2-独孤九剑第一招:定时器
前提是已经了解了定时器的工作原理,编写定时器时,如按此思路走犹如独孤九剑的心法口诀,“口诀”如下:
1、对TMOD赋值,以确定是定时器0,定时器1的两者之一或者两者同时工作;
2、计算初值,分别给TH0,TL0或TH1,TL1赋计算初值;
3、开总中断EA=1;
4、开定时器中断T0:ET0 = 1;
5、开启定时器T0开始计数:TR0 = 1或者直接对TCON(定时器/计数器控制寄存器)进行控制TCON = 0x10;
在调试过程中遇到代码烧录到芯片中,但是led不显示数字,然后通过对代码注释,用d0发光二极管来作为调试显示结果,找出错误地方在:把开启定时器计数直接写为了T0 = 1导致,错因在于:控制开启计数在TCON控制寄存器没有想到,直接写了。
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit d0 = P1^0;
sbit dula = P2^6;                                  
sbit wela = P2^7;
uint sum;
uchar num;
uchar coun;
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
uchar code love[]={
0x7d,0x06,0x07,0x5b,0x3f,0x06,0x66,0x06,0x4f
};
uchar code leds[]={
0xfe,0xfd,0xfb,
0xf7,0xef,0xdf
};
void main()
{
        //先给定时器0赋初值
        TMOD=0x01;//设置定时器0为工作方式1
        TH0 = (65535-5000)/256;
        TL0 = (65535-5000)%256;
        
        EA  = 1;//开总中断
        ET0 = 1;//开定时器0中断
        TR0  = 1;//开启定时器0或者TCON = 0x10;
        sum = 0;
        num = 0;
        coun = 0;
        while(1)
        {
            if (sum == 20)
            {                               
                d0 = 0;//用来测试用
                //打开锁存器74HC573进行位选
                wela = 1;
                P0 = leds[num];
                //关闭位选
                 wela = 0;
        
                //打开锁存器74HC573进行段选
                dula = 1;
                P0 = love[coun];
                //关闭段选
                dula = 0;
                num = (num+1)%6;
                coun = (coun+1)%9;
                sum = 0;
            }
        }
        
        
}
void timer0() interrupt 1
{
        sum++;
        TH0 = (65535-5000)/256;
        TL0 = (65535-5000)%256;
}
                    
                
                
            
        
浙公网安备 33010602011771号