8052单片机中定时器T2的应用
扫描二维码
随时随地手机看文章
52单片机的大家都熟悉,可是其中的Timer2很少有人去用,书上和网上鲜有资料,这里转载一篇文章,初步了解一下他的应用
/***********************************************************
程序功能:52系列单片机定时器计数器2使用
程序设计:燕山大学鲁信琼
晶振选择:24MHz,如果晶振不匹配,请修改延时函数参数;P2^6口接数码管段选控制位;P2^7口接数码管位选控制位;P1^7口作为测试指示灯
本实验注意事项:
1.定时器2的中断使能为IE^6位,也就是ET2;中断服务程序标号为5。
2.定时器2工作在16为自动重装模式下,不需要在中断服务程序中重新赋初值,在程序初始化的时候我们应该给RCAP2L和RCAP2H赋值,TH2和TL2将会在
中断产生时自动使TH2=RCAP2H,TL2=RCAP2L。
3.定时器2的中断标志位TF2不能够由硬件清零,所以要在中断服务程序中将其清零,为了使定时尽量准确,我们常在终端服务程序中第一步就使TF2=0。
4.使定时器2产生中断的有两个中断源,如果EXEN2(定时器2外部使能标志)置1的话,使定时器2进入中断的有可能是定时器2计数溢出,也可能是捕获
到T2EX(单片机P1^1口)有负跳变,所以需要在中断服务程序中判断EXF2是否为1。
***********************************************************/
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
#defineLED_DATAP0
sbitDULA=P2^6;
sbitWELA=P2^7;
sbitLED=P1^7;
uchartimer2_ctr,num;
ucharcodetable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x40,0};
//0123456789ABCDEF-
//24MHz晶振延时x毫秒函数
voiddelay_ms(uintxms)
{
uintx,y;
for(x=xms;x>0;x--)
for(y=248;y>0;y--);
}
//初始化主函数
voidinit_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;//10100000开总中断,开外定时器2中断,可按位操作:EA=1;ET2=1;
TR2=1;//启动定时器2
}
//数码管显示3位数:0-255
voiddisplay(ucharnum)
{
uchargw,sw,bw;
bw=num/100;
sw=num%100/10;
gw=num%10;
LED_DATA=0XFE;//11111110
WELA=1;
_nop_();_nop_();
WELA=0;
LED_DATA=table[bw];
DULA=1;
_nop_();_nop_();
DULA=0;
delay_ms(3);
LED_DATA=0XFD;//11111101
WELA=1;
_nop_();_nop_();
WELA=0;
LED_DATA=table[sw];
DULA=1;
_nop_();_nop_();
DULA=0;
delay_ms(3);
LED_DATA=0XFB;//11111011
WELA=1;
_nop_();_nop_();
WELA=0;
LED_DATA=table[gw];
DULA=1;
_nop_();_nop_();
DULA=0;
delay_ms(3);
}
voidmain()
{
init_main();
while(1)
{
display(num);
}
}
voidtimer2()interrupt5
{
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;
}
}
}
大家可以编译下载试试哦,我试过,可以运行,不过是12MHz的晶振。