找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2778|回复: 4
收起左侧

protues仿真DS1302+LCD1602显示实验

[复制链接]
ID:576497 发表于 2019-10-15 11:30 | 显示全部楼层 |阅读模式
萌新小白,第一次发帖,望见谅!这是我以前做的一个实验,用protues仿真,DS1302读取时间,LCD1602显示出读取的时间。
附件带源文件和仿真工程。
实验效果图:

LCD显示DS1302的时间

LCD显示DS1302的时间


单片机源程序如下:
  1. #include <reg52.h>
  2. #define uint unsigned int
  3. #define uchar unsigned char
  4. #define WRITE_SECOND 0x80
  5. #define WRITE_MINUTE 0x82
  6. #define WRITE_HOUR 0x84
  7. #define READ_SECOND 0x81
  8. #define READ_MINUTE 0x83
  9. #define READ_HOUR 0x85
  10. #define WRITE_PROTECT 0x8E
  11. sbit IO=P1^0;
  12. sbit SCLK=P1^1;
  13. sbit RST=P1^2;
  14. sbit LCD_RS=P2^0;
  15. sbit LCD_RW=P2^1;
  16. sbit LCD_E=P2^2;
  17. uchar DATE[]={"DATE:2000-00-00"};
  18. uchar TIME[]={"TIME:00:00:00  "};
  19. uchar date_time[7];
  20. void delay_ms(uint x)
  21. {
  22.         uint i,j;
  23.         for(i=x;i>0;i--)
  24.         {
  25.                 for(j=112;j>0;j--);
  26.         }
  27. }
  28.         void write_ds1302(uchar date)//写入地址或者数据(控制字)
  29. {
  30.         uint i;
  31.         SCLK=0;//开始准备传输
  32.         for(i=0;i<8;i++)
  33.         {
  34.                 IO=date&0x01;//读取每一位的值
  35.                 SCLK=1;
  36.                 delay_ms(2);
  37.                 SCLK=0;
  38.                 date>>=1;//右移一位
  39.         }
  40. }
  41. uchar read_ds1302()//读取数据
  42. {
  43.         uint i;
  44.         uchar date=0x00;
  45.   for(i=0;i<8;i++)
  46.         {
  47.                 date>>=1;
  48.                 if(IO==1)//如果读取出来的值是1,则将数据定为1,不是就定为0
  49.                 date|=0x80;
  50.                 SCLK=1;
  51.                 delay_ms(2);
  52.                 SCLK=0;
  53.         }
  54.         return date/16*10+date%16;//16进制转换成10进制
  55. }
  56. void write_time(uchar addr,uchar date)//写入你要修改的时间值
  57. {
  58.         RST=0;//初始化CE线,复位
  59.         SCLK=0;//时钟总线清零
  60.         RST=1;//CE置1,传输开始
  61.         write_ds1302(addr);//传入你要写入的时间(时间或者日历地址)
  62.         write_ds1302(date);//写入你要修改的时间值
  63.         SCLK=1;//时间线拉高
  64.         RST=0;//写入结束
  65. }
  66. uchar read_time(uchar addr)//读取你需要的时间值
  67. {
  68.         uchar dat;
  69.         RST=0;//初始化CE线,复位
  70.         SCLK=0;//时钟总线清零
  71.         RST=1;//CE置1,传输开始
  72.         write_ds1302(addr);//传入你要读取的时间地址
  73.         dat=read_ds1302();//读取时间值
  74.         SCLK=1;//时间线拉高
  75.         RST=0;//读取结束
  76.         return dat;
  77. }
  78. void LCD_write_commd(uchar com)//写入命令,如显示地址或者是写入CGRAM,此次代码没有这个功能
  79. {
  80.         LCD_RS=0;//写命令
  81.         LCD_RW=0;
  82.         P0=com;
  83.         delay_ms(2);
  84.         LCD_E=1;
  85.         delay_ms(2);
  86.         LCD_E=0;
  87. }
  88. void LCD_write_date(uchar dat)//写入数据,这次是写入字符码,显示在液晶屏上
  89. {
  90.         LCD_RS=1;//写数据
  91.         LCD_RW=0;
  92.         P0=dat;
  93.         delay_ms(2);
  94.         LCD_E=1;
  95.         delay_ms(2);
  96.         LCD_E=0;
  97. }
  98. void init_LCD1602()//初始化
  99. {
  100.         LCD_write_commd(0x38);
  101.         delay_ms(2);
  102.         LCD_write_commd(0x0c);
  103.         delay_ms(2);
  104.         LCD_write_commd(0x06);
  105.         delay_ms(2);
  106.         LCD_write_commd(0x01);
  107.         delay_ms(2);
  108. }
  109. void set_lcd_pos(uchar p)//设置显示位置
  110. {
  111.         LCD_write_commd(p|0x80);
  112. }
  113. void LCD_print(uchar p,uchar *s)//显示
  114. {
  115.         uint i;
  116.         set_lcd_pos(p);
  117.         for(i=0;i<16;i++)
  118.         {
  119.                 LCD_write_date(s[i]);
  120.                 delay_ms(10);
  121.   }
  122. }
  123. void Get_time()//读取时间
  124. {
  125.         uchar i,addr=0x81;
  126.         for(i=0;i<7;i++)
  127.         {
  128.                 date_time[i]=read_time(addr);
  129.                 addr+=2;
  130.         }
  131. }
  132. void Format_Datetime(uchar d,uchar *a)//将日期和时间值转换成数字字符
  133. {
  134.         a[0]=d/10+'0';
  135.         a[1]=d%10+'0';
  136. }
  137. void init_DS1302()//DS1302初始化
  138. {
  139.         write_time(WRITE_PROTECT,0x00);
  140.         write_time(WRITE_SECOND,0x56);
  141.         write_time(WRITE_MINUTE,0x34);
  142.         write_time(WRITE_HOUR,0x12);
  143.         write_time(WRITE_PROTECT,0x80);
  144.        
  145. }
  146. void main()
  147. {
  148.         //init_DS1302();
  149.         init_LCD1602();//初始化液晶屏
  150.         while(1)
  151.         {
  152.                 Get_time();
  153.           Format_Datetime(date_time[6],DATE+7);
  154.           Format_Datetime(date_time[4],DATE+10);
  155.           Format_Datetime(date_time[3],DATE+13);
  156.           Format_Datetime(date_time[2],TIME+5);
  157.           Format_Datetime(date_time[1],TIME+8);
  158.           Format_Datetime(date_time[0],TIME+11);
  159.     LCD_print(0x00,DATE);
  160.           LCD_print(0x40,TIME);
  161.         }
  162.        
  163. }
复制代码

所有资料51hei提供下载:
DS1302 LCD1602显示.rar (64.47 KB, 下载次数: 90)

评分

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

查看全部评分

回复

使用道具 举报

ID:84745 发表于 2019-10-20 11:58 来自手机 | 显示全部楼层
感谢分享
回复

使用道具 举报

ID:670001 发表于 2019-12-21 19:10 | 显示全部楼层
十分感谢
回复

使用道具 举报

ID:621620 发表于 2019-12-24 17:04 | 显示全部楼层
感谢大佬分享,最近实训需要参考。
回复

使用道具 举报

ID:302325 发表于 2020-5-12 01:42 | 显示全部楼层
感谢分享            
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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