找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5137|回复: 8
收起左侧

51单片机读取ds1302时钟模块的数据显示在1602上面,乱码了

[复制链接]
ID:232062 发表于 2019-3-23 22:27 | 显示全部楼层 |阅读模式
100黑币
IMG_20190323_222431.jpg

求大佬给看一下1602乱码的原因

  1. #include <STC89C5xRC.H>
  2. #include <stdio.h>
  3. #include <intrins.h>
  4. #define uchar unsigned char
  5. #define uint unsigned int
  6. #include "LCD1602.h"
  7. sbit RST=P3^5;
  8. sbit IO=P3^6;
  9. sbit SCK=P3^7;
  10. sbit led=P2^4;
  11. #define ds1302_sec_add   0x80  //秒数据地址
  12. #define ds1302_min_add   0x82  //分数据地址
  13. #define ds1302_hr_add   0x84  //时数据地址
  14. #define ds1302_date_add   0x86  //日数据地址
  15. #define ds1302_month_add  0x88  //月数据地址
  16. #define ds1302_day_add   0x8a  //星期数据地址
  17. #define ds1302_year_add   0x8c  //年数据地址
  18. #define ds1302_control_add  0x8e  //控制数据地址
  19. #define ds1302_charger_add  0x90      
  20. #define ds1302_clkburst_add  0xbe
  21. //初始时间定义
  22. uchar time_buf[7] = {0x19,0x03,0x23,0x16,0x23,0x55,0x06};//初始时间2010年6月1号23点59分55秒 星期二
  23. void Delay_xms(uint x)
  24. {
  25.   uint i,j;
  26.   for(i=0;i<x;i++)
  27.     for(j=0;j<112;j++);
  28. }
  29. //功能:12us延时
  30. //STC89C52为1T单片机,即1个时钟/机器周期,速度为AT89C52的12倍
  31. void Delay_xus(uint t)        
  32. {
  33.   for(;t>0;t--)
  34.    {
  35.   _nop_();
  36.    }
  37. }
  38. void ds1302_init(void)
  39. {
  40. RST=0;   //RST脚置低
  41. SCK=0;   //SCK脚置低
  42. }
  43. //向DS1302写入一字节数据
  44. void ds1302_write_byte(uchar addr, uchar d)
  45. {
  46. uchar i;
  47. RST=1;     //启动DS1302总线
  48. //写入目标地址:addr
  49. addr = addr & 0xFE;   //最低位置零,寄存器0位为0时写,为1时读
  50. for (i = 0; i < 8; i ++) {
  51.   if (addr & 0x01) {
  52.    IO=1;
  53.    }
  54.   else {
  55.    IO=0;
  56.    }
  57.   SCK=1;      //产生时钟
  58.   SCK=0;
  59.   addr = addr >> 1;
  60.   }
  61. //写入数据:d
  62. for (i = 0; i < 8; i ++) {
  63.   if (d & 0x01) {
  64.    IO=1;
  65.    }
  66.   else {
  67.    IO=0;
  68.    }
  69.   SCK=1;    //产生时钟
  70.   SCK=0;
  71.   d = d >> 1;
  72.   }
  73. RST=0;  //停止DS1302总线
  74. }
  75. //从DS1302读出一字节数据
  76. uchar ds1302_read_byte(uchar addr) {
  77. uchar i,temp;
  78. RST=1;     //启动DS1302总线
  79. //写入目标地址:addr
  80. addr = addr | 0x01;    //最低位置高,寄存器0位为0时写,为1时读
  81. for (i = 0; i < 8; i ++) {
  82.   if (addr & 0x01) {
  83.    IO=1;
  84.    }
  85.   else {
  86.    IO=0;
  87.    }
  88.   SCK=1;
  89.   SCK=0;
  90.   addr = addr >> 1;
  91.   }
  92. //输出数据:temp
  93. for (i = 0; i < 8; i ++) {
  94.   temp = temp >> 1;
  95.   if (IO) {
  96.    temp |= 0x80;
  97.    }
  98.   else {
  99.    temp &= 0x7F;
  100.    }
  101.   SCK=1;
  102.   SCK=0;
  103.   }
  104. RST=0;     //停止DS1302总线
  105. return temp;
  106. }
  107. //向DS302写入时钟数据
  108. void ds1302_write_time(void)
  109. {

  110. ds1302_write_byte(ds1302_control_add,0x00);   //关闭写保护
  111. ds1302_write_byte(ds1302_sec_add,0x80);    //暂停时钟
  112. ds1302_write_byte(ds1302_charger_add,0xa9);     //涓流充电
  113. ds1302_write_byte(ds1302_year_add,time_buf[0]);  //年
  114. ds1302_write_byte(ds1302_month_add,time_buf[1]); //月
  115. ds1302_write_byte(ds1302_date_add,time_buf[2]);  //日
  116. ds1302_write_byte(ds1302_hr_add,time_buf[3]);  //时
  117. ds1302_write_byte(ds1302_min_add,time_buf[4]);  //分
  118. ds1302_write_byte(ds1302_sec_add,time_buf[5]);  //秒
  119. ds1302_write_byte(ds1302_day_add,time_buf[6]);  //周
  120. ds1302_write_byte(ds1302_control_add,0x80);   //打开写保护     
  121. }
  122. //从DS302读出时钟数据
  123. void ds1302_read_time(void)  
  124. {
  125. time_buf[0]=ds1302_read_byte(ds1302_year_add);  //年
  126. time_buf[1]=ds1302_read_byte(ds1302_month_add);  //月
  127. time_buf[2]=ds1302_read_byte(ds1302_date_add);  //日
  128. time_buf[3]=ds1302_read_byte(ds1302_hr_add);  //时
  129. time_buf[4]=ds1302_read_byte(ds1302_min_add);  //分
  130. time_buf[5]=(ds1302_read_byte(ds1302_sec_add))&0x7f;//秒,屏蔽秒的第7位,避免超出59
  131. time_buf[6]=ds1302_read_byte(ds1302_day_add);  //周  
  132. }
  133. void Display(void)
  134. {
  135.    write_com(0x80+0);                  //1602第1行第1列
  136.    write_data('2');                    //x000年00月00日00时00分00秒
  137.   write_com(0x80+1);                  //1602第1行第2列
  138.    write_data('0');                    //0x00年00月00日00时00分00秒
  139.    write_com(0x80+2);                  //1602第1行第3列
  140.    write_data(time_buf[0]/16);         //00x0年00月00日00时00分00秒
  141.   write_com(0x80+3);                  //1602第1行第4列
  142.   write_data(time_buf[0]&0X0F);       //000x年00月00日00时00分00秒
  143.   write_com(0x80+4);
  144.    write_data('/');

  145.   write_com(0x80+5);
  146.    write_data(time_buf[1]/16);
  147.   write_com(0x80+6);
  148.   write_data(time_buf[1]&0X0F);

  149.   write_com(0x80+7);
  150.    write_data('/');

  151.   write_com(0x80+8);
  152.    write_data(time_buf[2]/16);
  153.   write_com(0x80+9);
  154.   write_data(time_buf[2]&0X0F);

  155.   write_com(0x80+13);
  156.    write_data(time_buf[6]&0X0F);

  157.   write_com(0xc0+0);
  158.   write_data(time_buf[3]/16);
  159.   write_com(0xc0+1);
  160.   write_data(time_buf[3]&0X0F);
  161.   
  162.   write_com(0xc0+2);
  163.    write_data('/');

  164.   write_com(0xc0+3);
  165.   write_data(time_buf[4]/16);
  166.   write_com(0xc0+4);
  167.   write_data(time_buf[4]&0X0F);
  168.   
  169.   write_com(0xc0+5);
  170.    write_data('/');

  171.   write_com(0xc0+6);
  172.   write_data(time_buf[5]/16);
  173.   write_com(0xc0+7);
  174.   write_data(time_buf[5]&0X0F);


  175. }

  176. //主函数
  177. void main(void)
  178. {
  179. Delay_xms(50);//等待系统稳定
  180. lcd1602_init();
  181. ds1302_init();  //DS1302初始化
  182. Delay_xms(10);
  183. ds1302_write_time(); //写入初始值
  184. while(1)
  185.   {  
  186.    Display();
  187.    Delay_xms(200);
  188.   }
  189. }
