⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 51time.c

📁 数字时钟.在基于单片机系统的数字钟电路中,输入装置是按键开关.
💻 C
字号:
#include<reg51.h>
#include<absacc.h>
#define unit unsigned int
#define uchar unsigned char

/*定义字型字位口*/
#define DIGPORT  XBYTE[0X8000]
#define WORDPORT  XBYTE[0x4000]

/*定义P1口各管脚*/
sbit K0=P^0;
sbit K1=P^1;
sbit K2=P^2;
sbit BEEP=P1^3;
sbit L0=P1^4;
sbit L1=P1^5;
sbit L2=P1^6;
sbit L3=P1^7;

uchar data BUFFER[2]={0,0};      /*显示缓冲区(依次为低位,高位)*/
uchar data CLOCK[4]={0,0,0,0};   /*存放时钟时间(依次为百分秒,秒,分和时位)*/
uchar data SECOND[2]={0,0};      /*存放秒表时间(依次为百分秒,秒)*/
uchar data REVERSE[4]={0,0,0,0}; /*存放倒计时时间*/

/*定义运行状态*/
uchar data STATE=0;
/*STATE=0,秒表*/
/*STATE=1,倒计时分调整*/
/*STATE=2,倒计时小时调整*/
/*STATE=3,倒计时运行*/
/*STATE=4 or 7,时钟运行*/
/*STATE=5,时钟分调整*/
/*STATE=6,时钟时调整*/

bit bdata SND=0;      /*秒表START*/
bit bdata RST=0;      /*秒表RESET*/
bit bdata STP=0;      /*倒计时STOP*/

/*数码管显示编号“0”-“9”,“A”,“-”*/
uchar code TABLE[]={0X3f,0x06,0x5b,0x4f,0x66,0x6dm0x7d,0x07,0x7f,0x6f,0x77,0x40};

void display(void)
{
	uchar i;                   /*显示缓冲区首址*/
	uchar delay;               /*显示延时*/
	uchar disp;                /*显示内容*/
	uchar digit;               /*定义数码管显示位*/
	digit=0x08;
	for(i=0;i<2;i++)           /*秒表,显示百分秒和秒*/
	{
		if(BUFFER[i]>100)disp=BUFFER[i]&10+10;
	  else disp=BUFFER[i]%10;
	  
	  DIGPORT=digit;
	  WORDPORT=TABLE[disp];
	  for(delay=0;delay<=200;delay++);
	  digit=digit>>1;
	  disp=BUFFER[i]/10;
	  
	  DIGPORT=digit;
	  WORDPORT=TABLE[disp];
	  
	  for(delay=0;delay<=200;delay++);
	  digit=digit>>1;
	}
}

void main(void)
{
	uchar stabak;               /*上一次程序运行的状态*/
	P1=0x0f;
	EA=1;IT1=1;ET0=1;
	
	TMOD=0x61;                  /*T1方式2计数,T0方式1计时*/
	TH0=-5000/256;TL0=-500%256;
	TH1=0xff;TL1=0xff;
	T2CON=0;TH2=-5000/256;TL2=-5000%256;
	
	K0=1;K1=1;K2=1;
	STATE=P1&0x07;
	stabak=STATE;
	
	for(;;)
	{
		switch(STATE)
		{
			case0:
				{
					EX1=0;ET1-1;ET2=1;TR1=1;SND=1;
					L1=1;L0=0;L2=0;
					SECOND[0]=0;
					SECOND[1]=0;
				}break;
				
			case1:
				{
					EX1=0;ET1=1;ET2=1;TR1=1;TR2=0;
					L2=1;L0=0;L1=0;
					REVERSE[0]=0;
					REVERSE[1]=0;
				}break;
				
			case2:
				{
					EX1=0;ET1=1;ET2=1;TR1=1;TR2=0;
					L2=1;L0=0;L1=0;
					REVERSE[0]=0;
					REVERSE[1]=0;
				}break;
			
			case3:
				{
					EX1=0;ET1=1;ET2=1;TR1=1;
					if((REVERSE[2]==0)&&(REVERSE[3]==0))L2=1;
					else TR2=1;
					L0=0;L1=0;
				}break;
			
			case5:
				{
					IE1=1;EX1=1;ET1=0;ET2=1;TR0=0;
					L0=1;L2=0;L2=0;
				}break;
				
			case6: /*STATE=6,时钟时调整*/
				{
					IE1=0;EX1=1;ET1=0;ET2=1;TR0=0;
					L0=1;L1=0;L2=0;
				}break;
				
			default:
				{
					EX1=0;ET1=0;ET2=1;TR0=1;
					L1=0;L2=0
				}
			}
			
			while(STATE==stabak)
			{
				switch(STATE)
				{
					case0:
						{
							BUFFER[0]=SECOND[0];
							BUFFER[1]=SECOND[1];
						}break;
						
					case1:
					 {
						  BUFFER[0]=REVERSE[2];
						  BUFFER[1]=101;/*A-*/
					  }break;
					  
					case2:
						{
							BUFFER[0]=110;/*-A*/
							BUFFER[1]REVERSE[3];
						}break;
						
					case3:
						{
							BUFFER[0]=REVERSE[2];
							BUFFER[1]=REVERSE[3];
						}break;
						
					case5:
						{
							BUFFER[0]=CLOCK[2];
							BUFFER[1]=101;/*A-*/
						}break;
						
					case6:
						{
							BUFFER[0]110;/*-A*/
							BUFFER[1]=CLOCK[3];
						}break;
						
					default:                     /*STATE=4or7时,时钟运行*/
						{
							BUFFER[0]=CLOCK[2];
							BUFFER[1]=CLOCK[3];
						}
					}
					//显示子程序
					display();
					K0=1;K1=1;K2=1;
					STATE=P1&0x07;
				}
				stabak=STATE;
			}
		}
	}
}

