一般在大学里学习单片机编程,教师都是教训要写程序流程,并且写出来的流程几乎是一条长龙偶然附加点分支判别。这样写出来的程序条理比较明晰、易懂,可是一般问题多多,比方我突然间要加点东西进去,发现体系不正常了。
往往这些问题都是整个流程上附加的延时过多导致的。延时程序是比较直观明晰的程序,可是也损坏单片机的整机功用,由于延时单片机处于全速运转状况。
我现在的脑际想起曾经写的流程:初始化->显现->按键->其他功用->完毕。
1.比方说显现,肉眼不行分辩是50HZ以上,所以说用4个数码管动态显现均匀每个显现是5ms。依照曾经的观念是这样写的 第一个数码管点亮->延时几毫秒、灭第一个、点亮第二个->…->延时、灭最终个、点亮第一个。 假设8个数码管的动态显现,岂不是得有 8 * 几毫秒的 延时。
2.还有个按键,按键得有个去除颤动,一般是软件延时,大约在20ms, 假设在加上显现的几十毫秒,那这延时是适当恐惧的。
3.其他功用函数也是有顺便延时,特别是驱动程序,比方MAX7279读取操作都是需求必定延时,可是这种延时都是在us等级,比照与ms等级能够疏忽。
笔者主张写程序,特别写到延时程序,考虑下你的延时得多久,假设是ms等级,考虑用定时器中止处理。
比方说显现程序。假设8个数码管动态显现。那么你就得考虑20ms内8个数码管改写一次,那么意味着每个数码管显现时刻为2.5ms。
那么程序如下:
volatile unsigned char time_2500_flag; //2.5ms标志
void TimerA(void) //定时器初始化
{
//初始化,装备为500us中止一次
}
#pragma interrupt_handler TimerA_ISR:NUM
void Timer1_ISR(void) //中止服务程序
{
static unsigned char cnt = 0;
//reload 从头赋值
if (++cnt > 5)
{
cnt = 0;
time_2500_flag = 1;
}
}
void Display(void)
{
;
}
void main(void)
{
//初始化
for (;;)
{
if (time_2500_flag == 1)
{
time_2500_flag = 0;
Display();
}
}
}
程序写到这儿。
显现程序这儿要做特别处理,履行一次显现程序,数码管顺次点亮就OK。