当要写一个实际应用的程序,delay 几ms 这些基本是不能用的。详细参考 从
单片机初学者迈向单片机工程师 ,百度文库可以搜到。
平时的实验,都是单一的,所以delay多少ms都能实现到功能,但是如果一个程序涉及很多,就拿最简单的按键控制数码管显示时钟来说,数码管的20ms内刷新一次人不会感觉有闪烁,但是如果再按键部分使用了delay函数延时了几个ms,数码管本身的动态显示又带了delay函数,那数码管将不会正常显示。51
开发板的按键和数码管显示都是带delay函数的,大概都是delay(5ms)。这些只是给新手入门用,简化程序。。。当我们学到一定的阶段,就不能总是依赖delay函数来帮忙。在实时操作系统UCOSII等的情况就另当别论了。
初学,无论怎样都要写一些轮询系统。这些基本都是从《从单片机初学者迈向单片机工程师 》里面学来的,真的非常感谢这个文章的作者!让我这个新手了解到单片机的系统是怎样来写的。写得实在太好了。如果没有看过,可能我现在还是连个门都入不了。当时看到也是在
电子发烧友的
论坛的转帖,现在想起来都特别激动
使用定时器代替,大概原理用程序说:
void
tiM3_IRQHandler(void) //TIM3ÖжÏ
{
static u32 count=0;
static u8 ledTask=0;
if (TIM3->SR&0X0001)//这句可忽略
{
count++;
if(
ledTask==0)//任务的计时
{
g_switchLed=TRUE;//执行任务的标志,在主程序中清0
ledTask=
ledTaskTime;//led的任务计时器赋值(自己根据情况设置)
}
else ledTask--;
}
TIM3->SR&=~(1<<0);//清中断标志
}
------------------在main中--------------------------------
while(1)
{
if(g_switchLed==TRUE)
{
led_task();//执行LED任务的转换,不能使用while(1)哦
g_switchLed=FALE;
}
}
----------------------------------------------
这些写法其实是最简单的,有更简单的,搜 Protothread ,这个编程框架非常适合用于51那种特别小RAM ROM的单片机。
像我们用的这块活动的开发板,那么大的容量,根据教程移植UCOSII都完全没问题。。UCOSII的好处简单概括为:程序都可以写成while(1),按键写成一个while(1){按键检测},数码管显示写成一个while(1),delay照用。。。
这个轮询系统,下次会加入按键检测。。现在暂时是这样。。。后面有时间还会尝试一下移植UCOSII
2