1 Star 0 Fork 4

armku / FN1895E-MCU101

forked from 建伟F4nniu / FN1895E-MCU101 
加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
MCU003.md 3.48 KB
一键复制 编辑 原始数据 按行查看 历史
建伟F4nniu 提交于 2016-12-24 13:48 . Track 1 files into repository.

#第三节:累计主循环次数使LED灯闪烁。

开场白:

上一节鸿哥提到delay()延时函数消耗的时间太长了,其它任务根本没有机会执行,我们该怎么改善?本节教大家利用累计主循环次数的方法来解决这个问题。

这一节要教会大家两个知识点:

  • 第一点:利用累计主循环次数的方法实现时间延时
  • 第二点:switch核心语句之初体验。 鸿哥所有的实战项目都是基于switch语句实现多任务并行处理。
  • (1)硬件平台:基于朱兆祺51单片机学习板。

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

  • (3)源代码讲解如下:

#include "REG52.H"

/* 注释一:
* const_time_level是统计循环次数的设定上限,数值越大,LED延时的时间越久
*/
#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;

/* 注释二:
* 吴坚鸿个人的命名风格:凡是switch语句里面的步骤变量后缀都是Step.
* 前缀带uc,ui,ul分别表示此变量是unsigned char,unsigned int,unsigned long.
*/
unsigned char ucLedStep = 0; //步骤变量
unsigned int  uiTimeCnt = 0; //统计循环次数的延时计数器
void main()
{
    initial_myself();
    delay_long(100);
    initial_peripheral();
    while(1)
    {
        led_flicker();
    }

}

void led_flicker() ////第三区 LED闪烁应用程序
{

    switch(ucLedStep)
    {
    case 0:
        /* 注释三:
        * uiTimeCnt累加循环次数,只有当它的次数大于或等于设定上限const_time_level时,
        * 才会去改变LED灯的状态,否则CPU退出led_flicker()任务,继续快速扫描其他的任务,
        * 这样的程序结构就可以达到多任务并行处理的目的。
        * 本程序基于朱兆祺51单片机学习板
        */
        uiTimeCnt++;  //累加循环次数,
        if(uiTimeCnt >= const_time_level) //时间到
        {
            uiTimeCnt = 0; //时间计数器清零
            led_dr = 1;  //让LED亮
            ucLedStep = 1; //切换到下一个步骤
        }
        break;
    case 1:
        uiTimeCnt++;  //累加循环次数,
        if(uiTimeCnt >= const_time_level) //时间到
        {
            uiTimeCnt = 0; //时间计数器清零
            led_dr = 0;  //让LED灭
            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; //LED灭
}
void initial_peripheral() //第二区 初始化外围
{
    ;   //本例为空
}

总结陈词:

在实际项目中,用累计主循环次数实现时间延时是一个不错的选择。这种方法能胜任多任务处理的程序框架,但是它本身也有一个小小的不足。随着主函数里任务量的增加,我们为了保证延时时间的准确性,要不断修正设定上限const_time_level 。我们该怎么解决这个问题呢?欲知详情,请听下回分解-----累计定时中断次数使LED灯闪烁。

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

C
1
https://gitee.com/armku/FN1895E-MCU101.git
git@gitee.com:armku/FN1895E-MCU101.git
armku
FN1895E-MCU101
FN1895E-MCU101
master

搜索帮助