欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1671|回復(fù): 6
打印 上一主題 下一主題
收起左側(cè)

求助DS1302 burst模式讀取錯誤

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
用字節(jié)讀取模式可以正常讀取,burst模式能寫,但是讀出來是亂碼。


一下是代碼,哪位學(xué)長有空幫忙看下。
  1. /*********************************************************************


  2.                                                                                         VyoMeng 51單片機(jī)實(shí)習(xí)訓(xùn)練

  3.   
  4. **********************************************************************
  5. 程序名稱:DS1302 Burst模式讀寫
  6. 程序版本:V1.0
  7. 作    者: VyoMeng                
  8. 編寫時(shí)間:2021年09月11日         
  9. 硬件支持:  
  10. 接口說明:
  11. 修改日志:
  12.     N0.1:
  13. **********************************************************************/
  14. /*
  15. **********************************************************************
  16. *                        頭文件包含/SFR定義
  17. **********************************************************************
  18. */
  19. #include<reg52.h>

  20. /*
  21. **********************************************************************
  22. *                       本地?cái)?shù)據(jù)類型/宏定義
  23. **********************************************************************
  24. */
  25. typedef signed char int8;         //8位有符號字符型
  26. typedef signed int int16;         //16位有符號整型
  27. typedef signed long int32;        //32位有符號長整型
  28. typedef unsigned char uint8;      //8位無符號字符型
  29. typedef unsigned int uint16;      //16位無符號整型
  30. typedef unsigned long uint32;     //32位無符號長整型

  31. /*
  32. **********************************************************************
  33. *                        單片機(jī)IO口位定義
  34. **********************************************************************
  35. */
  36. sbit DS1302_CE     = P2^3;                        //定義DS1302芯片CE引腳  使能引腳
  37. sbit DS1302_IO     = P2^4;                        //定義DS1302芯片IO引腳  數(shù)據(jù)讀寫引腳
  38. sbit DS1302_SCLK   = P2^5;                        //定義DS1302芯片SCLK引腳  鎖存引腳

  39. sbit DX            = P2^1;                  //定義數(shù)碼管顯示內(nèi)容
  40. sbit WX            = P2^2;                  //定義數(shù)碼管顯示位置
  41. /*
  42. **********************************************************************
  43. *                      本地全局變量/數(shù)組定義
  44. **********************************************************************
  45. */
  46. uint8 code zifu[20]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0x89,0x7f,0xbf,0xc8};   //數(shù)碼管所有顯示情況加入數(shù)組
  47. uint8 Time_Set[7] = {0x00,0x01,0x02,0x03,0x04,0x05,0x21};  //設(shè)置初始時(shí)間 2021年9月8日23點(diǎn)59分50秒周3
  48. uint8 tm[8];                //定義數(shù)組放讀取出的時(shí)間數(shù)據(jù)
  49. /*
  50. **********************************************************************
  51. *                         函數(shù)原型聲明
  52. **********************************************************************
  53. */
  54. void DS1302Init();
  55. void delay(uint16 x_ms); //延遲  x_ms*1  毫秒
  56. void xiaoying();
  57. void DS1302ByteWrite(uint8 dat);
  58. uint8 DS1302ByteRead();
  59. void DS1302TimeWrite();
  60. void DS1302TimeRead(uint8 *time);
  61. /*********************************************************************
  62. *函數(shù)名稱:main
  63. *函數(shù)功能:主函數(shù)
  64. *函數(shù)調(diào)用:
  65. *參數(shù)列表:無
  66. *返 回 值:無
  67. *結(jié)    果:
  68. *備    注:
  69. *********************************************************************/
  70. void main()
  71. {
  72.         DS1302Init();        //初始化DS1302芯片
  73.        
  74.         while(1)
  75.         {
  76.                 DS1302TimeRead(tm);

  77. ////////////////////  數(shù)碼管第1位
  78.                 DX=0;           //顯示內(nèi)容清空
  79.                 WX=0;           //顯示位置清空
  80.                 P0=0X01;        //顯示位置在數(shù)碼管 第1位
  81.                 WX=1;           //給高電平
  82.                 WX=0;           //給低電平 電平下衍 將顯示位置寫入數(shù)碼管位置顯示鎖存器
  83.                 DX=0;           //顯示內(nèi)容清空
  84.                 WX=0;           //顯示位置清空
  85.                 P0=zifu[tm[3] >> 4];     //寫入數(shù)字
  86.                 DX=1;           //給高電平
  87.                 DX=0;           //給低電平 電平下衍 將顯示內(nèi)容寫入數(shù)碼管內(nèi)容顯示鎖存器
  88.                 xiaoying();      //數(shù)碼管消影
  89.                
  90. ////////////////////  數(shù)碼管第2位
  91.                 DX=0;           //顯示內(nèi)容清空
  92.                 WX=0;           //顯示位置清空
  93.                 P0=0X02;        //顯示位置在數(shù)碼管 第2位
  94.                 WX=1;           //給高電平
  95.                 WX=0;           //給低電平 電平下衍 將顯示位置寫入數(shù)碼管位置顯示鎖存器
  96.                 DX=0;           //顯示內(nèi)容清空
  97.                 WX=0;           //顯示位置清空
  98.                 P0=zifu[tm[3] & 0x0F];     //寫入數(shù)字
  99.                 DX=1;           //給高電平
  100.                 DX=0;           //給低電平 電平下衍 將顯示內(nèi)容寫入數(shù)碼管內(nèi)容顯示鎖存器
  101.                 xiaoying();      //數(shù)碼管消影
  102.                
  103. ////////////////////  數(shù)碼管第3位
  104.                 DX=0;           //顯示內(nèi)容清空
  105.                 WX=0;           //顯示位置清空
  106.                 P0=0X04;        //顯示位置在數(shù)碼管 第3位
  107.                 WX=1;           //給高電平
  108.                 WX=0;           //給低電平 電平下衍 將顯示位置寫入數(shù)碼管位置顯示鎖存器
  109.                 DX=0;           //顯示內(nèi)容清空
  110.                 WX=0;           //顯示位置清空
  111.                 P0=zifu[tm[4] >> 4];     //寫入數(shù)字
  112.                 DX=1;           //給高電平
  113.                 DX=0;           //給低電平 電平下衍 將顯示內(nèi)容寫入數(shù)碼管內(nèi)容顯示鎖存器
  114.                 xiaoying();      //數(shù)碼管消影
  115.                
  116. ////////////////////  數(shù)碼管第4位
  117.                 DX=0;           //顯示內(nèi)容清空
  118.                 WX=0;           //顯示位置清空
  119.                 P0=0X08;        //顯示位置在數(shù)碼管 第4位
  120.                 WX=1;           //給高電平
  121.                 WX=0;           //給低電平 電平下衍 將顯示位置寫入數(shù)碼管位置顯示鎖存器
  122.                 DX=0;           //顯示內(nèi)容清空
  123.                 WX=0;           //顯示位置清空
  124.                 P0=zifu[tm[4] & 0x0F];     //寫入數(shù)字
  125.                 DX=1;           //給高電平
  126.                 DX=0;           //給低電平 電平下衍 將顯示內(nèi)容寫入數(shù)碼管內(nèi)容顯示鎖存器
  127.                 xiaoying();      //數(shù)碼管消影

  128. ////////////////////  數(shù)碼管第5位
  129.                 DX=0;           //顯示內(nèi)容清空
  130.                 WX=0;           //顯示位置清空
  131.                 P0=0X10;        //顯示位置在數(shù)碼管 第5位
  132.                 WX=1;           //給高電平
  133.                 WX=0;           //給低電平 電平下衍 將顯示位置寫入數(shù)碼管位置顯示鎖存器
  134.                 DX=0;           //顯示內(nèi)容清空
  135.                 WX=0;           //顯示位置清空
  136.                 P0=zifu[tm[5] >> 4];     //寫入數(shù)字
  137.                 DX=1;           //給高電平
  138.                 DX=0;           //給低電平 電平下衍 將顯示內(nèi)容寫入數(shù)碼管內(nèi)容顯示鎖存器
  139.                 xiaoying();      //數(shù)碼管消影
  140.                
  141. ////////////////////  數(shù)碼管第6位
  142.                 DX=0;           //顯示內(nèi)容清空
  143.                 WX=0;           //顯示位置清空
  144.                 P0=0X20;        //顯示位置在數(shù)碼管 第6位
  145.                 WX=1;           //給高電平
  146.                 WX=0;           //給低電平 電平下衍 將顯示位置寫入數(shù)碼管位置顯示鎖存器
  147.                 DX=0;           //顯示內(nèi)容清空
  148.                 WX=0;           //顯示位置清空
  149.                 P0=zifu[tm[5] & 0x0F];     //寫入數(shù)字
  150.                 DX=1;           //給高電平
  151.                 DX=0;           //給低電平 電平下衍 將顯示內(nèi)容寫入數(shù)碼管內(nèi)容顯示鎖存器
  152.                 xiaoying();      //數(shù)碼管消影  
  153.   
  154. ////////////////////  數(shù)碼管第7位
  155.                 DX=0;           //顯示內(nèi)容清空
  156.                 WX=0;           //顯示位置清空
  157.                 P0=0X40;        //顯示位置在數(shù)碼管 第7位
  158.                 WX=1;           //給高電平
  159.                 WX=0;           //給低電平 電平下衍 將顯示位置寫入數(shù)碼管位置顯示鎖存器
  160.                 DX=0;           //顯示內(nèi)容清空
  161.                 WX=0;           //顯示位置清空
  162.                 P0=zifu[tm[6] >> 4];     //寫入數(shù)字
  163.                 DX=1;           //給高電平
  164.                 DX=0;           //給低電平 電平下衍 將顯示內(nèi)容寫入數(shù)碼管內(nèi)容顯示鎖存器
  165.                 xiaoying();      //數(shù)碼管消影
  166.                
  167. ////////////////////  數(shù)碼管第8位
  168.                 DX=0;           //顯示內(nèi)容清空
  169.                 WX=0;           //顯示位置清空
  170.                 P0=0X80;        //顯示位置在數(shù)碼管 第8位
  171.                 WX=1;           //給高電平
  172.                 WX=0;           //給低電平 電平下衍 將顯示位置寫入數(shù)碼管位置顯示鎖存器
  173.                 DX=0;           //顯示內(nèi)容清空
  174.                 WX=0;           //顯示位置清空
  175.                 P0=zifu[tm[6] & 0x0F];     //寫入數(shù)字
  176.                 DX=1;           //給高電平
  177.                 DX=0;           //給低電平 電平下衍 將顯示內(nèi)容寫入數(shù)碼管內(nèi)容顯示鎖存器
  178.                 xiaoying();      //數(shù)碼管消影         
  179.   }
  180. }

  181. /*********************************************************************
  182. *函數(shù)名稱:DS1302Init
  183. *函數(shù)功能:初始化DS1302芯片
  184. *函數(shù)調(diào)用:DS1302Init();
  185. *參數(shù)列表:
  186. *返 回 值:無
  187. *結(jié)    果:
  188. *備    注:初始化DS1302
  189. *********************************************************************/
  190. void DS1302Init()
  191. {

  192.         uint8 state;
  193.         DS1302TimeRead(tm);                        //讀取時(shí)間數(shù)據(jù)
  194.         state = tm[0];                                        //讀取秒位
  195.         state = state >> 7;                                //數(shù)據(jù)右移7位,將CH值移到右邊最低位
  196.        
  197.         if (state == 0x01)                                                //如果CH值=1,說明時(shí)鐘停止了,需要進(jìn)行初始化
  198.         {
  199.                 DS1302_CE = 1;                                        //打開DS1302使能引腳
  200.                 DS1302ByteWrite(0x8E);        //操作寫保護(hù)位
  201.                 DS1302ByteWrite(0x00);        //關(guān)閉寫保護(hù)
  202.                 DS1302_CE = 0;                //關(guān)閉DS1302使能引腳
  203.        
  204.                 DS1302TimeWrite();                        //寫入初始時(shí)間
  205.        
  206.                 DS1302_CE = 1;                                        //打開DS1302使能引腳
  207.                 DS1302ByteWrite(0x8E);        //操作寫保護(hù)位
  208.                 DS1302ByteWrite(0x80);        //打開寫保護(hù)
  209.                 DS1302_CE = 0;                                        //關(guān)閉DS1302使能引腳
  210.        
  211.         }
  212. }


  213. /*********************************************************************
  214. *函數(shù)名稱:DS1302ByteWrite
  215. *函數(shù)功能:寫入一個字節(jié)數(shù)據(jù)
  216. *函數(shù)調(diào)用:DS1302ByteWrite(uint8 dat);
  217. *參數(shù)列表:dat
  218. *返 回 值:無
  219. *結(jié)    果:
  220. *備    注:dat為時(shí)間日期的數(shù)據(jù)
  221. *********************************************************************/
  222. void DS1302ByteWrite(uint8 dat)
  223. {
  224.         uint8 i;
  225. //        DS1302_SCLK = 0;                                //拉低鎖存器電平準(zhǔn)備寫入數(shù)據(jù)
  226.         for(i=0;i<8;i++)                                //循環(huán)8次寫入8組數(shù)據(jù)
  227.                 {
  228.                         DS1302_IO = dat & 0x01;        //DS1302寫入數(shù)據(jù)是從最低位開始寫,所以先取最低為數(shù)值
  229.                         dat = dat >> 1;                                        //取完最低位后將dat右移1位,將原來第2位數(shù)移到最低位
  230.                         DS1302_SCLK = 1;                                //拉高鎖存器電平產(chǎn)生上升沿,寫入數(shù)據(jù)
  231.                         DS1302_SCLK = 0;                                //拉高鎖存器電平產(chǎn)生上升沿,寫入數(shù)據(jù)
  232.                 }
  233.                 DS1302_IO =1;
  234. }

  235. /*********************************************************************
  236. *函數(shù)名稱:DS1302ByteRead
  237. *函數(shù)功能:讀取一個字節(jié)數(shù)據(jù)
  238. *函數(shù)調(diào)用:DS1302ByteRead();
  239. *參數(shù)列表:無
  240. *返 回 值:dat
  241. *結(jié)    果:返回讀取到的時(shí)間數(shù)據(jù)
  242. *備    注:
  243. *********************************************************************/
  244. uint8 DS1302ByteRead()
  245. {
  246.         uint8 i;
  247.         uint8 dat=0;                                //先給dat賦值 0X00 即 0000 0000
  248. //        DS1302_SCLK=0;                                //拉低鎖存器電平準(zhǔn)備寫入數(shù)據(jù)
  249.         for(i=0;i<8;i++)                        //循環(huán)8次讀取8組數(shù)據(jù)
  250.         {
  251.                 if (DS1302_IO == 0)        //判斷IO口數(shù)據(jù)是否為0
  252.                 {
  253.                         dat = dat << 1;                                        //如果IO口為0,dat左移1位,左移最低位默認(rèn)補(bǔ)0
  254.                 }
  255.                 else
  256.                 {
  257.                         dat = dat << 1;                                        //如果IO口不為0,dat左移1位,最低位先補(bǔ)個0
  258.                         dat = dat | 0x01;                                //最低位或上0x01,最低位變成1
  259.                 }
  260.                         DS1302_SCLK = 1;        //拉高鎖存器電平產(chǎn)生上升沿,讀入數(shù)據(jù)
  261.                         DS1302_SCLK = 0;        //拉高鎖存器電平產(chǎn)生上升沿,讀入數(shù)據(jù)
  262.         }
  263.         return dat;                                                //返回讀取到的時(shí)間數(shù)據(jù)數(shù)組               
  264. }
  265. /*********************************************************************
  266. *函數(shù)名稱:DS1302TimeWrite
  267. *函數(shù)功能:讀取一個字節(jié)數(shù)據(jù)
  268. *函數(shù)調(diào)用:DS1302TimeWrite();
  269. *參數(shù)列表:
  270. *返 回 值:無
  271. *結(jié)    果:
  272. *備    注:
  273. *********************************************************************/
  274. void DS1302TimeWrite()
  275. {
  276.         uint8 i;
  277.         DS1302_CE = 1;                                                                                        //打開DS1302使能引腳
  278.         DS1302ByteWrite(0xBE);                                                        //開啟burst寫入模式,0XBE為burst寫入地址
  279.         for(i=0;i<7;i++)                                                                                //循環(huán)7次,將 [年月日時(shí)分秒周] 七個字節(jié)寫入
  280.                 {
  281.                         DS1302ByteWrite(Time_Set[i]);                //從Time_Set數(shù)組里提取數(shù)值寫入
  282.                 }
  283.         DS1302ByteWrite(0x00);                                                        //burst模式一次要讀寫8個字節(jié),實(shí)際日期總共7個字節(jié),所以最后補(bǔ)充一個無意義的0x00字節(jié)
  284.         DS1302_CE = 0;                                                                                        //關(guān)閉DS1302使能引腳
  285. }

  286. /*********************************************************************
  287. *函數(shù)名稱:DS1302TimeRead
  288. *函數(shù)功能:讀取一個字節(jié)數(shù)據(jù)
  289. *函數(shù)調(diào)用:DS1302TimeRead(uint8 *time);
  290. *參數(shù)列表:time
  291. *返 回 值:無
  292. *結(jié)    果:
  293. *備    注:
  294. *********************************************************************/
  295. void DS1302TimeRead(uint8 *time)
  296. {
  297.         uint8 i;
  298.         DS1302_CE = 1;                                                                                        //打開DS1302使能引腳
  299.         DS1302ByteWrite(0xBF);                                                        //開啟burst讀取模式,0XBF為burst讀取地址
  300.         for (i=0;i<7;i++)                                                                                //burst模式一次要讀寫8個字節(jié),實(shí)際日期總共7個字節(jié),所以最后一個無意義
  301.                 {
  302.                         time[i]=DS1302ByteRead();       //循環(huán)8次,將 [年月日時(shí)分秒周] 7個字節(jié)及保護(hù)字節(jié)讀取出來
  303.                 }
  304.                 delay(3);
  305.         DS1302_CE = 0;                                //關(guān)閉DS1302使能引腳                       
  306. }

  307. /*********************************************************************
  308. *函數(shù)名稱:delay
  309. *函數(shù)功能:延時(shí)函數(shù)
  310. *函數(shù)調(diào)用:delay(uint16 x_ms);
  311. *參數(shù)列表:x_ms
  312. *返 回 值:無
  313. *結(jié)    果:延遲時(shí)間=1* x_ms(毫秒)
  314. *備    注:
  315. *********************************************************************/
  316. void delay(uint16 x_ms) //延遲  x_ms*1  毫秒
  317. {
  318.    uint16 i,j;
  319.         for(i=x_ms;i>0;i--)
  320.                  for(j=114;j>0;j--);
  321. }

  322. /*********************************************************************
  323. *函數(shù)名稱:xiaoying
  324. *函數(shù)功能:數(shù)碼管掃描延遲及消影函數(shù)
  325. *函數(shù)調(diào)用:xiaoying();
  326. *參數(shù)列表:無
  327. *返 回 值:無
  328. *結(jié)    果:數(shù)碼管掃描延遲及消影
  329. *備    注:
  330. *********************************************************************/
  331. void xiaoying()
  332. {
  333.                 delay(3);       //數(shù)碼管掃描延遲時(shí)間 毫秒
  334.                 DX=0;           //顯示內(nèi)容清空
  335.                 WX=0;           //顯示位置清空
  336.                 P0=0X00;        //選擇顯示位置
  337.                 WX=1;           //給高電平
  338.                 WX=0;           //給低電平 電平下衍 將顯示位置寫入數(shù)碼管位置顯示鎖存器
  339. }
