找回密码
 立即注册

QQ登录

只需一步,快速开始

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

电子万年历全部单片机程序

[复制链接]
跳转到指定楼层
楼主
ID:257049 发表于 2017-12-6 08:51 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
单片机源程序如下:
  1. /*********************************************************************************
  2. * 【实验平台】: QX-MCS51 单片机开发板
  3. * 【外部晶振】: 11.0592mhz        
  4. * 【主控芯片】: STC89C52
  5. * 【编译环境】: Keil μVisio4        
  6. * 【程序功能】: 电子万年历,LCD1602液晶显示,显示时分秒、星期、公历、阴历、闹钟、环境温度、可以校时和设置闹钟。                                                                                          
  7. * 【使用说明】: 使用3条杜邦线把P10接到DS1302的TSCLK上,P11接到TIO,P12接到TRST上。
  8.                                  接上LCD1602液晶。
  9. * 【按键功能说明】:在正常显示状态下S2按键为切换公历、时钟/阴历、闹钟显示,在设置状态下S2为设置左移。
  10.                                         S5为设置键,在显示公历时钟状态下,按下S5为设置公历、时钟,再次按下S5为写入设置参数并退出
  11.                                         在显示阴历、闹钟状态下,按下S5为设置阴历、闹钟,再次按下S5为写入设置参数并退出
  12.                                         在设置状态下,S3为数据加
  13.                                         在设置状态下,S4为数据减
  14. *  说明:免费开源,不提供源代码分析.
  15. **********************************************************************************/
  16. #define  _MAIN_C
  17. #include "config.h"
  18. #include "LCD1602.h"
  19. #include "DS1302.h"
  20. #include "DS18B20.h"
  21. #include "app.h"
  22. #include "Key_Buzzer.h"
  23. #include "main.h"

  24. bit flag1s = 0;    //1s定时标志位
  25. bit flag200ms = 0; //200ms定时标志
  26. enum eStaSystem staSystem = E_NORMAL;  //系统运行状态

  27. void main()
  28. {
  29.         EA = 1;                        //开总中断
  30.         Start18B20();   //启动温度转换
  31.         Init_Timer0();  //初始化定时器0
  32.         Init_LCD1602(); //LCD1602初始化
  33.         //Init_DS1302();        //初始化DS1302
  34.         while (!flag1s);//上电后延时1秒
  35.     flag1s = 0;
  36.         RefreshTime();        //刷新时间
  37.         RefreshDate(1);        //立即刷新日期
  38.         RefreshTemp(1); //立即刷新温度显示

  39.         while(1)
  40.         {
  41.             KeyDriver();        //按键检测
  42.                 if(flag200ms)        //200ms时间到
  43.                 {
  44.                         flag200ms = 0;        //清零标志位
  45.                         AlarmMonitor(); //监控闹钟
  46.                         if (staSystem == E_NORMAL)//如果系统正常运行
  47.                         {
  48.                                 RefreshTime(); //刷新时间
  49.                                 RefreshDate(0);//刷新日期
  50.                         }
  51.                         if (staSystem == Dis_Alarm)
  52.                         {
  53.                                 RefreshLunar(); //刷新阴历
  54.                         }
  55.                 }        
  56.                 if(flag1s && (staSystem == E_NORMAL))//1s时间到并且系统为正常运行
  57.                 {
  58.                         flag1s = 0;//清零标志位
  59.                         RefreshTemp(0);//刷新温度        
  60.                 }
  61.    }
  62. }

  63. /* 温度刷新函数,读取当前温度并根据需要刷新液晶显示,
  64. ** ops-刷新选项:为0时只当温度变化才刷新,非0则立即刷新 */
  65. void RefreshTemp(uint8 ops)
  66. {
  67.     int16 temp;
  68.     uint8 pdata str[8];
  69.     static int16 backup = 0;
  70.    
  71.     Get18B20Temp(&temp); //获取当前温度值
  72.     Start18B20();        //启动下一次转换
  73.     temp >>= 4;          //舍弃4bit小数位
  74.     if ((backup!=temp) || (ops!=0)) //按需要刷新液晶显示
  75.     {
  76.         str[0] = (temp / 10) + '0';  //十位转为ASCII码
  77.         str[1] = (temp % 10) + '0';  //个位转为ASCII码
  78.         str[2] = '\'';             //用'C代替℃
  79.         str[3] = 'C';
  80.         str[4] = '\0';             //字符串结束符
  81.         LCD1602_Dis_Str(12, 1, str);    //显示到液晶上
  82.         backup = temp;             //刷新上次温度值
  83.     }
  84. }


  85. /*初始化定时器0 定时5ms*/        
  86. void Init_Timer0()
  87. {
  88.         
  89.         TMOD = 0x01;  //定时器16为计数工作模式
  90.         TH0 =0xee;
  91.         TL0 =0x00; //5ms
  92.         ET0 = 1; //开定时器0中断
  93.         TR0 = 1;//启动定时器0
  94. }
  95. /*定时器0中断服务程序*/
  96. void Timer0() interrupt 1
  97. {
  98.         static uint8 tmr1s = 0;
  99.     static uint8 tmr200ms = 0;
  100.         
  101.         TH0 =0xee;
  102. ……………………

  103. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
万年历焊接板.zip (124.25 KB, 下载次数: 73)


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

使用道具 举报

沙发
ID:310944 发表于 2018-4-18 15:42 | 只看该作者
很强很赞有参考价值
回复

使用道具 举报

板凳
ID:441756 发表于 2018-12-7 17:28 | 只看该作者
好想下载
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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