51微控制器的DS1302的驅動程式

2021-07-23 02:26:32 字數 3902 閱讀 6934

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訊號...