下面说的单片机也主要是51与台系芯片,也就是现在的工作。其它应用不在讨论范围。才识有限,也敬请前辈们勘误,指教。
一个真正意义的单片机系统肯定会是多任务的,怎样建立一个多任务程序的框架
1 前后台系统:
前台是中断程序,后台是执行主程序,当中断来了,就转到前台来执行时间性要求高的任务。不断的切换。
2 分时扫描(主程序中执行)
分时扫描思想:
分时扫描就是在中断中采用一些时间标志,在主程序里分时处理功能模块;
时间精度要求很高的只能在中断中处理(比如单工通讯),但中断中尽量不要写过多的程序(计时程序是必须的);
这种方法好想也叫时间片扫描;
核心思想实现的几个步骤:
第一, 用中断来计时,中断时间50或100us(这是我的习惯,数值根据自己程序设置);
第二, 在中断程序中以50或100us为基准 放3个计时器(就是计数器)并有时间标志;100US 1MS 10MS 500MS 都可行 但时间要求精准
第三, 在主程序的循环里面放一个专门处理时间的子程序。
第四,“程序是跑着来等,而不是站着来等”,(引用别人的话)
/**************************************************************************************************
程序名称:T2中断处理 功能描述:定时100US中断一次 中断10次=100x10=1Ms
输入变量:
输出变量:无
影响标志位:
***************************************************************************************************/
void Timer2_ISR() interrupt 5
{
TF2=0; //中断到来
B_100USFlag=1; //100us时间标志
R_1MSCount++; //1MS计数器++
if(R_1MSCount==10) //判断1MS时间是否到
{
R_1MSCount=0; //清除数据
B_1MSFlag=1; //1MS时间标志
R_10MSCount++; //10MS计数器++
if(R_10MSCount==10) //判断10MS时间是否到
{
R_10MSCount=0; //清除数据
B_10MSFlag=1; //10MS时间标志
}
}
}
接下来看看我的主程序
while(1)
{
这里清除看门狗
//===========================1OOUS处理的事件=============================
if(B_100USFlag==1)
{
B_100USFlag=0;
ADCScan_Por(); //ADC检测程序
}
//===========================1ms处理的事件=============================
if(B_1MSFlag==1)
{
B_1MSFlag=0;
Key_Scan(); //按键程序
ADC_ValPor(); //AD数据处理子程序(也可以在10MS处理)
}
//===========================10ms处理的事件=============================
if(B_10MSFlag==1)
{
B_10MSFlag=0;
LCD_Por(); //LDC显示子程序
}
}
很是简单明了吧!我一直是这样用的;觉得还好,当然,这里只是说一种可行的办法而已,不是说只有这种办法,如果大家有好的思想也分享一下哦,
编写程序是一门艺术,写出来很容易,但是写得好,写得精巧,那就很难了。
3)无特殊要求要将看门狗与低压复位打开(具体要求根据实际情况进行配置)
最后感谢大家能看完,在下还是菜鸟,希望能得到前辈们的指导,拜谢
2014/3/23
四非人
|