项目尽量不要出现delay(uchar data),但是有些协议是需要使用延迟来实现协议时序;前后台框架在一定程度上提高了时效性,但是如果如果一个主函数中多次使用就会对整个软件架构的时效性大打折扣,给个反面教材......
//主循环
while(1)
{
//上电进入主程序 或 触发触摸屏
Function1();//播放提示语音
Delay();//等待播放完毕
//读取M1卡信息
Function2();
Delay();//等待读卡数据返回
//播放提示语音
Function3();
Delay();//等待播放完毕
//M1卡数据交互,判定下一步操作及提示
Function4();
Delay();//等待数据处理完毕
……
……
}
提出“switch 外加定时中断”理论,主要方便初学者理解单片机程序大概的“逻辑框架”。switch 是一个万能语句,它外加 while 与 for 循环就可以做任何复杂的算法,比如,搜索算法,运动算法,提取关键词算法,等等。它外加定时中断,就可以搭建一个系统的基本框架。比如,做通信的程序框架,人机界面的程序框架,按键服务的程序框架,等等。switch 的精髓在于“根据条件进行步骤的灵活切换”。
#include
sbit led0 = P0^0;
uinsigned char time_500ms_flag = 0; //500ms标志位
uinsigned char led_state = 0; //状态缓存
void initT0()
{
TMOD |= 0x01; //使用方式1,16位定时器
TH0 = (65536-50000)/256; //给TH1和TL1初初值,计数器由15536开始计数,到65535溢出
TL0 = (65536-50000)%256; //外部晶振为12MHz,对应的延时时间为50ms
EA = 1; //总中断打开
ET0 = 1; //定时器中断打开
TR0 = 1; //定时器开关打开
}
void main()
{
//初始化定时器
initT0();
initT1();
//初始化led灯
led0 = 0;
while(1)
{
switch(led_state)
{
case 0:
if( time_500ms_flag )
{
time_500ms_flag = 0;
led_state = 1;
//=========任务========
led0 = 1;
//---------------------
}
break;
case 1:
if( time_500ms_flag )
{
time_500ms_flag = 0;
led_state = 0;
//=========任务========
led0 = 0;
//---------------------
}
break;
default: break;
}
}
}
//===============================
//t0定时器中断服务程序
//每隔50ms进入一次该程序
//===============================
void t0Intr() interrupt 1
{
static unsigned int num;
TH0 = (65536-50000)/256;
TL0 = (65536-50000)%256;
if( !time_500ms_flag )
{
num++;
if( num >= 10 )
{
num = 0;
time_500ms_flag = 0xff;
}
}
}
//--------------------------------
用个小程序说明这框架的主要思路,这框架可拓展性很强,时效性有保证,可以满足很多项目的需求,但是这框架最致命的是遇到需要长时间关闭单片机所有中断的项目,因为有些协议是不能被中断打断,有兴趣的可以留意后续推文。
全部0条评论
快来发表一下你的评论吧 !