首页 > 编程语言 >【51编程经验笔记】第二节:鸿哥的三区一线理论 & delay()延时实现LED灯的闪烁

【51编程经验笔记】第二节:鸿哥的三区一线理论 & delay()延时实现LED灯的闪烁

时间:2024-12-07 12:33:23浏览次数:5  
标签:LED void 51 delay 延时 led 鸿哥

第二节: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灯闪烁。

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

 

本文转载自:

https://blog.csdn.net/yuanmeixiang/article/details/53990191

标签:LED,void,51,delay,延时,led,鸿哥
From: https://www.cnblogs.com/FBsharl/p/18591998

相关文章

  • P9751 [CSP-J 2023] 旅游巴士
    $P9751$部分分思路题目要求时间必须是$k$的非负整数倍,所以想到了升维。这样就变成了一道分层图最短路的题目。用BFS算法可以拿到$A_i=0$的$35$分。满分思路其实部分分的思路已经很接近正解了,想要拿到满分只需要做一点小小的调整。虽然说不能在路上停留,但是......
  • 新手必看!小小白也能用Rust点亮LED,入门嵌入式开发(上)
    讲动人的故事,写懂人的代码"你作为编程新手,为什么要学Rust?"我在微信里问小小白。我是一名有着30多年IT从业经验的老程序员,正在创作一本Rust编程入门书,致力于降低Rust那传说中陡峭的学习曲线。小小白是我最近在社交网络上认识的朋友,他对学习Rust充满热情。作为一名......
  • 基于51单片机和16X16LED点阵屏(MAX7219驱动)的自制独立按键控制的小游戏《贪吃蛇》
    目录系列文章目录前言一、效果展示二、原理分析三、各模块代码1、定时器02、自制独立按键(8位)3、16X16LED点阵屏(MAX7219驱动)四、主函数总结系列文章目录前言《贪吃蛇》,一款经典的、怀旧的小游戏,单片机入门必写程序。基于51单片机和8X8LED点阵屏(板载74HC595驱动)的......
  • 洛谷 P1651 塔(DP)
    题目传送门https://www.luogu.com.cn/problem/P1651解题思路设  表示前  个积木,两塔高度差为 (第一个比第二个高多少),的最大高度。易得:首先,不选当前的积木:其次,选当前积木,将它拼到第一个塔上:最后,选当前积木,将它拼到第二个塔上:由于,第二维可能为负数,所以,我们可以以 (数......
  • VAS1260Q奇力LED驱动芯片DCDC降压恒流可替代Diodes8860
    VAS1260Q是一款专为车规级LED照明设计的连续模式电感降压驱动器,能够高效地驱动单个或多个串联LED。它集成了高端输出电流检测电路,并通过外部电阻设置标称平均输出电流,具有高可靠性和宽广的应用场景。核心技术参数    1.    输入电压范围:5V至60V,适应多种电源......
  • STM32:(入门)实现LED2灯循环闪烁
    思路:认识开发板的引脚——进行参数配置——运行代码——烧入开发板一、认识开发板的引脚(认识开发板)(STM32有2个LED灯的引脚分别是LED1-PA3,LED2-PB8【反面】) 依据题目,LED2灯---PB8二、进行参数配置(打开STM32CubeMx软件(新建项目)----选择版本【例题使用STM32F151C8】-......
  • DedeCMS最新注入漏洞(CNVD-2024-44514、CVE-2024-9076)
    DedeCms系统(织梦系统)是一套PHP开发的网站管理系统,因其功能强大,操作使用简单,具有非常高的知名度,拥有大量用户。 国家信息安全漏洞共享平台于2024-11-07公布其存在跨站脚本漏洞。漏洞编号:CNVD-2024-44514、CVE-2024-9076影响产品:DeDeCMS<=5.7.115漏洞级别:中公布时间:2024-11-......
  • P7518 [省选联考 2021 A/B 卷] 宝石
    P7518[省选联考2021A/B卷]宝石Solution:首先我们注意到宝石收集器上的顺序是不变的,所以我们考虑将每个点的点权转化为其在宝石收集器上的排名(后文的权值都是这个意思)然后我们记录两个数组:\(f_1[u][i]和f_2[u][i]\)用来表示在rt->u这段路径上,权值为\(w[u]+2^i\)or\(w[......
  • 企业如何选择内训机构?TsingtaoAI、51CTO、极客邦各有千秋,学会这几点就能选对!
    如何选择一个最合适的内训机构,可能是许多HR、企业高管和培训负责人面临的共同挑战。随着各类新兴技术的崛起和企业对数字化、智能化转型的强烈需求,传统的培训模式已经不能满足大多数企业对员工技能提升的要求。在众多的企业内训机构中,哪家才是最专业、最能符合企业当下业务需求......
  • 力扣 LeetCode 51. N皇后(Day14:回溯算法)
    解题思路:每次进入backtracking都表示进入下一行每个backtracking中处理当前行的各个列,看各列是否合法isValid中因为是一行一行向下遍历的,所以对应的当前行一定满足条件,没有放置过其他皇后,只需要看对应的列是否满足即可是否符合需要看左上45°和右上45°,之所以是往上看,......