第二节:delay()延时实现LED灯的闪烁。

开场白:
    上一节鸿哥列出了初学者七大误区,到底什么才是初学者关注的核心?那就是裸机奔跑的程序结构。一个好的程序结构,本身就是一个微型的多任务操作系统。鸿哥教给大家的就是如何编写这个简单的操作系统。在main函数循环中用switch语句实现多任务并行处理的任务切换,再外加一个定时器中断,这两者的结合就是鸿哥多年来所有实战项目的核心。鸿哥的程序结构看似简单,实际上就是那么简单。大家不用着急,本篇连载文章现在才正式开始,这一节我要教会大家两个知识点:
第一点:鸿哥首次提出的“三区一线”理论。此理论把程序代码分成三个区,一个延时分割线。
第二点:delay()延时的用途。

(1)硬件平台:基于朱兆祺51单片机学习板。

(2)实现功能:让一个LED闪烁。

(3)源代码讲解如下:

#include "REG52.H"

void initial_myself();    
void initial_peripheral();

void delay_short(unsigned int uiDelayshort);
void delay_long(unsigned int uiDelaylong);
void led_flicker();

/* 注释一:
* 吴坚鸿个人的命名风格:凡是输出后缀都是_dr,凡是输入后缀都是_sr。
* dr代表drive驱动,sr代表sensor感应器
*/
sbit led_dr=P3^5;

void main()  //学习要点:深刻理解鸿哥首次提出的三区一线理论
  {
/* 注释二:
* initial_myself()函数属于鸿哥三区一线理论的第一区,
* 专门用来初始化单片机自己的寄存器以及个别外围要求响应速度快的输出设备,
* 防止刚上电之后,由于输出IO口电平状态不确定而导致外围设备误动作,
* 比如继电器的误动作等等。 
*/
   initial_myself();

/* 注释三:
* 此处的delay_long()延时函数属于第一区与第二区的分割线,
* 延时时间一般是0.3秒到2秒之间,等待外围芯片和模块上电稳定。
* 比如液晶模块,AT24C02存储芯片,DS1302时钟芯片,
* 这类芯片有个特点,一般都是跟单片机进行串口或并口通讯的,
* 并且不要求上电立即处理的。
*/
   delay_long(100);

/* 注释四:
* initial_peripheral()函数属于鸿哥三区一线理论的第二区,
* 专门用来初始化不要求上电立即处理的外围芯片和模块.
* 比如液晶模块,AT24C02存储芯片,DS1302时钟芯片。
* 本程序基于朱兆祺51单片机学习板。
*/
   initial_peripheral();

/* 注释五:
* while(1){}主函数循环区属于鸿哥三区一线理论的第三区,
* 专门用来编写被循环扫描到的非中断应用程序
*/
   while(1)
   {
      led_flicker();   //LED闪烁应用程序
   }

}

void led_flicker() //LED闪烁应用程序
{
  led_dr=1;  //LED亮
  delay_short(50000);  //延时50000个空指令的时间

/* 注释六:
* delay_long(100)延时50000个空指令的时间,因为内嵌了一个500次的for循环
*/
  led_dr=0;  //LED灭
  delay_long(100);    //延时50000个空指令的时间  
}

/* 注释七:
* delay_short(unsigned int uiDelayShort)是小延时函数,
* 专门用在时序驱动的小延时,一般uiDelayShort的数值取10左右,
* 最大一般也不超过100.本例为了解释此函数的特点,取值范围超过100。
* 此函数的特点是时间的细分度高,延时时间不宜过长。uiDelayShort数值
* 的大小就代表里面执行了多少条空指令的时间。数值越大,延时越长。
* 时间精度不要刻意去计算,感觉差不多就行。
*/
void delay_short(unsigned int uiDelayShort) 
{
   unsigned int i;  
   for(i=0;i<uiDelayShort;i++)
   {
     ;   //一个分号相当于执行一条空语句
   }
}

/* 注释八:
* delay_long(unsigned int uiDelayLong)是大延时函数,
* 专门用在上电初始化的大延时,
* 此函数的特点是能实现比较长时间的延时,细分度取决于内嵌for循环的次数,
* uiDelayLong的数值的大小就代表里面执行了多少次500条空指令的时间。
* 数值越大,延时越长。时间精度不要刻意去计算,感觉差不多就行。
*/
void delay_long(unsigned int uiDelayLong)
{
   unsigned int i;
   unsigned int j;
   for(i=0;i<uiDelayLong;i++)
   {
      for(j=0;j<500;j++)  //内嵌循环的空指令数量
          {
             ; //一个分号相当于执行一条空语句
          }
   }
}

void initial_myself()  //初始化单片机
{
  led_dr=0;  //LED灭
}
void initial_peripheral() //初始化外围
{
  ;   //本例为空
}

总结陈词:
鸿哥首次提出的“三区一线”理论概况了各种项目程序的基本分区。我后续的程序就按此分区编写。
Delay()函数的长延时适用在上电初始化。
Delay()函数的短延时适用在驱动时序的脉冲延时,此时的时间不能太长,本例中暂时没有列出这方面的例子,在后面的章节中会提到。
在本例源代码中,在led_flicker()闪烁应用程序里用到的两个延时delay,它们的延时时间都太长了,在实战项目中肯定不能用这种延时,因为消耗的时间太长了,其它任务根本没有机会执行。那怎么办呢?我们应该如何改善?欲知详情,请听下回分解-----累计主循环次数使LED灯闪烁。

