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

📄 keil.c

📁 基于单片机的电子钟c语言实现
💻 C
字号:
#include <reg52.h>
#include <absacc.h>
#define unit unsigned int
#define uchar unsigned char

/*定义各管脚*/
sbit P10=P1^0;         /*调整时钟的时位*/
sbit P11=P1^1;         /*调整时钟的分位*/
sbit L0=P1^4;          /*时钟正常运行指示灯,1秒亮一次*/
sbit L1=P1^5;          /*调整时钟的时位指示灯,调整时,灯亮*/                
sbit L2=P1^6;          /*调整时钟的分位指示灯,调整时,灯亮*/
 
sbit P20=P2^0;         /*给时钟分位低位送上升沿*/
sbit P21=P2^1;         /*给时钟分位高位送上升沿*/
sbit P22=P2^2;         /*给时钟时位低位送上升沿*/
sbit P23=P2^3;         /*给时钟时位高位送上升沿*/
sbit P27=P2^7;         /*用于配合中断消抖,增强抗干扰能力*/

uchar data BUFFER[2]={00,12}; 		/*显示缓冲区(依次为低位,高位)*/
uchar data CLOCK[4]={0,0,0,12};	    /*存放时钟时间(依次为百分秒,秒,分和时位)*/
uchar data BUFFER_A[2]={0,0}; 	    /*存放调整时钟时间(分和时位)*/
uchar n;                            /*用来确定时钟的状态,0正常运行,1小时调整,2分钟调整,3数据更新*/
uchar m;                            /*用来表明定时器是否到了1S,若一秒到了,则刷新显示数据*/
	
/*数码管显示编码"0"-"9","A","-"*/
uchar code TABLE[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};


void display(void)
{	

  	uchar disp;		
    disp=BUFFER[0]%10;		
	P20=0;
	P0=TABLE[disp];
	P20=1;P20=0;
	disp=BUFFER[0]/10;	
	P21=0;
	P0=TABLE[disp];
	P21=1;P21=0;
	disp=BUFFER[1]%10;		
	P22=0;
	P0=TABLE[disp];
	P22=1;P22=0;
	disp=BUFFER[1]/10;	
	P23=0;
	P0=TABLE[disp];
	P23=1;P23=0;
}



void timer0(void)  interrupt 1 using 1
{
	/*重置定时初值*/
    TH0=0x3c; TL0=0xbc;    /*定时50MS,20次为一分钟*/



	
	/*时钟处理*/
	CLOCK[0]=CLOCK[0]+1;
	if (CLOCK[0]==10)
		{
		    L0=!L0;          /*L0为正常运行指示灯,一秒闪烁一次*/
		}
	if (CLOCK[0]==20)
		{	
	        L0=!L0;
		    CLOCK[0]=0;
		    CLOCK[1]=CLOCK[1]+1;
		
		    if (CLOCK[1]==60) 
		    {
	             CLOCK[1]=0;
		         m=1;
                 CLOCK[2]=CLOCK[2]+1;
                 if (CLOCK[2]==60)
			     {
				     CLOCK[2]=0;
                   	 CLOCK[3]=CLOCK[3]+1;
				     if (CLOCK[3]==24)
				     {	
			        	 CLOCK[3]=0;	
				     }
			     }
		     }
	    }	
}
void main()
{
	EA=1; ET0=1;IT1=1;
	TMOD=0x01;				/*T0方式1计时*/
	TH0=0x3c; TL0=0xbc; 
	P20=0;P21=0;P22=0;P23=0;
	TR0=1;
	display();
	n=0;
	m=1;
    
for(;;)
{

	if(n==1)    /*小时,分钟调整,P1.0口为时调整,P1.1口为分调整*/
	{
        if(P10==0)
		{
		     delay();   /*延时10MS去抖*/
		     if (P10==0)
	         {	
		         EX1=1;TR0=0;
			     while (!P10);   /*如果P10发生翻转,则时加1*/
        	     CLOCK[3]=CLOCK[3]+1;
			     if (CLOCK[3]==24)   CLOCK[3]=0;
			     BUFFER_A[1]=CLOCK[3];
			     BUFFER_A[0]=CLOCK[2];
			     display_t();
			 }
		}
	


		if(P11==0)
		{
		    delay();
		    if (P11==0)
		    {	
		        EX1=1;TR0=0;
			    while (!P11);
			    CLOCK[2]=CLOCK[2]+1;
			    if (CLOCK[2]==60)   CLOCK[2]=0;
			    BUFFER_A[0]=CLOCK[2];
                BUFFER_A[1]=CLOCK[3];   
		        display_t();

		    }
		 }
	}
	if(n==2)
	{
		n=0;
		BUFFER[0]=CLOCK[2];
		BUFFER[1]=CLOCK[3];
		display();
		TH0=0x3c; TL0=0xb0; /*如果更新数据,则重新开始计时下一50MS*/
		TR0=1;
		CLOCK[0]=0;CLOCK[1]=0;
		m=1;
	}
	if (m==1)
	{	
		m=0;
	
		EX1=1;  
		BUFFER[0]=CLOCK[2];
		BUFFER[1]=CLOCK[3];	
		display();	
			
	}
}
}



display_t(void)
{	

  		uchar disp_t;		
		disp_t=BUFFER_A[0]%10;		
		P20=0;
		P0=TABLE[disp_t];
		P20=1;P20=0;
		disp_t=BUFFER_A[0]/10;	
		P21=0;
		P0=TABLE[disp_t];
		P21=1;P21=0;
	    disp_t=BUFFER_A[1]%10;		
		P22=0;
		P0=TABLE[disp_t];
		P22=1;P22=0;
		disp_t=BUFFER_A[1]/10;	
		P23=0;
		P0=TABLE[disp_t];
		P23=1;P23=0;
}
 delay(void)
{	
	uchar a,b;
	for(a=100;a>0;a--);
	for(b=100;b>0;b--);
}
	
		
		
void intsvr1(void)  interrupt 2 using 3
{
  delay(); /*延时十毫秒,用于消抖*/
  if (P27==0)
  {
 
  n=n+1;
  TR0=0;
  }
	
}
	

⌨️ 快捷键说明

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