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

📄 时钟.c

📁 简单的时钟程序
💻 C
📖 第 1 页 / 共 3 页
字号:
			/*============================================================
使用1602液晶显示DS1302+c51时钟 
[注:AT89C51使用12M晶振]
=============================================================*/

#include <AT89x51.h>
#include <string.h>

#define LCM_RW P3_1 //定义引脚
#define LCM_RS P3_0
#define LCM_E P3_2
#define LCM_Data P0
#define Busy 0x80          //用于检测LCM状态字中的Busy标识
#define uchar unsigned char

sbit T_CLK=P2^4;
sbit T_IO =P2^5;
sbit T_RST=P2^6;
sbit ACC0=ACC^0;
sbit ACC7=ACC^7;
sbit LED=P2^0;			 //背光灯输出 (因本实验板无此功能 所以此项功能无效)
sbit system=P1^1;		 //模式
sbit TimerUp=P1^2;		 //时间加
sbit TimerDown=P1^0;     //时间减
sbit Speaker=P2^1;       //蜂鸣器


void   Set(uchar,uchar);      //根据选择调整相应项目
void   RTInputByte(uchar);    //输入 1Byte */
uchar  RTOutputByte(void);    //输出 1Byte */
void   W1302(uchar, uchar);   //向DS1302写入一个字节
uchar  R1302(uchar);          //从DS1302读出一个字节
void   Set1302(uchar * );     //设置时间 
void   KeySound();			  //按键音
void   ClockSound();		  //闹铃蜂鸣声


uchar id,msec,model,LedTime,d;
bit a,b;                	  //闪烁标志位

                        
uchar inittime[7]={0x00,0x10,0x19,0x29,0x03,0x04,0x06};	//初始化后设置为:06年3月29日星期3 19点10分0秒
void  Out_LCM(void);     //显示屏幕
void  model0(void);						   //显示输出
void  model1(void);
void  model2(void);
void  model3(void);
void  model4(void);
void  model5(void);
void  model6(void);

 
void  id_case1_key();	//项目调整
void  Modset();          //模式键处理

void  WriteDataLCM(uchar WDLCM);
void  WriteCommandLCM(uchar WCLCM,BuysC);
uchar ReadStatusLCM(void);
void  LCMInit(void);
void  OutputInformation(uchar X, uchar Y, uchar DData);
void  DisplayListChar(uchar X, uchar Y, uchar code *DData);

void  Delay5Ms(void);
void  Delay400Ms(void);
void  systemsetup(void);                 //进入系统设置

uchar code systemp[]={"System.setup"};  //字符串输出(系统设定)
uchar code TIMER[]={"Time"};            //字符串输出(时间)
uchar code DATE[]={"Date"};	            //字符串输出(日期)
uchar code alarmclock[]={"Clock"};      //字符串输出(闹铃)
uchar code lamp[]={"Lamp"};			    //字符串输出(背光灯)
uchar code reset[]={"Reset"};		    //字符串输出(时间归零)
uchar code exit[]={"Exit"};             //字符串输出(退出)
uchar code set[]={"Set"};				//字符串输出(设置)
uchar code sec[]={"sec"};               //字符串输出(秒)
uchar code ClockSet[]={"ClockSet"};		//字符串输出(闹铃设置)
uchar code ClockOn[]={"ON"};		    //字符串输出(ON)
uchar code ClockOff[]={"OFF"};		    //字符串输出(OFF)

void  timesetup(void);                   //时间设置
void  datesetup(void);                   //日期设置
void  alarmclockset(void);               //闹铃设置
void  lampsetup(void);                   //背光灯设置									   
void  timereset(void);                   //时间清零

void main(void)
{
  Speaker=1;    //关闭蜂鸣器
  LED=0;        //打开LED ,低电平有效,外接9012驱动
  Delay400Ms(); //启动等待,等LCM讲入工作状态
  Delay400Ms();
  LCMInit();    //LCM初始化
  TMOD=0x01;	//16位定时
  TH0=0x3c;		//50ms
  TL0=0xb0;
  EA=1;
  TR0=1;
  ET0=1;  
   
  while(1)
  {
     if(TimerDown==0)         //左移键按下后把背光灯打开
      {Delay5Ms();
      if(TimerDown==0)
	   {KeySound();			  //蜂鸣声
		LED=0;				  //打开背光灯
	    LedTime=R1302(0xc1)/16*10+R1302(0xc1)%16;} //取出背光灯时间并转换为十进制数         
       }
	 b=1;		         	  //模式键是否动作标志。为1时不动作,为0时动作。
	 Modset();		          //调用模式键处理程序判断按键是否按下。
	 if(b==0)
	  {
	   KeySound();			  //蜂鸣声
	   LED=0;                 //打开背光灯
	   systemsetup();         //进入系统设置模式
	   LedTime=R1302(0xc1)/16*10+R1302(0xc1)%16; //取出背光灯时间并转换为十进制数
	   }
	 if((LED==0)&&LedTime==0)  //延时间是否到
	    LED=1;            	   //关闭背光灯	
	 if(R1302(0xc3)==1)        //闹铃是否打开,0xc3为读闹铃寄存器地址。
	   {if((R1302(0x85)==R1302(0xc5))&&(R1302(0x83)==R1302(0xc7))) //判断闹铃时间是否到,
		  ClockSound();		   //发出闹铃蜂鸣声,无按键动作蜂鸣一分钟。
	   	}	   
	 model0();                //输出显示屏幕
	}					    
}

void KeySound()			        //按键音
{
 Speaker=0;					    //开蜂鸣声
 Delay5Ms();
 Speaker=1;					    //关蜂鸣声
 }
void ClockSound()		        //闹铃蜂鸣声
{
 if(a==0)
  {
   Speaker=0;					//开蜂鸣声
   Delay5Ms();
   Delay5Ms();
   Delay5Ms();
   Speaker=1;				    //关蜂鸣声
  }
}

void Modset()                   //模式键处理
{ if(system==0)               
   {
    Delay5Ms();
    if(system==0)
	 {while(system==0);
	   KeySound();			  //蜂鸣声
	   a=0;msec=0;b=0;		  //a、msec为闪烁标志,按键有动作时清零,不闪烁。
	 }						  //b为模式键确认动作。其它程判断b是否为零时来确定模式键是否动作。
   }
}

void systemsetup(void)		    //系统设置
{ 
  model=1;
  while(model!=0)
  {	
  Out_LCM(); 
  if (TimerUp==0)      	      //设置项目左移
      {Delay5Ms();
       if(TimerUp==0)
	   {a=0;msec=0;KeySound();//蜂鸣声
	    if(model--==1)	      //6种系统设置项目
		 model=6;
		}   
       while(TimerUp==0);    
      }
   if (TimerDown==0)         //设置项目右移
      {
       Delay5Ms();
       if(TimerDown==0) 
	     {a=0;msec=0;KeySound();//蜂鸣声
		 if(model++==6)
		     model=1; 
		 }         
       while(TimerDown==0);    
      }
     b=1;			//模式键是否动作标志。为1时不动作,为0时动作。
	 Modset();		//调用模式键处理程序判断按键是否按下。
	 if(b==0)
	   {KeySound();			   //蜂鸣声
	    switch(model)          //进入进个项目设置
		  {
		   case 1:
		        timesetup(); break;   //时间设置
		   case 2:
		        datesetup();break;    //日期设置
		   case 3:
		        alarmclockset();break;//闹铃设置
		   case 4:
		        lampsetup();break;	  //背光灯设置
	       case 5:
		        timereset();break;    //时间清零
		   case 6:
		        model=0;break;        //退出系统设置
		  }
	  }
   }
 }

							  
void timesetup()                //时间调整
{
 id=6;
 while(model==1)				//model为1时进入时间调整
  {
    b=1;
    Modset();
	if(b==0)
	 {KeySound();			     //蜂鸣声
	  if(id++==9)			    //6..9为时分秒调。				   .
	   id=6;
	  }
   id_case1_key();				//调用按键处理
   Out_LCM();                   //显示输出
 } 
}
void datesetup()                //对日期进行调整
{
 id=1;
 while(model==2)				//model为2时进入日期调整
  {b=1;
   Modset();					//模式键是否动作
   if(b==0)
    {KeySound();			    //蜂鸣声
	 if(id++==5)			    //1..5为年月日星期 exit
	  id=1;
	 }
 id_case1_key();		        //日期调整
 Out_LCM();                     //显示输出
 } 
}
void alarmclockset(void)	    //闹铃调整
{id=12;
 while(model==3)			    //进入闹铃设置
  {b=1;
   Modset();				    //模式键是否动作
   if(b==0)					  
    {KeySound();			    //蜂鸣声
	 if(R1302(0xc3)%16==0)
 	   {id=0;model++;}          //0xc2为闹铃开关寄存器。当为关时按下模式键时将退出闹铃设置,当开时进入闹铃时间设置
        
	 else if(id++==15)		    //12..15为闹铃开关和时间设置 exit
	      id=12;
    }
  id_case1_key();		        //调整
  Out_LCM();                    //显示输出
  }
} 
   
void lampsetup(void)            //背光灯时间设置
{id=10;							//背光灯存储空间DS1302(0xc0)
  while(model==4)				//model为3时进入背光灯调整
  {b=1;
   Modset();					//模式键是否动作
   if(b==0)
    {KeySound();			    //蜂鸣声
	 if(id++==11)			    //10为背光灯 exit
	  id=10;
	 }
 id_case1_key();		        
 Out_LCM();                     //显示输出                    
 }

}
void  timereset()               //时间清零
{
  Set1302(inittime);		    //清时间
  W1302(0x90,0xa5);             //打开充电二级管  一个二级管串联一个2K电阻
  model++; 
}
//对相应的项目进行加、减调整。
void id_case1_key()				//按键处理
{
  if (TimerUp==0)        //增加
      {
       Delay5Ms();
       if(TimerUp==0)
	    {a=0;msec=0;KeySound();			//蜂鸣声
		 if((id==9)||(id==5)||(id==11)||(id==15))	//当ID为9、5时按下加、减键将退出调整
	   	  { model++;		            //退出时间、日期设置
		    id=0;
		  }
		 else
	       Set(id,1);
		}  
      while(TimerUp==0);    
     }
  if (TimerDown==0)  //减少
     {
       Delay5Ms();
       if(TimerDown==0) 
	    {a=0;msec=0;KeySound();			 //蜂鸣声
		 if((id==9)||(id==5)||(id==11)||(id==15))  //当ID为9、5时按下加、减键将退出调整
	   	  { model++;		             //退出时间、日期设置
		    id=0;
		  }
	   else
		   Set(id,0);		  //调用DS1302写入函数
	   }          
      while(TimerDown==0);    
     }

⌨️ 快捷键说明

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