1 引言
實(shí)時(shí)時(shí)鐘(RTC)器件是一種能提供日歷/時(shí)鐘、數(shù)據(jù)存儲(chǔ)等功能的專用集成電路,常常用作各種計(jì)算機(jī)系統(tǒng)的時(shí)鐘信號(hào)源和設(shè)置參數(shù)的存儲(chǔ)電路。它具有計(jì)時(shí)準(zhǔn)確、耗電低和體積小等特點(diǎn),特別是在各種嵌入式系統(tǒng)諸如照相機(jī)、洗衣機(jī)等智能家電中得到廣泛的應(yīng)用。隨著集成電路技術(shù)的不斷發(fā)展,RTC器件的新品也不斷推出,美國的Xicor 和Dallas公司推出了X1203、X1228 和DS1302、DS1616等新品。這些新品不僅具有準(zhǔn)確的RTC,還有大容量的存儲(chǔ)器、溫度傳感器和A/D數(shù)據(jù)采集通道等,已成為集RTC、數(shù)據(jù)采集和存儲(chǔ)于一體的綜合功能器件,特別適用于以微控制器為核心的嵌入式系統(tǒng)。這些器件與微控制器之間的接口大都采用連線簡單的串行接口,但其通信時(shí)序是比較復(fù)雜的,怎樣利用高效的編程語言設(shè)計(jì)出通信程序就顯得尤為重要。本文以DS1616與微控制器的通信過程為例,在介紹通信組成和原理后,重點(diǎn)討論了用C51編寫其通信程序的過程和方法。
由于微控制器具有內(nèi)嵌功能很強(qiáng)的CPU內(nèi)核特點(diǎn),因此微控制器用于數(shù)據(jù)傳輸獨(dú)具智能化的優(yōu)勢。利用其智能化的特點(diǎn)就可以構(gòu)成連線簡單的串口通信,諸如I2C、SPI、MICROWIRE和CAN [3]等串行總線接口。這些串口由2~3根線連接,分為同步和異步。
DS1616是一種具有數(shù)據(jù)采集功能的實(shí)時(shí)時(shí)鐘器件,由控制邏輯、實(shí)時(shí)時(shí)鐘、通信接口等電路和溫度傳感器、A/D轉(zhuǎn)換器、存儲(chǔ)器等部分構(gòu)成。片外32.768 kHz石英晶體和內(nèi)部振蕩電路產(chǎn)生的時(shí)鐘信號(hào)經(jīng)分頻后得到相應(yīng)日歷/時(shí)間寄存器的計(jì)時(shí)值;控制邏輯電路根據(jù)控制寄存器的設(shè)定值實(shí)現(xiàn)計(jì)時(shí)、溫度數(shù)據(jù)采集、A/D轉(zhuǎn)換和通信方式等的控制;DS1616的存儲(chǔ)器采用分頁結(jié)構(gòu),每頁共有32個(gè)字節(jié)。第0頁和第1頁為實(shí)時(shí)時(shí)鐘和特殊功能寄存器,特殊功能寄存器有兩個(gè)控制寄存器和兩個(gè)狀態(tài)寄存器;第2頁為用戶非易失 RAM;第17頁到第19頁用來存儲(chǔ)報(bào)警時(shí)間標(biāo)簽和持續(xù)時(shí)間;第64頁到71頁用來存儲(chǔ)直方圖數(shù)據(jù);第128頁到191頁2k字節(jié)用來存儲(chǔ)記錄數(shù)據(jù);第3到第16頁、20到63 頁、68到127頁及192以上為將來擴(kuò)展預(yù)留。用戶只能修改實(shí)時(shí)時(shí)鐘RTC、特殊功能寄存器和非易失 RAM的數(shù)據(jù),其余存儲(chǔ)空間只能讀不能寫,存儲(chǔ)器的每個(gè)單元都有一個(gè)16位地址。CPU通過給控制寄存器寫入相應(yīng)控制字來確定其工作方式,讀取狀態(tài)寄存器值判斷其狀態(tài),采集數(shù)據(jù)在2k字節(jié)的存儲(chǔ)器中讀取。
DS1616有兩種通信方式,即同步和異步通信方式。當(dāng)COMSEL端置高電平后,DS1616與微控制器之間實(shí)現(xiàn)三線同步通信,實(shí)現(xiàn)對(duì)片內(nèi)存儲(chǔ)器的單字節(jié)讀寫和頁數(shù)據(jù)讀。圖1給出了與AT89C51微控制器的連接關(guān)系。輸入端接收高電平后就啟動(dòng)所有的數(shù)據(jù)傳送。的輸入有兩種功能:首先,置高電平后接通控制邏輯,允許命令、地址、數(shù)據(jù)序列送入/讀出片內(nèi)移位寄存器;其次,置低電平后終止單字節(jié)或多字節(jié)數(shù)據(jù)的傳送。SCL是移位同步時(shí)鐘,通過每個(gè)SCLK時(shí)鐘的上升沿把每位數(shù)據(jù)寫入DS1616,下降沿讀出DS1616的逐位數(shù)據(jù)。傳送的數(shù)據(jù)都是從低位到高位逐位寫入/讀出。每次傳送的數(shù)據(jù)由命令字節(jié)、地址和數(shù)據(jù)三部分構(gòu)成,時(shí)序如圖2所示,地址視不同的訪問單元而定。DS1616的讀寫過程是由命令字節(jié)控制的,共有5個(gè)命令字節(jié),其功能如表1 所示。
3 通信程序設(shè)計(jì)
C語言是目前公認(rèn)的最為流行的一種計(jì)算機(jī)高級(jí)程序設(shè)計(jì)語言。為了使C語言更加貼近硬件,使微控制器的開發(fā)者從艱苦的匯編語言設(shè)計(jì)中解脫出來,縮短開發(fā)周期,美國Archimedes和Franklin Software公司在90年代推出了適于以MCS51為內(nèi)核的微控制器的高級(jí)程序開發(fā)工具C51。目前C51 主要有Archimedes和Franklin兩種版本,兩種版本均符合ANSI C的標(biāo)準(zhǔn)[4]。
下面通過C51編譯器的編程,說明通信程序的編寫方法,其中 WriteB()為寫入單字節(jié)、ReadB()為讀出單字節(jié),Wait()為等待,Delay()延時(shí)函數(shù)用匯編程序?qū)崿F(xiàn)。
#include
#define uchar unsigned char
#define SCL P3_5
#define IO P3_6
#define RST P3_7
extern void WriteB( uchar ); //向DS1616寫入一個(gè)字節(jié)函數(shù) extern uchar ReadB(); //從DS1616中讀取一個(gè)字節(jié)函數(shù)
extern void Wait();//等待
extern void Delay( uchar ); //延時(shí)函數(shù)
uchar data Data[32];//存放32字節(jié)內(nèi)容的數(shù)組
3.1 向DS1616指定單元中寫入一個(gè)字節(jié)的函數(shù)
void WDS1616( uchar Address, uchar Data )
{
SCL = 0;
RST = 1;//開始通訊
WriteB( 0x22 ); Wait();//發(fā)送寫字節(jié)命令22H
WriteB( Address ); Wait(); //發(fā)送地址
WriteB( Data ); Wait();//發(fā)送數(shù)據(jù)
RST = 0;//結(jié)束通訊
}
3.2 讀取頁數(shù)據(jù)的函數(shù)
void RPageDS1616( uchar AddressH, uchar AddressL )
{
uchar i;
RST = 1;//開始通訊
Wait();
WriteB( 0x33 );Wait();//發(fā)送讀頁節(jié)命令33H
WriteB( AddressH ); Wait(); //發(fā)送高位地址
WriteB( AddressL ); Wait(); //發(fā)送低位地址
for( i = 0; i 《 32; i++ )
{
Data = ReadB();//獲取一頁數(shù)據(jù)
Wait();
}
IO = 0;
RST = 0; //結(jié)束通訊
SCL = 0;
}
3.3 啟動(dòng)DS1616立即進(jìn)行A/D轉(zhuǎn)換或溫度檢測, 并將數(shù)據(jù)存入相應(yīng)寄存器的函數(shù)
void RDS1616( )
{
RST = 1;//開始通訊
WriteB( 0x55 );//發(fā)送命令
IO = 0;
RST = 0;//結(jié)束通訊
SCL = 0; }
3.4 初始化DS1616并讀取數(shù)據(jù)的主程序
void main()
{//COMSEL為高電平,DS1616采用同步通訊 RST = 0;//通訊復(fù)位
WDS1616( 0x0e, 0x40 ); Wait();//允許執(zhí)行內(nèi)存清0命令
WriteB( 0xA5 ); Wait();//清除寄存器和RAM
WDS1616( 0x0d, 0x01 ); Wait();//設(shè)置采樣速率為每分鐘一次
WDS1616( 0x29, 0x41 ); Wait();//啟動(dòng)溫度傳感器
WDS1616( 0x00, 0x32 ); Wait();//設(shè)置秒寄存器為32s
WDS1616( 0x01, 0x59 ); Wait();//分寄存器為59min
WDS1616( 0x02, 0x20 ); Wait();//20h
WDS1616( 0x03, 0x05 ); Wait();//星期五
WDS1616( 0x04, 0x05 ); Wait();//5號(hào)
WDS1616( 0x05, 0x84 ); Wait();//4月份,并且是20世紀(jì)(Y2K = 1)
WDS1616( 0x06, 0x02 ); Wait();//02年
while(1)
{ //以下是從地址0000H開始讀取一頁數(shù)據(jù),其中包含有RTC,當(dāng)前溫度狀態(tài)寄存器1等
RPageDS1616( 0x00, 0x00 );Wait();
RDS1616( ); //立即進(jìn)行A/D轉(zhuǎn)換或溫度檢測,并將數(shù)據(jù)存入相應(yīng)寄存器
Delay( 100 );
Delay( 100 );
RPageDS1616( 0x00, 0x20 ); //從地址0020開始讀取一頁數(shù)據(jù)
Wait(); //其中包含有3路ADC數(shù)據(jù)和狀態(tài)寄存器2等
}
}
4 結(jié)束語
使用C51編寫MCS51與RTC器件的通信程序使編譯變得簡捷有序,并且調(diào)試和移植方便。以上程序稍加修改就可用于I 2C、SPI、MICROWIRE和CAN等總線接口的通信中。在單鏡頭反光相機(jī)的嵌入式系統(tǒng)的測光信號(hào)處理、日歷/時(shí)鐘模塊與MCS51微控制器的通信中就應(yīng)用了以上程序。C51 編程可大大提高M(jìn)CS51微控制器應(yīng)用軟件的編寫速度,縮短系統(tǒng)的開發(fā)周期。
責(zé)任編輯:gt
-
微控制器
+關(guān)注
關(guān)注
48文章
7951瀏覽量
154961 -
傳感器
+關(guān)注
關(guān)注
2565文章
52982瀏覽量
767255 -
接口
+關(guān)注
關(guān)注
33文章
9000瀏覽量
153712
發(fā)布評(píng)論請(qǐng)先 登錄
DS1318與8051微控制器的接口
DS1302 RTC與8051微控制器的接口

DS1388實(shí)時(shí)時(shí)鐘與8051微控制器的接口

DS3231與8051微控制器的接口

DS1305 RTC與8051微控制器的接口

基于微控制器的串行端口接口(SPI)啟動(dòng)電路

基于DMA控制器的UART串行通信設(shè)計(jì)

AN-812: 基于微控制器的串行端口接口(SPI?)啟動(dòng)電路

DS1616 時(shí)鐘/定時(shí) - 實(shí)時(shí)時(shí)鐘

如何在MAXQ3180微控制器上使用串行外設(shè)接口

怎樣使用MAXQ3180微控制器的串行外設(shè)接口

評(píng)論