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

发布者:博雅之士最新更新时间:2016-03-14 来源: eefocus关键字: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
   {
     ;   //一个分号相当于执行一条空语句
   }
}
 
 
/* 注释八:
* delay_long(unsigned int uiDelayLong)是大延时函数,
* 专门用在上电初始化的大延时,
* 此函数的特点是能实现比较长时间的延时,细分度取决于内嵌for循环的次数,
* uiDelayLong的数值的大小就代表里面执行了多少次500条空指令的时间。
* 数值越大,延时越长。时间精度不要刻意去计算,感觉差不多就行。
*/
void delay_long(unsigned int uiDelayLong)
{
   unsigned int i;
   unsigned int j;
   for(i=0;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灯  闪烁 引用地址:第二节:delay()延时实现LED灯的闪烁

上一篇:第一节:吴坚鸿谈初学单片机的误区
下一篇:第三节:累计主循环次数使LED灯闪烁

推荐阅读最新更新时间:2024-03-16 14:47

关于while(--i)延时讨论
很多人从汇编转到C语言后感到不是非常适应,特别是一些要求比较高的延时程序,感觉C的操控性没有汇编那么高。在DALLAS的单总线(1-wire)操作中,对延时的精度由为重要。很多人写单总线的程序的时候一般是在C中嵌入汇编。这是最直观的一种方法。但不是最方便的。在Keil C51中,还是有一定规律可寻的。经过一些尝试,得到了一种比较好用的方法。可以通过软件仿真来验证。程序的执行时间可在keil仿真状态下的左侧察看。 1.精确延时试验代码: void delay(unsigned char i); void main() {delay(50); while(1); } void delay(unsigned char i) {wh
[单片机]
专注手术引擎定制机器人,云百生云手术导航延时仅37ms
通过游戏引擎,公司可以开发出各种游戏。而通过手术引擎,云百生可以定制各类机器人,将手术机器人的开发周期压缩到三个月左右,成本仅需一、两百万(每台成本不含定制开发费用)。 刘芳德认为,在外科4.0时代,手术机器人要在智能化和应用方面发展,不止做医生眼和手的延伸。 手术机器人的未来在基层 总体来看,手术机器人行业仍处在发展初期,大部分的机器人产品都还在研发和临床试验阶段,商业化规模有限。 手术机器人的市场普及率较低,部分原因在于它虽然能够帮助医务人员提升手术效率与精准度,但开发成本高、售价高,一次开机就可能花费上万元。 达芬奇机器人自2006年引入中国,在手术机器人行业长期占据垄断地位,售价曾高达2000万人民币。 云百生创始人刘
[机器人]
LED灯具IP防护等级定义解读
led应用上要注意到防湿气与倾入等规范,IP(INTERNATIONAL PROTECTION)防护等级系统是由IEC(INTERNATIONAL ELECTROTECHNICAL COMMISSION)所起草。将 灯具 依其防尘防湿气之特性加以分级。这里所指的外物含工具,人的手指等均不可接触到灯具内之带电部分,以免触电。IP防护等级是由两个数位所组成,第1个数字表示灯具离尘、防止外物侵入的等级,第2个数位表示灯具防湿气、防水侵入的密闭程度,数字越大表示其防护等级越高。 第一个标示数字定义: 0没有防护:对外界的人或物无特殊防护 1防止大于50mm的固体物体侵入:防止人体(如手掌)因意外而接触到灯具内部的零件。防止较大尺
[电源管理]
stm32专题九:SysTick(二)微妙和毫秒级延时
stm32系统嘀嗒定时器编程其实也很简单,这里写了两个us级延时和ms级延时函数。 bsp_systick.c 主要思路是,根据时钟频率,设置好固定的reload值,然后用传入参数不断计数;也可以根据传入参数精确计算reload值,但是可能会存在一个问题,就是如果希望的延时时间很长,24位reload寄存器可能会溢出,导致计数出错。 // 这里是重装载值固定为72,也可以根据us数来计算reload /** * @brief us级延时 */ void SysTick_Delay_us(uint32_t us) { uint32_t i; // 计时72节拍,默认时钟72M(对应1us) // 下次
[单片机]
自制交流LED节能延时
  在卧室床边的插座上插上一个延时 开关 灯,睡前按下开关,灯就亮了,等安排好睡下灯会自动熄灭,夜间解手也同样方便。如果采用白色高 亮度 发光二极管作光源,又节能又别致。   笔者制作了一个交流 LED节能 延时开关灯,用了一个带插座的电视天线放大器 电源 盒,一个H型节能灯线路板,外加六个 元件 和16只Φ3mm白色高亮度发光二极管焊接而成,电路如图1所示。      一、工作原理   按下按键S,AC220V市电通过小变压器B初级线圈、桥式整流二极管VD1~VD4、隔离二极管VD5,对电容器C1快速充电,同时经限流电阻R给单向 可控硅 VS输入触发电流,使Vs导通,这时变压器B次级输出12v交流电,点亮
[电源管理]
自制交流LED节能<font color='red'>延时</font>灯
第三节:累计主循环次数使LED灯闪烁
开场白: 上一节鸿哥提到delay()延时函数消耗的时间太长了,其它任务根本没有机会执行,我们该怎么改善?本节教大家利用累计主循环次数的方法来解决这个问题。这一节要教会大家两个知识点: 第一点:利用累计主循环次数的方法实现时间延时 第二点:switch核心语句之初体验。 鸿哥所有的实战项目都是基于switch语句实现多任务并行处理。 (1)硬件平台:基于朱兆祺51单片机学习板。 (2)实现功能:让一个LED闪烁。 (3)源代码讲解如下: #include REG52.H /* 注释一: * const_time_level是统计循环次数的设定上限,数值越大,LED延时的时间越久 */ #define co
[单片机]
关于LED灯具可靠性检测工作的思考
随着 LED 技术的快速发展,LED在照明领域的各个方面应用也越来越广泛,并逐渐开始占据照明市场的主导地位。   LED作为新型照明光源,在很多方面具有传统光源所无法比拟的优势。但是,它在实际应用过程中仍存在一些问题而导致它没有达到其理论上的使用寿命和光度参数上的要求。因此,如果不能实现高可靠性、长寿命的LED光源,即使光效再好,高昂的维护成本必然限制其在各个领域的应用。白炽灯的额定寿命一般是1000小时,荧光灯的平均寿命是10000小时,而根据美国照明研究中心(LRC)Narendran等人对白光LED进行的寿命实验,LED的寿命可以达到10万小时。    一、LED灯具可靠性检测的重要性   照明LED商业化到现在还不足
[电源管理]
关于<font color='red'>LED灯</font>具可靠性检测工作的思考
高噪声环境下基于自适应滤波语音降噪技术的研究
0 引 言 在实际环境中,语音信号在声电转换时不可避免地要受到周围环境的影响,高背景噪声会严重地影响语音信号质量。语音通信系统中的一个重要工作就是从带噪语音信号中提取纯净的原始语音、抑制背景噪声。各种语音降噪算法正处于广泛的研究中。 其中,利用自适应滤波技术进行语音降噪是一种效果较好的方法。自适应滤波能在输入信号与噪声的统计特性未知或变化的情况下,自动估计出所需的统计特性,并以此为依据自动调整滤波参数,以达到最佳的滤波效果。 传统的自适应噪声抵消法多采用双声道(多声道)系统,以得到一个或多个参考噪声作为辅助输入,这势必造成系统结构复杂等一系列问题。所以本文选取原始输入的延时信号作为参考噪声输入的单声道系统,构建基于线性预测的
[模拟电子]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved