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

📄 main.c

📁 <基于单片机的数字钟设计> 个人做的毕业设计,带Protel图,源代码用proteus软件仿真通过,附有毕设论文
💻 C
字号:
#include <reg52.h> 	  
#include <absacc.h>	  
#define  uint unsigned int 	 
#define  uchar unsigned char 
//
#define DPSEC 0						   	//Clock[DPSEC]数组的元素0,存放时钟时间 DPSEC:Second  
#define DPMIN 1						   	//Clock[DPMIN]数组的元素1,存放时钟时间 DPMIN:minute  
#define DPHOUR 2					   	//Clock[DPHOUR]数组的元素2,存放时钟时间 DPHOUR:hour  
#define WHMILSEC 0						//Watch[WHMILSEC]数组的元素0,存放秒表时间 WHMILSEC:milliSecond  
#define WHSEC 1	  						//Watch[WHSEC]数组的元素1,存放秒表时间 WHSEC:Second

#define KEYMIN 14						//按键号:分钟加一
#define KEYHOUR	 13						//按键号:小时加一
#define KEYSTARPRESS 11					//按键号:秒表启动/停止

#define CLOCKMODE 0						//时钟模式 

//定义管脚 
sbit K0=P1^0;	 						//时钟分钟调整键
sbit K1=P1^1;	  					   	//时钟小时调整键
sbit K2=P1^2;	  						//秒表启动停止键
sbit K4=P3^2;							//时钟/秒表状态切换键
sbit BELL=P1^7;							//响闹输出端
uchar data ClockMode=CLOCKMODE;			//时钟/秒表模式标记位-CLOCKMODE:时钟 1:秒表
uchar data SwitchClockMode=0;			//时钟/秒表状态切换标记-0:没有发生过切换1:发生过切换
uchar data DecSec=0;					//秒的分频位
uchar data Refersh=6;					//数码管个数
uchar data Clock[3]={0,0,0};			//存放时钟时间(依次是秒,分,时)
uchar data Watch[2]={0,0};				//存放秒表时间(依次是百分秒,秒,分)		 
uchar data Buffer[6]={0,0,0,0,0,0};    	//显示缓冲区(依次从低位到高位,共6位数码管)	 
uchar code TABLE[]={0xC0,0xf9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x98,0xbf};  
		//共阳数码管显示"0"-"9","-" 
/*------声明区--------*/  
void delay();                           //显示延时函数
void addTime(uchar mode);              	//调整时间时加1子函数
uchar key();	 						//按键函数
void bell(void);						//闹铃函数
void clockDisplay( uchar ClockMode );				//显示函数

