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

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

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

DS1302液晶顯示單片機(jī)程序

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
制作出來(lái)的實(shí)物圖如下:

  1. /*********************************************************************
  2. 模塊名稱:DS1302
  3. 模塊功能: RTC               
  4. 硬件接線:無(wú)。
  5. 注意事項(xiàng):(1) DS1302的SPI接口用到了P3.4、P3.5、P3.6,若程序運(yùn)行有問(wèn)題查
  6.                           硬件問(wèn)題時(shí)可以從這三個(gè)引腳復(fù)用部分查起
  7.                   (2) DS1302的初始化時(shí)間是隨便給的,之所以給23.59.50,是為了在10
  8.                             秒后即可看到24.59.59到00.00.00的跳變。
  9.                   (3) DS1302寄存器讀寫的函數(shù)編寫時(shí)要注意時(shí)序和LSB這2個(gè)要點(diǎn)。                                                                  
  10. **********************************************************************/

  11. /*
  12. **********************************************************************
  13. *                         頭文件包含
  14. **********************************************************************
  15. */
  16. #include "ds1302.h"


  17. /*
  18. **********************************************************************
  19. *                         本地全局變量
  20. **********************************************************************
  21. */
  22. // 以下為DS1302相關(guān)定義
  23. sbit DSIO = P1^0;                 // DS1302的SPI接口IO線,輸入輸出都走這里
  24. sbit CE   = P1^1;                // chip enable,讀寫ds1302前要使能,讀寫完要禁止
  25. sbit SCLK = P1^2;                   // serial clock,串行時(shí)鐘線


  26. extern u8 gTime[7];                // 定義在mian.c中,用來(lái)存儲(chǔ)DS1302中7個(gè)時(shí)間的BCD碼值
  27. extern u8 gDigValue[8];                // 定義在main.c中,用LCD2864上顯示的8個(gè)數(shù)值
  28. extern u8 YTD[];
  29. extern u8 week[];

  30. // DS1302內(nèi)部時(shí)間寄存器地址常量定義,這些地址值可查DS1302數(shù)據(jù)手冊(cè)獲取
  31. u8 code DS1302_READ_ADDR[7] = {0x81, 0x83, 0x85, 0x87, 0x89, 0x8b, 0x8d};                 //讀地址
  32. u8 code DS1302_WRITE_ADDR[7] = {0x80, 0x82, 0x84, 0x86, 0x88, 0x8a, 0x8c};                //寫地址


  33. /*
  34. **********************************************************************
  35. *                         內(nèi)部函數(shù)原型聲明
  36. **********************************************************************
  37. */
  38. static void Ds1302WriteReg(u8 addr, u8 dat);
  39. static u8 Ds1302ReadReg(u8 addr);
  40. static void Ds1302WriteTime(void);



  41. /*********************************************************************
  42. * 函 數(shù) 名       : Ds1302WriteReg
  43. * 函數(shù)功能                 : 向DS1302中地址為addr的寄存器寫入數(shù)值dat
  44. * 參數(shù)列表       : addr - 待寫入數(shù)值的寄存器地址
  45.                                    dat  - 待寫入addr寄存器的數(shù)值
  46. * 函數(shù)輸出             : 無(wú)
  47. *********************************************************************/
  48. static void Ds1302WriteReg(u8 addr, u8 dat)
  49. {
  50.         u8 i = 0;

  51.         CE = 0;
  52.         _nop_();                                // 空指令,延時(shí)

  53.         SCLK = 0;                                // 先將SCLK置低電平
  54.         _nop_();

  55.         CE = 1;                                 // CE拉高以使能對(duì)DS1302的讀寫權(quán)限
  56.         _nop_();

  57.         for (i=0; i<8; i++)                // 循環(huán)逐位發(fā)送addr的8個(gè)bit,注意低位在前
  58.         {
  59.                 DSIO = addr & 0x01;        // 數(shù)據(jù)從LSB低位開始傳送
  60.                 addr >>= 1;                        // 發(fā)完后addr右移一位原來(lái)的次低位變成新的低位
  61.                 SCLK = 1;                        // 拉高SCLK制造一個(gè)上升沿,通知DS1302讀取數(shù)據(jù)
  62.                 _nop_();                        // 延時(shí)等待DS1302讀取DSIO線上的1位數(shù)據(jù)

  63.                 SCLK = 0;                        // 讀完后,拉低SCLK為下一個(gè)位的傳輸做準(zhǔn)備
  64.                 _nop_();
  65.         }
  66.                                                         // 循環(huán)結(jié)束后1字節(jié)的寄存器地址傳給DS1302
  67.         for (i=0; i<8; i++)                // 循環(huán)寫入8位數(shù)據(jù),注意低位在前
  68.         {
  69.                 DSIO = dat & 0x01;
  70.                 dat >>= 1;
  71.                 SCLK = 1;                        //制造上升沿通知DS1302讀取數(shù)據(jù)
  72.                 _nop_();
  73.                 SCLK = 0;
  74.                 _nop_();        
  75.         }                                                   // 循環(huán)結(jié)束后1字節(jié)值成功傳給DS1302
  76.                  
  77.         CE = 0;                                        // 寫入完畢拉低CE以禁止對(duì)DS1302的讀寫,防止意外改寫事故
  78.         _nop_();
  79. }


  80. /*********************************************************************
  81. * 函 數(shù) 名       : Ds1302ReadReg
  82. * 函數(shù)功能                 : 向DS1302中地址為addr的寄存器寫入數(shù)值dat
  83. * 參數(shù)列表       : addr - 待讀出的寄存器的地址
  84. * 函數(shù)輸出             : 讀出的寄存器addr的數(shù)值
  85. *********************************************************************/
  86. static u8 Ds1302ReadReg(u8 addr)
  87. {
  88.         u8 i = 0, dat = 0, dat1 = 0;

  89.         CE = 0;                                                          // CE設(shè)置為初始狀態(tài)
  90.         _nop_();

  91.         SCLK = 0;                                                // SCLK設(shè)置為初始狀態(tài)
  92.         _nop_();

  93.         CE = 1;                                                        // 拉高CE使能對(duì)DS1302的寄存器讀寫權(quán)限
  94.         _nop_();

  95.         for (i=0; i<8; i++)                                // 循環(huán)發(fā)送8bit寄存器地址值
  96.         {
  97.                 DSIO = addr & 0x01;                        // DS1302的SPI接口從LSB開始發(fā)送
  98.                 addr >>= 1;

  99.                 SCLK = 1;                                        // 制造上升沿,DS1302在上升沿完成讀取動(dòng)作
  100.                 _nop_();

  101.                 SCLK = 0;                                        // 拉低SCLK為下個(gè)bit發(fā)送做準(zhǔn)備
  102.                 _nop_();
  103.         }
  104.         
  105.         for (i=0; i<8; i++)                                // 循環(huán)讀取8bit寄存器值數(shù)據(jù)
  106.         {
  107.                 dat1 = DSIO;//從最低位開始接收
  108.                 dat = (dat>>1) | (dat1<<7);
  109.                 SCLK = 1;
  110.                 _nop_();
  111.                 SCLK = 0;//DS1302下降沿時(shí),放置數(shù)據(jù)
  112.                 _nop_();
  113.         }

  114.         CE = 0;
  115.         _nop_();        //以下為DS1302復(fù)位的穩(wěn)定時(shí)間,必須的。

  116.         SCLK = 1;
  117.         _nop_();

  118.         DSIO = 0;
  119.         _nop_();

  120.         DSIO = 1;
  121.         _nop_();

  122.         return dat;        
  123. }


  124. /*********************************************************************
  125. * 函 數(shù) 名       : Ds1302WriteTime
  126. * 函數(shù)功能                 : 將全局變量gTime中的時(shí)間寫入DS1302中以重置DS1302時(shí)間
  127. * 參數(shù)列表       : 無(wú)
  128. * 函數(shù)輸出             : 無(wú)
  129. *********************************************************************/
  130. static void Ds1302WriteTime(void)
  131. {
  132.         u8 i = 0;

  133.         Ds1302WriteReg(0x8E,0x00);                 // 禁用WP以獲取寫時(shí)間寄存器的權(quán)限
  134.         for (i=0; i<7; i++)                         // 依次寫入7個(gè)時(shí)間,順序依次:秒分時(shí)日月周年
  135.         {
  136.                 Ds1302WriteReg(DS1302_WRITE_ADDR[i],gTime[i]);        
  137.         }
  138.         Ds1302WriteReg(0x8E,0x80);                 // 使能WP以禁止對(duì)時(shí)間寄存器的讀寫,防止意外改寫事故
  139. }


  140. /*********************************************************************
  141. * 函 數(shù) 名       : Ds1302InitTime
  142. * 函數(shù)功能                 : 以給定的初始時(shí)間來(lái)重置DS1302時(shí)間值
  143. * 參數(shù)列表       : 無(wú)
  144. * 函數(shù)輸出             : 無(wú)
  145. *********************************************************************/
  146. void Ds1302InitTime(void)
  147. {
  148.         // 先給個(gè)初始化時(shí)間
  149.         gTime[0] = 0x50;        // 初始化時(shí)間,秒,注意是BCD碼不是10進(jìn)制也不是16進(jìn)制
  150.         gTime[1] = 0x59;        // 初始化時(shí)間,分,注意是BCD碼不是10進(jìn)制也不是16進(jìn)制
  151.         gTime[2] = 0x23;        // 初始化時(shí)間,時(shí),注意是BCD碼不是10進(jìn)制也不是16進(jìn)制
  152.         gTime[3] = 0x31;        // 初始化時(shí)間,日,注意是BCD碼不是10進(jìn)制也不是16進(jìn)制
  153.         gTime[4] = 0x12;        // 初始化時(shí)間,月,注意是BCD碼不是10進(jìn)制也不是16進(jìn)制
  154.         gTime[5] = 0x07;        // 初始化時(shí)間,周,注意是BCD碼不是10進(jìn)制也不是16進(jìn)制
  155.         gTime[6] = 0x18;        // 初始化時(shí)間,年,注意是BCD碼不是10進(jìn)制也不是16進(jìn)制,以2000為基數(shù)
  156.         // 將給定時(shí)間寫入DS1302內(nèi)部時(shí)間寄存器以完成初始化
  157.         Ds1302WriteTime();
  158. }


  159. /*********************************************************************
  160. * 函 數(shù) 名       : Ds1302ReadTime
  161. * 函數(shù)功能                 : 讀出DS1302內(nèi)部時(shí)間放入全局變量gTime中
  162. * 參數(shù)列表       : 無(wú)
  163. * 函數(shù)輸出             : 無(wú)
  164. *********************************************************************/
  165. void Ds1302ReadTime(void)
  166. {
  167.         u8 i = 0;

  168.         for (i=0; i<7; i++)//讀取7個(gè)字節(jié)的時(shí)鐘信號(hào):秒分時(shí)日月周年
  169.         {
  170.                 gTime[i] = Ds1302ReadReg(DS1302_READ_ADDR[i]);
  171.         }
  172. }
  173. /*********************************************************************
  174. * 函 數(shù) 名       : UpdateDigValue
  175. * 函數(shù)功能                 : 顯示時(shí)間
  176. * 參數(shù)列表       : 無(wú)
  177. * 函數(shù)輸出             : 無(wú)
  178. *********************************************************************/
  179. void UpdateDigValue(void)
  180. {
  181.         Ds1302ReadTime();                  // 從DS1302讀取時(shí)間存入gTime中

  182.         gDigValue[0] = ((gTime[2] >> 4) & 0x0f)+48;                // Hour的高4位
  183.         gDigValue[1] = ((gTime[2] >> 0) & 0x0f)+48;                // Hour的低4位
  184.         gDigValue[2] = ':';                                                                // 分隔符
  185.         
  186.         gDigValue[3] = ((gTime[1] >> 4) & 0x0f)+48;                // Minute的高4位
  187.         gDigValue[4] = ((gTime[1] >> 0) & 0x0f)+48;                // Minute的低4位
  188.         gDigValue[5] = ':';                                                                // 分隔符

  189.         gDigValue[6] = ((gTime[0] >> 4) & 0x0f)+48;                // Second的高4位
  190.         gDigValue[7] = ((gTime[0] >> 0) & 0x0f)+48;                // Second的低4位
  191.         
  192. }
  193. /*********************************************************************
  194. * 函 數(shù) 名       : DisplayDay
  195. * 函數(shù)功能                 : 顯示年月日
  196. * 參數(shù)列表       : 無(wú)
  197. * 函數(shù)輸出             : 無(wú)
  198. *********************************************************************/
  199. void DisplayDay(void)
  200. {
  201.           Ds1302ReadTime();                  // 從DS1302讀取時(shí)間存入gTime中

  202.         YTD[2] = ((gTime[6] >> 4) & 0x0f)+48;                // Hour的高4位
  203.         YTD[3] = ((gTime[6] >> 0) & 0x0f)+48;                // Hour的低4位
  204.         YTD[6] = ((gTime[4] >> 4) & 0x0f)+48;                // Minute的高4位
  205.         YTD[7] = ((gTime[4] >> 0) & 0x0f)+48;                // Minute的低4位
  206.         YTD[10] = ((gTime[3] >> 4) & 0x0f)+48;                // Second的高4位
  207.         YTD[11] = ((gTime[3] >> 0) & 0x0f)+48;                // Second的低4位
  208. }
