韓劉宇
(天津工業(yè)大學(xué) 電子與信息工程學(xué)院通信工程專業(yè) 300384)
基本設(shè)計(jì)要求
(1)單片機(jī)控制日歷時(shí)鐘芯片實(shí)現(xiàn)年份、月份、日期、星期、時(shí)間信息的獲取。
(2)在LCD上對(duì)年份、月份、日期、星期、時(shí)間信息進(jìn)行顯示。
(3)可以對(duì)年份、月份、日期、星期、時(shí)間進(jìn)行修改。
(4)具有掉電后時(shí)間信息不丟失的功能。
發(fā)揮部分
(1)具有鬧鐘功能。可設(shè)置鬧鈴時(shí)間,當(dāng)鬧鈴時(shí)間到時(shí),進(jìn)行鬧鈴。通過(guò)按鍵可解除鬧鈴。
(2)具有整點(diǎn)報(bào)時(shí)功能。
(3)程序固化到單片機(jī)中,并且可直接進(jìn)行程序下載和更新。
本電子鐘由單片機(jī)、定時(shí)、顯示、按鍵、定時(shí)提醒、ISP在線編程6部分組成。產(chǎn)品以AT89S52單片機(jī)、DS12C887時(shí)鐘芯片為核心,顯示部分采用LCD1602,使用4個(gè)按鍵和1蜂鳴器,加上ISP在線編程模塊。DS12C887時(shí)鐘芯片產(chǎn)生時(shí)鐘信號(hào)和存放鬧鈴數(shù)據(jù),其精度和可靠性高,在單片機(jī)掉電狀態(tài)下能正確走時(shí)、保存鬧鈴數(shù)據(jù)長(zhǎng)達(dá)10年,故能實(shí)現(xiàn)停電重起后定時(shí)設(shè)計(jì)不變的關(guān)鍵設(shè)計(jì)指標(biāo)。AT89S52單片機(jī)實(shí)時(shí)獲取DS12C887的時(shí)間和鬧鈴數(shù)據(jù),驅(qū)動(dòng)LCD和蜂鳴器。顯示部分的LCD有高亮度,低成本等諸多優(yōu)點(diǎn)。蜂鳴器作鬧鈴提示切合實(shí)際、直觀。按鍵方面采用軟件消抖,減少硬件電路的同時(shí)增加了可靠性。本產(chǎn)品完全達(dá)到設(shè)計(jì)要求,輔助的ISP在線編程讓產(chǎn)品具有強(qiáng)大的擴(kuò)展功能,使其不僅僅是一個(gè)電子鐘,更是一個(gè)單片機(jī)試驗(yàn)平臺(tái)。
DS12C887時(shí)鐘芯片能夠產(chǎn)生世紀(jì)、年、月、日、時(shí)、分、秒等信息,同時(shí) DS12C887時(shí)鐘芯片中自帶有鋰電池,外部掉電時(shí),通過(guò)鋰電池的作用其內(nèi)部時(shí)間信息還能夠保持相當(dāng)長(zhǎng)的時(shí)間;時(shí)間記錄分為十二小時(shí)制和二十四小時(shí)制兩種方式。在十二小時(shí)制模式中,AM和PM用來(lái)分別表示上午和下午;時(shí)間的表示方法也有兩種,利用二進(jìn)制數(shù)表示或利用BCD碼表示;DS12C887時(shí)鐘芯片帶有 128字節(jié)的 RAM,其中有113字節(jié)通用 RAM用來(lái)給用戶使用,11字節(jié)的RAM是用來(lái)存儲(chǔ)時(shí)間信息的,4字節(jié) RAM是用來(lái)存儲(chǔ) DS12C887的控制信息的,被我們稱之為控制寄存器。
3.2.1 主要特性
單片機(jī)AT89S52是ATMEL公司生產(chǎn)的低電壓、高性能COMS 8位單片機(jī),它有128Byte RAM、8KByte可編程FLASH ROM,指令系統(tǒng)與MCS-51系列兼容。采用KEILC51編譯軟件,PROTUES仿真平臺(tái),能方便實(shí)現(xiàn)程序的仿真。ISP在線編程,能方便的更新程序??蓪?duì)選用的單片機(jī)特點(diǎn)進(jìn)行描述,可畫(huà)出單片機(jī)最小系統(tǒng)并描述電路連接。
3.2.2 單片機(jī)引腳說(shuō)明
AT89S52是采用40個(gè)引腳封裝的雙列直接 DIP結(jié)構(gòu),40個(gè)引腳中,外置石英振蕩器的時(shí)鐘線有兩根,正電源和地線有兩根,還有32個(gè) I/O口,中斷口線與P3口線是復(fù)用的。我們對(duì)引腳的功能加以說(shuō)明:
·Pin20:是接地腳。
·Pin40:是正電源腳,接+5V電源,用來(lái)正常工作或?qū)ζ瑑?nèi)EPROM燒寫(xiě)程序時(shí)。
·Pin19:是時(shí)鐘XTAL1腳,為片內(nèi)振蕩電路輸入端。
·Pin18:是時(shí)鐘XTAL2腳,為片內(nèi)振蕩電路輸出端。時(shí)鐘有兩種方式,方式一為片內(nèi)時(shí)鐘振蕩方式,但需在18和19兩個(gè)引腳外接石英晶體和振蕩電容。方式二為外部時(shí)鐘方式,即將XTAL1接地,將外部時(shí)鐘的信號(hào)從XTAL2腳輸入。
·輸入輸出 (I/O)Pin32-Pin39引腳是 P0.0-P0.7的輸入輸出腳,Pin1-Pin8引腳是 P1.0-P1.7的輸入輸出腳,Pin21-Pin28引腳為 P2.0-P2.7輸入輸出腳,Pin10-Pin17引腳為P3.0-P3.7輸入輸出腳,上述的輸入輸出腳的功能是:
P3口(10腳~17腳):為8位準(zhǔn)雙向 I/O口,由于高阻狀態(tài)不能在這種接口輸出中產(chǎn)生,輸入也不能鎖存,故不是真正的雙向 I/O口。 P3口能驅(qū)動(dòng) (吸收或輸出電流)4個(gè)TTL負(fù)載。P除了作為一般的準(zhǔn)雙向通用I/O口使用外,p3口每個(gè)引腳還有第二功能。P3口的八條線都被我們定義有第二功能[6],如表4.1所列。
P2口(21腳~28腳):為8位準(zhǔn)雙向 I/O口。當(dāng)我們?cè)L問(wèn)外部存儲(chǔ)器時(shí),它可以被我們作為高8位地址總線 送出高8位地址。P2可以驅(qū)動(dòng)(吸收或輸出電流)4個(gè)TTL的負(fù)載。
P1口(1腳~8腳):為 8位準(zhǔn)雙向 I/O口。P1口能驅(qū)動(dòng)4個(gè)TTL負(fù)載。
P0口(32腳~39腳):不同于其他的三個(gè)端口,它為雙向8位三態(tài)I/O口,外接存儲(chǔ)器與地址總線的低八位及數(shù)據(jù)的總線進(jìn)行復(fù)用,8個(gè)TTL負(fù)載能以吸收電流的方式被驅(qū)動(dòng)。
P3引腳第二功能:3.0 RXD(串行口的輸入端)
3.1 TXD(串行口的輸出端)
3.2 INT0(外部中斷0請(qǐng)求輸入端,低電平的時(shí)候有效)
3.3 INT1(外部中斷0請(qǐng)求輸入端,低電平的時(shí)候有效)
3.4 T0(定時(shí)器/計(jì)數(shù)器0的技數(shù)脈沖輸入端)
3.5 T1(定時(shí)器/計(jì)數(shù)器0的技數(shù)脈沖輸入端)
3.6 WR(片外數(shù)據(jù)存儲(chǔ)器寫(xiě)選通信號(hào)輸出端,低電平的時(shí)候有效)
3.7 RD(片外數(shù)據(jù)存儲(chǔ)器寫(xiě)選通信號(hào)輸出端,低電平的時(shí)候有效)
·Pin9:RESET/Vpd為復(fù)位信號(hào)復(fù)用腳,單片機(jī)通電時(shí),時(shí)鐘電路就開(kāi)始工作,在RESET引腳上產(chǎn)生24個(gè)時(shí)鐘周期以上的高電平,則系統(tǒng)即會(huì)初始復(fù)位。初始化后,程序計(jì)數(shù)器 PC會(huì)指向 0000H,P0-P3輸出口都為高電平時(shí),則堆棧指鐘就會(huì)寫(xiě)入 07H,而其它專用的寄存器被清“0”。當(dāng)RESET從高電平下降為低電平后,系統(tǒng)就會(huì)從 0000H開(kāi)始執(zhí)行程序。然而,初始復(fù)位并不使RAM(包括工作寄存器R0-R7)的狀態(tài)發(fā)生變化,當(dāng)單片機(jī)復(fù)位后它的狀態(tài)為:
·P0~P3=FFH,各口可用于輸出,也可用于輸入;
·SP=07H,第一個(gè)入棧內(nèi)容將寫(xiě)入08H單元;
·IP、IE和 PCON的有效位為 0,各中斷源處于低優(yōu)先級(jí)且均被關(guān)斷,串行通訊的波特率不加倍;
·PSW=00H,當(dāng)前工作寄存器為0組。
·Pin30:ALE/PROG是訪問(wèn)外部程序器時(shí),ALE輸出的用來(lái)鎖存地址的低位字節(jié)。當(dāng)訪問(wèn)內(nèi)部程序存儲(chǔ)器的時(shí)候,ALE端將會(huì)有個(gè) 以1/6時(shí)鐘頻率為周期的正脈沖信號(hào),此信號(hào)是用于識(shí)別單片機(jī)工作與否的,我們也可以把它當(dāng)作一個(gè)時(shí)鐘向外輸出。還有一個(gè)特點(diǎn)就是,當(dāng)我們?cè)L問(wèn)外部程序存儲(chǔ)器,ALE會(huì)自動(dòng)跳過(guò)一 個(gè)脈沖。而如果單片機(jī)是EPROM的話 ,在其編程的時(shí)候,PROG會(huì)用于輸入編程的脈沖。
·Pin29:PESN是訪問(wèn)外部程序存儲(chǔ)器時(shí),輸出負(fù)脈沖選通信號(hào)的引腳,PC其16位的地址數(shù)據(jù)會(huì)出現(xiàn)在P0和P2中,外部程序存儲(chǔ)器會(huì)把其指令數(shù)據(jù)放到P0口的上面,而CPU負(fù)責(zé)讀入執(zhí)行。
·Pin31:EA/Vpp是程序存儲(chǔ)器內(nèi)外部選通線,8051和8751單片機(jī)中,其內(nèi)部有 4kB的程序存儲(chǔ)器,當(dāng)EA是高電平而且程序地址不大于4kB時(shí),讀取的就是內(nèi)部程序存儲(chǔ)器的指令數(shù)據(jù),而超過(guò)4kB地址則讀取的就是外部指令的數(shù)據(jù)。但是如果EA是低電平,不管地址的大小,都是讀取外部程序存儲(chǔ)器的指令。顯而易見(jiàn),對(duì)于內(nèi)部沒(méi)有程序存儲(chǔ)器 8031,EA端就必須要接地。
?
振蕩器是數(shù)字鐘的核心。振蕩器的穩(wěn)定度及頻率的精確度決定了數(shù)字鐘計(jì)時(shí)的準(zhǔn)確程度,通常選用石英晶體構(gòu)成振蕩器電路。石英晶體振蕩器的作用是產(chǎn)生時(shí)間標(biāo)準(zhǔn)信號(hào)。
本電路采用1602LCD,由于數(shù)碼管只能顯示數(shù)字?jǐn)?shù)碼管顯示內(nèi)容單一,液晶則比較豐富,而這個(gè)實(shí)驗(yàn)中,要求功能較多,為了使電路顯示的更清晰明了,本實(shí)驗(yàn)最終決定采用1602LCD 顯示。且液晶顯示已占居社會(huì)主流,優(yōu)勢(shì)明顯。
鑒于使用中斷電路會(huì)增加硬件電路的復(fù)雜度,本電路采用獨(dú)立按鍵的方法,只需在程序中加入掃描程序即可。其中P1.4接按鍵1,P1.5接按鍵2,P1.6接按鍵3,P1.7接按鍵4。其中按鍵1為選擇鍵,通過(guò)按鍵1可以將光標(biāo)移動(dòng)到要調(diào)節(jié)的選項(xiàng);按鍵2為加鍵,通過(guò)按鍵2可以調(diào)整時(shí)間和鬧鐘的各項(xiàng)數(shù)值加一;按鍵3為減鍵,通過(guò)按鍵3可以調(diào)整時(shí)間和鬧鐘的各項(xiàng)數(shù)值減一;按鍵4為鬧鐘,通過(guò)按鍵4可以調(diào)節(jié)鬧鐘。
void main()//主函數(shù)
{
init();//調(diào)用初始化函數(shù)
while(1)
{
keyscan();//按鍵掃描
if(flag_ri==1)//當(dāng)鬧鐘中斷時(shí)進(jìn)入這里
{
di();
delay(100);
di();
delay(500);
}
if(flag==0&&flag1==0)//正常工作時(shí)進(jìn)入這里
{
keyscan();//按鍵掃描
year=read_ds(9);//讀取12C887數(shù)據(jù)
month=read_ds(8);
day=read_ds(7);
//week=read_ds(6);
shi=read_ds(4);
fen=read_ds(2);
miao=read_ds(0);
if(fen/10==0&&fen%10==0&&miao/10==0&&miao%10==0)di();
week=GetWeekFromDay(year,month,day);
write_sfm(10,miao);//送液晶顯示
write_sfm(7,fen);
write_sfm(4,shi);
write_week(week);
write_nyr(3,year);
write_nyr(6,month);
write_nyr(9,day);
}
}
}
本數(shù)字時(shí)鐘采用ISP下載線進(jìn)行下載和供電。首先將程序下載到AT89S52芯片中。打開(kāi)開(kāi)關(guān)將看到開(kāi)機(jī)初始畫(huà)面,左側(cè)四個(gè)按鍵依次設(shè)為 K1、K2、K3、K4,按K1鍵,將會(huì)看到光標(biāo)依次挪動(dòng)到秒、分、時(shí)、日、月、年,當(dāng)光標(biāo)移動(dòng)到某個(gè)選項(xiàng),例如“分”選項(xiàng):按下K2,該項(xiàng)數(shù)值則加一,按下K3,該項(xiàng)數(shù)值則減一;若調(diào)節(jié)年月日選項(xiàng)時(shí),調(diào)節(jié)完畢后會(huì)自動(dòng)計(jì)算出該日為星期幾,并且顯示在LCD屏幕上。當(dāng)時(shí)鐘處于正常運(yùn)行狀態(tài)時(shí),按下K4鍵,界面將轉(zhuǎn)到鬧鈴調(diào)節(jié)界面,此時(shí)按照時(shí)鐘的調(diào)節(jié)方法,設(shè)定鬧鈴。每當(dāng)有按鍵按下時(shí),蜂鳴器將會(huì)伴隨響聲,當(dāng)時(shí)中達(dá)到整點(diǎn)時(shí),蜂鳴器也將會(huì)有提示音(整點(diǎn)報(bào)時(shí)功能),當(dāng)時(shí)鐘的時(shí)間到達(dá)設(shè)定的鬧鈴時(shí)間,蜂鳴器將會(huì)發(fā)出連續(xù)的鳴叫聲,直至按下任意鍵來(lái)解除此鬧鈴。實(shí)物效果圖:
整體電路圖:
[1] 倪云峰.單片機(jī)原理與應(yīng)用【M】.西安:西安電子科技大學(xué)出版社,2009.
[2] 梁潔婷.單片機(jī)原理與應(yīng)用【M】.北京:高等教育出版社,2002.
[3] 林國(guó)清,李見(jiàn)為,王崇文.一種新型日歷時(shí)鐘芯片[J].國(guó)外電子元器件,2002(3):61-62.