ds1302實時時鐘模組
對於時鐘晶元,我們只要知道它的寫入時序圖和讀出時序圖,以及時鐘晶元內部
所對應的位址就可以了,
所謂寫是寫入eeprom裡面,即設定好乙個時鐘的初值,然後每次重新整理的時鐘的
新值都寫入eeprom裡儲存起來,再從
eeprom
裡讀出來,這樣就能保證當外部
電源掉電後,自帶的電池仍能按照掉電時的時間繼續重新整理,而不是回到初始值。
讀乙個資料的時序圖
寫乙個資料的時序圖
內部各功能位址
驅動程式:
#include #include "./delay/delay.h"
#define ds1302_sec_add 0x80 //設定秒的位址
#define ds1302_min_add 0x82 //設定分的位址
#define ds1302_hr_add 0x84 //設定時的位址
#define ds1302_date_add 0x86 //設定天的位址
#define ds1302_month_add 0x88 //設定月的位址
#define ds1302_year_add 0x8c //設定年的位址
#define ds1302_control_add 0x8e
#define ds1302_charger_add 0x90
#define ds1302_clkburst_add 0xbe
sbit rst = p1^2;
sbit sck = p1^1;
sbit io = p1^0;
unsigned char tempbuf[3];
unsigned char timebuf[3] = ; //時間
unsigned char readbuf[6];
unsigned char disbuf[7];
unsigned char writebuf[6];
unsigned char disyear[3] = ; //日期
/*lcd*/
#define lcdport p0
#define lcd_write_data 1
#define lcd_write_com 0
sbit rs = p2^4;
sbit rw = p2^5;
sbit e = p2^6;
void ds1302_write_byte(unsigned char addr, unsigned char byte)
for(i = 0; i < 8; i++)
sck = 0;
rst = 0;
}unsigned char ds1302_read_byte(unsigned char addr)
for(i = 0; i < 8; i++)
}//sck = 0;
rst = 0;
return temp;}
void ds1302_write_time()
ds1302_write_byte(ds1302_control_add,0x00);
ds1302_write_byte(ds1302_hr_add,writebuf[0]);
ds1302_write_byte(ds1302_min_add,writebuf[1]);
ds1302_write_byte(ds1302_sec_add,writebuf[2]);
ds1302_write_byte(ds1302_year_add,writebuf[3]);
ds1302_write_byte(ds1302_month_add,writebuf[4]);
ds1302_write_byte(ds1302_date_add,writebuf[5]);
ds1302_write_byte(ds1302_control_add,0x80);
}void ds1302_read_time() }
void lcd1602_write(unsigned char byte, unsigned char flag)
else
rw = 0; //寫
e = 1; //選中lcd
lcdport = byte;
delay_ms(5);
e = 0; //失能lcd 高電平有效 }
void lcd1602_init()
void lcd1602_dis_str(unsigned char x, unsigned char y, unsigned char *s) //列印字串
if(0 == x)
else if(1 == x)
while(*s) }
void lcd1602_dis_time()
; unsigned char lcdday[9] = ;
lcddisbuf[0] = (disbuf[0] / 10) + 0x30; //顯示時間
lcddisbuf[1] = (disbuf[0] % 10) + 0x30;
lcddisbuf[2] = ':';
lcddisbuf[3] = (disbuf[1] / 10) + 0x30;
lcddisbuf[4] = (disbuf[1] % 10) + 0x30;
lcddisbuf[5] = ':';
lcddisbuf[6] = (disbuf[2] / 10) + 0x30;
lcddisbuf[7] = (disbuf[2] % 10) + 0x30;
lcdday[0] = (disbuf[3] / 10) + 0x30; //顯示日期
lcdday[1] = (disbuf[3] % 10) + 0x30;
lcdday[2] = '-';
lcdday[3] = (disbuf[4] / 10) + 0x30;
lcdday[4] = (disbuf[4] % 10) + 0x30;
lcdday[5] = '-';
lcdday[6] = (disbuf[5] / 10) + 0x30;
lcdday[7] = (disbuf[5] % 10) + 0x30;
lcd1602_dis_str(0,0,"time:");
lcd1602_dis_str(0,6,lcddisbuf);
lcd1602_dis_str(1,0,lcdday);}
void main()
}
51微控制器複習 DS1302
一 ds1302的主要效能指標 1 ds1302實時時鐘具有能計算2100年之前的秒 分 時 日 日期 星期 月 年的能力,還有閏年調整的能力。2 內部含有31個位元組靜態ram,可提供使用者訪問。3 採用序列資料傳送方式,使得管腳數量最少,簡單spi 3線介面。4 工作電壓範圍寬 2.0 5.5v...
DS1302的使用(by 51微控制器)
最近在準備藍橋杯微控制器組的比賽,在學習這款微控制器時,裡面涉及到ds1302晶元的使用,所以今天就在這裡把學習使用ds1302的過程寫下來,以方便日後查閱。ds1302是由dallas公司推出的涓流充電時鐘晶元,片內含有乙個實時時鐘和31位元組靜態ram.可通過簡單序列介面與微控制器進行通訊。與微...
51微控制器DS1302實時時鐘驅動程式
ds1302是低功耗實時時鐘晶元,它可以對年 月 日 周 時 分 秒進行計時,且具有閏年補償等多種功能。主要特點是採用序列資料傳輸,可為掉電保護電源提供可程式設計的充電功能,並且可以關閉充電功能。1.引腳分析 2.時序分析 1 寫位元組 第乙個位元組是位址位元組,第二個位元組是資料位元組。rst訊號...