(未完待续,下节更精彩,不要走开哦)

第二节:delay()延时实现LED灯的闪烁。相关推荐

  1. 跟着吴坚鸿学单片机——第2天:delay()延时实现LED灯的闪烁

    原文链接:delay()延时实现LED灯的闪烁. 文章目录 原文 读后感 自我练习 原文 第二节:delay()延时实现LED灯的闪烁. 开场白: 上一节鸿哥列出了初学者七大误区,到底什么才是初学者关 ...

  2. STM32使用延时控制LED灯亮暗变换,LED呼吸灯效果

    STM32F407ZE 使用延时控制LED灯亮暗变换,实现LED呼吸灯效果 具体代码如下: main.c部分 #include <stm32f4xx.h> #include "s ...

  3. 【STM32 嵌入式课程实验】实验一 单个LED灯的闪烁

    实验一 单个LED灯的闪烁 1.1系统功能 实现对STM32开发板上单个LED灯的循环点亮与熄灭,使其呈现不断闪烁的状态. 1.2系统组成 由STM32开发板及板上的LED灯组成,STM32为STM3 ...

  4. 控制三色LED灯的闪烁——Arduino

    最近要弄下Arduino.动过手,知道问题,细节可能在哪. 知识点我不清楚,直接看程序.直接控制也相对简单. 程序 /*实战案例1:控制三色LED灯的闪烁2019/3/12 */ int redpin ...

  5. ZYNQ FPGA控制LED灯不闪烁

    1.1 ZYNQ FPGA控制LED灯不闪烁 1.1.1 本节目录 1)本节目录: 2)本节引言: 3)FPGA简介: 4)ZYNQ FPGA控制LED灯不闪烁: 5)结束语. 1.1.2 本节引言 ...

  6. STM32F103C8T6核心板控制器下,通过电路搭建实现LED灯轮流闪烁的实验操作

    通过STM32F103C8T6+面板板+3只红绿蓝LED,搭建了电路,控制LED灯实现轮流闪烁 文章目录 通过STM32F103C8T6+面板板+3只红绿蓝LED,搭建了电路,控制LED灯实现轮流闪烁 ...

  7. c51单片机led奇数偶数亮_单片机LED灯花式闪烁电路图及程序

    单片机LED灯花式闪烁电路图及程序 在点亮LED灯的程序中我们知道开发板上的LED灯是接到高电平的,如果单片机引脚输出电平,LED导通发亮.如果单片机引脚输出高电平,LED截止熄灭.知道这个原理后我们 ...

  8. Holtek合泰单片机 《四》 从TM定时器中断到led灯1s闪烁

    跳过中断直接讲TM中断是不是有些超前了? 由于最近参加了一个项目,真是忙的不要不要的,没办法,只有抽了点放假的时间来更新下自己的博文,希望对正在学习HT单片机的同学有帮助. 重庆合泰初赛是5月15日, ...

  9. 第一节 基本数字输出功能LED灯

    I/O端口的原理 单片机端口是标准双向口,可以输出信号也可以输入信号. 上图的A点相当于单片机的I/O口,A可以连接5V或接地,保证了电流可以双向通过. 假设LED正常工作压降(电压差)是1.5V,正 ...

最新文章

  1. ajax+php+jq+面向对象,php+jquery+ajax+json的一个最简单实例
  2. 自然语言处理期末复习(1)n元模型
  3. JS获取浏览器高度 并赋值给类
  4. python-pygame激动时刻你我共享
  5. [基础题] 3、设计一个交通工具抽象类,提供抽象方法--驾驶
  6. react如何监听路由url变化
  7. LeetCode 2185. 统计包含给定前缀的字符串
  8. 类型参数作为约束 where T : U 的作用
  9. Adobe AIR教程:面向iOS设备的原生扩展
  10. 论如何用cmd命令做出数字雨特效
  11. 矩阵迹的几何意义是什么?
  12. Unity 三消游戏学习
  13. 一个“精神病”人的世界观——我看完了,然后陷入深深的不安中……
  14. Linux下清理日志及自动清理
  15. 为什么物理诺奖颁给量子信息科学?——量子信息的过去、现在和未来
  16. 忆旧路:雄关漫道真如铁,而今迈步从头越
  17. 14西安区域赛总结帖
  18. 安卓控件使用系列2:TextView实现图文(图片和文字)混排
  19. IDM+百度云链下载网盘资源
  20. android模拟器有什么作用,为什么要用安卓模拟器?安卓模拟器是什么?

热门文章

  1. 花十分钟顺手拿个阿里的Apsara Clouder专项技能认证,不比手里的王者香?
  2. mongotemplate mongodb的各种操作 模糊查询 精确查询 等等
  3. 张萌韩墨羽——Ument_Share集成
  4. [推荐] 经典健康谚语100句
  5. 公司拖欠后端工资逼急了可以删库跑路,逼急了前端该如何何去何从?
  6. 明星热图|王嘉尔、刘诗诗代言新品牌;王一博、周笔畅、刘恺威出席活动;吴彦祖、黄晓明演绎品牌大片...
  7. ESP32 E (10309) task_wdt: Task watchdog got triggered. The following tasks did not reset the watchdo
  8. 微信公众号定时推送消息
  9. cpu上干硅脂怎么清理_cpu上面硅胶怎么清洗
  10. 一篇文章说清楚shared_ptr,unique_ptr的区别和关系