復(fù)制代碼




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

使用道具 舉報(bào)

沙發(fā)
ID:624769 發(fā)表于 2021-9-12 17:05 | 只看該作者
用Burst 讀取,有兩個比較 重要的注意點(diǎn)。
1, 發(fā)送 0xBF  或者  0xff 前, 在拉高 CE 之后, CLK 動作之前, 先拉低數(shù)據(jù)傳授口  IO = 0(如果每次讀到錯誤值都一樣,就是這個問題); 然后再開始發(fā)送, 0xBF 或者 0xFF.
2,  條件如果允許, 數(shù)據(jù)串口IO   上拉10K電阻到 VCC , 然后選擇模式為開漏, 如果硬件上改造比較難,那么在Burst 讀取時(shí),確保, 每次 CLK = 0 之后, 等待時(shí)間 0.5us 之后 再去 讀 IO 的值(沒有上拉電阻這點(diǎn)很重要,如果你每次讀到的錯誤值沒有規(guī)律,就是這個問題。),讀完一個字節(jié)之后,等待 2us 之后再繼續(xù)讀下一個字節(jié)(這個你用C語言寫代碼的話到基本不用特別考慮,肯定會超過2us)。
回復(fù)

使用道具 舉報(bào)

板凳
ID:965600 發(fā)表于 2021-9-12 18:39 | 只看該作者
188610329 發(fā)表于 2021-9-12 17:05
用Burst 讀取,有兩個比較 重要的注意點(diǎn)。
1, 發(fā)送 0xBF  或者  0xff 前, 在拉高 CE 之后, CLK 動作之 ...

