安會(huì),蒲禹辰,李紀(jì)榕,馬紅靜,李莉,張靜
(石家莊郵電職業(yè)技術(shù)學(xué)院,河北石家莊,050020)
近年來,電子技術(shù)高速發(fā)展,由于單片機(jī)體積小價(jià)格低的特點(diǎn),被廣泛的應(yīng)用在家電、儀器儀表、玩具等產(chǎn)品中,成為現(xiàn)代智能化的工具,故基于單片機(jī)的多功能電子時(shí)鐘應(yīng)運(yùn)而生。電子鐘以精度高、運(yùn)行可靠等特點(diǎn),被應(yīng)用在社會(huì)各個(gè)領(lǐng)域,如商超、家庭、車站、銀行、寫字樓等。與此同時(shí),其特有的擴(kuò)展性,使得它可以根據(jù)需求來集成、整合其他功能,比如定時(shí)、光照度顯示、溫度顯示等。本文設(shè)計(jì)的電子時(shí)鐘采用IAR15W413AS 單片機(jī)作為控制器,采用數(shù)碼管作為顯示器,運(yùn)用獨(dú)立按鍵進(jìn)行時(shí)間調(diào)整和鬧鐘設(shè)定。相比傳統(tǒng)的電子時(shí)鐘,它的功能更加強(qiáng)大,并且具有體積小、攜帶方便、穩(wěn)定性高等優(yōu)勢(shì)。
本文設(shè)計(jì)的電子時(shí)鐘,硬件電路由單片機(jī)、時(shí)鐘、熱敏電阻測(cè)溫電路、光敏電阻測(cè)溫電路、數(shù)碼顯示電路、鬧鐘電路、鍵盤輸入、電源等部分組成。硬件原理圖如圖1 所示。時(shí)鐘芯片采用DS1302,具體硬件設(shè)計(jì)如下。
圖1
IAR15W413AS 的內(nèi)部集成了高精度的RC 振蕩電路和高可靠的復(fù)位電路,可以省略外部晶振和復(fù)位電路,芯片接通電源后就可以直接工作;單片機(jī)自帶ADC 轉(zhuǎn)換,可用來測(cè)溫和測(cè)量光照度;顯示部分就用簡(jiǎn)單的共陽數(shù)碼管驅(qū)動(dòng);要實(shí)現(xiàn)調(diào)整時(shí)間,所以還需要按鍵;要有鬧鐘就還需要有發(fā)聲元件,這里我們用簡(jiǎn)單的蜂鳴器;時(shí)鐘的來源我們用DS1302 時(shí)鐘芯片產(chǎn)生,測(cè)溫用的是熱敏電阻,最后還需要一個(gè)光敏電阻來采集光照度數(shù)據(jù)。
在完成原理圖后,開始設(shè)計(jì)PCB 板。首先要選擇元件封裝,LED 用3mm 的直插式封裝,單片機(jī)用 DIP28 封裝,DS1302 用DIP8 封裝。其他的如數(shù)碼管選的是0.56 寸的,電阻使用的是1/6W 的小尺寸電阻。選好封裝后開始繪制PCB,最終的電路板如圖2 所示。
圖2
為了在編程調(diào)試的時(shí)候,清楚地了解到程序的各個(gè)參數(shù)是否正確,我們先編寫顯示驅(qū)動(dòng),這樣可以最直觀的把想要知道的參數(shù)顯示出來。電路整個(gè)顯示部分可以看作是一個(gè)12×8 的點(diǎn)陣(LED 是8×8,數(shù)碼管是4×8)。那么顯示就只能是動(dòng)態(tài)掃描的方式來顯示。即一個(gè)時(shí)間只能顯示8個(gè)燈,或者數(shù)碼管只能顯示一個(gè)位。動(dòng)態(tài)掃描的重點(diǎn)是每組燈亮的時(shí)間必須是一樣的,否則每組燈的亮度會(huì)不同。為了讓每組燈亮的時(shí)間一樣,通常的做法是把切換顯示的程序放在定時(shí)中斷里。
程序的第一步是包含單片機(jī)的頭文件,頭文件里定義了單片機(jī)里的各種硬件資源。在寫程序前要先將IAR15 W413AS.h 添加到工程所在的目錄里。我們將主程序的文件名命名為main.c,在程序的第一行寫上#include“IAR15W413AS.h”雖然我們現(xiàn)在只是寫一個(gè)顯示程序,但以后我們要在這個(gè)程序的基礎(chǔ)上加上其他功能,為了方便以后的程序,我們要定義一個(gè)12 個(gè)字節(jié)的數(shù)組作為顯存(因?yàn)殡娐穲D是12×8 點(diǎn)陣),顯示程序只需要顯示數(shù)組里面的數(shù)據(jù)就可以了。然后又因?yàn)橛幸粋€(gè)四位數(shù)碼管,還要再加一個(gè)數(shù)碼管顯示數(shù)組。以上定義的代碼如下:
先初始化IO 口,因?yàn)檫@是共陽電路,所以點(diǎn)陣的公共端的IO 口要設(shè)為推挽輸出,在這個(gè)模式下IO 口輸出的最大電流有20MA,足夠點(diǎn)亮8 個(gè)LED。STC 的單片機(jī)IO 口還有準(zhǔn)雙向口模式,開漏輸出和高阻輸出模式,可以滿足各種應(yīng)用需求。
主函數(shù)就是單片機(jī)上電后開始工作的地方??紤]到剛上電時(shí)電源波動(dòng)比較大,所以還要再加一個(gè)比較長(zhǎng)的延時(shí)。此處的延時(shí)不要求很準(zhǔn)確,因此用軟件延時(shí)就可以了。軟件延時(shí)在 STC-ISP 里也可以自動(dòng)生成。在生成 1MS 的延時(shí)程序后,稍加改動(dòng)就可以成為一個(gè)帶參數(shù)的延時(shí)程序了,代碼如下:
按鍵部分的程序思路也是和顯示部分一樣的。先把按鍵掃描程序?qū)懗鰜?,然后再測(cè)試一下按鍵功能是否和設(shè)計(jì)的一樣就可以了。首先我們新建一個(gè)工程,把main.c 和包含的頭文件復(fù)制過來添加到工程里。首先在初始化函數(shù)void init_IO(void)里把 P3 數(shù)據(jù)出改為 P3=0x23;因?yàn)榘存I是低電平有效,所以要把按鍵口拉高。注意這兩個(gè)按鍵口不能設(shè)為推挽輸出,否則會(huì)造成電路短路。先完成按鍵掃描函數(shù):
此掃按鍵掃描程序用到了三個(gè)新的全局變量,一個(gè)是用來計(jì)算按鍵去抖時(shí)間的 key_db,一個(gè)是用來保存鍵值的 key_cval,一個(gè)是用來保存上一次按鍵口的值的 key_temp。因此要在前面定義一下這三個(gè)變量。當(dāng)然,在中斷函數(shù)中要加上一句:
現(xiàn)在按鍵掃描已經(jīng)做好了,那怎么驗(yàn)證這個(gè)思路正不正確呢。之前的顯示部分已經(jīng)做了一個(gè)流水燈程序,但數(shù)碼管是隨意顯示的,我們現(xiàn)在就加一個(gè)測(cè)試代碼,按下 PLUS 鍵數(shù)碼管的顯示就加 1,按 MODE 就減 1。
首先我們先定義一個(gè)整型的顯示變量,就叫 shumaguan Disp 。然后在 void liushuidengTest(void)函數(shù)中數(shù)碼管賦值的那四條語句改為:
然后在主函數(shù)中調(diào)用這兩個(gè)函數(shù),編譯成功后就可以下載到時(shí)鐘板上驗(yàn)證了。到此我們的按鍵程序也完成了。
完成了顯示和按鍵后,現(xiàn)在就可以寫DS1302 的程序了。首先新建一個(gè)工程,把上一章的源程序復(fù)制過來。DS1302的通信協(xié)議可以參考DS1302 的技術(shù)文檔,是比較簡(jiǎn)單的同步串行通信。DS1302 的底層驅(qū)動(dòng)就不再贅述,直接把DS1302.c 和 DS1302.h 這兩個(gè)文件復(fù)制到本章的工程中。然后把 DS1302.c 添加到工程中。然后在 main.c 的前面包含 1302 的頭文件 #include “DS1302.h”。這個(gè)頭文件里定義有四個(gè)函數(shù)。
我們?cè)趯懗绦虻臅r(shí)候只需要調(diào)用這四個(gè)函數(shù)就可以完成DS1302 的讀寫了。那么這四個(gè)函數(shù)各有什么功能呢?先來看 WriteTime 這個(gè)函數(shù)的定義。
這是一個(gè)寫時(shí)間的函數(shù)。由于1302 的時(shí)間存儲(chǔ)是10進(jìn)制的方式,而我們的程序是用16 進(jìn)制的方式,所以在寫進(jìn)去時(shí)要進(jìn)行轉(zhuǎn)換,(tim/10)<<4)|(tim%10)就是16 進(jìn)制轉(zhuǎn)10 進(jìn)制的操作。ReadTime 是讀取1302 時(shí)間的函數(shù),同樣,讀出時(shí)間后要轉(zhuǎn)成16 進(jìn)制再給其他程序使用。
unsigned char ReadTime(unsigned char add)// 從1302 讀時(shí)間值
編譯后下載到單片機(jī)里,看是否和我們想的一樣。完成了這個(gè)小測(cè)試程序后,我們時(shí)鐘基本模塊已經(jīng)全部調(diào)試完。
電阻選擇時(shí),首先考慮采用最常用的1/4W 的電阻,但是由于電路板比較小,如果采用常用電阻,電阻板就會(huì)顯得很擁擠,影響美觀。最終考慮采用1/6W 的小尺寸電阻,而并非選擇常用的1/4W 的電阻,看起來會(huì)整潔很多。
單片機(jī)選擇時(shí),首先考慮用AT89S52 或者STC89C52,但是這兩款單片機(jī)太大了,有些元件可能需要使用貼片才能放得進(jìn)板,這帶來了一系列問題,因?yàn)橘N片比較小,學(xué)生作為初學(xué)者對(duì)貼片不熟悉,所以導(dǎo)至焊接成功率不高。經(jīng)過考慮,最終單片機(jī)選擇了IAR15W413AS,較之前的AT89S52或者 STC89C52,有了很多的優(yōu)點(diǎn):
(1)體積小,可以在電路板上多放一些其他元件。(2)有內(nèi)部時(shí)鐘信號(hào),可以省去外部晶振,可以減少一些元件。(3)內(nèi)部集成了復(fù)位電路,也可以減少一些元件。(4)引腳輸出最大電流可達(dá)20MA,足以驅(qū)動(dòng)一個(gè) LED,因此不需外接三極管來驅(qū)動(dòng),這省了很多的外圍元件。(5)內(nèi)部集成有ADC,這可以直接讀取熱敏電阻和光敏電阻的阻值變化,從而實(shí)現(xiàn)讀取環(huán)境溫度和測(cè)量光照度的功能。(6)內(nèi)部 FLASH 有8K,足夠?qū)懸粋€(gè)很多功能的電子鐘程序了。