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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

基于AVR的ds1302時鐘代碼

[復制鏈接]
跳轉到指定樓層
樓主
ID:525479 發表于 2019-5-1 10:46 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
  1. #include <iom16v.h>
  2. #include <macros.h>         
  3. #define uchar unsigned char  
  4. #define uint  unsigned int  

  5. #define SCK_CLR    PORTC&=~BIT(0)
  6. //拉低時鐘線  
  7. #define SCK_SET  PORTC|=BIT(0)
  8. //拉高時鐘線
  9. #define SCK_OUT  DDRC|=BIT(0)
  10. #define RST_CLR  PORTC&=~BIT(2)
  11. //拉低RST線  復位線
  12. #define RST_SET  PORTC|=BIT(2)
  13. //拉高RST線
  14. #define RST_OUT  DDRC|=BIT(2)
  15. //把RST設為輸出
  16. #define IO_CLR  PORTC&=~BIT(1)
  17. //拉低IO線  數據線
  18. #define IO_SET  PORTC|=BIT(1)
  19. //拉高IO線
  20. #define IO_IN  DDRC&=~BIT(1)
  21. //把IO設為輸入
  22. #define IO_RD PINC&BIT(1)
  23. //從IO中讀數據  
  24. #define IO_OUT  DDRC|=BIT(1)
  25. //把IO設為輸出
  26.       
  27.      
  28.            
  29. uchar const write_add[]={0x80,0x82,0x84};   //寫地址,0x86,0x88,0x8c,0x8a
  30. //uchar code read_add[] ={0x81,0x83,0x85};   //讀地址,0x87,0x89,0x8d,0x8b
  31. uchar const init_ds[]  ={0x55,0x17,0x15,0x01,0x01,0x13,0x13};   
  32. uchar miao,fen,shi;//,ri,yue,week,nian=0x20;
  33. uchar nfen=0;
  34. uchar nshi=0;

  35. /*************寫一個數據到對應的地址里***************/
  36. void write_ds1302(uchar add,uchar dat)
  37. {
  38. uchar i;  
  39. RST_SET;
  40. IO_OUT;    //把復位線拉高
  41. for(i=0;i<8;i++)
  42. {         //低位在前
  43.   SCK_CLR;   //時鐘線拿低開始寫數據
  44.   if(add&0x01)
  45.        {
  46.         IO_SET;
  47.        }
  48.        else
  49.        {
  50.        IO_CLR;
  51.        }   //把地址右移一位
  52.   SCK_SET;   //時鐘線拿高
  53.        add=add>>1;
  54.     }

  55. for(i=0;i<8;i++)
  56. {
  57.   SCK_CLR;   //時鐘線拿低開始讀數據
  58.   if(dat&0x01)
  59.         {
  60.          IO_SET;
  61.         }
  62.         else
  63.         {
  64.           IO_CLR;
  65.         }   //把數據右移一位
  66.   SCK_SET;   //時鐘線拿高
  67.         dat=dat>>1;
  68.     }
  69.            
  70. RST_CLR;    //復位線合低
  71. SCK_CLR;
  72. IO_CLR;
  73. }
  74. /*************從對應的地址讀一個數據出來***************/
  75. uchar read_ds1302(uchar add)
  76. {
  77. uchar value,i;
  78. RST_SET;
  79.     IO_IN;     //把復位線拿高
  80. for(i=0;i<8;i++)
  81. {         //低位在前
  82.   SCK_CLR;   //時鐘線拿低開始寫數據
  83.   if(add&0x01)
  84.       {
  85.        IO_SET;
  86.        }
  87.        else
  88.       {
  89.       IO_CLR;
  90.       }   
  91.   SCK_SET;   //時鐘線拿高
  92.    add=add>>1; //把地址右移一位
  93.   }  
  94.   for(i=0;i<8;i++)
  95.   {
  96.   SCK_CLR;   //時鐘線拿低開始讀數據
  97.   value >>= 1;
  98.   if(IO_RD)
  99.    value |= 0x80;
  100.   SCK_SET;   //時鐘線拿高
  101.   }
  102.    RST_CLR;    //復位線合低
  103.    SCK_CLR;
  104.    IO_CLR;
  105.    return value;   //返回讀出來的數據
  106. }
  107. /*************把要的時間年月日都讀出來***************/
  108. void read_time()
  109. {
  110. miao = read_ds1302(0x81); //讀秒
  111. fen = read_ds1302(0x83); //讀分
  112. shi = read_ds1302(0x85); //讀時
  113. // ri   = read_ds1302(read_add[3]); //讀日
  114. // yue  = read_ds1302(read_add[4]); //讀月
  115. // nian = read_ds1302(read_add[5]); //讀年
  116. // week = read_ds1302(read_add[6]); //讀星期
  117. }
  118. /*************把要寫的時間年月日都寫入ds1302里***************/
  119. void write_time()
  120. {
  121. write_ds1302(0x8e,0x00);   //打開寫保護
  122. // write_ds1302(write_add[0],miao); //寫秒
  123. write_ds1302(0x82,fen);  //寫分
  124. write_ds1302(0x84,shi);  //寫時
  125. // write_ds1302(write_add[3],ri);  //寫日
  126. // write_ds1302(write_add[4],yue);  //寫月
  127. // write_ds1302(write_add[5],nian); //寫年
  128. // write_ds1302(write_add[6],week); //寫星期
  129. write_ds1302(0xc2,nshi);   //寫鬧時
  130. write_ds1302(0xc4,nfen);   //寫鬧分
  131. write_ds1302(0x8e,0x80);   //關閉寫保護
  132. }
  133. void read_nao()
  134. {
  135. nshi = read_ds1302(0xc3); //讀鬧鐘時
  136. nfen = read_ds1302(0xc5); //讀鬧鐘分
  137. }
  138. /*************把數據保存到ds1302 RAM中**0-31***********/
  139. void write_ds1302ram(uchar add,uchar dat)
  140. {
  141. add <<= 1;     //地址是從第二位開始的
  142. add &= 0xfe;   //把最低位清零  是寫的命令
  143. add |= 0xc0;   //地址最高兩位為1
  144. write_ds1302(0x8e,0x00);
  145. write_ds1302(add,dat);
  146. write_ds1302(0x8e,0x80);
  147. }
  148. /*************把數據從ds1302 RAM讀出來**0-31***********/
  149. uchar read_ds1302ram(uchar add)
  150. {
  151. add <<= 1;     //地址是從第二位開始的
  152. add |= 0x01;   //把最低位清零  是讀的命令
  153. add |= 0xc0;   //地址最高兩位為1   
  154. return(read_ds1302(add));
  155. }
  156. /*************初始化ds1302時間***************/
  157. void init_ds1302()
  158. {
  159. uchar i;
  160. RST_CLR;    //復位線合低
  161. SCK_CLR;
  162. IO_CLR;
  163. i = read_ds1302ram(30);   
  164. if(i != 3)
  165. {
  166.   i = 3;
  167.   write_ds1302ram(30,i);
  168.   write_ds1302(0x8e,0x00);             //打開保護
  169.   for(i=0;i<3;i++)
  170.    write_ds1302(write_add[i],init_ds[i]); //把最高位值0 允許ds1302工作
  171.   write_ds1302(0x8e,0x80); //關寫保護
  172. }
  173. }
  174. void init_ds1302_io()
  175. {
  176. RST_CLR;    //第一次讀寫數據是要把io位拿低
  177. SCK_CLR;
  178. IO_CLR;
  179. }