拉低了IO口電平,顯示還是這樣
CE,IO,SCLK三個引腳都加了10k上拉電阻,我之前加的是4.7K的
  1. void DS1302TimeRead(uint8 *time)
  2. {
  3.         uint8 i;
  4.         DS1302_CE = 1;                //打開DS1302使能引腳
  5.         DS1302_IO = 0;
  6.         DS1302ByteWrite(0xBF);                                                        //開啟burst讀取模式,0XBF為burst讀取地址
  7.         for (i=0;i<7;i++)                                                                                //burst模式一次要讀寫8個字節(jié),實(shí)際日期總共7個字節(jié),所以最后一個無意義
  8.                 {
  9.                         time[i]=DS1302ByteRead();       //循環(huán)8次,將 [年月日時(shí)分秒周] 7個字節(jié)及保護(hù)字節(jié)讀取出來
  10.                 }
  11.                 delay(3);
  12.         DS1302_CE = 0;                                //關(guān)閉DS1302使能引腳                       
  13. }
復(fù)制代碼
顯示結(jié)果和仿真結(jié)果一樣

回復(fù)

使用道具 舉報(bào)

地板
ID:624769 發(fā)表于 2021-9-12 22:16 | 只看該作者
uint8 DS1302ByteRead()
{
        uint8 i;
        uint8 dat=0;                                //先給dat賦值 0X00 即 0000 0000
//        DS1302_SCLK=0;                                //拉低鎖存器電平準(zhǔn)備寫入數(shù)據(jù)
        for(i=0;i<8;i++)                        //循環(huán)8次讀取8組數(shù)據(jù)
        {
                if (DS1302_IO == 0)        //判斷IO口數(shù)據(jù)是否為0
                {
                        dat = dat << 1;                                        //如果IO口為0,dat左移1位,左移最低位默認(rèn)補(bǔ)0
                }
                else
                {
                        dat = dat << 1;                                        //如果IO口不為0,dat左移1位,最低位先補(bǔ)個0
                        dat = dat | 0x01;                                //最低位或上0x01,最低位變成1
                }
                        DS1302_SCLK = 1;        //拉高鎖存器電平產(chǎn)生上升沿,讀入數(shù)據(jù)
                        DS1302_SCLK = 0;        //拉高鎖存器電平產(chǎn)生上升沿,讀入數(shù)據(jù)
        }
        return dat;                                                //返回讀取到的時(shí)間數(shù)據(jù)數(shù)組               
}

