下面说的单片机也主要是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四非人QQ:189708929