英锐恩单片机论坛,Microchip单片机,模拟器件,接口电路,麦肯单片机,单片机应用交流
标题:
如何有效的实时控制LED闪烁。
[打印本页]
作者:
winnie
时间:
2009-3-24 14:09
标题:
如何有效的实时控制LED闪烁。
在很多设计中需要有精彩而实用的LED闪烁来表示设备工作正常与否和工作状态。
在一些实时性要求不高的设计中可以用插入延时来控制LED闪烁。
它的缺点现而易见:1:LED闪烁方式反映慢。2:在延时过程不能干其它工作(中断除外),浪费了资源。3:代码雍长,真正控制LED就几个个指令,其它的延时代码占了99%的空间。
如果用TMR1或TMR2来做一个时钟,上面的种种缺点就可以避免,使得你可以腾出大量的时间做更有效的工作。
下面是用TMR1作时钟的C代码(RB1、RB2、RB3控制LED)示例:
void set_tmr1(){
TMR1L=0xdc;
TMR1H=0xb; /*设定初值3036*/
T1CON=0B10001; /*设定TMR1 0.125s溢出一次*/
}
void interrupt time(){
if(TMR1IF){
T1CON=0B10000; /*关闭TMR1*/
TMR1L=0xdc;
TMR1H=0xb; /*TMR1设初值*/
T1CON=0B10001; /*从新设分频比,打开TMR1*/
if(s++>8){ /*每S清0*/
s=0;
if(ss++>60)/*每分钟清0*/
ss=0;
}
TMR1IF=0;
return;
}
}
unsigned char s; /*每0.125S累加1*/
unsigned char ss; /*每1秒累加1*/
void main(){
set_tmr1();
........; /*设定I/O口,开TMR1中断*/
while(1){
if(...) /*判断闪烁方式语句,下同*/
RB1=(bit)(s>4); /*每1s闪烁一次,占空比50%(调节>后面值可以改变)*/
if(...)
RB2=(bit)(!ss); /*每1分钟闪烁一次,亮1秒,熄59秒*/
if(...)
RB3=(bit)(s==0 || s==2 || s== 4 || s== 6); /*每0.25S闪烁一次*/
.........; /*其它工作*/
}
}
这样的框架对于基于要求实时性高的软件查询的程序是很有效的。
欢迎光临 英锐恩单片机论坛,Microchip单片机,模拟器件,接口电路,麦肯单片机,单片机应用交流 (http://enroobbs.com/)
Powered by Discuz! X3.2