新闻  |   论坛  |   博客  |   在线研讨会
LCD1602、DS1302、DS18B20、LED多功能电子日历(最终版)
0750long | 2009-06-16 12:54:12    阅读:3129   发布文章

LCD1602、DS1302、DS18B20、LED多功能电子日历(最终版)

 

 

电子日历工程文件(包括源代码、keil文件、protues仿真等)rar

电子日历实验报告(含原理图、程序分析、效果图等)rar

原理图如下:

点击看大图

以下为该电子日历的main函数:

Calendar.c程序文件:

/******使用LCD1602、DS1302时钟芯片、DS18B20温度传感器完成该日历*******/

#include<reg52.h>

//以下的顺序不能任意放

#define uint unsigned int //宏定义

#define uchar unsigned char

#include"LM016L.h"    

#include"DS1302.h"

#include"DS18B20.h"

#include"KeyScan.h"

#include"MODE.h"

#include"OPEN.h"

////////以下为几个标志位///////////

// flag,select,alarm,temperature,limit 

/*分别为模式标志位、功能选择标志位、闹钟、温度正负标志位以及温度上限值 (整型)

  其中alarm有三种状态:0为禁止进入,1为允许进入,2为正在闹钟模式下  */

void open();               //上电显示 

void KeyScan();       //键盘扫描

void SetTime_Mode();  //调时

void SetRing_Mode();  //闹钟设置

void SetTemp_Mode();  //温度上限设置模式

/******************************日历主函数************************************/

void main()

{    

       init();         //初始化LCD

       Set_RTC(l_tmpdate1);//初始化时钟芯片   

       open();        //上电显示函数

       write_com(0x01);   //清屏

       while(1)

   {      

              time_date();  //时间处理

           KeyScan();       //键盘扫描

       if(ring_time[1]==l_tmpdate[1]&&ring_time[2]==l_tmpdate[2]&&flag==0&&alarm!=0)//判断是否到闹钟设置的时间,是的话执行相应动作

              {    

                  uchar i;

                     alarm=2;  //正在闹钟响应模式下

                  if(ring_time[0]==l_tmpdate[0])//相等的那一时刻清屏,循环清屏会导致闪烁

                      write_com(0x01);

                     led=0;                                //小灯闪烁

                     delay(100);                         

                     led=1;

                     write_com(0x80+0x01); //写入“Time To Get Up”

                     for(i=0;i<14;i++)

                     {

                        write_date(ringtable[i]);  

                     }

                     if(l_tmpdate[0]==0x59) //自动退出闹钟模式时清屏

                      write_com(0x01);

                     continue;       //跳出本次的While循环

               }                 

              if(flag==0)     //正常显示模式下

              {

                 tempchange();  //温度转换命令   

              display(l_tmpdisplay,8);//显示时间

                 Temp_Display();      //显示温度

               deal();        //温度处理

              }

              if(flag==1)     //功能选择模式下

          {      

                     uchar i;

                     write_com(0x80+0x4);           //选择菜单

                     for(i=0;menu[select][i]!='\0';i++)

                     {

                            write_date(menu[select][i]); 

                     }

                    

                     if(select==0)     //调试模式

                     {

                         SetTime_Mode();         

                     }

                     if(select==1)        //闹钟设置

                     {

                            SetRing_Mode();

                     }

                     if(select==2)  //设置温度上限

                     {

                            SetTemp_Mode();  

                     }

              }

       }                

}

/***************END***********END******************************/    

*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。

参与讨论
登录后参与讨论
wgj_king  2010-07-17 14:58:35 

111111111111111

da_heng  2009-12-01 20:15:05 

看看

h0nly_zhang  2009-08-14 08:34:07 

咯咯

推荐文章
最近访客