久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2415|回復: 8
打印 上一主題 下一主題
收起左側

單片機+DS1302時鐘芯片程序讀數據一直是29

[復制鏈接]
跳轉到指定樓層
樓主
    DS1302時鐘芯片,按照手冊寫的呀!為什么在單片機開發板上一直2081-29-29  29:29:29 ,我是用的LCD1602作為顯示器,程序燒寫進去以后一直是這樣。其中的LCD1602顯示程序沒有問題,可以不用看,應該是DS1302的程序哪里出了問題,附件里我加了keil5的工程文件,大佬們有空幫我看一下,不勝感激。我網上查過資料,也有很多人遇到DS1302的這種問題,但沒有合適的解決我的問題。extern unsigned char Real_Time[]; 已經設置為全局變量。

單片機源程序如下:
  1. #include <REGX51.H>
  2. #include "LCD1602.H"
  3. #include "DS1302.H"

  4. unsigned int Second,Minutes,Hour,Day,Month,Year,Week;
  5. unsigned char Weeks[7][3]={"Mon","Tue","Thu","Wed","Fri","Sat","Sun"};


  6. void main()
  7. {
  8.         LCD_Init();
  9.         LCD_ShowNum(1,1,20,2);//LCD1602顯示數字,分別是,第一行,第一列,數字位數。
  10.         LCD_ShowString(1,5,"-  -");//顯示字符串
  11.         LCD_ShowString(2,3,":  :");
  12.         DS1302_Init();//初始化1302
  13.   Set_Time();//設置給定的時間
  14.         
  15.         while(1)
  16.         {
  17.                 Read_Time();//讀取時間
  18. LCD_ShowNum(1,3,Real_Time[0],2);
  19.                 LCD_ShowNum(1,6,Real_Time[1],2);
  20.                 LCD_ShowNum(1,9,Real_Time[2],2);
  21.                 LCD_ShowNum(2,1,Real_Time[3],2);
  22.                 LCD_ShowNum(2,4,Real_Time[4],2);
  23.                 LCD_ShowNum(2,7,Real_Time[5],2);        
  24.                 LCD_ShowString(1,13,"Sat");               
  25.         }
  26. }

  27. //一-------------------
  28. #include <REGX51.H>

  29. //寫指令
  30. #define DS1302_Second 0x80
  31. #define DS1302_Minute 0x82
  32. #define DS1302_Hour   0x84
  33. #define DS1302_Day    0x86
  34. #define DS1302_Month  0x88
  35. #define DS1302_Year   0x8A
  36. #define DS1302_Week   0x8C
  37. #define DS1302_WP                        0x8E
  38. //讀指令
  39. #define DS1302R_Second 0x81
  40. #define DS1302R_Minute 0x83
  41. #define DS1302R_Hour   0x85
  42. #define DS1302R_Day    0x87
  43. #define DS1302R_Month  0x89
  44. #define DS1302R_Year   0x8B
  45. #define DS1302R_Week   0x8D

  46. sbit DS1302_SCLK=P3^6;
  47. sbit DS1302_CE=P3^5;
  48. sbit DS1302_IO=P3^4;

  49. unsigned char Time[7]={21,11,28,20,50,30,7};//設定的時間,依次為 年/月/日/時/分/秒/周
  50. unsigned char Real_Time[7];


  51. void DS1302_Init()  //初始化
  52.         {
  53.                 DS1302_CE=0;
  54.                 DS1302_SCLK=0;
  55.         }

  56. DS1302_WriteByte(unsigned char cmd,datax)//DS1302寫命令
  57. {
  58.         unsigned int i;
  59.         DS1302_CE=1;
  60.         for(i=0;i<8;i++)
  61.         {
  62.                 DS1302_IO=cmd&(0x01<<i);
  63.                 DS1302_SCLK=1;
  64.                 DS1302_SCLK=0;
  65.         }
  66.                 for(i=0;i<8;i++)
  67.         {
  68.                 DS1302_IO=datax & (0x01<<i);
  69.                 DS1302_SCLK=1;
  70.                 DS1302_SCLK=0;
  71.         }
  72.         DS1302_CE=0;
  73. }

  74. unsigned char DS1302_ReadByte(unsigned char cmd)//DS1302讀命令
  75. {
  76.         unsigned char data1=0x00;
  77.         unsigned int i;
  78.         DS1302_CE=1;
  79.         for(i=0;i<8;i++)
  80.         {
  81.                 DS1302_IO=cmd&(0x01<<i);
  82.                 DS1302_SCLK=0;
  83.                 DS1302_SCLK=1;
  84.         }
  85.                 for(i=0;i<8;i++)
  86.         {
  87.                 if(DS1302_IO==1){data1=DS1302_IO|(0x01<<i);}
  88.                 DS1302_SCLK=1;
  89.                 DS1302_SCLK=0;
  90.         }
  91.                 DS1302_CE=0;
  92.                 DS1302_IO=0;
  93.                 return data1;
  94. }


  95. void Set_Time()
  96. {
  97.         DS1302_WriteByte(DS1302_WP,0x00);//關閉寫保護
  98.         DS1302_WriteByte(DS1302_Year,21);//設置年
  99.         DS1302_WriteByte(DS1302_Month,Time[1]);//設置年
  100.         DS1302_WriteByte(DS1302_Day,Time[2]);//設置年
  101.         DS1302_WriteByte(DS1302_Hour,Time[3]);//設置年
  102.         DS1302_WriteByte(DS1302_Minute,Time[4]);//設置年
  103.         DS1302_WriteByte(DS1302_Second,Time[5]);//設置年
  104.         DS1302_WriteByte(DS1302_Week,Time[6]);//設置年
  105. }

  106. void Read_Time()
  107. {
  108.         unsigned int i;
  109.   Real_Time[0]=DS1302_ReadByte(DS1302R_Year);
  110.         Real_Time[1]=DS1302_ReadByte(DS1302R_Month);
  111.         Real_Time[2]=DS1302_ReadByte(DS1302R_Day);
  112.         Real_Time[3]=DS1302_ReadByte(DS1302R_Hour);
  113.         Real_Time[4]=DS1302_ReadByte(DS1302R_Minute);
  114.         Real_Time[5]=DS1302_ReadByte(DS1302R_Second);
  115.         Real_Time[6]=DS1302_ReadByte(DS1302R_Week);
  116.         for(i=0;i<7;i++)
  117.         {
  118.                 Time[i]=Time[i]/16*10+Time[i]%16;
  119.         }
  120. }
