×
单片机 > 单片机程序设计 > 详情

测试定时器0的程序

发布时间:2020-06-05 发布时间:
|

这是写的一个简单的测试定时器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);
           } 
}


关键字:定时器0  主函数

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
AVR熔丝位操作时的要点和需要注意的相关事项