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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

為什么這樣單片機(jī)讀出來的DS1302時間星期是0-7呀,這個怎么去調(diào)時間0,請大佬賜教

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:894870 發(fā)表于 2021-5-2 10:20 | 只看該作者 回帖獎勵 |倒序?yàn)g覽 |閱讀模式
  1. #include "intrins.h"
  2. #ifndef _DS1302_H_
  3. #define _DS1302_H_

  4. sbit clk = P2^2;          //ds1302時鐘線定義
  5. sbit io =  P2^1;          //數(shù)據(jù)線
  6. sbit rst = P2^0;          //復(fù)位線
  7.                       //秒   分    時   日   月    年   星期         
  8. uchar code write_add[]={0x80,0x82,0x84,0x86,0x88,0x8c,0x8a};   //寫地址
  9. uchar code read_add[] ={0x81,0x83,0x85,0x87,0x89,0x8d,0x8b};   //讀地址
  10. uchar code init_ds[]  ={0x58,0x29,0x07,0x05,0x10,0x14,0x1};   
  11. extern uchar miao,fen,shi,ri,yue,week,nian;
  12. extern uchar i;

  13. void delaynus(unsigned char n)
  14. {
  15. unsigned char i;
  16. for(i=0;i<n;i++);     
  17. }

  18. //向1302寫一個字節(jié)數(shù)據(jù)
  19. void Write1302(unsigned char dat)
  20. {
  21.   unsigned char i;
  22.   clk=0;            //拉低CLK,為脈沖上升沿寫入數(shù)據(jù)做準(zhǔn)備
  23.   delaynus(2);       //稍微等待,使硬件做好準(zhǔn)備
  24.   for(i=0;i<8;i++)      //連續(xù)寫8個二進(jìn)制數(shù)據(jù)
  25.     {
  26.             io=dat&0x01;    //取出dat的第0位數(shù)據(jù)寫入1302
  27.             delaynus(2);       //稍微等待,使硬件做好準(zhǔn)備
  28.             clk=1;           //上升沿寫入數(shù)據(jù)
  29.             delaynus(2);      //稍微等待,使硬件做好準(zhǔn)備
  30.             clk=0;           //重新拉低SCLK,形成脈沖
  31.             dat>>=1;          //將dat的各數(shù)據(jù)位右移1位,準(zhǔn)備下入下一位數(shù)據(jù)位
  32.           }

  33. }

  34. /*************根據(jù)命令,向1302寫一個數(shù)據(jù)到對應(yīng)的地址里***************/
  35. void write_ds1302(uchar add,uchar dat)
  36. {               
  37.         rst=0;           //禁止數(shù)據(jù)傳遞
  38.   clk=0;          //確保寫數(shù)據(jù)前CLK被拉低
  39.   rst=1;           //啟動數(shù)據(jù)傳輸
  40.   delaynus(2);     //稍微等待,為硬件做好準(zhǔn)備
  41.   Write1302(add);  //寫入命令字
  42.   Write1302(dat);  //寫數(shù)據(jù)
  43.   clk=1;          //將始終電平置于已知狀態(tài)
  44.   rst=0;           //禁止數(shù)據(jù)傳遞
  45. }

  46. /*****************************************************
  47. 從1302讀一個字節(jié)數(shù)據(jù)
  48. ***************************************************/
  49. unsigned char Read1302(void)
  50. {
  51.    unsigned char i,dat;
  52.         delaynus(2);       //稍微等待,為硬件做好準(zhǔn)備
  53.         for(i=0;i<8;i++)   //連續(xù)讀8個二進(jìn)制位數(shù)據(jù)
  54.          {
  55.            dat>>=1;       //將dat的各數(shù)據(jù)位右移1位,因?yàn)橄茸x出來的是字節(jié)的最低位
  56.            if(io==1)    //如果讀出來的是1
  57.            dat|=0x80;    //將1取出,寫在dat的最高位
  58.            clk=1;       //將clk置于高電平,為下降沿讀出
  59.            delaynus(2);  //稍微等待
  60.            clk=0;       //拉低clk,形成脈沖下降沿
  61.            delaynus(2);  //稍微等待
  62.           }         
  63.   return dat;        //將讀出來的數(shù)據(jù)返回
  64. }  

  65. /*************根據(jù)命令,從1302對應(yīng)的地址讀一個數(shù)據(jù)出來***************/
  66. uchar read_ds1302(uchar add)
  67. {
  68.         unsigned char dat;
  69.   rst=0;                 //拉低RST
  70.   clk=0;                //確保寫數(shù)據(jù)前CLK被拉低
  71.   rst=1;                 //啟動數(shù)據(jù)傳輸
  72.   Write1302(add);       //寫入命令字
  73.   dat=Read1302();       //讀出數(shù)據(jù)
  74.   clk=1;              //將時鐘電平置于已知狀態(tài)
  75.   rst=0;               //禁止數(shù)據(jù)傳遞
  76.   return dat;          //將讀出的數(shù)據(jù)返回
  77. }

  78. /*************把要的時間 年月日 都讀出來***************/
  79. void read_time()
  80. {
  81.         miao = read_ds1302(read_add[0]);        //讀秒
  82.         fen  = read_ds1302(read_add[1]);        //讀分
  83.         shi  = read_ds1302(read_add[2]);        //讀時
  84.         ri   = read_ds1302(read_add[3]);        //讀日
  85.         yue  = read_ds1302(read_add[4]);        //讀月
  86.         nian = read_ds1302(read_add[5]);        //讀年
  87.         week = read_ds1302(read_add[6]);        //讀星期
  88. }

  89. /*************把要寫的時間 年月日 都寫入ds1302里***************/
  90. void write_time()
  91. {
  92.         write_ds1302(0x8e,0x00);                        //關(guān)閉寫保護(hù)
  93.         write_ds1302(write_add[0],miao);        //寫秒
  94.         write_ds1302(write_add[1],fen);                //寫分
  95.         write_ds1302(write_add[2],shi);                //寫時
  96.         write_ds1302(write_add[3],ri);                //寫日
  97.         write_ds1302(write_add[4],yue);                //寫月
  98.         write_ds1302(write_add[5],nian);        //寫年
  99.         write_ds1302(write_add[6],week);        //寫星期
  100.         write_ds1302(0x8e,0x80);                        //打開寫保護(hù)
  101. }

  102. /*************把數(shù)據(jù)保存到ds1302 RAM中**0-31*************/
  103. void write_ds1302ram(uchar add,uchar dat)
  104. {
  105.         add <<= 1;     //地址是從第二位開始的
  106.         add &= 0xfe;   //把最低位清零  是寫的命令
  107.         add |= 0xc0;   //地址最高兩位為 1  
  108.         write_ds1302(0x8e,0x00);
  109.         write_ds1302(add,dat);        
  110.         write_ds1302(0x8e,0x80);
  111. }

  112. /**********************設(shè)置ds1302時間函數(shù)**********************/
  113. void set_ds1302time(uchar num,uchar *shi,uchar dat)         //調(diào)時
  114. {
  115.           if(num == 1)
  116.     {
  117.             *shi+=0x01;
  118.                 if((*shi & 0x0f) >= 0x0a)
  119.                         *shi = (*shi & 0xf0) + 0x10;
  120.                 if(*shi >= dat)
  121.                         *shi = 0;
  122.     }
  123.     else
  124.     {
  125.                 if(*shi == 0x00)
  126.                         *shi = dat;
  127.                 if((*shi & 0x0f) == 0x00)
  128.                         *shi = (*shi | 0x0a) - 0x10;
  129.                 *shi -=0x01 ;
  130.     }  
  131. }

  132. /*************把數(shù)據(jù)從ds1302 RAM讀出來**0-31*************/
  133. uchar read_ds1302ram(uchar add)
  134. {
  135.         add <<= 1;     //地址是從第二位開始的
  136.         add |= 0x01;   //把最高位置1  是讀命令
  137.         add |= 0xc0;   //地址最高兩位為 1  
  138.         return(read_ds1302(add));        
  139. }


  140. /*************初始化ds1302時間***************/
  141. void init_ds1302()
  142. {
  143.         uchar i;
  144.         rst = 0;        //第一次讀寫數(shù)據(jù)時要把I O口拉低
  145.         clk = 0;
  146.         io = 0;
  147.         i = read_ds1302ram(30);   
  148.         if(i != 3)
  149.         {        
  150.                 i = 3;
  151.                 write_ds1302ram(30,i);                         //4050   4100                 3080
  152.                 write_ds1302(0x8e,0x00);                    //關(guān)閉寫保護(hù)
  153.                 for(i=0;i<7;i++)
  154.                 write_ds1302(write_add[i],init_ds[i]);        //把最高位值0 允許ds1302工作
  155.                 write_ds1302(0x8e,0x80);        //打開保護(hù)
  156.         }

  157.         read_time();                  //讀時間
  158.         if(miao >= 0x60)
  159.         {
  160.                 write_ds1302(0x8e,0x00);                    //關(guān)閉寫保護(hù)
  161.                 write_ds1302(write_add[0],0x01);        //把最高位值0 允許ds1302工作
  162.                 write_ds1302(0x8e,0x80);        //打開保護(hù)
  163.                
  164.         }

  165. }


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