复制代码

最佳答案

查看完整内容

给一个例子,你对照看看:
回复

使用道具 举报

ID:164602 发表于 2019-3-23 22:27 | 显示全部楼层
给一个例子,你对照看看:
1.jpg

1.jpg


DS1302显示时钟.rar

45.69 KB, 下载次数: 43

回复

使用道具 举报

ID:111634 发表于 2019-3-24 11:24 | 显示全部楼层
实例91  具有校正功能的时钟1302(LCD1602显示)
回复

使用道具 举报

ID:232062 发表于 2019-3-24 12:31 | 显示全部楼层
HC6800-ES-V2.0 发表于 2019-3-24 10:02
给一个例子,你对照看看:

不行啊,这个程序下载进去什么都没有了,1602也不显示东西了
回复

使用道具 举报

ID:96682 发表于 2019-3-24 13:12 | 显示全部楼层
qq1104859436 发表于 2019-3-24 12:31
不行啊,这个程序下载进去什么都没有了,1602也不显示东西了

生搬硬套行不通,就算电路与程序是配套的,只是芯片不一样都有可能出问题
回复

使用道具 举报

ID:432823 发表于 2019-3-24 13:59 | 显示全部楼层
1602显示的字符,如显示3数字 代码0x30+3,你出现乱码是没有进行显示码的+0x30.
回复

使用道具 举报

ID:477407 发表于 2019-3-25 12:03 | 显示全部楼层
楼上说的对,你这个显示程序的输入参数应该是ASCII码,而你输入的是数字,比如‘0’的ASCII码是0x30,
以141行 write_data(time_buf[0]/16);为例 ,比如你要显示数字2 应该是write_data(0x32);其中0x32是数字2的ASCII码
因此在你141后面所有
write_data(XXX)全部改成write_data(‘0’+XXX)就能显示了 或者write_data(0x30+XXX)
回复

使用道具 举报

ID:232062 发表于 2019-3-26 19:03 | 显示全部楼层
我已经弄好了,换了几个旧模块都不行,然后自己焊接了一个ds1302的模块,再修改修改的程序就好了。
回复

使用道具 举报

ID:229821 发表于 2019-3-26 21:10 | 显示全部楼层
仔细检测程序。多看看其他帖子。吸取经验。楼主加油。祝你早日成功。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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