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

📄 main.c

📁 CLOCK 网上看到的电子钟 源码 附图
💻 C
字号:
/* 本程序所使用CPU为51单片机,时钟为24MHZ,程序主体网上所得,稍加修,念在下初学,还请原作者见谅。特此声明*/
  #include <reg51.h>
  #include <intrins.h>  
  #include "LCM1602.h"
  #include "DS1302.h" 
  
sbit Add_Key   = P3 ^ 3;//加1键
sbit Dec_Key   = P3 ^ 4;//减1键
sbit OK_Key    = P3 ^ 5;//确定键
 struct TimerStruct          //定义时钟的数据结构
{
  unsigned char Year;
  unsigned char Month;
  unsigned char Day;
  unsigned char Week;
  unsigned char Hour;
  unsigned char Minute;
  unsigned char Second;
};
  unsigned char  DateBuffer[] ={"2000/12/20"};	  // 随便设置,不表示显示的初始值,只为方便子程序调用													 
  unsigned char  TimeBuffer[] = {"21:49:00"};	  //初始值在主程序中设置  
  unsigned int SecondCounter;//秒计数器(无符号整型)
  unsigned char Keyboard_Clock_Number;
  unsigned char Temp;
  struct TimerStruct RealClock;
void timer0(void) interrupt 1 //定时T0溢出中断,每25mS产生一次中断   方式1    9E58
{    unsigned char Temp; 
 //    struct 
     TH0=0x9e;//(65536-46080)/256;         //重新装入定时25mS的初值到TH0,TL0
     TL0=0x58;//(65536-46080)%256;														    
     SecondCounter++;               //秒计数器加1
     if(SecondCounter==40)          //到40,表示1S时间到
    {
     SecondCounter=0;
 /****--以下是读取DS1302的时钟信息,并将结果存储到显示缓冲区中****/
      Temp=Read_DS1302_RTC(0x81);   //读秒信息
      RealClock.Second=Temp;
      TimeBuffer[7]=(Temp%16)|0x30;
      TimeBuffer[6]=(Temp>>4)|0x30;
      Temp=Read_DS1302_RTC(0x83);   //读分信息
      RealClock.Minute=Temp;
      TimeBuffer[4]=(Temp%16)|0x30;
      TimeBuffer[3]=(Temp>>4)|0x30;
      Temp=Read_DS1302_RTC(0x85);  //读时信息
      RealClock.Hour=Temp;
      TimeBuffer[1]=(Temp%16)|0x30;
      TimeBuffer[0]=(Temp>>4)|0x30;    
      Temp=Read_DS1302_RTC(0x87);  //读日信息
      RealClock.Day=Temp;
      DateBuffer[9]=(Temp%16)|0x30;
      DateBuffer[8]=(Temp>>4)|0x30;
      Temp=Read_DS1302_RTC(0x89);   //读月信息
      RealClock.Month=Temp;
      DateBuffer[6]=(Temp%16)|0x30;
      DateBuffer[5]=(Temp>>4)|0x30;
      Temp=Read_DS1302_RTC(0x8d);   //读年信息
      RealClock.Year=Temp;
      DateBuffer[3]=(Temp%16)|0x30;
      DateBuffer[2]=(Temp>>4)|0x30;
/*****************---送到LCD上显示出来***********************/
      DisplayListChar(0,0,DateBuffer);//刷新LCD上的日期信息
      DisplayListChar(0,1,TimeBuffer);//刷新LCD上的时间显示信息
    }
}
void main(void){
  TMOD=0x01;                     //T0工作于16位定时功能
  TH0=(65536-46080)/256;          //T0定时25mS的初值装入TH0,TL0
  TL0=(65536-46080)%256;
  EA=1;                           //CPU开中断
  ET0=1;                         //允许T0溢出中断
  Delay400Ms();
  LCMInit();                      //初始化LCD
/************ Init_DS1302_RTC();//初始化DS1302*************/
  Init_1302();
  TR0=1;                         //启动T0开始工作
  while(1)
  {
    OK_Key = 1;
	Add_Key = 1;
	Dec_Key = 1;
  if (OK_Key == 0) // 设置和选择项目键
       {
        Delay5Ms();
        Delay5Ms();
        EA = 0;
         if(OK_Key == 0)
   				{
    				Keyboard_Clock_Number++;if(Keyboard_Clock_Number>5)Keyboard_Clock_Number=0;
   				}
         while(OK_Key == 0);
		 }
      switch( Keyboard_Clock_Number )
       {
         case 0:
         	{ 
         		if(Add_Key==0)
         			{
         			Delay5Ms();
         			Delay5Ms();
         			if(Add_Key==0)
         				{
         		      Temp=Read_DS1302_RTC(0x81);
					    Temp|=0x80;   //每次传输低字节
         					Temp++;
         					if(Temp>59) Temp = 0;
							
					    Temp|=0x80;   //每次传输低字节
         					RealClock.Second=Temp;
         					TimeBuffer[7]=(Temp%16)|0x30;
         	  			TimeBuffer[6]=(Temp>>4)|0x30;
         	  			DisplayListChar(0,1,TimeBuffer);//刷新LCD上的时间显示信息
         	  		 }
         	  	}
         		if(Dec_Key==0)
         			{
         			Delay5Ms();
         			Delay5Ms();
         			if(Dec_Key==0)
         				{
         		      Temp=Read_DS1302_RTC(0x81);
         					Temp--;
         					if(Temp==0) Temp = 59;
							
					    Temp|=0x80;   //每次传输低字节
         					RealClock.Second=Temp;
         					TimeBuffer[7]=(Temp%16)|0x30;
         	  			TimeBuffer[6]=(Temp>>4)|0x30;
         	  			DisplayListChar(0,1,TimeBuffer);//刷新LCD上的时间显示信息
         	  		 }
         	  		}
         	  break;//正常显示秒
          }
         case 1:
         	{         		
         		if(Add_Key==0)
         			{
         			Delay5Ms();
         			Delay5Ms();
         			if(Add_Key==0)
         				{
         		      Temp=Read_DS1302_RTC(0x83);
         					Temp++;
         					if(Temp>59) Temp = 0;
							
					    Temp|=0x80;   //每次传输低字节
         					RealClock.Minute=Temp;
         					TimeBuffer[3]=(Temp%16)|0x30;
         	  			TimeBuffer[4]=(Temp>>4)|0x30;
         	  			DisplayListChar(0,1,TimeBuffer);//刷新LCD上的时间显示信息
         	  		 }
         	  	}
         		if(Dec_Key==0)
         			{
         			Delay5Ms();
         			Delay5Ms();
         			if(Dec_Key==0)
         				{
         		      Temp=Read_DS1302_RTC(0x83);
         					Temp--;
         					if(Temp==0) Temp = 59;
							
					    Temp|=0x80;   //每次传输低字节
         					RealClock.Minute=Temp;
         					TimeBuffer[3]=(Temp%16)|0x30;
         	  			TimeBuffer[4]=(Temp>>4)|0x30;
         	  			DisplayListChar(0,1,TimeBuffer);//刷新LCD上的时间显示信息
         	  		 }
         	  		}
         	  break;//正常显示分钟
         	}
         case 2:
         	{         		
         		if(Add_Key==0)
         			{
         			Delay5Ms();
         			Delay5Ms();
         			if(Add_Key==0)
         				{
         		      Temp=Read_DS1302_RTC(0x85);
         					Temp++;
         					if(Temp>24) Temp = 0;
         					RealClock.Hour=Temp;
         					TimeBuffer[1]=(Temp%16)|0x30;
         	  			TimeBuffer[0]=(Temp>>4)|0x30;
         	  			DisplayListChar(0,1,TimeBuffer);//刷新LCD上的时间显示信息
         	  		 }
         	  	}
         		if(Dec_Key==0)
         			{
         			Delay5Ms();
         			Delay5Ms();
         			if(Dec_Key==0)
         				{
         		      Temp=Read_DS1302_RTC(0x85);
         					Temp--;
         					if(Temp==0) Temp = 23;
         					RealClock.Hour=Temp;
         					TimeBuffer[1]=(Temp%16)|0x30;
         	  			TimeBuffer[0]=(Temp>>4)|0x30;
         	  			DisplayListChar(0,1,TimeBuffer);//刷新LCD上的时间显示信息
         	  		 }
         	  		}
         	  break;//正常显示小时
         	}
         case 3:
         	{         		
         		if(Add_Key==0)
         			{
         			Delay5Ms();
         			Delay5Ms();
         			if(Add_Key==0)
         				{
         		      Temp=Read_DS1302_RTC(0x87);
         					Temp++;
         					if(Temp>31) Temp = 0;
         					RealClock.Day=Temp;
         					TimeBuffer[9]=(Temp%16)|0x30;
         	  			TimeBuffer[8]=(Temp>>4)|0x30;
         	  			DisplayListChar(0,0,TimeBuffer);//刷新LCD上的时间显示信息
         	  		 }
         	  	}
         		if(Dec_Key==0)
         			{
         			Delay5Ms();
         			Delay5Ms();
         			if(Dec_Key==0)
         				{
         		      Temp=Read_DS1302_RTC(0x87);
         					Temp--;
         					if(Temp==0) Temp = 30;
         					RealClock.Day=Temp;
         					TimeBuffer[9]=(Temp%16)|0x30;
         	  			TimeBuffer[8]=(Temp>>4)|0x30;
         	  			DisplayListChar(0,0,TimeBuffer);//刷新LCD上的时间显示信息
         	  		 }
         	  		}
         	  break;//正常显示小时
         	}
         case 4:
         	{         		
         		if(Add_Key==0)
         			{
         			Delay5Ms();
         			Delay5Ms();
         			if(Add_Key==0)
         				{
         		      Temp=Read_DS1302_RTC(0x89);
         					Temp++;
         					if(Temp>12) Temp = 0;
         					RealClock.Month=Temp;
         					TimeBuffer[6]=(Temp%16)|0x30;
         	  			TimeBuffer[5]=(Temp>>4)|0x30;
         	  			DisplayListChar(0,0,TimeBuffer);//刷新LCD上的时间显示信息
         	  		 }
         	  	}
         		if(Dec_Key==0)
         			{
         			Delay5Ms();
         			Delay5Ms();
         			if(Dec_Key==0)
         				{
         		      Temp=Read_DS1302_RTC(0x89);
         					Temp--;
         					if(Temp==0) Temp = 12;
         					RealClock.Month=Temp;
         					TimeBuffer[6]=(Temp%16)|0x30;
         	  			TimeBuffer[5]=(Temp>>4)|0x30;
         	  			DisplayListChar(0,0,TimeBuffer);//刷新LCD上的时间显示信息
         	  		 }
         	  		}
         	  break;//正常显示小时
         	}
         case 5:
         	{         		
         		if(Add_Key==0)
         			{
         			Delay5Ms();
         			Delay5Ms();
         			if(Add_Key==0)
         				{
         		      Temp=Read_DS1302_RTC(0x8d);
         					Temp++;
         					RealClock.Day=Temp;
         					TimeBuffer[3]=(Temp%16)|0x30;
         	  			TimeBuffer[2]=(Temp>>4)|0x30;
         	  			DisplayListChar(0,0,TimeBuffer);//刷新LCD上的时间显示信息
         	  		 }
         	  	}
         		if(Dec_Key==0)
         			{
         			Delay5Ms();
         			Delay5Ms();
         			if(Dec_Key==0)
         				{
         		      Temp=Read_DS1302_RTC(0x8d);
         					Temp--;
         					RealClock.Year=Temp;
         					TimeBuffer[3]=(Temp%16)|0x30;
         	  			TimeBuffer[2]=(Temp>>4)|0x30;
         	  			DisplayListChar(0,0,TimeBuffer);//刷新LCD上的时间显示信息
         	  		 }
         	  		}
         	  break;//正常显示小时
         	}
         default:break;
       }
	   EA = 1;
       }
}

⌨️ 快捷键说明

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