1. 程式人生 > >DS1302時鐘模組介紹及與USRAT HMI通訊

DS1302時鐘模組介紹及與USRAT HMI通訊

一、DS1302時鐘模組

現在流行的序列時鐘電路很多,如DS1302、 DS1307、PCF8485等。這些電路的介面簡單、價格低廉、使用方便,被廣泛地採用。

DS1302 是美國DALLAS公司推出的一種高效能、低功耗、帶RAM的實時時鐘電路,它可以對年、月、日、周、時、分、秒進行計時,具有閏年補償功能,工作電壓為2.0V~5.5V。採用三線介面與CPU進行同步通訊,並可採用突發方式一次傳送多個位元組的時鐘訊號或RAM資料。DS1302內部有一個31×8的用於臨時性存放資料的RAM暫存器。DS1302是DS1202的升級產品,與DS1202相容,但增加了主電源/後備電源雙電源引腳,同時提供了對後備電源進行涓細電流充電的能力,該晶片採用普通32.768kHz晶振,DS1302 工作時功耗很低保持資料和時鐘資訊時功率小於1mW。

                                                                            圖1 DS1302時鐘模組實物圖

                                                                                       圖2 DS1302時鐘模組封裝

                                                                                表1  DS1302晶片引腳功能介紹表

VCC1

後備電源

GND

電源地

VCC2

工作電源

X1

晶振32.768kHz輸入

X2

SCLK

時鐘訊號

I/O

資料輸入輸出

RST

復位訊號|片選訊號

   DS1302時鐘模組的引腳功能介紹如表1所示,而時序不再做陳述,需要再自行查詢資料。

二、DS1302時鐘模組驅動程式碼

1.標頭檔案

#ifndef _DS1302_H_

#define _DS1302_H_



#include "STC15F2K60S2.h"



#ifndef UINT8

#define UINT8 unsigned char

#endif

#ifndef DS1302_READ_BURST

#define DS1302_READ_BURST 0xBF

#endif

#ifndef DS1302_WRITE_BURST

#define DS1302_WRITE_BURST 0xBE

#endif



sbit DS1302_IO   = P1^4;

sbit DS1302_RST  = P1^5;

sbit DS1302_SCLK = P1^3;



extern UINT8 xdata time[9];

extern UINT8 xdata date[11];

extern UINT8 xdata current_day[2];

//宣告全域性變數



void DS1302_WriteByte(UINT8 data_byte);//向ds1302寫一個位元組

void DS1302_ReadByte(UINT8 *data_byte);//從ds1302讀一個位元組

void DS1302_Start();//操作起始訊號

void DS1302_Over();//操作結束訊號

void DS1302_ClearWriteProtection();//清除防寫

void DS1302_SetWriteProtection();//設定防寫

void DS1302_SetTime(UINT8 *ds1302_set_buffer);//設定ds1302的時間

void DS1302_ReadTime(UINT8 *ds1302_build_buffer);//讀取ds1302的時間



void Time_Build();//系統從ds1302讀取時間

void Time_Set();//系統向ds1302設定時間

void Time_Init();//系統時間初始化



#endif

2.主程式

#include "ds1302.h"



void DS1302_WriteByte(UINT8 data_byte)//向ds1302寫一個位元組

{

        UINT8 i;

       

        for (i=0;i<8;i++)

        {

                DS1302_IO = data_byte & 0x01;

                DS1302_SCLK = 1;

                data_byte >>= 1;

                DS1302_SCLK = 0;

        }

}



void DS1302_ReadByte(UINT8 *data_byte) //從ds1302讀一個位元組

{

        UINT8 i;

       

        for (i=0;i<8;i++)

        {      

                *data_byte >>= 1;

                if (DS1302_IO){*data_byte |= 0x80;}

                DS1302_SCLK = 1;

                DS1302_SCLK = 0;

        }

}



void DS1302_Start()//操作起始訊號

{

        DS1302_RST  = 0;

        DS1302_SCLK = 0;

        DS1302_RST  = 1;

}



void DS1302_Over()//操作結束訊號

{

        DS1302_IO  = 0;

        DS1302_RST = 0;

}



void DS1302_ClearWriteProtection()//清除防寫

{

        DS1302_Start();

        DS1302_WriteByte(0x8E);

        DS1302_WriteByte(0x00);

        DS1302_Over();

}



void DS1302_SetWriteProtection()//設定防寫

{

        DS1302_Start();

        DS1302_WriteByte(0x8E);

        DS1302_WriteByte(0x80);

        DS1302_Over();

}



void DS1302_SetTime(UINT8 *ds1302_set_buffer)//突發模式下設定時間

{

        UINT8 i;



        DS1302_ClearWriteProtection();



        DS1302_Start();

        DS1302_WriteByte(DS1302_WRITE_BURST);

        for (i=0; i<7; i++)

        {

                DS1302_WriteByte(ds1302_set_buffer[i]);

        }

        DS1302_WriteByte(0x80);//突發模式一次要寫8個位元組,第八個位元組是防寫位元組

        DS1302_Over();

}



void DS1302_ReadTime(UINT8 *ds1302_read_buffer)//突發模式下讀取時間