void main(void)	  	   					//主函数体
{				  
	uchar data keyLockFlag=0;			//按键延迟锁标记位,1:表示锁定
	uchar data keyLock=0;	 			//
	uchar data keyValue;				//键值暂存
	uchar data startWatch=1;			//秒表状态
	EA=1;EX0=1;ET0=1;ET1=1;ET2=1;     	//开总中断源,开外部中断1,开Timer0,Timer1中断	 
	IT0=1;								//下降沿触发  
    TMOD=0x11;                       	//T1方式1计数,T0方式1计时	
    TH0=0X54;TL0=0;         			//初始化计数器0初值			
	TH1=0X10;TL1=0;         			//初始化计数器1初值
	TH1=0;TL1=0;         			//初始化计数器1初值			
	TR0=1;TR1=0;TR2=1;					//启动定时器
					
    while(1)  									//主循环
    {
	//-----------时钟模式------------//
		while( ClockMode == CLOCKMODE )			//如果选择时钟模式
		{	
			if( SwitchClockMode == 1  )				//如果时钟/秒表状态切换
			{
				clockDisplay( CLOCKMODE );			//显示
				SwitchClockMode=0; 					//清除切换标记位
			}

			keyValue=key();	 
        	switch(keyValue)  		   				//按键跳转
        	{			   
          		case KEYMIN:                    	//时钟按键分调整程序	   
            	{	
					keyLockFlag=1;					//按键调节时钟后,时钟不是立刻走时,而是等待2秒钟
                	TR0=0;							//关闭定时器,时钟停止运行	 
                	addTime(keyValue);                	//调用调节时钟加1函数	
					delay();delay();delay();										  
            	} break;	
            	case KEYHOUR:                      	//时钟按键小时调整程序  
            	{
					keyLockFlag=1;
                	TR0=0;							
                	addTime(keyValue);                	//调用调节时钟加1函数	
					delay();delay();delay();										  
            	} break;	
				default :break;
			 }
			if(keyLockFlag == 1)			   		//按键延迟锁延迟约两秒
			{	
				if(++keyLock == 20 )
				{	
					keyLockFlag=0;keyLock=0;
					TR0=1;							//时钟设置完毕开始运行
				}
			}
 			clockDisplay( ClockMode );				//刷新时钟显示

		} 

	//-----------秒表模式------------//
		while( ClockMode != CLOCKMODE )				//如果选择秒表模式
		{
			if( SwitchClockMode == 1 )				//如果时钟/秒表状态切换
			{
				Buffer[0]=0; 						//显示'-'  	
				Buffer[1]=0;   	
           		Buffer[2]=0;		  
           		Buffer[3]=0;   	  
          		Buffer[4]=10; 	 	
             	Buffer[5]=10;  
				Watch[WHMILSEC]=0;   				//
             	Watch[WHSEC]=0;		  				//预置秒表值

			  	TR1=0;
				SwitchClockMode=0; 					//清除切换标记位	
			}

			keyValue=key();	 
        	if( keyValue == KEYSTARPRESS )			//如果秒表启动停止按键按下
			{  	
				if( startWatch == 0 )
				{
					TR1=1;					 	   		//启动定时器
					startWatch=1;
				}
				else
				{
					TR1=0;
					startWatch=0;
				}
				delay();delay();delay();delay();delay();delay();										  
			}

			clockDisplay( ClockMode );							//显示
        }
    } 	 
}	
void time0(void) interrupt 1 using 2
{	
	TH0=0X112;	 	 
	TL0=0x30;										//计时器放入预置时间,大概10毫秒
	DecSec++;
	if(DecSec==16)
	{	DecSec=0;
		Clock[DPSEC]++;                     		//秒位加1	 
		if(Clock[DPSEC]==60)               			//1分钟到 
		{ 												   
			Clock[DPSEC]=0;                   		//秒位清0 
			Clock[DPMIN]++;                 		//分位加1 
			if(Clock[DPMIN]==60)              		//1小时到 
			{                                    		  
				Clock[DPMIN]=0;                		//分位清0 
				Clock[DPHOUR]++;					//时位加1
       			if(Clock[DPHOUR]==24)				//24小时到
         		{											
         			Clock[DPHOUR]=0;				//时位清0	
        		} 				   
    		}  
		} 
	}
}
void bell(void)
{ 	
	BELL=1;delay();delay();delay();delay();delay();
	BELL=0;delay();delay();delay();delay();delay();
	BELL=1;delay();delay();delay();delay();delay();
	BELL=0;delay();delay();delay();delay();delay();
	BELL=1;
}
void intsrl(void) interrupt 0 using 2 	//外中断IT0中断服务子函数,K3按键触发
{			 
	SwitchClockMode=1;									//置位切换标志位
	if( ClockMode == CLOCKMODE )						//如果在时钟模式下运行
	{	
		ClockMode=1;									//转到秒表模式下运行
	}
	else
	{
		ClockMode= CLOCKMODE;
	}												  
}
void time1(void) interrupt 3 using 2
{	

	TH1=0Xe0;	 	 
	TL1=0x10;										//计时器放入预置时间,大概10毫秒
	Watch[WHMILSEC]++;                     			//毫秒位减1	 
	if(Watch[WHMILSEC]==99)               			//0.1秒到 
	{ 												   
		Watch[WHMILSEC]=0;                   		//毫秒位清0 
		Watch[WHSEC]++;                 			//秒位减1 
		if(Watch[WHSEC]==99)              			//1秒到 
		{   Watch[WHSEC]=0;                                 		  
			bell();									//报警
  		}  
 	}
}	 
void time2(void) interrupt 5 using 2             	//定时器T2中断服务子函数	 
{	
	TF2=0;
	TH2=0Xe0;	 	 
	TL2=0x00;										//计时器2放入预置时间,大概10毫秒
	switch(--Refersh)
	{	case 0:P2=32;break;	   
		case 1:P2=16;break;	   
		case 2:P2=8;break;	   
		case 3:P2=4;break;	   
		case 4:P2=2;break;
		case 5:P2=1;break;	   
	}
	P0=TABLE[Buffer[Refersh]];                   				//输入要显示数据
	if(Refersh==0) Refersh=6; 

						
}
void addTime(uchar mode)					//加1子函数	
{					
    switch(mode)                         			//判断当前状态	 
    {													  
        case KEYMIN:                           		//时钟分调整时   
        {												  
      		Clock[DPMIN]++;  						//分位加1		
       		if(Clock[DPMIN]==60)      				//到60时	   
          	{								  
        		Clock[DPMIN]=0;       				//分位清0	   
          	}								
     	}break;  
        case KEYHOUR:                         		//时钟时调整	
        {											  
     		Clock[DPHOUR]++;  						//时位加1
        	if(Clock[DPHOUR]==24)      				//24小时到 
       		{	 
       			Clock[DPHOUR]=0;       				//时位清0	
        	}
		}break;
    }		   
}
void clockDisplay( uchar ClockMode )                		//动态显示函数  
{														
	if(ClockMode == CLOCKMODE)						//时钟模式
	{
		Buffer[0]=Clock[DPSEC]%10;   				//数码管显示秒个位
		Buffer[1]=Clock[DPSEC]/10;   				//秒十位 
    	Buffer[2]=Clock[DPMIN]%10;					//分钟个位  
     	Buffer[3]=Clock[DPMIN]/10;   				//分钟十位  
     	Buffer[4]=Clock[DPHOUR]%10; 				//小时个位 	
    	Buffer[5]=Clock[DPHOUR]/10;   				//小时十位  
 	}
	else
	{
		Buffer[0]=Watch[WHMILSEC]%10;   				//数码管显示秒个位
		Buffer[1]=Watch[WHMILSEC]/10;   				//秒十位 
    	Buffer[2]=Watch[WHSEC]%10;					//分钟个位  
     	Buffer[3]=Watch[WHSEC]/10;   				//分钟十位  
	}
/*
    disp=Buffer[--Refersh];        	  				//刷新
	switch(Refersh)
	{	case 0:P2=32;break;	   
		case 1:P2=16;break;	   
		case 2:P2=8;break;	   
		case 3:P2=4;break;	   
		case 4:P2=2;break;
		case 5:P2=1;break;	   
	}
	P0=TABLE[disp];                   				//输入要显示数据
	delay10ms();
	if(Refersh==0) Refersh=6; 
	*/
}
uchar key(void)						 		//键盘输入
{	
	uchar i;
	i= P1&0x0f;
	if(i != 0x0f)									//键盘屏蔽
	{	
		i= P1&0x0f;
		if(i != 0x0f)			
		{	return (P1&0x0f);
		}
	}
	else return 0;
}

void delay(void)  						//键盘去抖延时
{		 
    uchar j,i;		
  	for(j=0;j<=40;j++)	
		for(i=0;i<=200;i++); 
}				 

⌨️ 快捷键说明

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