復制代碼

51hei圖片_20211205210428.jpg (424.15 KB, 下載次數: 179)

51hei圖片_20211205210428.jpg

06DS1302時鐘芯片.zip

42.37 KB, 下載次數: 8

keil5工程文件

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:624769 發表于 2021-12-5 22:04 | 只看該作者
你太依賴顯示屏了,

你先用串口,把從DS1302中讀取出來的值原封不動的發出來, 串口助手 直接原封不動的 HEX接收, HEX顯示,看看到底是什么值,然后分析是什么問題, 你這29都是轉碼以后的值了,要從源頭分析。
幾個參考值,秒為默認上電后是 0x80, 寫保護位默認上電后是 0x00, 充電設置位,默認上電后是 0x5C, 別急著寫數據,先讀數據,看看對不對了,再驗證其他的。
回復

使用道具 舉報

板凳
ID:988270 發表于 2021-12-5 22:31 | 只看該作者
188610329 發表于 2021-12-5 22:04
你太依賴顯示屏了,

你先用串口,把從DS1302中讀取出來的值原封不動的發出來, 串口助手 直接原封不動的 ...

剛用串口測試了一下,讀出來數據是81,在秒的位置讀出來的一直是81,因為DS1302輸出的是BCD碼,所以轉換一下,其實是129,剛好對應上LCD顯示的29
回復

使用道具 舉報

地板
ID:624769 發表于 2021-12-5 22:58 | 只看該作者
天賦異稟 發表于 2021-12-5 22:31
剛用串口測試了一下,讀出來數據是81,在秒的位置讀出來的一直是81,因為DS1302輸出的是BCD碼,所以轉換 ...

你讀秒的時候, 往 DS1302 發出去的就是 0x81 吧? 所以你最后讀出來 0x81, 說明,你壓根沒完成讀取,讀的,就是你發的,
回復

使用道具 舉報