復制代碼



clk.7z

96.78 KB, 下載次數: 16, 下載積分: 黑幣 -5

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

使用道具 舉報

沙發
ID:1 發表于 2019-5-8 02:04 | 只看該作者
本帖需要重新編輯補全電路原理圖,源碼,詳細說明與圖片即可獲得100+黑幣(帖子下方有編輯按鈕)
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 91国产精品 | 久久另类 | 色一级片| 亚洲精品免费在线 | 超碰97在线免费 | 日韩羞羞| 日韩中文字幕一区二区 | 精品一二三区视频 | 久久一二区 | av在线视 | 中文字幕高清免费日韩视频在线 | h在线免费观看 | 综合国产 | 日韩精品一区二区三区中文在线 | 精品一区二区三区在线观看 | 亚洲高清在线 | 美女天堂av| 一区二区三区四区电影 | 欧美日韩亚洲国产综合 | 一区二区三区观看视频 | 亚洲天堂av一区 | 亚洲国产aⅴ成人精品无吗 综合国产在线 | www.亚洲一区二区三区 | 欧美久久久久久 | 色婷婷精品久久二区二区蜜臂av | 国产精品一二三区在线观看 | 一区二区三区四区在线视频 | 久久精品一区二 | 无码日韩精品一区二区免费 | 国产玖玖| 九九久久国产 | 一区二区三区在线电影 | 日韩精品成人一区二区三区视频 | 亚洲成人一二区 | 一级a性色生活片久久毛片波多野 | 成人性生交大免费 | 国产高清一区二区 | 美女在线视频一区二区三区 | 中文天堂在线一区 | 国产中文| 韩国久久 |