数码管与中断的综合使用

C51定时器和计数器数码管

  • 开发板:普中51—单核-A2
  • 开发环境:Keil5
  • 参考资料:普中51单片机开发攻略、开发板原理图
  • 如有错误,感谢指正。若如侵权请联系博主

60秒倒计时计数器(精确到秒)

任务:使用动态数码管的后两个设计一个倒计时计数器,初始状态为60秒,按下K3启动倒计时,再次按下K3暂停,按第三下K3接着继续计时,按K4重新置为60秒的初始状态,暂停的时候,5管显示0。

#include

/*start=0 暂停
	start=1 启动
	stop=1 重置
*/
unsigned char num,nums=0;start=0,stop=1,i=6,j=0;																			//num计时所用,start暂停所用,stop重置所用,i为个位,j为十位
char LED[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};		//0~9LED灯的显示

sbit K3 = P3^2;
sbit K4 = P3^3;
sbit A0 = P2^2;										//INT0\1\2为74HC138译码器的输入端
sbit A1 = P2^3;
sbit A2 = P2^4;


void delay(int h){
	int i,j;
	for(i=h;i>0;i--)
		for(j=120;j>0;j--);
}

void T0_time() interrupt 1					//定时器中断,用于计时
{
	TH0 = (65536-45872)/256;      		//重装初值
	TL0 = (65536-45872)%256;					//重装初值
	if(start==1) num++;	                          //num=20为1秒
	if(num==20){
		nums = 1;
		num = 0;
	}
}

void 	Int0() interrupt 0							//外部中断0,用于控制倒计时启动、暂停
{ 
  stop = 0;
	start++;												//用于暂停标志,start=0为暂停
	if(start == 2) start = 0;
}

void Int1() interrupt 2
{
	stop = 1;											 //stop=1重置为60秒
}


void main(){
	IE=0X87; 	//1000 0111,开启EA,EX0,EX1,ET01
	IT0=1;     
	IT1=1;			//下降沿触发方式
	TR0 = 1;
	TMOD=0X01;  //T0选择方式1工作模式
	K3 = 1;
	K4 = 1;
	while(1){
		while(stop==1){				//
		A0=0;A1=0;A2 = 0;
		P0 = LED[0];delay(1);
		A0=1;A1=0;A2 = 0;
	  P0 = LED[6];delay(1);
		i = 6;
		j = 0;
		}
		if(nums==1){
		if(j==0){
			if(i!=0){
			i--;
			j = 9;}
			}else j--;
		nums = 0;
		}
		A0=0;A1=0;A2 = 0;
		P0 = LED[j];delay(1);
		A0=1;A1=0;A2 = 0;
	  P0 = LED[i];delay(1);
		if(start==0){
		A0=1;A1=1;A2 = 0;
	  P0 = LED[0];delay(1);
		}
		}
}

你可能感兴趣的:(嵌入式,单片机,嵌入式硬件,51单片机)