定时器的应用

本段代码与定时器的简单应用有关。

使用数码管进行倒计时的显示。

主要功能就是先设置一个倒计时所需要的时间,然后按下 “启动” 按键进行开始倒计时。并且可以按下 “置零” 键进行时间置零并且蜂鸣器响起。最后可以按下 “重置” 键进行倒计时的重置。

本段代码默认设置的倒计时的时间是45分钟,如果想要更改成自己想要的时间可以直接进行更改。

(在 #define time 后进行更改。单位为:分钟,最大可以设置999分钟)

(本人学习单片机也没有很长时间,如果有不足或者宝贵的意见还请给予指出,十分感谢!)

#include <REGX52.H>

typedef unsigned int u16;
typedef unsigned char u8;

sbit LSA=P2^0;         //定义74HC138位选端口
sbit LSB=P2^1;
sbit LSC=P2^2;
sbit k1=P3^2;          //定义按键
sbit k2=P3^3;
sbit k3=P3^4;
sbit ring=P1^5;        //定义蜂鸣器端口

#define time 45       //设置倒计时的时间,这里设置的45分钟(需要倒计时多少可直接对其更改--单位:分钟)

u16 min=time;
int sec;
u8 code smgnum[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
					0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};

void keypros();
void mode1();
void mode2();
void mode3();					
					
void delay(unsigned int xms)		//@12.000MHz晶振--带参延时函数,延时一毫秒
{
	unsigned char i, j;
	while(xms--)
	{
		i = 2;
		j = 239;
		do
		{
		  while (--j);
		} while (--i);
	}
}

void Timer0Init()                  //定时器初始化 
{
	TMOD|=0X01;

	TH0=0XFC;	
	TL0=0X18;	
	ET0=1;
	EA=1;
	TR0=0;		
}

void DigDisplay(unsigned char sec)  //数码管显示
{
	LSA=0;LSB=0;LSC=0;
	P0=smgnum[min/100];
	delay(1);
	P0=0x00;
	
	LSA=1;LSB=0;LSC=0;
	P0=smgnum[min/10%10];
	delay(1);
    P0=0x00;
	
	LSA=0;LSB=1;LSC=0;
	P0=smgnum[min%10];;
	delay(1);
	P0=0x00;
	
	LSA=0;LSB=0;LSC=1;
	P0=0x40;
	delay(1);
	P0=0x00;
						
	LSA=0;LSB=1;LSC=1;
	P0=smgnum[sec/10%10];
	delay(1);
	P0=0x00;
			
	LSA=1;LSB=1;LSC=1;
	P0=smgnum[sec%10];
	delay(1);
	P0=0x00;
}					

void keypros()               //按键
{
	if(k1==0 && TR0==0)
	{
	  delay(20);
	  if(k1==0 && TR0==0)
		{
		 mode1();
		}
		while(!k1);
	}
	
	if(k2==0)
	{
	  delay(20);
	  if(k2==0)
	  mode2();
	  while(!k2);
	}	
		
	if(k3==0)
	{
	  delay(20);
      if(k3==0)
	  mode3();
	  while(!k3);
	}
}

void mode1()           //模式一:开始倒计时
{
	sec=60;
	min-=1;
	TR0=1;
}

void mode2()           //模式二:时间置零,蜂鸣器响起
{
	TR0=0;
	sec=0;
	min=0;
	ring=0;
}	

void mode3()           //模式三:重置时间
{
	TR0=0;
	min=time;
	sec=0;
	ring=1;
}

void main()           //主函数
{ 
	sec=0;
	Timer0Init();
	while(1)
	{		
		DigDisplay(sec);
		keypros();	
	}
}

void Timer0() interrupt 1      //定时器
{
	static u16 i;
	TH0=0XFC;	
	TL0=0X18;
	i++;
	if(i==1000)
	{
		i=0;
		sec--;
	}
	
	if(sec<0)
	{
		min--;
		sec=59;
	}
	
   if(min==0 && sec==0)
	{	
		TR0=0;
		ring=0;
	}	
}

附上仿真图

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值