|
制作出來(lái)的實(shí)物圖如下:
DS1302液晶顯示.jpg (1.81 MB, 下載次數(shù): 17)
下載附件
2019-5-4 09:11 上傳
- /*********************************************************************
- 模塊名稱:DS1302
- 模塊功能: RTC
- 硬件接線:無(wú)。
- 注意事項(xiàng):(1) DS1302的SPI接口用到了P3.4、P3.5、P3.6,若程序運(yùn)行有問(wèn)題查
- 硬件問(wèn)題時(shí)可以從這三個(gè)引腳復(fù)用部分查起
- (2) DS1302的初始化時(shí)間是隨便給的,之所以給23.59.50,是為了在10
- 秒后即可看到24.59.59到00.00.00的跳變。
- (3) DS1302寄存器讀寫的函數(shù)編寫時(shí)要注意時(shí)序和LSB這2個(gè)要點(diǎn)。
- **********************************************************************/
- /*
- **********************************************************************
- * 頭文件包含
- **********************************************************************
- */
- #include "ds1302.h"
- /*
- **********************************************************************
- * 本地全局變量
- **********************************************************************
- */
- // 以下為DS1302相關(guān)定義
- sbit DSIO = P1^0; // DS1302的SPI接口IO線,輸入輸出都走這里
- sbit CE = P1^1; // chip enable,讀寫ds1302前要使能,讀寫完要禁止
- sbit SCLK = P1^2; // serial clock,串行時(shí)鐘線
- extern u8 gTime[7]; // 定義在mian.c中,用來(lái)存儲(chǔ)DS1302中7個(gè)時(shí)間的BCD碼值
- extern u8 gDigValue[8]; // 定義在main.c中,用LCD2864上顯示的8個(gè)數(shù)值
- extern u8 YTD[];
- extern u8 week[];
- // DS1302內(nèi)部時(shí)間寄存器地址常量定義,這些地址值可查DS1302數(shù)據(jù)手冊(cè)獲取
- u8 code DS1302_READ_ADDR[7] = {0x81, 0x83, 0x85, 0x87, 0x89, 0x8b, 0x8d}; //讀地址
- u8 code DS1302_WRITE_ADDR[7] = {0x80, 0x82, 0x84, 0x86, 0x88, 0x8a, 0x8c}; //寫地址
- /*
- **********************************************************************
- * 內(nèi)部函數(shù)原型聲明
- **********************************************************************
- */
- static void Ds1302WriteReg(u8 addr, u8 dat);
- static u8 Ds1302ReadReg(u8 addr);
- static void Ds1302WriteTime(void);
- /*********************************************************************
- * 函 數(shù) 名 : Ds1302WriteReg
- * 函數(shù)功能 : 向DS1302中地址為addr的寄存器寫入數(shù)值dat
- * 參數(shù)列表 : addr - 待寫入數(shù)值的寄存器地址
- dat - 待寫入addr寄存器的數(shù)值
- * 函數(shù)輸出 : 無(wú)
- *********************************************************************/
- static void Ds1302WriteReg(u8 addr, u8 dat)
- {
- u8 i = 0;
- CE = 0;
- _nop_(); // 空指令,延時(shí)
- SCLK = 0; // 先將SCLK置低電平
- _nop_();
- CE = 1; // CE拉高以使能對(duì)DS1302的讀寫權(quán)限
- _nop_();
- for (i=0; i<8; i++) // 循環(huán)逐位發(fā)送addr的8個(gè)bit,注意低位在前
- {
- DSIO = addr & 0x01; // 數(shù)據(jù)從LSB低位開始傳送
- addr >>= 1; // 發(fā)完后addr右移一位原來(lái)的次低位變成新的低位
- SCLK = 1; // 拉高SCLK制造一個(gè)上升沿,通知DS1302讀取數(shù)據(jù)
- _nop_(); // 延時(shí)等待DS1302讀取DSIO線上的1位數(shù)據(jù)
- SCLK = 0; // 讀完后,拉低SCLK為下一個(gè)位的傳輸做準(zhǔn)備
- _nop_();
- }
- // 循環(huán)結(jié)束后1字節(jié)的寄存器地址傳給DS1302
- for (i=0; i<8; i++) // 循環(huán)寫入8位數(shù)據(jù),注意低位在前
- {
- DSIO = dat & 0x01;
- dat >>= 1;
- SCLK = 1; //制造上升沿通知DS1302讀取數(shù)據(jù)
- _nop_();
- SCLK = 0;
- _nop_();
- } // 循環(huán)結(jié)束后1字節(jié)值成功傳給DS1302
-
- CE = 0; // 寫入完畢拉低CE以禁止對(duì)DS1302的讀寫,防止意外改寫事故
- _nop_();
- }
- /*********************************************************************
- * 函 數(shù) 名 : Ds1302ReadReg
- * 函數(shù)功能 : 向DS1302中地址為addr的寄存器寫入數(shù)值dat
- * 參數(shù)列表 : addr - 待讀出的寄存器的地址
- * 函數(shù)輸出 : 讀出的寄存器addr的數(shù)值
- *********************************************************************/
- static u8 Ds1302ReadReg(u8 addr)
- {
- u8 i = 0, dat = 0, dat1 = 0;
- CE = 0; // CE設(shè)置為初始狀態(tài)
- _nop_();
- SCLK = 0; // SCLK設(shè)置為初始狀態(tài)
- _nop_();
- CE = 1; // 拉高CE使能對(duì)DS1302的寄存器讀寫權(quán)限
- _nop_();
- for (i=0; i<8; i++) // 循環(huán)發(fā)送8bit寄存器地址值
- {
- DSIO = addr & 0x01; // DS1302的SPI接口從LSB開始發(fā)送
- addr >>= 1;
- SCLK = 1; // 制造上升沿,DS1302在上升沿完成讀取動(dòng)作
- _nop_();
- SCLK = 0; // 拉低SCLK為下個(gè)bit發(fā)送做準(zhǔn)備
- _nop_();
- }
-
- for (i=0; i<8; i++) // 循環(huán)讀取8bit寄存器值數(shù)據(jù)
- {
- dat1 = DSIO;//從最低位開始接收
- dat = (dat>>1) | (dat1<<7);
- SCLK = 1;
- _nop_();
- SCLK = 0;//DS1302下降沿時(shí),放置數(shù)據(jù)
- _nop_();
- }
- CE = 0;
- _nop_(); //以下為DS1302復(fù)位的穩(wěn)定時(shí)間,必須的。
- SCLK = 1;
- _nop_();
- DSIO = 0;
- _nop_();
- DSIO = 1;
- _nop_();
- return dat;
- }
- /*********************************************************************
- * 函 數(shù) 名 : Ds1302WriteTime
- * 函數(shù)功能 : 將全局變量gTime中的時(shí)間寫入DS1302中以重置DS1302時(shí)間
- * 參數(shù)列表 : 無(wú)
- * 函數(shù)輸出 : 無(wú)
- *********************************************************************/
- static void Ds1302WriteTime(void)
- {
- u8 i = 0;
- Ds1302WriteReg(0x8E,0x00); // 禁用WP以獲取寫時(shí)間寄存器的權(quán)限
- for (i=0; i<7; i++) // 依次寫入7個(gè)時(shí)間,順序依次:秒分時(shí)日月周年
- {
- Ds1302WriteReg(DS1302_WRITE_ADDR[i],gTime[i]);
- }
- Ds1302WriteReg(0x8E,0x80); // 使能WP以禁止對(duì)時(shí)間寄存器的讀寫,防止意外改寫事故
- }
- /*********************************************************************
- * 函 數(shù) 名 : Ds1302InitTime
- * 函數(shù)功能 : 以給定的初始時(shí)間來(lái)重置DS1302時(shí)間值
- * 參數(shù)列表 : 無(wú)
- * 函數(shù)輸出 : 無(wú)
- *********************************************************************/
- void Ds1302InitTime(void)
- {
- // 先給個(gè)初始化時(shí)間
- gTime[0] = 0x50; // 初始化時(shí)間,秒,注意是BCD碼不是10進(jìn)制也不是16進(jìn)制
- gTime[1] = 0x59; // 初始化時(shí)間,分,注意是BCD碼不是10進(jìn)制也不是16進(jìn)制
- gTime[2] = 0x23; // 初始化時(shí)間,時(shí),注意是BCD碼不是10進(jìn)制也不是16進(jìn)制
- gTime[3] = 0x31; // 初始化時(shí)間,日,注意是BCD碼不是10進(jìn)制也不是16進(jìn)制
- gTime[4] = 0x12; // 初始化時(shí)間,月,注意是BCD碼不是10進(jìn)制也不是16進(jìn)制
- gTime[5] = 0x07; // 初始化時(shí)間,周,注意是BCD碼不是10進(jìn)制也不是16進(jìn)制
- gTime[6] = 0x18; // 初始化時(shí)間,年,注意是BCD碼不是10進(jìn)制也不是16進(jìn)制,以2000為基數(shù)
- // 將給定時(shí)間寫入DS1302內(nèi)部時(shí)間寄存器以完成初始化
- Ds1302WriteTime();
- }
- /*********************************************************************
- * 函 數(shù) 名 : Ds1302ReadTime
- * 函數(shù)功能 : 讀出DS1302內(nèi)部時(shí)間放入全局變量gTime中
- * 參數(shù)列表 : 無(wú)
- * 函數(shù)輸出 : 無(wú)
- *********************************************************************/
- void Ds1302ReadTime(void)
- {
- u8 i = 0;
- for (i=0; i<7; i++)//讀取7個(gè)字節(jié)的時(shí)鐘信號(hào):秒分時(shí)日月周年
- {
- gTime[i] = Ds1302ReadReg(DS1302_READ_ADDR[i]);
- }
- }
- /*********************************************************************
- * 函 數(shù) 名 : UpdateDigValue
- * 函數(shù)功能 : 顯示時(shí)間
- * 參數(shù)列表 : 無(wú)
- * 函數(shù)輸出 : 無(wú)
- *********************************************************************/
- void UpdateDigValue(void)
- {
- Ds1302ReadTime(); // 從DS1302讀取時(shí)間存入gTime中
- gDigValue[0] = ((gTime[2] >> 4) & 0x0f)+48; // Hour的高4位
- gDigValue[1] = ((gTime[2] >> 0) & 0x0f)+48; // Hour的低4位
- gDigValue[2] = ':'; // 分隔符
-
- gDigValue[3] = ((gTime[1] >> 4) & 0x0f)+48; // Minute的高4位
- gDigValue[4] = ((gTime[1] >> 0) & 0x0f)+48; // Minute的低4位
- gDigValue[5] = ':'; // 分隔符
- gDigValue[6] = ((gTime[0] >> 4) & 0x0f)+48; // Second的高4位
- gDigValue[7] = ((gTime[0] >> 0) & 0x0f)+48; // Second的低4位
-
- }
- /*********************************************************************
- * 函 數(shù) 名 : DisplayDay
- * 函數(shù)功能 : 顯示年月日
- * 參數(shù)列表 : 無(wú)
- * 函數(shù)輸出 : 無(wú)
- *********************************************************************/
- void DisplayDay(void)
- {
- Ds1302ReadTime(); // 從DS1302讀取時(shí)間存入gTime中
- YTD[2] = ((gTime[6] >> 4) & 0x0f)+48; // Hour的高4位
- YTD[3] = ((gTime[6] >> 0) & 0x0f)+48; // Hour的低4位
- YTD[6] = ((gTime[4] >> 4) & 0x0f)+48; // Minute的高4位
- YTD[7] = ((gTime[4] >> 0) & 0x0f)+48; // Minute的低4位
- YTD[10] = ((gTime[3] >> 4) & 0x0f)+48; // Second的高4位
- YTD[11] = ((gTime[3] >> 0) & 0x0f)+48; // Second的低4位
- }
復(fù)制代碼 全部資料51hei下載地址:
代碼.zip
(53.48 KB, 下載次數(shù): 5)
2019-5-4 09:14 上傳
點(diǎn)擊文件名下載附件
DS1302液晶顯示 下載積分: 黑幣 -5
|
評(píng)分
-
查看全部評(píng)分
|