讀的時(shí)候,是低位開始讀,所以你要高位開始寫,
        for(i=0;i<8;i++)                        //循環(huán)8次讀取8組數(shù)據(jù)
        {
               dat >>= 1;                    //數(shù)據(jù)右移
               if (DS1302_IO)     dat |= 0x80;   //判斷IO口數(shù)據(jù)是否為1,唯一高位置1,反之啥也不干
               DS1302_SCLK = 1;        //拉高鎖存器電平產(chǎn)生上升沿,讀入數(shù)據(jù)
               DS1302_SCLK = 0;        //拉高鎖存器電平產(chǎn)生上升沿,讀入數(shù)據(jù)
         }
   
回復(fù)

使用道具 舉報(bào)

5#
ID:624769 發(fā)表于 2021-9-12 22:43 | 只看該作者
vyo 發(fā)表于 2021-9-12 18:39
拉低了IO口電平,顯示還是這樣
CE,IO,SCLK三個引腳都加了10k上拉電阻,我之前加的是4.7K的
顯示結(jié)果和仿 ...

你個/////!! ///////了, 你說你字節(jié)讀取時(shí)正確的???
你的  DS1302ByteRead()  壓根是錯的,你居然說字節(jié)讀取能正確,用這個代碼你能正確讀取??……

