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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

DS1302液晶顯示單片機程序

[復制鏈接]
跳轉到指定樓層
樓主
制作出來的實物圖如下:

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

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


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


  26. extern u8 gTime[7];                // 定義在mian.c中,用來存儲DS1302中7個時間的BCD碼值
  27. extern u8 gDigValue[8];                // 定義在main.c中,用LCD2864上顯示的8個數值
  28. extern u8 YTD[];
  29. extern u8 week[];

  30. // DS1302內部時間寄存器地址常量定義,這些地址值可查DS1302數據手冊獲取
  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. *                         內部函數原型聲明
  36. **********************************************************************
  37. */
  38. static void Ds1302WriteReg(u8 addr, u8 dat);
  39. static u8 Ds1302ReadReg(u8 addr);
  40. static void Ds1302WriteTime(void);



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

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

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

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

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

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


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

  89.         CE = 0;                                                          // CE設置為初始狀態
  90.         _nop_();

  91.         SCLK = 0;                                                // SCLK設置為初始狀態
  92.         _nop_();

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

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

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

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

  114.         CE = 0;
  115.         _nop_();        //以下為DS1302復位的穩定時間,必須的。

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

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

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

  122.         return dat;        
  123. }


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

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


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


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

  168.         for (i=0; i<7; i++)//讀取7個字節的時鐘信號:秒分時日月周年
  169.         {
  170.                 gTime[i] = Ds1302ReadReg(DS1302_READ_ADDR[i]);
  171.         }
  172. }
  173. /*********************************************************************
  174. * 函 數 名       : UpdateDigValue
  175. * 函數功能                 : 顯示時間
  176. * 參數列表       : 無
  177. * 函數輸出             : 無
  178. *********************************************************************/
  179. void UpdateDigValue(void)
  180. {
  181.         Ds1302ReadTime();                  // 從DS1302讀取時間存入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. * 函 數 名       : DisplayDay
  195. * 函數功能                 : 顯示年月日
  196. * 參數列表       : 無
  197. * 函數輸出             : 無
  198. *********************************************************************/
  199. void DisplayDay(void)
  200. {
  201.           Ds1302ReadTime();                  // 從DS1302讀取時間存入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. }
復制代碼
全部資料51hei下載地址:
代碼.zip (53.48 KB, 下載次數: 5)

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表