标题: 51单片机+12c887大数字时钟12864液晶显示 [打印本页]

作者: xiaoliu    时间: 2013-6-26 02:10
标题: 51单片机+12c887大数字时钟12864液晶显示
再发一个作品到51hei论坛,仿了个12864大数字时钟12c887板子和12864一样大。。4个固定孔。。先吧显示搞出来。。功能慢慢学习。
12864时钟PCB和原理图程序

pcb文件.rar (95.87 KB, 下载次数: 466)
   这个pcb就是发的效果。。还有原理图什么的都再里面。。要仿的直接就可以用。

电路图 程序.rar (218.54 KB, 下载次数: 785)
这个是我后来冲冲改的1302和12c887   二选一的PCB。。。。要用的改下io定义就可以了。用1302的话还有好多IO口闲置可以再利用。。当然程序要自己找了。












  1. /*---------------------------------------------------------------------------
  2.                 电子智能时钟程序
  3.                 单 片 机:STC89C52RC
  4.                 晶    振:12MHz
  5.                 时钟芯片:DS12887
  6.                 液 晶 屏:LCM-12864-ST7920
  7.                 时    间:2010年3月28日
  8.                 LCM12864使用并口连接方式,PSB、RST接高电平
  9. 头文件----------------------------------------------------------------------*/
  10. #include
  11. #include
  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. /*结束----------------------------------------------------------------------*/
复制代码

作者: 左左右右    时间: 2013-6-28 15:32
51hei论坛有你更精彩

作者: 左左右右    时间: 2013-6-28 15:34
这个资料真的太好了 我也做一个

作者: 冷清___若水    时间: 2013-8-13 16:26
第一次来51hei论坛就弄到这么好的资料  M币严重不够用啊

作者: azhiarm9    时间: 2013-11-1 17:10
好东西啊 做的不错 看着心痒痒的

作者: doitmyself    时间: 2013-11-2 17:06
功能很齐全啊 好东西 值得学习啊
作者: pany520    时间: 2013-12-31 11:34
下载来看看啊!~初学者必须下!~
作者: pany520    时间: 2013-12-31 11:38
请问下,三极管是怎么选的!~
作者: yhu168    时间: 2014-3-26 16:48
不错!值的收藏
作者: 金属蒙皮    时间: 2014-3-26 22:03
不错,分享的资料很详细,感谢了。
作者: 07700114    时间: 2014-5-26 12:25
好东东,谢谢楼主分享。
作者: rich3524    时间: 2014-5-26 13:34
好东东,谢谢楼主分享。
作者: fengrongkai    时间: 2014-6-22 18:27
多得多
作者: Instrument    时间: 2014-6-26 21:36
好东西啊
作者: ya123chiang    时间: 2014-6-27 06:28
太好嘞謝謝妳分享.................
作者: huyin    时间: 2014-8-18 20:37
谢谢,很好不错
作者: h2o1    时间: 2014-8-22 20:44
资料真的太好了,俺要大数字的。。。。
作者: jst    时间: 2014-8-25 09:46
这个资料真的太好了
作者: yanggff    时间: 2014-8-25 10:31
真是高手
作者: rich3524    时间: 2014-8-25 15:52
这个资料真的太好了~大大真是高手~
作者: delay    时间: 2015-1-21 22:50
下来参考参考
作者: 南天白云    时间: 2015-1-23 14:41
楼主资料不全哦
作者: days110002    时间: 2015-5-10 12:04
好东西,支持
作者: 601331349    时间: 2015-5-25 13:38
好东西,支持支持
作者: 海阔天空2015    时间: 2015-7-3 18:25
不知楼主用的是什么12864的?用带字库的吗
作者: 南天白云    时间: 2015-7-3 18:47
楼主:这个资料太好了,都是模块化结构,对我也是一种启示
作者: 游戏机123456    时间: 2015-7-6 10:53
你好看到你做的时钟不错可惜我没有黑币,麻烦你把你的制作资料发给我用用不胜感激。我的邮箱是JZRCL88@163.com
作者: kongxiangning    时间: 2015-7-6 11:06
不错啊
作者: yangjing29    时间: 2015-9-19 12:12
精彩的呀。
作者: yamglang    时间: 2015-10-9 02:45
M币严重不够用啊
作者: fyang    时间: 2015-10-14 22:48
很漂亮啊
作者: 油炸热干面    时间: 2015-10-21 21:39
51hei论坛有你更精彩
作者: LCHK119    时间: 2015-10-22 23:26
漂亮,12c887 刚拆得两片,改天做个试试,谢谢分享!
作者: fyang    时间: 2015-10-24 21:31
很好看啊
作者: 胡闹闹    时间: 2015-10-25 11:30
正在学习51中,来了后发现,这里的朋友程序都贴得很工整。感谢楼主
作者: fyang    时间: 2015-10-26 21:09
照着用洞洞板做了一个,一直显示不出来,不知道哪里出错了
作者: fyang    时间: 2015-10-26 21:11
P3口没有焊接上拉电阻,显示不正常,是这个原因吗?
作者: fyang    时间: 2015-10-26 21:13
说错了,是P2口没有上拉电阻,是不是这个原因呢
作者: jinzhenhuaj    时间: 2015-10-28 21:21
谢谢分享,好详细啊
作者: jinzhenhuaj    时间: 2015-10-28 21:21
金属蒙皮 发表于 2014-3-26 22:03
不错,分享的资料很详细,感谢了。

