找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 937|回复: 0
收起左侧

单片机DS1302时钟LCD1602显示代码,proteus7和8的仿真都有

[复制链接]
ID:439558 发表于 2023-4-11 13:07 | 显示全部楼层 |阅读模式
DS1302时钟LCD1602显示,proteus7和8的仿真都有
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
51hei截图18141218354188.jpg

单片机源程序如下:
  1. //调用1602显示驱动,在此文件内已包含51头文件和定义数据类型
  2. #include "LCD1602.h"
  3. /*====================================
  4. IO接口定义
  5. ====================================*/
  6. sbit TSCLK = P1^1; //时钟
  7. sbit TIO = P1^0;   //数据
  8. sbit TRST = P1^2;  //使能

  9. #define MAIN_Fosc                11059200UL        //宏定义主时钟HZ
  10. #define DS1302_W_ADDR 0x80  //写时钟日历寄存器起始地址
  11. #define DS1302_R_ADDR 0x81        //读时钟日历寄存器起始地址

  12. //时钟日历暂存数组,秒、分、时、日、月、周、年
  13. uchar TimeData[7]={0, 0, 0, 0, 0, 0, 0};

  14. /*=================================================
  15. *函数名称:Delay_Ms
  16. *函数功能:12T 51单片机自适应主时钟毫秒级延时函数
  17. *说明:需定义MAIN_Fosc(晶振主频单位HZ)
  18. *输入:ms:要延时的毫秒
  19. =================================================*/
  20. void Delay_Ms(INT16U ms)
  21. {
  22.      INT16U i;
  23.          do{
  24.               i = MAIN_Fosc / 96000;
  25.                   while(--i);   //96T per loop
  26.      }while(--ms);
  27. }
  28. /*=================================================
  29. *函数名称:DS1302_W_Byte
  30. *函数功能:DS1302写一字节数据
  31. *输入:dat:要写入的数据
  32. =================================================*/
  33. void DS1302_W_Byte(uchar dat)
  34. {
  35.         uchar i;
  36.         for(i = 0; i < 8; i++) //每次写1bit,写8次
  37.         {
  38.                 TSCLK = 0;                   //拉低时钟总线
  39.                 TIO = dat & 0x01;  //从一字节最低位开始写
  40.                 TSCLK = 1;                   //拉高时钟总线,DS1302把数据读走
  41.                 dat >>= 1;                   //数据右移一位
  42.         }       
  43. }
  44. /*=================================================
  45. *函数名称:DS1302_R_Byte
  46. *函数功能:DS1302读一字节
  47. *输出:dat:读取的数据
  48. =================================================*/
  49. uchar DS1302_R_Byte()
  50. {
  51.         uchar i, dat;
  52.         for(i = 0; i < 8; i++)  //每次写1bit,写8次
  53.         {
  54.                 TSCLK = 0;                        //拉低时钟总线,DS1302把数据放到数据总线上
  55.                 dat >>= 1;                         //数据右移一位,数据从最低位开始读
  56.                 if(TIO)        dat |= 0x80;//读取数据
  57.                 TSCLK = 1;                        //拉高时钟总线
  58.         }
  59.         return dat;                                //返回读取的数据
  60. }
  61. /*=================================================
  62. *函数名称:DS1302_W_DAT
  63. *函数功能:写DS1302数据一次写2个字节
  64. *说明:先写命令后写数据
  65. *调用:DS1302_W_Byte()
  66. *输入:cmd:需要写的命令 ,dat:需要些的数据
  67. =================================================*/
  68. void DS1302_W_DAT(uchar cmd, uchar dat)
  69. {
  70.         TRST = 0;                         //拉低使能端
  71.         TSCLK = 0;                         //拉低数据总线
  72.         TRST = 1;                         //拉高使能端,开始写数据
  73.         DS1302_W_Byte(cmd);         //写命令
  74.         DS1302_W_Byte(dat);         //写数据
  75. }
  76. /*=================================================
  77. *函数名称:DS1302_R_DAT
  78. *函数功能:读DS1302数据
  79. *说明:先写入命令字节后读出对应数据
  80. *调用:        DS1302_W_Byte();DS1302_R_Byte();
  81. *输入:        cmd:需要写的命令
  82. *输出:        dat:读出的数据
  83. =================================================*/
  84. uchar DS1302_R_DAT(uchar cmd)
  85. {
  86.         uchar dat;
  87.         TRST = 0;                                 //拉低使能端
  88.         TSCLK = 0;                                //拉低数据总线
  89.         TRST = 1;                                //拉高使能端,开始写数据
  90.         DS1302_W_Byte(cmd);                //写命令
  91.         dat = DS1302_R_Byte();        //读出数据
  92.         return dat;                                //返回读出数据
  93. }

  94. /*=================================================
  95. *函数名称:DS1302_Clear_WP
  96. *函数功能:清除DS1302写保护
  97. *说明:先写入命令0x8e(写控制寄存器)接着向该寄存器写0
  98. *调用:DS1302_W_DAT()
  99. =================================================*/
  100. void DS1302_Clear_WP()
  101. {
  102.         DS1302_W_DAT(0x8e,0x00);  //把控制寄存器WP位置0
  103. }
  104. /*=================================================
  105. *函数名称:DS1302_Clear_WP
  106. *函数功能:设置DS1302写保护
  107. *说明:先写入命令0x8e(写控制寄存器)接着向该寄存器写0x80
  108. *调用:DS1302_W_DAT()
  109. =================================================*/
  110. void DS1302_Set_WP()
  111. {       
  112.         DS1302_W_DAT(0x8e,0x80); //把控制寄存器WP位置1
  113.         TRST = 0;                                 //拉低使能端
  114.         TSCLK = 0;                                 //拉低数据总线
  115. }

  116. /*=================================================
  117. *函数名称:Read_DS1302_Time
  118. *函数功能:读取DS1302时钟数据
  119. *说明:        读取DS1302时钟数据 返回数据存入时钟日历暂存
  120.                 数组TimeData(数据格式BCD码)
  121. *调用:DS1302_Clear_WP();DS1302_R_DAT();DS1302_Set_WP();
  122. *输入:        addr:需要读取时钟日历寄存器的起始地址
  123. =================================================*/
  124. void Read_DS1302_Time(uchar addr)
  125. {
  126.         uchar i;
  127.         DS1302_Clear_WP();            //清楚些保护
  128.         for(i = 0; i < 7; i++)        //从DS1302读取7个字节的时钟日历数据
  129.         {
  130.                 TimeData[i] = DS1302_R_DAT(addr);//先写入要读取数据的寄存器起始地址,再读出数据存入TimeData数组
  131.                 addr += 2;                                                 //时钟日历寄存器地址+2转向下一个寄存器
  132.         }
  133.         DS1302_Set_WP();   //开起写保护
  134. }
  135. /*=================================================
  136. *函数名称:main
  137. *函数功能:主函数 1602液晶显示DS1302数据
  138.                    Date:年-月-日-星期
  139.                    Time:时:分:秒
  140. =================================================*/
  141. void main()
  142. {
  143.         InitLcd1602();                      //1602初始化
  144.         LcdShowStr(0,0,"Date:");  //1602显示字符串
  145.         LcdShowStr(0,1,"Time:");  //1602显示字符串
  146.         while(1)
  147.         {
  148.                 Read_DS1302_Time(DS1302_R_ADDR); //先写入时钟日历寄存器起始地址再读出时钟日历写入到TimeData数组中
  149.                 DisplayOneStr (5,0,TimeData[6]); //年
  150.                 DisplayOneChar (7,0,'-');                 //-
  151.                 DisplayOneStr (8,0,TimeData[4]); //月
  152.                 DisplayOneChar (10,0,'-');                 //-
  153.                 DisplayOneStr (11,0,TimeData[3]);//日

  154.                 DisplayOneStr (5,1,TimeData[2]); //时
  155.                 DisplayOneChar (7,1,':');                 //:
  156.                 DisplayOneStr (8,1,TimeData[1]); //分
  157.                 DisplayOneChar (10,1,':');                 //:
  158.                 DisplayOneStr (11,1,TimeData[0]);//秒
  159.                 Delay_Ms(1000);                                         //延时1秒
  160.         }               
  161. }
复制代码

Keil代码与Proteus仿真下载:
DS1302时钟LCD1602不带星期.zip (95.21 KB, 下载次数: 54)

评分

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

查看全部评分

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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