AT89S52的T2定时器如何用,如何初始化,定时器中断如何用,最好能举一个实例。

2024-12-22 19:17:55
推荐回答(1个)
回答1:

以前弄得,试试吧
#include
#include
#define uchar unsigned char
#define uint unsigned int
#define LED_DATA P0
sbit DULA=P2^6;
sbit WELA=P2^7;
sbit LED=P1^7;
uchar timer2_ctr,num;
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x40,0};
// 0 1 2 3 4 5 6 7 8 9 A B C D E F -

//24MHz晶振延时x毫秒函数
void delay_ms(uint xms)
{
uint x,y;
for(x=xms; x>0; x--)
for(y=248; y>0; y--);
}

//初始化主函数
void init_main()
{
DULA=0; //关闭数码管显示
WELA=0;

RCAP2H=(0xFFFF-50000)/256;
RCAP2L=(0xFFFF-50000)%256; //24MHz晶振下定时25ms,自动重装
TH2=RCAP2H;
TL2=RCAP2L; //定时器2赋初值
T2CON=0; //配置定时器2控制寄存器,这里其实不用配置,T2CON上电默认就是0,这里赋值只是为了演示这个寄存器的配置
T2MOD=0; //配置定时器2工作模式寄存器,这里其实不用配置,T2MOD上电默认就是0,这里赋值只是为了演示这个寄存器的配置
IE=0xA0; //1010 0000开总中断,开外定时器2中断,可按位操作:EA=1; ET2=1;
TR2=1; //启动定时器2
}

//数码管显示3位数:0-255
void display(uchar num)
{
uchar gw,sw,bw;
bw=num/100;
sw=num%100/10;
gw=num%10;

LED_DATA=0XFE; //1111 1110
WELA=1;
_nop_();_nop_();
WELA=0;
LED_DATA=table[bw];
DULA=1;
_nop_();_nop_();
DULA=0;
delay_ms(3);

LED_DATA=0XFD; //1111 1101
WELA=1;
_nop_();_nop_();
WELA=0;
LED_DATA=table[sw];
DULA=1;
_nop_();_nop_();
DULA=0;
delay_ms(3);

LED_DATA=0XFB; //1111 1011
WELA=1;
_nop_();_nop_();
WELA=0;
LED_DATA=table[gw];
DULA=1;
_nop_();_nop_();
DULA=0;
delay_ms(3);
}

void main()
{
init_main();
while(1)
{
display(num);
}
}

void timer2() interrupt 5
{
TF2=0; //!!!注意!!! 定时器2必须由软件对溢出标志位清零,硬件不能清零,这里与定时器0和定时器1不同!!!
timer2_ctr++;

if(timer2_ctr>=40) //定时25ms×40=1000ms即1秒钟,这里模拟一个60秒秒表
{
timer2_ctr=0;
LED=~LED;
num++;
if(num>=60)
{
num=0;
}
}
}