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

📄 电子钟程序.c

📁 此为单片机的一个电子钟程序
💻 C
字号:
/**************************************************************
**项目名称:CLOCK
**功能描述:
**说    明:12MHz晶体振荡器
/**************************************************************
头文件预处理:
**************************************************************/
#include <reg52.h>
#include <intrins.h>
#include <stdio.h>
/**************************************************************
数据类型宏定义:
**************************************************************/
#define uchar unsigned char
#define uint  unsigned int
/*============================================================
I/O Ports' Definition:
============================================================*/
sbit      Key1=P1^0;
sbit      Key2=P1^1;
sbit      Key3=P1^2;
sbit      Key4=P1^3;
sbit      Key5=P1^4;
sbit   Led_Clk=P1^5;            //clock port of 74HC164
sbit   Led_Dat=P1^6;            //data port of 74HC164
sbit    Led_Cs=P1^7;            //Led display controlling(using BJT's base)


/**************************************************************
全局变量声明:
**************************************************************/
uchar  bdata    B_Byte;
uchar  disp[6]={0x00,0x00,0x00,0x00,0x00,0x00}; //数组的长度??????
uchar  key_value,key_value_temp;
uchar  Cnt=0;
uchar  Cnt1=0;
uchar  Srl=0;
uchar  temp=0;
uchar i,k;
bit    Wink_Bit = 0;
bit    Sft_Bit = 0;
uchar  disp_temp[6];
/**************************************************************
函数说明:
**************************************************************/
void   Led_Display();
void   Led_Write(uchar leddat);
void   Key_Func();
void   delay();
void   delay1();

/**************************************************************
code tab:
**************************************************************/
uchar code tab[]={
        0x03,0x9F,0x25,0x0D,0x99,0x49,0x41,0x1F,0x01,0x09,//0-9
        0xFF//dark all
};
void Tmr0_ISR() interrupt 1 using 1
{
    uchar i;
	if(Cnt<20)  ++Cnt;
	else
	{  
	    Cnt=0;
		if(disp[0]<9) ++disp[0];
		else 
		{
			disp[0] = 0;
			if(disp[1]<5)  ++disp[1];
			else
			{
				disp[1] = 0;
				 if(disp[2]<9)  ++disp[2]; 
				 	else 
		            {
			         disp[2] = 0;
			         if(disp[3]<5)  ++disp[3]; 
						else 
						{
	
			                disp[3] = 0;
							if(disp[4]<3)  disp[4]++;
							else 
		                 {
			              
			                if(disp[5]<2)  
							{ if(disp[4]<9)  ++disp[4];
							  else 	{
							   disp[4]=0;  ++disp[5];
								}
								}
								else
									 
								{disp[4]=0;disp[5]=0;
								}
						 }
						}
					 }
			}
		}
									 
    }
	for( i = 0;i<=5;++i )
	disp_temp[i] = disp[i];
	TH0=0x3c;
	TL0=0xb0;         
}

void Tmr1_ISR() interrupt 3 using 2
{
	if(Cnt1<20)  ++Cnt1;
	else  Cnt1 = 0;
	if(Cnt1==9||Cnt1==19)  Wink_Bit = !Wink_Bit;
	TH1=0x3c;
	TL1=0xb0;         
}