{

        UINT8 i,Temp;



        DS1302_ClearWriteProtection();



        DS1302_Start();

        DS1302_WriteByte(DS1302_READ_BURST);

        for (i=0; i<7; i++)

        {

                DS1302_ReadByte(ds1302_read_buffer+i);

        }

        DS1302_ReadByte(&Temp);//突發模式一次讀8個位元組,最後一位元組讀出來沒用

        DS1302_Over();



        DS1302_SetWriteProtection();

}



void Time_Build()//讀取時間後轉換成需要的格式

{

        UINT8 xdata ds1302_build_buffer[7];

       

        DS1302_ReadTime(ds1302_build_buffer);

        time[7] = (ds1302_build_buffer[0]&0x0f)+'0';

        time[6] = ((ds1302_build_buffer[0]&0x70)>>4)+'0';

        time[4] = (ds1302_build_buffer[1]&0x0f)+'0';

        time[3] = ((ds1302_build_buffer[1]&0x70)>>4)+'0';

        time[1] = (ds1302_build_buffer[2]&0x0f)+'0';

        time[0] = ((ds1302_build_buffer[2]&0x30)>>4)+'0';

        date[9] = (ds1302_build_buffer[3]&0x0f)+'0';

        date[8] = ((ds1302_build_buffer[3]&0x30)>>4)+'0';

        date[6] = (ds1302_build_buffer[4]&0x0f)+'0';

        date[5] = ((ds1302_build_buffer[4]&0x10)>>4)+'0';

        date[3] = (ds1302_build_buffer[6]&0x0f)+'0';

        date[2] = ((ds1302_build_buffer[6]&0xf0)>>4)+'0';

       

}



void Time_Set()//將時間轉化為對應格式存入ds1302

{

        UINT8 xdata ds1302_set_buffer[7];

       

        ds1302_set_buffer[0]  = time[7]-'0';

        ds1302_set_buffer[0] |= ((time[6]-'0')&0x07)<<4;

        ds1302_set_buffer[1]  = time[4]-'0';

        ds1302_set_buffer[1] |= ((time[3]-'0')&0x07)<<4;

        ds1302_set_buffer[2]  = time[1]-'0';

        ds1302_set_buffer[2] |= ((time[0]-'0')&0x03)<<4;

        ds1302_set_buffer[3]  = date[9]-'0';

        ds1302_set_buffer[3] |= ((date[8]-'0')&0x03)<<4;

        ds1302_set_buffer[4]  = date[6]-'0';

        ds1302_set_buffer[4] |= ((date[5]-'0')&0x01)<<4;

        ds1302_set_buffer[6]  = date[3]-'0';

        ds1302_set_buffer[6] |= ((date[2]-'0')&0x0f)<<4;

        ds1302_set_buffer[5] = 0x01;

        DS1302_SetTime(ds1302_set_buffer);

}



void Time_Init()//開機時間初始化

{

        Time_Build();

        current_day[0] = date[8];

        current_day[1] = date[9];//儲存當前日期,用於檢測日期變化

}

三、DS1302時鐘模組與USRAT HMI通訊

    uchar a=0,b=0,c=0,d=0,e=0,f=0;
	/**********顯示時間**********/			
	a = date[2];	//傳送年資料
	b = date[3];
	c = date[5];	//傳送月資料
	d = date[6];
	e = date[8];	//傳送日資料
	f = date[9];
	write_txt("t0.txt=");   //傳送文字
	write_COM(34);			//雙引號
	write_COM(a);
	write_COM(b);
	write_COM(34);
	write_END();				//結束符 
	write_txt("t1.txt=");   //傳送文字
	write_COM(34);			//雙引號
	write_COM(c);
	write_COM(d);
	write_COM(34);
	write_END();				//結束符 
	write_txt("t2.txt=");   //傳送文字
	write_COM(34);			//雙引號
	write_COM(e);
	write_COM(f);
	write_COM(34);
	write_END();				//結束符 

	
	a = time[0];	//傳送時資料
	b = time[1];
	c = time[3];	//傳送分鐘資料
	d = time[4];
	e = time[6];	//傳送秒鐘資料
	f = time[7];
	write_txt("t3.txt=");   //傳送文字
	write_COM(34);			//雙引號
	write_COM(a);
	write_COM(b);
	write_COM(34);
	write_END();				//結束符 
	write_txt("t4.txt=");   //傳送文字
	write_COM(34);			//雙引號
	write_COM(c);
	write_COM(d);
	write_COM(34);
	write_END();				//結束符
	write_txt("t5.txt=");   //傳送文字
	write_COM(34);			//雙引號
	write_COM(e);
	write_COM(f);
	write_COM(34);
	write_END();				//結束符

	write_txt("t9.txt=");   //傳送文字
	write_COM(34);
	if(week==1)							//傳送星期資料
		write_txt("一");
	if(week==2)
		write_txt("二");
	if(week==3)
		write_txt("三");
	if(week==4)
		write_txt("四");
	if(week==5)
		write_txt("五");
	if(week==6)
		write_txt("六");
	if(week==7)
		write_txt("日"); 
	write_COM(34);
	write_END();