使用道具 舉報

沙發(fā)
ID:889094 發(fā)表于 2021-5-2 23:37 | 只看該作者
你有什么問題,想問什么?
看了你的初始化數(shù)組init_ds[i],周你初始化個0x14進(jìn)去,你讓1302怎么想?
各種芯片都有例程,研究一下不難
回復(fù)

使用道具 舉報

板凳
ID:889094 發(fā)表于 2021-5-2 23:48 | 只看該作者
144./*************把數(shù)據(jù)從ds1302 RAM讀出來**0-31*************/

145.uchar read_ds1302ram(uchar add)

146.{

147.        add <<= 1;     //地址是從第二位開始的

148.        add |= 0x01;   //把最高位置1  是讀命令

149.        add |= 0xc0;   //地址最高兩位為 1  

150.        return(read_ds1302(add));        

151.}

這個函數(shù)我沒有看出來怎么退出,無限嵌套?
回復(fù)

使用道具 舉報

地板
ID:894870 發(fā)表于 2021-5-3 16:16 | 只看該作者
birdzhyli 發(fā)表于 2021-5-2 23:37
你有什么問題,想問什么?
看了你的初始化數(shù)組init_ds,周你初始化個0x14進(jìn)去,你讓1302怎么想?
各種芯 ...

周是0x1呀,我的意思是顯示屏顯示的時候。周是顯示0-7的數(shù)字,而正常的是1-7,這個問題怎么解決
回復(fù)