你把DS1302ByteRead()里面循環(huán)節(jié)如下修改:

       for(i=0;i<8;i++)                        //循環(huán)8次讀取8組數(shù)據(jù)
        {
                      dat >>=  1;        //先右移 !!!!!!!!!!! 不是左移
                if (DS1302_IO)      dat  |=0x80;   //判斷IO口數(shù)據(jù)是否為1, 為1置1高位,否則不動
                        DS1302_SCLK = 1;        //拉高鎖存器電平產(chǎn)生上升沿,讀入數(shù)據(jù)
                        DS1302_SCLK = 0;        //拉高鎖存器電平產(chǎn)生上升沿,讀入數(shù)據(jù)
       }

最后說一下,DS1302 的時(shí)鐘比較特別,寫一個地址的內(nèi)容, 地址+數(shù)據(jù),其實(shí)總共只有 15個半時(shí)鐘。讀一個地址的內(nèi)容, 地址+內(nèi)容,其實(shí)總共只有15個時(shí)鐘,兩種方式都不是用滿16個時(shí)鐘,你這種強(qiáng)改時(shí)鐘的方式,我以前強(qiáng)迫癥狀況下也作過,后來發(fā)現(xiàn),強(qiáng)行16個時(shí)鐘,下一次的讀操作很容易被誤判寫操作。如果寫保護(hù)位不置80的話,在沒有數(shù)據(jù)口上拉電阻情況下,很容易誤寫0xff 到DS1302,。這個是后話了,你先搞定眼前的吧,總之,如果要完全按照手冊的時(shí)序,代碼會多很多。你之后如果,不需要頻繁改內(nèi)容的話,就寫保護(hù)置0x80吧。要改時(shí)間了再置0。
回復(fù)

