#include<reg52.h>
#define SEG P2 //令LED接至P2口
#define SCANP P1 //定义扫描线接至P1口
sbit LED=P0^7; //声明LED接至P0.7
//====================声明T0定时器相关参数===========================
#define count_M1 50000 //T0(Model1)的计数值,0.05s
#define TH_M1 (65536-count_M1)/256 //T0(Model1)的计数高8位
#define TL_M1 (65536-count_M1)%256 //T0(mODEL1)计数低8位
int count_T0=0; //计算T0中断次数
//====================声明T1定时器相关参数===========================
#define count_M2 250 //T1(Model2)的计数值,0.25ms
#define TH_M2 (256-count_M2) //T1(Model2)自动加载计数
#define TL_M2 (256-count_M2) //T1(Model2)计数量
char count_T1=0; //计算T中断次数
//===================声明7段LED数码管驱动信号数组(共阳)============
char TAB[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x83,0xf8,0x80,0x98};
//数字0~9译码0 1 2 3 4 5 6 7 8 9
char disp[2]={0xc0,0xc0}; //声明显示区数组,初始显示"00"
//==================声明基本变量=====================================
char seconds=0; //秒数
char scan=0; //扫描信号
//====================主程序=========================================
main()
{
IE=0x8a; //1000 1010,启动TF0,TF1中断
TMOD=0x21; //0010 0001,T1采用Model2,T0采用Model1
TH0=TH_M1;TL0=TL_M1; //设置T0计数量高8位,低8位
TR0=1; //启动定时器T0
TH1=TH_M2;TL1=TL_M2; //设置T1自动加载值、计数量
TR1=1; //启动定时器T1
LED=1; //关闭LED
while(1); //循环等待定时中断到来
}
//=================T0中断子程序--计算并显示秒数=======================
void T0_1S(void) interrupt 1 //T0中断子程序开始
{
TH0=TH_M1;TL0=TL_M1; //设置T0计数量高8低位、低8位
if(++count_T0==20) //若中断20次,即0.05x20=1s
{
count_T0=0; //重新计次
seconds++; //秒数加1
if(seconds==60) //若超过60s
{
seconds=0; //秒数归0,重新开始
LED=~LED; //切换LED状态
}
}
disp[1]=TAB[seconds/10]; //填入十位数显示区
disp[0]=TAB[seconds%10]; //填入个位数显示区
}
//=======================T1中断子程序--扫描===========================
void T1_8ms(void) interrupt 3 //T1中断子程序开始
{
if(++count_T1==32) //若中断32次,即0.25msx32=8ms
{
count_T1=0; //重新计次
if(++scan==3) scan=1; //scan取值为1或者2
SEG=0xff; //关闭7段LED数码管
SCANP=~scan; //输出扫描信号
SEG=disp[scan-1]; //输出显示信号
}
}
60S定时计数
最新推荐文章于 2023-10-12 19:08:38 发布