感谢了,很详细,连pcb版图都有
作者: jinzhenhuaj    时间: 2015-10-28 21:22
yhu168 发表于 2014-3-26 16:48
不错!值的收藏

完全同意
作者: a937983423    时间: 2015-10-28 21:27
好东西啊 做的不错 看着心痒痒的
作者: whmrd    时间: 2015-11-1 20:32
原理图和pcb不对应啊,原理图中p13输出蜂鸣器,pcb中是p15,另外程序中按键设置也和pcb中不对应。
作者: fyang    时间: 2015-11-16 21:04
总算做出来了,
作者: ifosdf    时间: 2015-11-25 14:42
请问12864怎么显示那么多的自定义字符呢  
作者: adls    时间: 2015-11-25 14:54
好东东,谢谢楼主分享。
作者: 电子diy    时间: 2015-11-25 18:27
刚刚好 我也想做这个
作者: liuyuanhui0    时间: 2015-12-1 21:40
漂亮,12c887 刚拆得一片,改天做个试试,谢谢分享!
作者: fa201104    时间: 2015-12-3 13:19
很详细的资料
作者: 1178282157    时间: 2015-12-5 00:57
时间会慢慢变得不准确是什么原因啊。
作者: BlackIotus    时间: 2015-12-7 22:29
好东西,收藏一下

作者: sunnny    时间: 2015-12-10 15:26
希望我也能做出来!谢谢分享
作者: nwpchennan    时间: 2016-2-26 13:46
真不错,支持一下楼主!!!
作者: 少年心    时间: 2016-3-12 11:51

好东东,谢谢楼主分享
作者: 少年心    时间: 2016-3-12 11:51

好东东,谢谢楼主分享!
作者: 2005198318    时间: 2016-3-13 22:49
功能很齐全啊 好东西 值得学习
作者: mysy    时间: 2016-4-7 11:36
很好看啊
作者: 李生新    时间: 2016-4-20 18:33
pany520 发表于 2013-12-31 11:38
**** 作者被禁止或删除 内容自动屏蔽 ****