5#
ID:988270 發表于 2021-12-5 23:02 | 只看該作者
天賦異稟 發表于 2021-12-5 22:31
剛用串口測試了一下,讀出來數據是81,在秒的位置讀出來的一直是81,因為DS1302輸出的是BCD碼,所以轉換 ...

我剛又用串口工具測試了一下,下面的程序當我給出P3_5=1,串口接收到的數據是01 01 01 00 00 00這樣一直循環,但如果是P3_0接口就沒有問題,這是硬件出問題了嗎?還是設置的問題?
[code]#include <REGX52.H>
回復

使用道具 舉報

6#
ID:988270 發表于 2021-12-5 23:04 | 只看該作者
188610329 發表于 2021-12-5 22:58
你讀秒的時候, 往 DS1302 發出去的就是 0x81 吧? 所以你最后讀出來 0x81, 說明,你壓根沒完成讀取,讀 ...

那就是讀的程序有問題了,但是0x81是存儲秒的地址呀,就算讀取 錯誤也不應該返回一個原地址呀
回復

使用道具 舉報

7#
ID:624769 發表于 2021-12-6 15:37 | 只看該作者
天賦異稟 發表于 2021-12-5 23:04
那就是讀的程序有問題了,但是0x81是存儲秒的地址呀,就算讀取 錯誤也不應該返回一個原地址呀

你DS1302 的讀寫代碼寫得非常“妖異”,很抱歉,我看不明白。

建議是,你直接用串口,依次 發送 0x81  0x83   0x91 這些,讓單片機 傳送到 DS1302 后回傳給串口,有助于你分析。  然后, 利用串口  發送比如  0x80 0x00, 讓單片機轉發給DS1302讓DS1302跑起來后, 再用 0x81 讀一下看看效果,是否會數據變化,通過這些綜合判斷一下,是啥問題,或者下載一個中規中矩的DS1302的代碼,嘗試一下讀寫看看。
回復

使用道具 舉報

8#
ID:401564 發表于 2021-12-6 23:36 | 只看該作者
如果是普中的板子,有可能是P3.4或者P3.5或者P3.6沒有上拉電阻
你看一下原理圖,認真看一下
回復

使用道具 舉報

9#
ID:584814 發表于 2021-12-8 15:34 | 只看該作者
定型的板子,板載的時鐘芯片肯定不會有什么沒上拉之類的問題。
從現象上看,是讀取時鐘數據不正常。
可以用試驗板所配的原代碼跑一下,正常后再根據自己需要修改。
還有個惡心的問題,就是當備用電池沒電、芯片是仿的沒仿好的情況下,必須先寫時鐘數據然后讀取才能正常,換句話說如果你不先寫個邏輯正確的數據就不會出正常的結果(一般會走時但亂走,也有不走的)。
另:記得有些這種板上時鐘有個跳線(比如圖中黃色的那個切換板載模塊用的),如果不按要求做就相當于沒接上時鐘模塊
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日操操| 一区二区三区四区在线视频 | www.天天操 | 国产观看 | 在线观看深夜视频 | 天天天操操操 | 成人久久18免费网站图片 | 国产一级免费在线观看 | 欧美黄色绿像 | 国产永久免费 | 亚洲五码久久 | 欧美日韩国产高清 | 青青草国产在线观看 | 久久精品亚洲精品国产欧美 | 国产剧情久久 | 粉嫩一区二区三区性色av | 96国产精品久久久久aⅴ四区 | 97人人超碰 | 中文字幕视频免费 | 国产精品揄拍一区二区 | 久久久久久久av麻豆果冻 | 午夜精品久久久久久久久久久久 | 国产日韩精品一区二区 | 日日夜夜狠狠操 | 欧美精品中文字幕久久二区 | 久久99视频精品 | 国产午夜高清 | 精品视频在线播放 | 欧美精品99 | 国产中文字幕在线 | 欧美四虎 | 可以免费观看的av | 丁香婷婷久久久综合精品国产 | 精品国产精品 | 久久精品这里 | 中文字幕精品一区二区三区精品 | 日韩一区二区在线视频 | 久久久成人精品 | 精品毛片视频 | 国产精品久久av | 亚洲国产一区二区三区, |