找回密码
 立即注册

QQ登录

只需一步,快速开始

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

51单片机+DS12887+12864大数字时钟程序+电路

[复制链接]
跳转到指定楼层
楼主
51单片机+DS12887+12864大数字时钟
电路原理图如下:


单片机源程序如下:
  1. /*---------------------------------------------------------------------------
  2.                 电子智能时钟程序
  3.                 单 片 机:STC89C52RC
  4.                 晶    振:12MHz
  5.                 时钟芯片:DS12887
  6.                 液 晶 屏:LCM-12864-ST7920
  7.                 时    间:2010年3月28日
  8.                 LCM12864使用并口连接方式,PSB、RST接高电平
  9. 头文件----------------------------------------------------------------------*/
  10. #include <reg52.h>
  11. #include <intrins.h>
  12. #include "LCD12864.h"
  13. #include "DS12CR887.h"
  14. #include "DS18B20.h"
  15. #include "nongli.h"
  16. #include "displaytime.h"
  17. #define uint  unsigned int
  18. #define uchar unsigned char

  19. /*--------------------定义按键-----------------------------------------------*/
  20. sbit K1  = P3^2; //K1-设置
  21. sbit K2  = P3^1; //K2-确认、返回
  22. sbit K3  = P3^0; //K3-加
  23. sbit K4  = P1^7; //K4-减
  24. sbit K5  = P1^6; //液晶背光控制按键,按一下亮,再按一下灭
  25. sbit BLK = P1^3; //液晶背光控制输出,低电平有效,PNP三极管控制。

  26. void DelayM(uint);              

  27. /*定义变量-------------------------------------------------------------------*/
  28. bit q=0, w=0;    //调时标志位

  29. /*延时函数 1MS/次------------------------------------------------------------*/
  30. void DelayM(uint a)              
  31. {
  32.         uchar i;
  33.         while( --a != 0) { for(i = 0; i < 125; i++); }                                     
  34. }
  35. /*日期、时间设置函数---------------------------------------------------------*/
  36. void Set_time(uchar sel)  
  37. {
  38.         signed char address,item;
  39.         signed char max,mini;
  40.         unsigned char yy,mo,moontemp1,moontemp2;
  41.         ds_write(0x0a,0x00);     //进入调时,关闭时钟振荡器
  42.         write_com(0x30); write_com(0x06);
  43.         write_com(0x98); lcm_w_word("设置");
  44.         if(sel==5)  {lcm_w_word("秒钟");address=0; max=59;mini=0;}  //秒钟0  
  45.         if(sel==4)  {lcm_w_word("分钟");address=2; max=59;mini=0;}  //分钟2
  46.         if(sel==3)  {lcm_w_word("小时");address=4; max=23;mini=0;}  //小时4  
  47. //        if(sel==3)  {lcm_w_word("星期");address=6; max=7; mini=1;}  //星期6  修改为自动计算
  48. //        if(sel==2)  {lcm_w_word("日期");address=7; max=31;mini=1;}  //日期7  
  49.         if(sel==2)  {lcm_w_word("日期");                                                                                //日期修改为按月份实际天数调整
  50.                                         address=7;                                                                                                        //日期7
  51.                mo = ds_read(0x08);//读月
  52.                                         moontemp1=mo/16;
  53.                                         moontemp2=mo%16;
  54.                                         mo=moontemp1*10+moontemp2;//转换成10进制月份数据

  55.                yy = ds_read(0x09);//读年
  56.                moontemp1=yy/16;
  57.                                         moontemp2=yy%16;
  58.                                         yy=moontemp1*10+moontemp2;//转换成10进制年份数据

  59.                if(mo==2&&yy%4!=0){max=28;mini=1;}//平年2月28天
  60.                                         if(mo==2&&yy%4==0){max=29;mini=1;}//闰年2月29天
  61.                                         if(mo==1||mo==3||mo==5||mo==7||mo==8||mo==10||mo==12){max=31;mini=1;}//每月31天的月份
  62.                                         if(mo==4||mo==6||mo==9||mo==11){max=30;mini=1;} //每月30天的月份
  63.                                         }                                                                                                                             
  64.         if(sel==1)  {lcm_w_word("月份");address=8; max=12;mini=1;}  //月份8  
  65.         if(sel==0)  {lcm_w_word("年份");address=9; max=99;mini=0;}  //年份9                  
  66.         item=ds_read(address);         //读取DS12CR887某地址上的数值赋给item
  67.         if(K3 == 0) {item++;}    //K3-加数:1
  68.         if(K4 == 0) {item--;}    //K4-减数:1
  69.         if(item>max) item=mini;  //限制数值最大有效范围   
  70.         if(item<mini) item=max;         //限制数值最小有效范围           
  71.         ds_write(address,item);  //将调整好的item值写入DS12CR887
  72.         displaydate();                          //显示日期
  73.         displaytime();                                 //显示时间
  74.         displaynl();                                  //显示农历
  75.         displayxq();                                 //显示星期
  76. }
  77. /*主函数---------------------------------------------------------------------*/
  78. void main()
  79. {                            
  80.         uchar e=0;
  81.         K1=1;K2=1;K3=1;K4=1;K5=1;BLK=0;

  82.         ds_int();                        //时钟芯片初始化
  83.         lcm_init();                        //液晶初始化
  84.         welcome();                    //调用欢迎信息
  85.         DelayM(2000);                 //延时
  86.         lcm_clr();            //清屏
  87.         Clean_12864_GDRAM();         //清屏
  88.         while(1)
  89.         {
  90.                 if (w == 0)                  //正常走时
  91.                 {
  92.                         displaydate();         //显示日期
  93.                         displaynl();         //显示农历
  94.                         displaytime();         //显示时间
  95.                         read_temp();         //读取温度
  96.                         ds1820disp();          //显示温度
  97. displayxq();
  98.                 }       
  99.                 else {}              //否则启动调时

  100. /*----------------------------设置时间--------------------------------------*/               
  101.                 if (K1 == 0)         
  102.                 {
  103.                         DelayM(20);                       //按键消抖
  104.                         if(K1 == 0 && w == 1)      //当是调时状态 本键用于调整下一项
  105.                         {
  106.                                 e++;
  107.                                 if (e >= 7 ) {e = 0;}
  108.                            while(! K1 );            //等待键松开
  109.                                 Set_time(e);           //调整                               
  110.                         }                       
  111.                         if(K1 == 0 && w == 0)      //当是正常状态时就进入调时状态
  112.                         {
  113.                                 lcm_clr();            
  114.                                 Clean_12864_GDRAM();   //清屏
  115.                                 w=1;                       //进入调时
  116.                                 Set_time(e);
  117.                         }
  118.                            while(K1 == 0);            //等待键松开
  119.                 }
  120. /*--------------------------------------------------------------------------*/               
  121.                 if (K2 == 0)                   // 当在调时状态时就退出调时
  122.                 {
  123.                         DelayM(20);
  124.                         if(K2 == 0 && w == 1)
  125.                         {                               
  126.                                 w = 0;                       //退出调时
  127.                                 e = 0;                           //"下一项"计数器清0                                                               
  128.                         }
  129.                         if(K2 == 0 && w == 0)
  130.                         {                               
  131.                                 lcm_clr(); Clean_12864_GDRAM();
  132.                                 write_com(0x30); write_com(0x06);
  133.                                 welcome();                               
  134.                                 while(K2 == 0);  
  135.                         }
  136.                         lcm_clr(); Clean_12864_GDRAM();
  137.                         ds_write(0x0a,0x20);       //调时完毕,开启时钟振荡器                               
  138.                         displaydate();
  139.                         displaynl();
  140.                         displaytime();
  141.                         read_temp();
  142.                         ds1820disp();
  143.                         while(K2 == 0);  
  144.                 }
  145. /*加调整--------------------------------------------------------------------*/               
  146.                 if (K3 == 0 && w == 1)
  147.                 {
  148.                         DelayM(20);
  149.                         if(K3 == 0 && w == 1) { Set_time(e); }
  150. //                        while(K3 == 0);
  151.                         while(! K3 );
  152.                 }
  153. /*减调整--------------------------------------------------------------------*/               
  154.                 if (K4 == 0 && w == 1)
  155.                 {              
  156.                         DelayM(20);
  157.                         if(K4 == 0 && w == 1) { Set_time(e); }
  158. //                        while(K4 == 0);
  159.                         while(! K4 );
  160.                 }
  161. /*液晶背光控制,按一下亮,再按一下灭----------------------------------------*/
  162.                 if(K5 == 0)        
  163.                 {
  164.                         DelayM(20); q = ~q;      //标志位取反
  165.                          if(q){BLK = BLK | 1;}   
  166.                                  else {BLK = BLK & 0;}   
  167.                         while(K5 == 0);           
  168.                 }
  169.         }
  170. }
  171. /*结束----------------------------------------------------------------------*/
复制代码

所有资料51hei提供下载:
PCB源文件.zip (209.02 KB, 下载次数: 51)
时钟程序.zip (80.33 KB, 下载次数: 80)


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

使用道具 举报

沙发
ID:441717 发表于 2018-12-17 18:11 | 只看该作者
原理图在这

DS12CR887时钟原理图.pdf

117.51 KB, 下载次数: 28, 下载积分: 黑币 -5

回复

使用道具 举报

板凳
ID:447439 发表于 2018-12-19 16:48 | 只看该作者
学习下,用160的屏幕需要改代码吗
回复

使用道具 举报

地板
ID:447439 发表于 2018-12-20 18:44 | 只看该作者
求程序包,学习借鉴
回复

使用道具 举报

5#
ID:38792 发表于 2020-2-4 19:32 | 只看该作者
怎么下载?
回复

使用道具 举报

6#
ID:447439 发表于 2021-1-8 13:33 | 只看该作者
最近再写UC1698控制器160160屏幕的GPS时钟,学习下
回复

使用道具 举报

7#
ID:864602 发表于 2021-1-18 21:40 | 只看该作者
非常感谢,经典
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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