大哥,那是18b20.温度传感器啊
作者: wjh罗尔    时间: 2016-4-20 19:18
谢谢分享
作者: yunfei0000    时间: 2016-5-4 11:08
这个板子动手能力很强
作者: middfat    时间: 2016-5-4 12:34
果断收藏!
作者: gw1682    时间: 2016-5-5 22:11
下载看看学习一下
作者: dlwjmcf    时间: 2016-5-8 19:38
支持,学习一下
作者: xudawei    时间: 2016-9-3 11:23
compiling 时钟2.c...
时钟2.C(40): warning C206: 'ds_write': missing function-prototype
时钟2.C(40): error C267: 'ds_write': requires ANSI-style prototype
时钟2.c - 1 Error(s), 1 Warning(s).
作者: siyaqq    时间: 2016-9-18 10:03
简单,实用,很不错
作者: Nicodon    时间: 2016-9-24 11:47
为什么下载以后打不开啊
作者: hfg5k    时间: 2016-9-24 15:11
多找几个程序研究研究,我弄个更好的出来
作者: sxh123    时间: 2016-10-4 17:40
精彩帖子 楼主牛人
作者: youchuang    时间: 2016-10-17 10:40
很不错,给力,DIY一个。
作者: scfengbiao    时间: 2016-12-14 15:46
我怎么打不开呢  程序也没有代码
作者: luotao    时间: 2017-1-1 22:15
伟大的楼主 ,,谢谢
作者: mllwj    时间: 2017-3-26 16:35
太好了,我也做一个玩玩,非常感谢
作者: 暗双魂    时间: 2017-4-3 02:46
楼主,有没有闹钟啊
作者: ryang    时间: 2017-4-3 07:12
也有相关材料!有空画图打个样
作者: zqy181818    时间: 2017-4-19 09:50
谢谢!资料不错
作者: 苏晓旭    时间: 2017-4-21 22:54
就做这个了,太漂亮。大爱。
作者: lijn    时间: 2017-4-23 05:55
进来学习,谢谢分享。
作者: 1965501205    时间: 2017-6-11 09:40
谢谢楼主,学习学习。
作者: 1965501205    时间: 2017-6-11 09:41
来学习一下,吸收经验。
作者: 1965501205    时间: 2017-6-11 14:52
楼主,你的大数字用那个软件提取的?
作者: 越快乐越堕落    时间: 2017-6-12 22:44
很不错 谢谢分享
作者: cjjcjj1    时间: 2017-6-13 12:32
提示: 作者被禁止或删除 内容自动屏蔽
作者: 越快乐越堕落    时间: 2017-6-20 19:20
想问一下温度值是怎么调整的?我调了好多遍都只显示95.9度,和楼主的那一张一样
作者: hzlsw1    时间: 2017-6-20 21:44
lay文件用什么打开啊,
作者: hzlsw1    时间: 2017-6-20 21:47
怎么程序里面没有温度采集变量函数
作者: (xiaobai)    时间: 2017-11-20 00:15
越快乐越堕落 发表于 2017-6-20 19:20
想问一下温度值是怎么调整的?我调了好多遍都只显示95.9度,和楼主的那一张一样

你做的是pcb还是洞洞板,我用洞洞板做的不亮啊

作者: tkf008    时间: 2017-11-25 16:18
谢谢楼主,真是好东西
作者: song1987_01    时间: 2018-1-9 21:48
正在学习单片机,谢谢分享&#128591;
作者: wsq0387    时间: 2018-1-10 17:17
谢谢楼主分享谢谢楼主分享
作者: 可爱你个头阿    时间: 2018-3-29 17:25
萌新求教怎么显示大数字
作者: ware    时间: 2018-3-29 19:50
666666666
作者: th2009    时间: 2018-7-6 22:55
感谢楼主分享
作者: zhuhong110450    时间: 2018-12-12 14:12
感觉看原理图,楼主对p2口也家了排组,我觉得就用po口就可以了,12864和12c887都是可以并口的应该,这样可以多余一些接口做闹钟.
作者: qq6688    时间: 2019-2-13 13:24
我正好手上有12887芯片,想要这个。
作者: woojoon1981    时间: 2022-5-6 12:50
流弊。正好是我想要的。感谢
作者: woojoon1981    时间: 2022-5-6 12:51
很好,。非常感谢楼主的无私奉献
作者: 3563032    时间: 2024-5-20 14:30
可惜了我的串口屏,用不上
作者: 是阿超    时间: 2024-5-22 09:57

不错!值的收藏




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1