找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1601|回复: 1
打印 上一主题 下一主题
收起左侧

基于52单片机的lcd1602的闹钟源码

[复制链接]
跳转到指定楼层
楼主
ID:126738 发表于 2018-12-27 13:24 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
通过4个按键来控制时间的调整和闹钟的设置,一键开关闹钟,时间通过ds1302 来读取设置

单片机源程序如下:
  1. #include <reg52.h>
  2. #include "ds1302.h"
  3. #include "lcd1602.h"
  4. #include "key.h"
  5. #include "eeprom52.h"

  6. static uchar value;
  7. uchar flag_100ms,flag_200ms;


  8. sbit LED = P1^5;
  9. sbit ElectricRelay = P1^6;



  10. void Init_Timer0(void)
  11. {
  12.         TMOD |= 0x01;          //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响                     
  13.         TH0=(65536-50000)/256;              //给定初值
  14.         TL0=(65536-50000)/256;
  15.         EA=1;            //总中断打开
  16.         ET0=1;           //定时器中断打开
  17.         TR0=1;           //定时器开关打开
  18. }

  19. void Alarm_Clock()
  20. {
  21.         if(flag_100ms == 1)                  //100ms执行一次
  22.         {
  23.                 flag_100ms = 0;
  24.                 if(alarm_switch)
  25.                         if(TimeData[0] == 0 && TimeData[1] == TimeAlarm[1] && TimeData[2] == TimeAlarm[2])
  26.                         {
  27.                                 alarmflag = 1;
  28.                                 ElectricRelay = 0;
  29.                         }       
  30.                 if(alarmflag)
  31.                         LED = ~LED;
  32.         }
  33. }


  34. void main()
  35. {
  36.         Init_Timer0();
  37.         InitLcd1602();                      //1602初始化
  38.         DS1302Init();                                 //先写入时钟日历寄存器起始地址再设置时钟日历初值
  39.         init_eeprom();                //开始初始化保存的数据
  40.         while(1)
  41.         {
  42.                
  43.                 key();
  44.                 key_switch();
  45.                
  46.                 if(menu_1 == 0)
  47.                 {
  48.                         Alarm_Clock();
  49.                         if(value == 0)
  50.                         {
  51.                                 if(alarm_switch)
  52.                                 {
  53.                                         LcdShowStr (14,1,"ON");
  54.                                         DisplayOneChar(12,1,0);
  55.                                 }
  56.                                 else
  57.                                 {
  58.                                         LcdShowStr (13,1,"OFF");
  59.                                         DisplayOneChar(12,1,1);
  60.                                 }
  61.                                
  62.                                 DS1302ReadTime(); //先写入时钟日历寄存器起始地址再读出时钟日历写入到TimeData数组中
  63.                        
  64.                                 LcdShowStr (0,0,"20"); //年
  65.                                 DisplayOneStr (2,0,TimeData[6]); //年
  66.                                 DisplayOneChar (4,0,'-');                    //-
  67.                                 DisplayOneStr (5,0,TimeData[4]); //月
  68.                                 DisplayOneChar (7,0,'-');                 //-
  69.                                 DisplayOneStr (8,0,TimeData[3]);//日
  70.                        
  71.                                 LcdShowWeek(11,0,TimeData[5]%10);  //星期
  72.                                 DisplayOneStr (14,0,TimeData[5]);//星期
  73.                
  74.                                 DisplayOneStr (1,1,TimeData[2]); //时
  75.                                 DisplayOneChar (3,1,':');                 //:
  76.                                 DisplayOneStr (4,1,TimeData[1]); //分
  77.                                 DisplayOneChar (6,1,':');                 //:
  78.                                 DisplayOneStr (7,1,TimeData[0]);//秒
  79.                                  
  80.                         }
  81.                 }
  82.         }       
  83. }

  84. void Timer0(void) interrupt 1
  85. {
  86.         TH0=(65536-50000)/256;              //给定初值
  87.         TL0=(65536-50000)/256;
  88.         value ++;          
  89.         if((value % 2) == 0)         //100ms
  90.         {
  91.                 flag_100ms = 1;         
  92.         }
  93.         if(value >= 6)                         //200ms
  94.         {
  95.                 value = 0;
  96.                 flag_200ms = 1;
  97.         }
  98. }
复制代码

所有资料51hei提供下载:
闹钟.zip (60.1 KB, 下载次数: 22)


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:1 发表于 2018-12-28 02:02 | 只看该作者
补全原理图或者详细说明一下电路连接即可获得100+黑币
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表