找回密码
 立即注册

QQ登录

只需一步,快速开始

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

DS1302+LCD1602显示日期、星期、时间Proteus仿真+单片机程序

  [复制链接]
回帖奖励 10 黑币 回复本帖可获得 10 黑币奖励! 每人限 1 次
跳转到指定楼层
楼主
本帖最后由 陈润源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, 下载次数: 666)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

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

使用道具 举报

沙发
ID:293363 发表于 2019-5-20 19:38 | 只看该作者
自古一楼是楼主
回复

使用道具 举报

板凳
ID:335647 发表于 2019-5-23 11:16 | 只看该作者
为什么压缩包格式损坏?
回复

使用道具 举报

地板
ID:293363 发表于 2019-6-1 23:14 | 只看该作者
没损坏啊,我这下载能打开
回复

使用道具 举报

5#
ID:554789 发表于 2019-6-4 15:59 | 只看该作者
真好,刚刚好能用到,感谢楼主
回复

使用道具 举报

6#
ID:519597 发表于 2019-6-5 19:16 | 只看该作者
感谢楼主!
回复

使用道具 举报

7#
ID:559289 发表于 2019-6-10 19:50 | 只看该作者
感谢楼主,51黑有你更精彩!!!
回复

使用道具 举报

8#
ID:469510 发表于 2019-6-11 14:53 | 只看该作者
感谢楼主,51黑有你更精彩!!!
回复

使用道具 举报

9#
ID:560786 发表于 2019-6-12 12:46 | 只看该作者
谢谢楼主了哈~
回复

使用道具 举报

10#
ID:560786 发表于 2019-6-12 12:49 | 只看该作者
谢谢楼主了哈~
回复

使用道具 举报

11#
ID:560816 发表于 2019-6-12 13:27 | 只看该作者
感谢楼主,51黑有你更精彩,爱你么么哒
回复

使用道具 举报

12#
ID:425846 发表于 2019-6-13 08:54 | 只看该作者
TMOd=0x11,工作模式怎么会是三?
回复

使用道具 举报

13#
ID:425846 发表于 2019-6-13 08:57 | 只看该作者
楼主看来还没学懂,tmod=0x11,是两个定时器都工作在方式1,居然备注解释是工作方式3,我也是醉了
回复

使用道具 举报

14#
ID:425846 发表于 2019-6-13 09:15 | 只看该作者
从你这程序来看,tmod应该是工作模式三,自动重装,因为没看到重新设初值,也就是256vs扫描显示一次
回复

使用道具 举报

15#
ID:560725 发表于 2019-6-13 16:28 | 只看该作者
感谢楼主
回复

使用道具 举报

16#
ID:480987 发表于 2019-6-18 14:44 | 只看该作者
感谢楼主
回复

使用道具 举报

17#
ID:82043 发表于 2019-6-18 23:54 | 只看该作者
漂亮,有你更精彩!!!
回复

使用道具 举报

18#
ID:409545 发表于 2019-6-20 16:05 来自手机 | 只看该作者
哈哈哈,这个没记错的话是课本上的叭,某些人阔以直接抄了
回复

使用道具 举报

19#
ID:293363 发表于 2019-6-28 11:10 | 只看该作者
wqwqw111 发表于 2019-6-13 09:15
从你这程序来看,tmod应该是工作模式三,自动重装,因为没看到重新设初值,也就是256vs扫描显示一次

写错了
回复

使用道具 举报

20#
ID:580058 发表于 2019-7-8 16:13 | 只看该作者
谢谢大佬
回复

使用道具 举报

21#
ID:247623 发表于 2019-8-8 14:26 | 只看该作者
有2个问题
第一:星期显示不对,不能做到实时显示,比如2019/8/8,显示却是星期五;
第二:在调整时间的时候,光标不会闪烁
回复

使用道具 举报

22#
ID:577423 发表于 2019-8-19 19:22 | 只看该作者
这个程序经测试以通过,谢谢大神,希望大神们多出佳作
回复

使用道具 举报

23#
ID:463339 发表于 2019-8-21 01:04 | 只看该作者
学习了,学习了,向大神学习。
回复

使用道具 举报

24#
ID:610572 发表于 2019-9-11 16:57 来自手机 | 只看该作者
有没有PCB原理图啊
回复

使用道具 举报

25#
ID:612406 发表于 2019-9-17 09:50 | 只看该作者
谢谢分享!
回复

使用道具 举报

26#
ID:91721 发表于 2019-9-19 10:50 | 只看该作者
看着心痒痒呀,好想成为大神这样的。
回复

使用道具 举报

27#
ID:484951 发表于 2019-9-21 17:34 | 只看该作者
真的可以用,谢谢楼主
回复

使用道具 举报

28#
ID:622486 发表于 2019-10-11 19:22 | 只看该作者
好难啊,不过还是谢谢楼主
回复

使用道具 举报

29#
ID:625482 发表于 2019-10-17 11:26 | 只看该作者
感谢楼主!
回复

使用道具 举报

30#
ID:415088 发表于 2019-11-8 14:29 | 只看该作者
正在学习数码管加LCD1602,谢谢分享
回复

使用道具 举报

31#
ID:639253 发表于 2019-11-11 19:39 | 只看该作者
这个要显示温度怎么做,调试了好久都不成功
回复

使用道具 举报

32#
ID:640789 发表于 2019-11-13 08:08 | 只看该作者
感谢分享
回复

使用道具 举报

33#
ID:638682 发表于 2019-11-20 17:10 | 只看该作者
感谢分享
回复

使用道具 举报

34#
ID:626677 发表于 2019-11-22 22:17 | 只看该作者

感谢分享
回复

使用道具 举报

35#
ID:446113 发表于 2019-11-23 10:33 | 只看该作者
感谢分享
回复

使用道具 举报

36#
ID:639253 发表于 2019-12-1 14:27 | 只看该作者
这东西为什么星期数不对,总是多一
回复

使用道具 举报

37#
ID:664337 发表于 2019-12-16 12:30 | 只看该作者
感谢分享,向大佬们学习!
回复

使用道具 举报

38#
ID:671627 发表于 2019-12-24 18:54 | 只看该作者
有没有51单片机和LCD的数字钟,不要显示温度
回复

使用道具 举报

39#
ID:671627 发表于 2019-12-24 18:55 | 只看该作者
感谢大佬
回复

使用道具 举报

40#
ID:671627 发表于 2019-12-24 19:01 | 只看该作者
为什么我回复不了,大佬帮帮我
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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