使用道具 舉報(bào)

6#
ID:965600 發(fā)表于 2021-9-13 12:51 來自觸屏版 | 只看該作者
188610329 發(fā)表于 2021-9-12 22:43
你個/////!! ///////了, 你說你字節(jié)讀取時(shí)正確的???
你的  DS1302ByteRead()  壓根是錯的,你居然說 ...

非常感謝,太謝謝了
之前數(shù)碼管顯示的是年月日,數(shù)值一直沒動,沒發(fā)現(xiàn)問題,昨天夜里把顯示改成時(shí)分秒,發(fā)現(xiàn)秒雖然是亂碼,但一直在有規(guī)律的跳動,記錄倒推了一下才發(fā)現(xiàn)是讀取時(shí)高低位順序反了。
我之前說字節(jié)讀取正確是用仿照教程寫的按字節(jié)讀取方式的代碼能正確讀出。這個burst模式的代碼是我自己寫的。我之前一直以為是沒有讀到數(shù)據(jù),所以檢查的方向錯了。
多謝耐心指正
回復(fù)

使用道具 舉報(bào)

7#
ID:1052462 發(fā)表于 2022-11-17 16:04 | 只看該作者
void DS1302_WriteByte(uint8_t addr)
{
        uint8_t i=0;
        for(i=0;i<8;i++)
        {
                if(addr&0x01)
                {
                        DATA_H;
                }
                else
                {
                        DATA_L;
                }
                addr>>=1;
                SCLK_H;
                SCLK_L;
        }
}
uint8_t DS1302_ReadByte()
{
        uint8_t i=0,date=0;
        for(i=0;i<8;i++)
        {
                date >>=1;
                if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_3))
                {
                        date |=0x80;
                }
                SCLK_H;
                SCLK_L;
        }
        return date;
}
void DS1302_BURST_Read(uint8_t *dat)
{
        uint8_t i=0;
        CE_H;
        DS1302_DAT_GPIO_Out();
        DS1302_WriteByte(0x8f);
        DS1302_DAT_GPIO_IN();
        for(i=0;i<8;i++)
        {
                dat[i]=DS1302_ReadByte();
        }
        CE_L;
}
我這個為什么BURST不行
回復(fù)

使用道具 舉報(bào)

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

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表