void timer0(void)  interrupt 1 using 1
{
	/*重置定时初值*/
	TH0=-5000/256;
	TL0=-5000%256;
	/*时钟处理*/
	CLOCK[0]=CLOCK[0]+1;
	if((CLOCK[0]==50)&&(STATE>=4))
	{
		L0=!L0;
	}
	if(CLOCK[0]==100)
	{
		if(STATE>=4)L0=!L0;
		CLOCK[0]=0;
		CLOCK[1]=CLOCK[1]+1;
		if(CLOCK[1]==60)
		{
			CLOCK[1]=0;
			CLOCK[2]=CLOCK[2]+1;
			if(CLOCK[2]==60)
			{
				CLOCK[1]=0;
				CLOCK[2]=CLCOK[3]+1;
				if=(CLOCK[2]==24)
				{
					CLOCK[3]=0;
				}
			}
		}
	}
}

void timer2(void)interrupt 5 using 3
{
	TF2=0;
	TH2=-5000/256;
	TL2=-5000%256;
	/*秒表处理*/
	if(STATE==0)
	{
		SECOND[0]=SECOND[0]+1;
		if(SECOND[0]==50)
		{
			L11=!L1;
		}
		if(SECOND[0]==100)
		{
			L1=!L1;
			SECOND[0]=0;
			SECOND[1]=SECOND[1]+1;
			if(SECOND[1]==100)
			{
				SECOND[1]=0;
			}
		}
	}
	/*倒计时处理*/
	if(STATE==3)
	{
		REVERSE[0]=REVERSE[0]+1;
		if(REVERSE[0]==50)
		{
			L2=!L2;
		}
		
		if(REVERSE[0]==100)
		{
			L2=!L2;
			REVERSE[0]=0;
			REVERSE[1]=REVERSE[1]+1;
			if(REVERSE[1]==60)
			{
				REVERSE[1]=00;
				REVERSE[2]=REVERSE[2]-1;
				if((REVERSE[2]==0)&&(REVERSE[3]==0))
				{
					TR2=0;
					STP=1;
					BEEP=0;
				}
				else if(REVERSE[2]==0xff)
				{
					REVERSE[2]=59;
					REVERSE[3]=REVERSE[3]-1;
				}
			}
		}
	}
}

void intsvr1(void) interrupt 2 using 2
{
	if(STATE==5)
	{
		CLOCK[2]=CLOCK[2]+1;
		if(CLOCK[2]==60)CLOCK[2]=0;
	}
	if(STATE==6)
	{
		CLOCK[3]=CLOCK[3]+1;
		if(CLOCK[3]==24)CLOCK[3]=0;
	}
}

void timer(void)  interrupt 3 using 3
{
	if(STATE==0)
	{
		if(RST)
		{
			SECOND[0]=0;
			SECOND[1]=0;
			L1=1;
			RST=0;
		}
		
		else
		{
			if(SND)TR2=1;
			else
			{
				L1=1;
				TR2=0;
				RST=1;
			}
			SND=!SND;
		}
	}
	else if(STATE==1)
	{
		REVERSE[2]=REVERSE[2]+1;
		if(REVERSE[2]==60)REVERSE[2]=0;
	}
	
	else if(STATE==2)
	{
		REVERSE[3]=REVERSE[3]+1;
		if(REVERSE[3]==24)RVERSE[3]=0;
	}
	else
	{
		if(STP)
		{
			BEEP=1;
			L2=1;
			STP=0;
		}
		else TR2=0;
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -