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

📄 1602时钟1302.c

📁 用C51编写的小闹钟程序,并附有相关电路图
💻 C
📖 第 1 页 / 共 3 页
字号:
/*============================================================
使用1602液晶显示DS1302+c51时钟 

功能:
        (1) 显示时间		   完成时间:2006/03/29
	(2) 1302初始设置         完成时间:2006/03/29
        (3) 显示日期		   完成时间:2006/03/29
	(4) 背光灯设置	   完成时间:2006/04/1
        (5) 闹铃设置		   完成时间:2006/04/02
	
	 
============================================================== 
1602接线图: 
---------------------------------------------------
|LCM-----51  | LCM-----51  | LCM------51 |
---------------------------------------------|
|DB0-----P0.0 | DB4-----P1.4 | RW-------P2_5 |
|DB1-----P0.1 | DB5-----P0.5 | RS-------P2_7 |
|DB2-----P0.2 | DB6-----P0.6 | E-------P2_6  |
|DB3-----P0.3 | DB7-----P0.7 | VLCD接1K电阻到GND|
---------------------------------------------------
DS1302 接线图

         Vcc2  CLK I/O  /RST 
           
            |   |   |   |
           --------------
          | 8   7   6   5|
          |   DS1302     |
          |              |
          | 1   2   3   4|
           --------------
            |   |   |   |

         VCC1           GND

1 脚接+5V    2,3脚32768HZ晶振  4脚接地  5脚接S51的P02 6脚接S51的P01 7接S51的P00
8脚接后备电源可以通过二级管隔离接一个大容量电解电容


按键说明:1. 共三个键,低电平有效
          2. P10 端口按键:选择要调整的项目
          3. P11 端口按键:增加;
          4. P12 端口按键:减少


[注:AT89C51使用12M晶振]
=============================================================*/
//#include <reg51.h>
#include <AT89x51.h>
#include <string.h>

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

sbit T_CLK=P2^1;
sbit T_IO =P2^2;
sbit T_RST=P2^3;
sbit ACC0=ACC^0;
sbit ACC7=ACC^7;
sbit LED=P2^0;			 //背光灯输出
sbit system=P1^0;		 //模式
sbit TimerUp=P1^1;		 //时间加
sbit TimerDown=P1^2;     //时间减
sbit Speaker=P2^4;       //蜂鸣器


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讲入工作状态
  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()				//按键处理
{

⌨️ 快捷键说明

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