基于C51串行時鐘DS1305在無紙記錄儀中的實現(xiàn)
隨著現(xiàn)代化工業(yè)過程控制領域的飛速發(fā)展,以CPU為核心的新型控制儀表得到了廣泛的應用,與之配套的二次記錄儀表也發(fā)展到無紙記錄的新階段。無紙記錄儀對于工業(yè)現(xiàn)場信號記錄與監(jiān)測提供了相當準確與精確的記錄,而實現(xiàn)這一準確與精確的記錄與該系統(tǒng)的時鐘是緊密聯(lián)系在一起的。文章介紹用C51來實現(xiàn)DALLAS公司的串行實時鐘芯片DS1305在無紙記錄儀應用。
關于Dallas公司的串行實時鐘芯片DS1305工作原理,在參考文獻[2]有詳細的介紹,本文不再贅述。本文從C51的角度,來詳細介紹DS1305在我們所研制的無紙記錄儀上的實現(xiàn)。
1 C51的特點
C語言是一種編譯型程序設計語言,它兼顧了多種高級語言的特點,并具備匯編語言的功能。C語言有功能豐富的庫函數(shù),運算速度快,編譯效率高,有良好的可移植性而且可以直接實現(xiàn)對系統(tǒng)硬件的控制。
C語言是一種結構化程序設計語言,它支持由頂向下結構化程序設計技術。
C語言程序具有完善的模塊化程序結構,從而為軟件開發(fā)中采用模塊化程序設計方法提供了有力保障。因此,使用C語言進行程序設計來編寫目標系統(tǒng)軟件會大大縮短開發(fā)周期,增加軟件的可讀性,便于改進和擴充。
本系統(tǒng)采用Keil公司的C51編譯器,版本為V6.10a。
2 DS1305與AT89C55WD的連接圖
見圖1
說明:本系統(tǒng)SERMODE 腳與VCC相連,為MOTOROLA SPI 方式。INT0腳與AT89C55WD的INT0腳相連,對時鐘進行每秒中斷1次編程,CPU每秒對4個通道進行采樣。
3 DS1305引腳定義
根據C51 所提供的定義關鍵字SBIT,進行如下的定義:
SBIT clk_ce=P1^3; /*時鐘片選*/
SBIT sclk_bit=P2^4; /*時鐘脈沖輸入端*/
SBIT sdi_bit=P2^6; /*時鐘輸入引腳*/
SBIT sdu_bit=P2^7; /*時鐘輸出引腳*/
說明:P1^3 等價于匯編語言P1.3的用法,由C51頭文件REG51.H定義,形式如下:
#include
3 時鐘初始化
對DS1305的初始化主要有如下三個寫操作:
往控制寄存器寫0x05;
往狀態(tài)寄存器寫0x01;
往涓流充電寄存器寫0xa5;
對應的C51程序如下,該程序調用了子程序dswr(uchar ac)在其后說明:
initclock() /*時鐘初始化*/
{
sclk_bit=0;
dswr(0x8f);/* 往控制寄存器寫0x05*/
dswr(0x05);
dswr(0x90); /*往狀態(tài)寄存器寫0x01 */
dswr(0x01);
dswr(0x91); /*往涓流充電寄存器寫0xa5*/
dswr(0xa5);
}
函數(shù)dswr 中用到參數(shù)uchar 是在C51 主程序開始定義的無符號字符:
#define unsigned char uchar
有了上述定義,整個程序都可以這樣使用。
dswr(uchar ac) /*ACC中的數(shù)據從高位開始送入ds1305 */
{
uchar i;
clk_ce=1;
sdu_bit=1;
for (i=0;i<8;i++)
{
sdi_bit=(ac&0x80==0x80)?1:0;
sclk_bit=1;
sclk_bit=0;
ac=ac<<1;
}
}
4 時鐘的讀
uchar dsrd() /*讀時鐘*/
{
uchar i,j,ac=0,x;
clk_ce=1;
for (i=0;i<=7;i++)
{
sclk_bit=1;
j=2;
while (j--);
sclk_bit=0;
x=P2;
ac=(x&0x80)>>i|ac;/*高位在前,底位在后*/
}
return (ac);
clk_ce=0;
}
說明:因為DS1305為串行方式,每次輸出1位,且高位在前,故上述程序用了向右移位再與原值相或的技巧來實現(xiàn)。
5 時鐘的設置
clockset() /*時鐘設置*/
{
uchar i,j;
sclk_bit=0;
dswr(0x8f);/* 往控制寄存器寫0x05*/
dswr(0x05);
clk_ce=0;
sclk_bit=0;
for (i=0x80,j=0;i<=0x86;i++)
if(i!=0x83)
{
clk_ce=1;
dswr(i);/*address*/
dswr(y_m_d_h_m[5-j]);/*data*/
j++;
clk_ce=0;
}
clockwp();
}
函數(shù)中用到數(shù)組y_m_d_h_m存放的是即將寫入時鐘的年、月、日、時、分和秒的壓縮的BCD碼,在主程序中定義為
uchar y_m_d_h_m[6]={0x01,0x05,0x19,0x23,0x10,0x00};
一旦設置好,就必須調用時鐘寫保護來防止對時鐘的誤操作。
clockwp() /*時鐘寫保護*/
{
clk_ce=1;
dswr(0x8f);
dswr(0x45);
clk_ce=0;
}
6 時間的顯示
在我們所研制的無紙記錄儀,顯示采用液晶顯示器,因為液晶顯示器不同,則為液晶顯示器所寫的驅動程序也不一樣,在此不對液晶顯示器部分進行詳細說明,而僅對于我們所采用的技巧做一說明。
先定義兩個數(shù)組:
其一:
uchar clock[]={0x00,0x00,0x00,0x00,0x00,0x00};/*秒、分、時、日、月、年*/
該數(shù)組把從時鐘讀來壓縮BCD數(shù)據暫存于此。
其二:
從BCD碼轉換為非壓縮BCD碼。
uchar dispclock[]={0x12,0x10,0x10,0x11,0x0d,0x10,0x17,0x0d,0x11,0x10,0x00,0x11,0x12,0x1a,0x11,0x18,0x1a,0x11,0x18};
/*年、月、日、星期、時、分、秒*/
例子:2001-07-10 12:18:18
0x10...0x19,0x0d,0x1a分別是液晶顯示器內部CG-ROM字符0-9,- 和 :的壓縮BCD碼。
clockread() /* 讀時鐘數(shù)據送入clock數(shù)組*/
{
uchar i,ac,j,m=1;
for (i=0;i<7;i++)
{
dswr(i);
ac=dsrd() ;
switch (i)
{
case 0:
case 1:
case 2: clock[i]=ac ;break;
case 3: break;
default:clock[i-1]=ac;
}
clk_ce=0;
}
}
clockdisp() /*把時間顯示數(shù)組中的數(shù)據顯示*/
{
uchar j=DELAY;
uchar ac,i;
for (i=0;i<=5;i++) /* 把clock 數(shù)組中的BCD碼轉換成clockdisp的非壓縮BCD碼*/
{
ac=clock[i];
ac= ac>>4;
ac+=0x10;
dispclock[2+3*(5-i)]=ac;
ac=clock[i];
ac=ac & 0x0f;
ac+=0x10;
dispclock[2+3*(5-i)+1]=ac;
}
/*以下是對液晶進行操作*/
data_wri(0);
data_wri(0);
com_wri(0x24);
com_wri(0xb0);
for (i=0;i<19;i++)
{
wait3();
lcd_ce=0;
PLCD_DATA=dispclock[i];
while (j--);
lcd_ce=1;
j=DELAY;
}
lcd_ce=0;
com_wri(0xb2);
lcd_ce=1;
}
7 時鐘每秒中斷一次
clockalarm()
{
uchar set[]={0x87,0x81,0x88,0x81,0x89,0x80,0x8a,
0x80,0x8f,0x05,0x90,0x01,0x91,0xa5};
uchar i,j;
clk_ce=0;
sclk_bit=0;
i=0;
for (j=0;j<7;j++)
{
dswr(set[i++]);
dswr(set[i++]);
clk_ce=0;
i=2;
while (i--);
}
}
8 結論
我們用C51對DS1305進行編程,可讀性強,模塊化好,結構清晰,方便今后的系統(tǒng)維護,應用于我們開發(fā)的無紙記錄儀中,運行穩(wěn)定,效果良好。該系統(tǒng)已經通過福建省科技庁的鑒定。
參考文獻
[1] 馬忠梅等 單片機的C語言應用程序設計 北京航空航天大學出版社,2000年 修訂版
[2] 王潤田等 串行時鐘DS1305在野外自容式設備中的應用 電子技術1999年第11期
[3] DALLAS 公司DS1305 Serial Alarm Real Time Clock(RTC) Data Sheet 08/10/99
評論