标题: DS1302+LCD1602显示日期、星期、时间Proteus仿真+单片机程序 [打印本页]

作者: 陈润源home    时间: 2019-5-20 16:16
标题: DS1302+LCD1602显示日期、星期、时间Proteus仿真+单片机程序
本帖最后由 陈润源home 于 2019-5-20 19:42 编辑

说明:开机显示当前计算机时间(若下载到开发板上请手动调节时间)
       第1次按下MODE键,如果此时按下 S+ /S-,则秒的值 +1/ -1,按下yes保存设定值
       第2次按下MODE键,如果此时按下 S+ /S-,则分的值 +1/ -1,按下yes保存设定值
       第3次按下MODE键,如果此时按下 S+ /S-,则时的值 +1/ -1,按下yes保存设定值
       第4次按下MODE键,如果此时按下 S+ /S-,则天的值 +1/ -1,按下yes保存设定值
       第5次按下MODE键,如果此时按下 S+ /S-,则月的值 +1/ -1,按下yes保存设定值
       第6次按下MODE键,如果此时按下 S+ /S-,则周的值 +1/ -1,按下yes保存设定值
       第7次按下MODE键,如果此时按下 S+ /S-,则年的值 +1/ -1,按下yes保存设定值
       第8次按下MODE键,开始正常计时。


本程序已通过“清翔电子”开发板完美验证,请坛友放心下载。用其他开发板的童鞋请自行修改端口。




附件还内附DS1302资料+标准程序,需要的小伙伴请下载

仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)



