51单片机入门(3)点灯的进阶——跑马灯(通过阻塞延时实现)
上一节我们学习了用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.0045
ms,即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)点灯的进阶——跑马灯(通过阻塞延时实现)相关推荐
- 想学单片机怎么入手?51单片机入门自学最佳指南
曾经我是自学单片机然后跨行成功,今天来分享下自己的经验. 在网上看了很多文章,很多人说现在51单片机已经过时了,建议从STM32开始学习. 或者单片机没有钱途,直接搞ARM+Linux. 我的建议是从 ...
- 51单片机入门教程(6)——外部中断
51单片机入门教程(6)--外部中断 一.外部中断 1.1 中断 1.2 外部中断 二.中断优先级 一.外部中断 1.1 中断 关于中断的概念在上一篇博客中已经提到了.(传送门:51单片机入门教程(5 ...
- 51单片机入门教程(5)——定时器中断
51单片机入门教程(5)--定时器中断 一.中断的概念 二.定时器中断 2.1 软件延时的不足 2.2 中断寄存器 2.2.1 中断允许控制寄存器 IE 2.2.2 定时器工作方式寄存器 TMOD 2 ...
- 51单片机入门教程(1)——点亮一个LED灯
51单片机入门教程(1)--点亮一个LED灯 一.什么是单片机 单片机(Microcontrollers)是一种集成电路芯片,是采用超大规模集成电路技术把具有数据处理能力的中央处理器CPU.随机存储器 ...
- 51单片机入门学习小结(流水灯与数码管)
51单片机入门学习小结(流水灯与数码管) 对原理图的分析 以下是我所用单片机的原理图 这块51单片机一共有4个I/O口(意思为input/output),也代表着如果我们后续都要用到这四个的话那么功能 ...
- 51单片机入门模板(STC89C52RC)
该模板适用于51单片机入门,比较易于理解,包含定时器和串口的操作. 可以在定时器T0中断服务函数和主循环中实现主要功能,在UART中断服务函数(T1定时器)中实现简单的串口通信接收命令的功能. 注:本 ...
- 51单片机入门指南系列:一、前期准备
51单片机入门指南系列:一.前期准备 51单片机学习步骤 为什么我用的是52单片机,大家也说它是51? 编译环境 单片机入门书籍 购买实物开发板 51单片机学习步骤 51单片机是嵌入式学习的入门级芯片 ...
- 51单片机入门——16路抢答器
文章目录 设计要求 电路原理图 硬件原理 时钟信号(晶振) 矩阵按键与独立按键 代码解析 设计要求 同时为16支参赛队提供抢答功能,抢答成功后应能通过数码管显示出参赛队号数,同时点亮发光二极管示意抢答 ...
- 51单片机入门基础介绍
51单片机入门基础介绍 文章目录 51单片机入门基础介绍 前言 常用元器件 发光二极管 数码管 LED数码管的显示方式 按键 定时计数器 串行口控制寄存器SCON 中断系统 中断源及中断请求 中断允许 ...
- 51单片机入门——数字时钟
文章目录 1. 前言 1.1. 设计要求 2. 硬件原理 2.1. 时钟信号(晶振) 2.2. 按键开关 2.3. 数码管显示 3. 原理图 3.1. 仿真原理图 3.2. AD原理图 3.3. PC ...
最新文章
- 微软2014校园招聘笔试试题
- 10个随机数相加等于100
- CAD绘图软件中如何查询图纸的版本是多少
- matlab共轭梯度法_优化算法之牛顿法
- 一文搞懂深度优先搜索、广度优先搜索(dfs、bfs)
- Hadoop:The Definitive Guid 总结 Chapter 1~2 初识Hadoop、MapReduce
- python制作计算机程序_用 Python 开发实用程序 – 计算器
- 南海发展大数据产业 建设新型智慧城市
- T-Sql备份还原数据库
- 飞鸽传书局域网聊天工具
- spring boot target文件夹_Boot之Boot Shell
- [BZOJ1860][ZJOI2006]Mahjong(DP)
- 我在b站上大学:计算机类优秀网课汇总【持续更新】
- ISO9001认证审核常见问题大汇总
- 手工雕刻图纸_鬼斧神工--木雕手工雕刻技法
- 数字后端设计相关文件说明
- 作为一个程序员对特修斯之船的理解
- TypeError: torch.nn.modules.batchnorm.BatchNorm2d is not a Module subclass
- 公众号认证?小程序认证?小程序复用公众号资质进行认证?
- 360n5s不打印日志 不同厂商手机系统日志抓取方法
热门文章
- Java:求两个正整数的最大公约数和最小公倍数
- ArcGIS For Unity3D(一)—— 在Unity3D中开启ArcGIS
- xubuntu切换回到ubuntu登陆界面
- vsftp配置虚拟账户
- 房屋租赁合同主要内容是那些
- 汇集各种 webservice工厂,快递,ip,天气,身份证,手机,翻译,火车时刻,股票,邮编,二维码,公交,ISBN,ICP 查询接口 API
- python的turtle模块制作的打地鼠小游戏2019/4/9版
- 5款超棒的微信小程序!绝对满足你的需求!个个超级厉害!
- matlab标记最大的连通区域,Matlab得到二值图像中最大连通区域
- 解决mac备忘录会自动将英文双引号转化为中文双引号