void main()
{
//initialize:
        TMOD=0x11;           //设置定时器0/1的工作方式,
        
	    ET0=1;               //允许定时器0中断
        ET1=1;
        EA=1;                //允许CPU总中断
        TR0 = 1;
        TH0=0xb1;
	    TL0=0xe0;
        
	    TH1=0xb1;
	    TL1=0xe0;
        delay();
        while(1)              //循环扫描键盘,调用显示
        {
            Led_Display();
            delay();
            Key_Func();
			if(Sft_Bit)
			{
			    if(Wink_Bit)
				    disp[Srl] = 0x0a;
				else
				    disp[Srl] = disp_temp[Srl];
				
			}
        }
}
/**************************************************************
**函数名称:Key_Func
**功能描述:键盘处理
***************************************************************
**调用函数:None
**参    数:None
**返 回 值:None              
**************************************************************/
void Key_Func()
{
       P1=0xff;
       key_value=P1;
       key_value=(key_value&0x1f);
       do
       {
          key_value_temp=P1;
          key_value_temp=(key_value_temp&0x1f);
          Led_Display();
          delay();
       }while(key_value_temp!=0x1f);

       switch(key_value)
       {
//------------------------------------------------------------
        case 0x1e: //TR0 = 0;
		           //break;
        case 0x1d: //TR0 = 1;
		           break;
//------------------------------------------------------------
        case 0x1b: if(!Sft_Bit)  break;
		           disp[Srl] = disp_temp[Srl];
		           switch(Srl)
		            {
					case 0:
					          if(disp[Srl]<9)
		                      ++disp[Srl];
				               else	 disp[Srl]=0;
							   break;
					case 1:  if(disp[Srl]<5)
		                      ++disp[Srl];
				               else	 disp[Srl]=0; break;
					case 2:	
					         if(disp[Srl]<9)
		                      ++disp[Srl];
				               else	 disp[Srl]=0;break;
					 case 3:	 if(disp[Srl]<5)
		                      ++disp[Srl];
				               else	 disp[Srl]=0;break;
					case 4:	  if(disp[5]<2)
					           {if(disp[Srl]<9)
							   ++disp[Srl];
				               else	 disp[Srl]=0;}
							   else 
							   {if(disp[Srl]<3)
							   disp[Srl]++;
				               else	 disp[Srl]=0;}break;
					case 5:	  if(disp[4]<4)
					          {if(disp[Srl]<2)
		                      ++disp[Srl];
				               else	 disp[Srl]=0;}
							   else
							   {if(disp[Srl]<1)
		                      ++disp[Srl];
				               else	 disp[Srl]=0;}
							   break;
				   
					default:   break;
							     
							   }
							   
				   disp_temp[Srl] = disp[Srl];
		           break;              //Key3 not used
//------------------------------------------------------------
        case 0x17: TR0 = 0;
				   TR1 = 1;
				   disp[Srl]=disp_temp[Srl];
		           if(Srl<5)  ++Srl;
		           else  Srl = 0;
				   if(!Sft_Bit)
				   {
				       Sft_Bit = 1;
					   Srl = 0;
				   }
		break;              //Key4 not used
//------------------------------------------------------------        
        case 0x0f: disp[Srl]=disp_temp[Srl];	  
		           Sft_Bit = 0;
		           Srl = 0;
				   TR0 = 1;
				   TR1 = 0;
		default:   break;
       }
}
/*==================Key_Func 函数结束=======================*/



/**************************************************************
**函数名称:Led_Write
**功能描述:移位寄存器送出一个字节的数据
***************************************************************
**调用函数:None
**参    数:None
**返 回 值:None
**************************************************************/
void Led_Write(uchar leddat)
{
        uchar i;

        for(i=0;i<8;i++)
        {
             if((leddat&0x80)==0)
                 Led_Dat=0;
             else
                 Led_Dat=1;

             Led_Clk=0;           //时钟端产生脉冲
             Led_Clk=1;           //送出一位数据
             leddat<<=1;
        }
}
/*********************Led_Write 函数结束**********************/





/**************************************************************
**函数名称:Led_Display
**功能描述:LED数码管显示6位
***************************************************************
**调用函数:Led_Write
**参    数:None
**返 回 值:None
**************************************************************/
void Led_Display()
{

        uchar i,Dat;
        Led_Cs=1;            //关显示
        for(i=0;i<6;i++)
        {
            Dat=tab[disp[i]];
            if((i==2||i==4) &&(disp[0]%2==0))
                Dat=Dat&0xfe;   //开小数点显示
				
            Led_Write(Dat);
        }
        Led_Cs=0;            //开显示

}
/********************Led_Display 函数结束*********************/





/**************************************************************
**函数名称:delay
**功能描述:延时
***************************************************************
**调用函数:None
**参    数:None
**返 回 值:None
**************************************************************/
void delay()
{
   uchar i,k;
   for(i=0;i<=50;i++)
   for(k=0;k<0xff;k++)
   {
       ;
   }
}

⌨️ 快捷键说明

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