使用道具 舉報

5#
ID:230742 發(fā)表于 2021-5-4 16:25 | 只看該作者
周是用軟件換算的。
建議你直接換一個例程。重新搬一下。
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 国产一级毛片视频 | www.97国产| 粉嫩国产精品一区二区在线观看 | 亚洲v区 | 女生羞羞网站 | 免费在线观看一区二区三区 | 欧美极品视频在线观看 | av免费观看在线 | 黄免费观看视频 | 日日夜夜天天 | 亚洲精品在线播放 | 日韩二区| 一级黄色短片 | 日韩一区二区三区视频在线观看 | 黄色成人免费看 | 天堂av在线影院 | 欧美福利 | 久久国产一区二区 | 国产精彩视频在线观看 | 一区二区三区免费 | 国产一区 | 久久er99热精品一区二区 | 偷拍亚洲色图 | 国精久久 | 国产麻豆乱码精品一区二区三区 | 亚洲欧美视频 | 久久99久久99| 中文字幕久久精品 | 成人av电影免费在线观看 | 99re视频在线免费观看 | 一级在线观看 | 欧美黄 片免费观看 | 亚洲成人精品 | 福利国产 | 一级黄色网页 | 日韩美女一区二区三区在线观看 | 免费精品视频一区 | 91免费福利视频 | 涩在线 | 不卡在线视频 | 日韩 欧美 二区 |