上一节我们学习了用51单片机点亮LED,这节我们继续围绕点灯进行进一步学习——实现跑马灯效果。
跑马灯的核心就是LED闪烁,要实现LED的闪烁,那就需要周期性地控制LED的亮和灭,而亮和灭的间隔如何实现呢?这就得用到延时了,本实验的延时采用阻塞式延时(让程序不停地执行空语句,空耗处理器的时间)。

文章目录

  • 一、单个LED闪烁
    • 实验代码
    • 编译+烧录
    • 实验效果
  • 二、LED跑马灯
    • 实验代码
    • 实验效果
  • 三、其他花样灯
    • 流水灯
    • 呼吸灯
  • 先简单介绍本文将用到的硬件及软件:
    硬件平台:普中51开发板-单核A2
    软件:Keil5(C51)、STC-ISP(或其他ISP软件)、Proteus8.9(用于仿真,非必须)

一、单个LED闪烁

在介绍代码前,我们先来讨论延时的实现,在学习定时器之前,我们只能通过空语句的方法实现延时。接下来的内容十分枯燥,建议跳过,直接看实验代码。

我们先看看单行C代码(一行空语句)在51单片机里需要运行的时间:

_nop延时这里就不讨论了,只讨论空语句

首先使用软件调试,在空语句之前程序运行时间为0.00019550(0.1955ms)【单片机从0s开始运行】;

运行完一行空语句,程序运行时长为:0.00020550(0.2055ms),和上一个状态相差0.01ms,也就是10us,所以理论上(由于这是软件仿真,所以只能得出理论值),我这个51单片机一行空语句耗时10us


一行空语句耗时10微秒,那我想延时1秒钟,岂不是只需要执行100000行空语句?

答案是可以实现,但时间可能并不准,网上给出的答案是(单片机中)C代码是不能实现准确延时的,只有汇编(如nop)和定时器可以,由于后两项本文暂不考虑,所以依旧使用C语言的空语句实现延时,毕竟现在不需要精准延时,同时我们也能了解一下空语句延时到底能有多大误差【这是我最感兴趣的】。

这里需要注意一点,51单片机的int类型只有2个字节,最大的数值为32767,如果用unsinged int,最大能使用65535,虽然可以用long类型(4字节),但网上说效率会降低,作为新手,我们还是保险点,尽量使用常用的类型,我就先用0.5秒做实验(50000行空语句)

同样,使用软件仿真查看,由于空语句前的运行时间和之前相同,所以我直接给出执行完50000行空语句后的运行时间,0.22529850(225.29850ms),与空语句前的运行时间的差值大约为225ms

这和我们设想的0.5秒相差得太大了吧。其实这里我犯了一个错误-----细心的朋友会发现,之前我算的并不是空语句的运行时长,而是一个while(1--);运行的时长,即一个while语句再加一个空语句。


但我们发现此时的一个空语句循环的延时时间约是225/50000=0.0045ms,即4.5us。
所以我们再试试其他值是不是也满足这个规律,比如我想延时100ms,能不能用100*1000/4.5=22222(保留整数)个空语句循环实现呢?试试吧。

执行完22222行空语句循环后,运行时间为0.10024300(100.243ms),与空语句前的运行时间的差值大约为100ms。准度还行,至少ms级的延时是没问题的。

上面的调试都是使用Keil软件进行的,软件仿真往往只能作为参考,所以我们还需对开发板进行实测

就测试250ms延时吧,利用刚才得出的结果-----while(i--);每次循环运行耗时为4.5us(i不能太小,也不能超过65535)。

0.25s需要的循环空语句数量约为250*1000/4.5=55555(保留整数)

测试代码见下文,其实就是LED闪烁的实验代码。

实验代码

在写代码前,我们需要先创建一个Keil工程,创建工程的步骤已经在第一节讲述,传送门:

