开场白:
上一节鸿哥提到delay()延时函数消耗的时间太长了,其它任务根本没有机会执行,我们该怎么改善?本节教大家利用累计主循环次数的方法来解决这个问题。这一节要教会大家两个知识点:
第一点:利用累计主循环次数的方法实现时间延时
第二点:switch核心语句之初体验。 鸿哥所有的实战项目都是基于switch语句实现多任务并行处理。
(1)硬件平台:基于朱兆祺51单片机学习板。
(2)实现功能:让一个LED闪烁。
(3)源代码讲解如下:
- #include "REG52.H"
-
-
-
-
-
- #define const_time_level 10000
-
- void initial_myself();
- void initial_peripheral();
- void delay_long(unsigned int uiDelaylong);
- void led_flicker();
-
- sbit led_dr=P3^5;
-
-
-
-
-
- unsigned char ucLedStep=0;
- unsigned int uiTimeCnt=0;
- void main()
- {
- initial_myself();
- delay_long(100);
- initial_peripheral();
- while(1)
- {
- led_flicker();
- }
-
- }
-
- void led_flicker()
- {
-
- switch(ucLedStep)
- {
- case 0:
-
-
-
-
-
-
- uiTimeCnt++;
- if(uiTimeCnt>=const_time_level)
- {
- uiTimeCnt=0;
- led_dr=1;
- ucLedStep=1;
- }
- break;
- case 1:
- uiTimeCnt++;
- if(uiTimeCnt>=const_time_level)
- {
- uiTimeCnt=0;
- led_dr=0;
- ucLedStep=0;
- }
- break;
-
- }
-
- }
-
-
- 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;
- }
- void initial_peripheral()
- {
- ;
- }
总结陈词:
在实际项目中,用累计主循环次数实现时间延时是一个不错的选择。这种方法能胜任多任务处理的程序框架,但是它本身也有一个小小的不足。随着主函数里任务量的增加,我们为了保证延时时间的准确性,要不断修正设定上限const_time_level 。我们该怎么解决这个问题呢?欲知详情,请听下回分解-----累计定时中断次数使LED灯闪烁。