这是写的一个简单的测试定时器0的程序:要实现的目标是,LED第一个跟第二个灯先循环亮起,第三盏灯则以间隔一秒钟的时间亮起一次,其中,第三盏灯的亮起时间以定时器0的中断来执行,里边有亮点需要注意。
一、不要忘记中断程序中进if语句中的后的tt清零
二、不要忘了把定时器里边的语句回归哦,否则老是认为中断服务程序没返回主函数呢
三、这个if语句不应写在主函数中,因为如果写在主函数中,时序会出现问题。因为如果在main函数中的话,前边的几个delay时间会与定时器定的准确时间产生时序问题,因为delay()的时间长,早过了20个tt时间了,所以会出现时序问题!
四、另外,那个delay函数的时间也有问题,我还得重新调试下!
五、注意定时器0的初始化,中断函数不需声明等。
# include
# define uint unsigned int
# define uchar unsigned char
sbit P21=P2^0;
sbit P22=P2^1;
sbit P23=P2^2;
void delay(uint z); //延时函数声明
uchar tt;
void main ()
{
TMOD=0x01; //定时器0初始化
TH0=(65536-50000)/256; //约为50ms
TL0=(65536-50000)%256;
EA=1; //开总中断
ET0=1; //开定时器0中断
TR0=1; //启动定时器工作 */
while(1)
{
P23=1; //不要忘了把定时器里边的语句回归哦,否则
//老是认为中断服务程序没返回主函数呢
P21=0; //如果是50*20ms=1秒时候,触发中断
delay(2000); //P21与P22以约为1秒的时间间隔闪烁
P21=1;
delay(2000);
P22=0;
delay(2000);
P22=1;
delay(2000);
}
}
void delay(uint z) //延时函数,约为1秒
{
uchar x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void timer0() interrupt 1 //定时器0中断服务函数
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
tt++;
if(tt==20) //这个if语句不应写在主函数中,因为如果
{ //写在主函数中,时序会出现问题
tt=0; //千万不要忘记tt清零哇!!!!
P23=0;
delay(2000); //delay()函数还要调试,因为
//延时时间不是按照()中的数字递增而递增的
P21=1;
delay(2000);
P22=1;
delay(2000);
}
}
上一篇:51数码管动态显示程序-------调试经验
下一篇:单片机中断函数的编写
推荐阅读最新更新时间:2024-03-16 15:29