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

转载 2017年01月03日 06:13:58
第二节: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灯闪烁。

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

LED灯亮500ms和灭500ms

/*********************************************************** 功能:KC伺服舵机测试程序 说明:让一个LED灯亮500ms再灭500ms...
  • boj0102
  • boj0102
  • 2012年12月14日 10:32
  • 311

【单片机】[LED]:LED 不用频率闪烁的程序

main.c 程序源代码:// =========================== main.c ======================#include "reg51.h"#define L...
  • z21109
  • z21109
  • 2016年03月30日 16:39
  • 1238

时间触发系统调度器思想LED闪烁简例

时间触发系统调度器思想LED闪烁简例 什么是调度器? 可以从两种角度来看调度器: 1、 调度器可以看成是一个简单的操作系统,允许以周期性或(更少见)单次方式来调用任务。 2、 从底层角度来看,...
  • crazyvoice
  • crazyvoice
  • 2013年11月08日 15:11
  • 1032

STM32实例之LED灯闪烁控制以及相关注意事项

在本实例中,主要是为了实现LED灯的闪烁。首先分析LED的驱动方式,本实验中使用的是OpenM3V,内置8个LED均采用灌流方式驱动(低电平亮)。如果想要实现其闪烁,则需要给相应端口持续不断的高低交替...
  • Cherish511842885
  • Cherish511842885
  • 2016年10月07日 22:20
  • 7388

单片机设计流水灯和实现LED的闪烁

前两天小编只介绍了软件啥的忘记了介绍最重要的学习用具---单片机。大家可以自行淘宝一下,选哪一个我就不在这安利了,大家自行选择,建议大家第一次买不用买贵的,也不用要那么多模块。 其实初学者用不了那么...
  • Engineer_X
  • Engineer_X
  • 2016年01月25日 17:08
  • 1353

1-1 实验1 LED不停地实现闪烁(一亮一灭)

LED不停地实现闪烁(一亮一灭) 1、开发环境 IAR继承开发环境(安装IAR Embedded   Workbench软件 )  版本:IAR Embedded   Workbench for 80...
  • gdliweibing
  • gdliweibing
  • 2013年10月12日 19:48
  • 2894

单片机控制继电器 使LED灯交替闪烁

今天看到了继电器,想用89C51单片机控制它,使其能控制更丰富的电路,以完成一些复杂的功能。 首先用单片机的P2^0直接加到继电器上,发现没有反应,于是查了相关资料。发现单片机引脚输出的电流太小,不足...
  • d2299360
  • d2299360
  • 2016年11月01日 23:41
  • 735

【STM32F429开发日志】+hello led(闪烁led灯)

拿到 STM32F429 Discovery kit 有一周了,万事开头难,现在启动单片机界的第一个 hello world 程序  也就是  hello led(闪烁led灯) 迈开探索429的第...
  • w22net
  • w22net
  • 2015年11月20日 22:27
  • 928

用定时器控制Led灯闪烁

实验目的 闪灯程序在嵌入式学习中犹如“Hello World!”在C/C++语言学习中一样经典。它以简单的方式引导了无数的嵌入式爱好者。通过本节的学习你可以基本了解STM32的GPIO以及基本定时器...
  • u011392772
  • u011392772
  • 2015年04月08日 12:46
  • 2339

基于89C51的闪烁LED小灯设计

C51的闪烁LED设计     本设计采用通俗易懂的语言组织,看好了,在进行以下主要内容之前,先话痨话痨,学习这些单片机设计啊,真的得有兴趣,所谓兴趣,就是你懂了它,理解了它,自然而然就对它产生了兴趣...
  • hglboke
  • hglboke
  • 2017年11月01日 21:17
  • 93
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:第二节:delay()延时实现LED灯的闪烁。
举报原因:
原因补充:

(最多只允许输入30个字)