60S定时计数

#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];                //输出显示信号
			 }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不恭却星辰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值