51单片机入门(3)点灯的进阶——跑马灯(通过阻塞延时实现)相关推荐

  1. 想学单片机怎么入手?51单片机入门自学最佳指南

    曾经我是自学单片机然后跨行成功,今天来分享下自己的经验. 在网上看了很多文章,很多人说现在51单片机已经过时了,建议从STM32开始学习. 或者单片机没有钱途,直接搞ARM+Linux. 我的建议是从 ...

  2. 51单片机入门教程(6)——外部中断

    51单片机入门教程(6)--外部中断 一.外部中断 1.1 中断 1.2 外部中断 二.中断优先级 一.外部中断 1.1 中断 关于中断的概念在上一篇博客中已经提到了.(传送门:51单片机入门教程(5 ...

  3. 51单片机入门教程(5)——定时器中断

    51单片机入门教程(5)--定时器中断 一.中断的概念 二.定时器中断 2.1 软件延时的不足 2.2 中断寄存器 2.2.1 中断允许控制寄存器 IE 2.2.2 定时器工作方式寄存器 TMOD 2 ...

  4. 51单片机入门教程(1)——点亮一个LED灯

    51单片机入门教程(1)--点亮一个LED灯 一.什么是单片机 单片机(Microcontrollers)是一种集成电路芯片,是采用超大规模集成电路技术把具有数据处理能力的中央处理器CPU.随机存储器 ...

  5. 51单片机入门学习小结(流水灯与数码管)

    51单片机入门学习小结(流水灯与数码管) 对原理图的分析 以下是我所用单片机的原理图 这块51单片机一共有4个I/O口(意思为input/output),也代表着如果我们后续都要用到这四个的话那么功能 ...

  6. 51单片机入门模板(STC89C52RC)

    该模板适用于51单片机入门,比较易于理解,包含定时器和串口的操作. 可以在定时器T0中断服务函数和主循环中实现主要功能,在UART中断服务函数(T1定时器)中实现简单的串口通信接收命令的功能. 注:本 ...

  7. 51单片机入门指南系列:一、前期准备

    51单片机入门指南系列:一.前期准备 51单片机学习步骤 为什么我用的是52单片机,大家也说它是51? 编译环境 单片机入门书籍 购买实物开发板 51单片机学习步骤 51单片机是嵌入式学习的入门级芯片 ...

  8. 51单片机入门——16路抢答器

    文章目录 设计要求 电路原理图 硬件原理 时钟信号(晶振) 矩阵按键与独立按键 代码解析 设计要求 同时为16支参赛队提供抢答功能,抢答成功后应能通过数码管显示出参赛队号数,同时点亮发光二极管示意抢答 ...

  9. 51单片机入门基础介绍

    51单片机入门基础介绍 文章目录 51单片机入门基础介绍 前言 常用元器件 发光二极管 数码管 LED数码管的显示方式 按键 定时计数器 串行口控制寄存器SCON 中断系统 中断源及中断请求 中断允许 ...

  10. 51单片机入门——数字时钟

    文章目录 1. 前言 1.1. 设计要求 2. 硬件原理 2.1. 时钟信号(晶振) 2.2. 按键开关 2.3. 数码管显示 3. 原理图 3.1. 仿真原理图 3.2. AD原理图 3.3. PC ...

最新文章

  1. 微软2014校园招聘笔试试题
  2. 10个随机数相加等于100
  3. CAD绘图软件中如何查询图纸的版本是多少
  4. matlab共轭梯度法_优化算法之牛顿法
  5. 一文搞懂深度优先搜索、广度优先搜索(dfs、bfs)
  6. Hadoop:The Definitive Guid 总结 Chapter 1~2 初识Hadoop、MapReduce
  7. python制作计算机程序_用 Python 开发实用程序 – 计算器
  8. 南海发展大数据产业 建设新型智慧城市
  9. T-Sql备份还原数据库
  10. 飞鸽传书局域网聊天工具
  11. spring boot target文件夹_Boot之Boot Shell
  12. [BZOJ1860][ZJOI2006]Mahjong(DP)
  13. 我在b站上大学:计算机类优秀网课汇总【持续更新】
  14. ISO9001认证审核常见问题大汇总
  15. 手工雕刻图纸_鬼斧神工--木雕手工雕刻技法
  16. 数字后端设计相关文件说明
  17. 作为一个程序员对特修斯之船的理解
  18. TypeError: torch.nn.modules.batchnorm.BatchNorm2d is not a Module subclass
  19. 公众号认证?小程序认证?小程序复用公众号资质进行认证?
  20. 360n5s不打印日志 不同厂商手机系统日志抓取方法

热门文章

  1. Java:求两个正整数的最大公约数和最小公倍数
  2. ArcGIS For Unity3D(一)—— 在Unity3D中开启ArcGIS
  3. xubuntu切换回到ubuntu登陆界面
  4. vsftp配置虚拟账户
  5. 房屋租赁合同主要内容是那些
  6. 汇集各种 webservice工厂,快递,ip,天气,身份证,手机,翻译,火车时刻,股票,邮编,二维码,公交,ISBN,ICP 查询接口 API
  7. python的turtle模块制作的打地鼠小游戏2019/4/9版
  8. 5款超棒的微信小程序!绝对满足你的需求!个个超级厉害!
  9. matlab标记最大的连通区域,Matlab得到二值图像中最大连通区域
  10. 解决mac备忘录会自动将英文双引号转化为中文双引号