復(fù)制代碼
全部資料51hei下載地址:
代碼.zip (53.48 KB, 下載次數(shù): 5)

評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

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

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 日韩欧美在线一区二区 | 小h片免费观看久久久久 | 中国一级特黄真人毛片免费观看 | 精品少妇一区二区三区在线播放 | 亚洲精选一区二区 | 欧美日韩精品久久久免费观看 | 国产精品视频中文字幕 | 天堂网中文 | 999国产精品视频免费 | 手机av在线| 91视频免费观看 | 成人国产免费观看 | 久久久精品视频一区二区三区 | 亚洲视频中文字幕 | 日本一区二区三区免费观看 | 91中文视频 | 亚洲综合色站 | 一级片毛片| 国产91色在线 | 亚洲 | 日本久草| 日本一区二区三区在线观看 | 一区二区三区在线免费观看 | 久久国产精品精品国产色婷婷 | h视频免费看 | 亚洲精品黄 | 日韩成人在线网址 | 国产精品久久免费观看 | 欧洲国产精品视频 | 99热精品在线观看 | 91xxx在线观看 | 精品香蕉一区二区三区 | 欧美亚洲国产一区二区三区 | 中国黄色毛片视频 | 精品影院| 欧美色a v | 免费看国产一级特黄aaaa大片 | 99re热精品视频 | 99视频在线免费观看 | 国产视频一区二区三区四区五区 | 狠狠干美女 | 91一区|