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号