单片机源程序如下:
  1. //说明:开机显示当前PC时间
  2. //     第1次按下MODE键,如果此时按下 S+ /S-,则秒的值 +1/ -1,按下yes保存设定值
  3. //     第2次按下MODE键,如果此时按下 S+ /S-,则分的值 +1/ -1,按下yes保存设定值
  4. //     第3次按下MODE键,如果此时按下 S+ /S-,则时的值 +1/ -1,按下yes保存设定值
  5. //     第4次按下MODE键,如果此时按下 S+ /S-,则天的值 +1/ -1,按下yes保存设定值
  6. //     第5次按下MODE键,如果此时按下 S+ /S-,则月的值 +1/ -1,按下yes保存设定值
  7. //     第6次按下MODE键,如果此时按下 S+ /S-,则周的值 +1/ -1,按下yes保存设定值
  8. //     第7次按下MODE键,如果此时按下 S+ /S-,则年的值 +1/ -1,按下yes保存设定值
  9. //     第8次按下MODE键,开始正常计时。
  10. //      
  11. //------------------------------------------------------------------------

  12. #include <reg51.h>                            //调用含有51专用寄存器的头文件
  13. #define uchar unsigned char            //用uchar代替unsigned char
  14. #define uint unsigned int                //用uint代替unsigned int

  15. #define yh 0x80       //LCD第一行的初始位置,因为LCD1602字符地址首位D7恒定为1(100000000=80)
  16. #define er 0x80+0x40 //LCD第二行初始位置(因为第二行第一个字符位置地址是0x40)

  17. char a,sec,min,hour,day,mouth,week,year,temp,n;                 //定义变量

  18. sbit rw=P3^6;                 //液晶读写端
  19. sbit rs=P3^5;                 //液晶指令/数据输入控制
  20. sbit en=P3^4;                 //液晶使能端

  21. sbit sda=P1^1;             //数据线
  22. sbit clk=P1^0;             //时钟线
  23. sbit rst=P1^2;             //使能

  24. sbit mode=P3^0;      //设置键
  25. sbit s1  =P3^1;      //加键
  26. sbit s2  =P3^2;      //减键
  27. sbit yes =P3^3;             //调整确认键

  28. sbit ACC0=ACC^0;         //累加器A低位
  29. sbit ACC7=ACC^7;         //累加器A高位

  30. uchar code tab1[]={"20  -  -   "};    //年显示的固定字符
  31. uchar code tab2[]={"  :  :  "};       //时间显示的固定字符

  32. /***********************延时子程序********************/
  33. void delay(uint xms)
  34. {
  35.         uint x,y;
  36.         for(x=xms;x>0;x--)
  37.          for(y=110;y>0;y--);
  38. }

  39. /****************液晶写入指令函数*******************/
  40. void write_1602com(uchar com)
  41. {
  42.         rs=0;                //数据/指令选择置为指令
  43.         rw=0;                //读写选择置为写
  44.         P0=com;              //送入数据
  45.         delay(1);
  46.         en=1;                //拉高使能端,为制造有效的下降沿做准备
  47.         delay(1);
  48.         en=0;                //en由高变低,产生下降沿,液晶执行命令
  49. }

  50. /********************液晶写入数据函数***************/
  51. void write_1602dat(uchar dat)
  52. {
  53.         rs=1;               //数据/指令选择置为数据
  54.         rw=0;               //读写选择置为写
  55.         P0=dat;             //送入数据
  56.         delay(1);
  57.         en=1;               //en置高电平,为制造下降沿做准备
  58.         delay(1);
  59.         en=0;               //en由高变低,产生下降沿,液晶执行命令
  60. }

  61. /**************液晶初始化函数**********************/
  62. void lcd_init()
  63. {
  64.         write_1602com(0x38);         //设置液晶工作模式,
  65.         write_1602com(0x0c);         //开显示不显示光标
  66.         write_1602com(0x06);         //整屏不移动,光标自动右移
  67.         write_1602com(0x01);         //清显示

  68.         write_1602com(yh+1);         //日历显示固定符号从第一行第1个位置之后开始显示
  69.         for(a=0;a<14;a++)
  70.         {
  71.         write_1602dat(tab1[a]);      //向液晶屏写日历显示的固定符号部分
  72.         }
  73.         write_1602com(er+2);         //时间显示固定符号写入位置,从第2个位置后开始显示
  74.         for(a=0;a<8;a++)
  75.         {
  76.         write_1602dat(tab2[a]);      //写显示时间固定符号,两个冒号
  77.         }

  78. }

  79. /***************写数据********************/
  80. void write_byte(uchar dat)
  81. {
  82.         ACC=dat;
  83.         rst=1;
  84.         for(a=8;a>0;a--)
  85.         {
  86.          sda=ACC0;
  87.          clk=0;
  88.          clk=1;
  89.          ACC=ACC>>1;
  90.         }
  91. }

  92. /******************读数据********************/
  93. uchar read_byte()
  94. {
  95.         rst=1;
  96.         for(a=8;a>0;a--)
  97.         {
  98.          ACC7=sda;
  99.          clk=1;
  100.          clk=0;
  101.          ACC=ACC>>1;
  102.         }
  103.         return (ACC);
  104. }

  105. /*********向1302芯片写函数,指定写入地址,数据*********/
  106. void write_1302(uchar add,uchar dat)
  107. {
  108.         rst=0;
  109.         clk=0;
  110.         rst=1;
  111.         write_byte(add);
  112.         write_byte(dat);
  113.         clk=1;
  114.         rst=0;
  115. }

  116. /*********从1302读数据函数,指定读取数据来源地址*******/
  117. uchar read_1302(uchar add)
  118. {
  119.         uchar temp;
  120.         rst=0;
  121.         clk=0;
  122.         rst=1;
  123.         write_byte(add);
  124.         temp=read_byte();
  125.         clk=1;
  126.         rst=0;
  127.         return(temp);
  128. }

  129. /****************BCD码转十进制函数,输入BCD,返回十进制*******/
  130. uchar BCD(uchar m)
  131. {
  132. uchar x;
  133. x=m>>4;
  134. return(x=x*10+(m&=0x0f));
  135. }

  136. /********1302芯片初始化子函********/
  137. void ds1302_init()
  138. {
  139. rst=0;
  140. clk=0;
  141. write_1302(0x8e,0x00); //允许写,禁止写保护
  142. delay(50);
复制代码

所有资料51hei提供下载:
DS1302 1602液晶.rar (600.95 KB, 下载次数: 706)


作者: 陈润源home    时间: 2019-5-20 19:38
自古一楼是楼主
作者: 158925    时间: 2019-5-23 11:16
为什么压缩包格式损坏?

作者: 陈润源home    时间: 2019-6-1 23:14
没损坏啊,我这下载能打开
作者: 51Y    时间: 2019-6-4 15:59
真好,刚刚好能用到,感谢楼主
作者: lllllllllzzzzzz    时间: 2019-6-5 19:16
感谢楼主!
作者: 匪爷2019    时间: 2019-6-10 19:50
感谢楼主,51黑有你更精彩!!!
作者: yzhbyyy    时间: 2019-6-11 14:53
感谢楼主,51黑有你更精彩!!!
作者: sh0871    时间: 2019-6-12 12:46
谢谢楼主了哈~
作者: sh0871    时间: 2019-6-12 12:49
谢谢楼主了哈~
作者: GYB123123    时间: 2019-6-12 13:27
感谢楼主,51黑有你更精彩,爱你么么哒
作者: wqwqw111    时间: 2019-6-13 08:54
TMOd=0x11,工作模式怎么会是三?
作者: wqwqw111    时间: 2019-6-13 08:57
楼主看来还没学懂,tmod=0x11,是两个定时器都工作在方式1,居然备注解释是工作方式3,我也是醉了
作者: wqwqw111    时间: 2019-6-13 09:15
从你这程序来看,tmod应该是工作模式三,自动重装,因为没看到重新设初值,也就是256vs扫描显示一次
作者: 鹜流后    时间: 2019-6-13 16:28
感谢楼主
作者: tp3333    时间: 2019-6-18 14:44
感谢楼主
作者: 3205440665    时间: 2019-6-18 23:54
漂亮,有你更精彩!!!
作者: 育碧看风景    时间: 2019-6-20 16:05
哈哈哈,这个没记错的话是课本上的叭,某些人阔以直接抄了
作者: 陈润源home    时间: 2019-6-28 11:10
wqwqw111 发表于 2019-6-13 09:15
从你这程序来看,tmod应该是工作模式三,自动重装,因为没看到重新设初值,也就是256vs扫描显示一次

写错了
作者: 单片机牛笔    时间: 2019-7-8 16:13
谢谢大佬
作者: yilinghai    时间: 2019-8-8 14:26
有2个问题
第一:星期显示不对,不能做到实时显示,比如2019/8/8,显示却是星期五;
第二:在调整时间的时候,光标不会闪烁
作者: 越南超级人类    时间: 2019-8-19 19:22
这个程序经测试以通过,谢谢大神,希望大神们多出佳作
作者: 2656210650    时间: 2019-8-21 01:04
学习了,学习了,向大神学习。
作者: NIGICUE    时间: 2019-9-11 16:57
有没有PCB原理图啊
作者: ugcamnx    时间: 2019-9-17 09:50
谢谢分享!
作者: mao918    时间: 2019-9-19 10:50
看着心痒痒呀,好想成为大神这样的。
作者: 纳爱斯牙牙乐    时间: 2019-9-21 17:34
真的可以用,谢谢楼主
作者: wzlwzl5273    时间: 2019-10-11 19:22
好难啊,不过还是谢谢楼主
作者: gilliamkee    时间: 2019-10-17 11:26
感谢楼主!
作者: 八月初    时间: 2019-11-8 14:29
正在学习数码管加LCD1602,谢谢分享
作者: 死也学不会    时间: 2019-11-11 19:39
这个要显示温度怎么做,调试了好久都不成功
作者: wyuhan    时间: 2019-11-13 08:08
感谢分享
作者: zhujunbo    时间: 2019-11-20 17:10
感谢分享

作者: 1727782690    时间: 2019-11-22 22:17

感谢分享
作者: GodWorks    时间: 2019-11-23 10:33
感谢分享
作者: 死也学不会    时间: 2019-12-1 14:27
这东西为什么星期数不对,总是多一
作者: xiaolin1    时间: 2019-12-16 12:30
感谢分享,向大佬们学习!
作者: clow    时间: 2019-12-24 18:54
有没有51单片机和LCD的数字钟,不要显示温度
作者: clow    时间: 2019-12-24 18:55
感谢大佬
作者: clow    时间: 2019-12-24 19:01
为什么我回复不了,大佬帮帮我
作者: 18066702924    时间: 2019-12-25 00:40
感谢大佬
作者: gspt    时间: 2019-12-25 11:29
感谢大佬
作者: 113265    时间: 2019-12-25 13:48
资料很好,收藏了
作者: jiangzn2020    时间: 2020-2-20 00:22

感谢分享
作者: 秋爽    时间: 2020-2-21 21:40
没有其它功能吗?
作者: denminshen    时间: 2020-3-13 12:30
下载学习学习,谢谢分享!
作者: wjm926    时间: 2020-3-16 13:20
感谢楼主,51黑有你更精彩
作者: wjm926    时间: 2020-3-16 13:20
感谢大佬
作者: uiwagd    时间: 2020-4-8 06:00
下载看看
作者: 王佳怡    时间: 2020-4-8 15:56
楼主太厉害了!

作者: caiji1hao    时间: 2020-6-18 09:18
谢谢大佬(鞠躬)!
作者: nishinagezhu    时间: 2020-6-18 21:24
看了,感觉作者没理由的强
作者: qhd11    时间: 2022-2-18 10:18
DS1302 lcd1602程序编写很标准,可以借用。
作者: hezezeze    时间: 2022-4-13 17:27
大神很棒!学习的榜样,很实用。赞赞
作者: Megagon    时间: 2022-4-13 21:46
为什么大佬的文件一编译就不行了,源文件还是很厉害的
作者: 1990808983    时间: 2022-12-10 22:47
谢谢大佬分享,资料很棒喔,正好可以学习学习
作者: 2396980347    时间: 2023-4-20 17:42
感谢楼主,实现实时显示

作者: ccplus7923    时间: 2023-6-9 09:55
陈润源home 发表于 2019-5-20 19:38
自古一楼是楼主

里面能实现计时器功能吗
作者: aide51    时间: 2023-6-18 19:52
这个不错,刚好拿来学习一下
作者: 有半岛铁盒    时间: 2023-6-19 10:16
很有帮助 对我这种刚学习的刚刚好 谢谢大佬

作者: AaronHe    时间: 2024-3-6 16:59
可以,测试可行!
作者: ljingwei    时间: 2024-4-2 10:57
如果加个定时程序应咋加
作者: yujingpiaomiao    时间: 2025-4-22 11:18
先下载,再向楼主讨教
作者: kirito21    时间: 2025-6-3 11:10
发表于 2019-9-11 16:57
有没有PCB原理图啊

你这纯零基础呀
作者: 几米断崖    时间: 2025-6-11 09:39
19年的贴现在还这么受欢迎,点赞楼主
作者: scfcb    时间: 2025-8-13 10:55
好贴不过时,不错,刚好拿来学习一下




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