工程師電子制作故事:實(shí)戰(zhàn)單片機(jī)電子鐘
購(gòu)齊所有元器件,焊接好電路板,最終焊接完成的電子鐘實(shí)物如圖10所示。
到這里就可以進(jìn)入編程調(diào)試階段了,這個(gè)時(shí)鐘程序的編寫(xiě)主要包括以下4個(gè)主要部分:
1.PS/2鍵盤(pán)通信
PS/2接口6只引腳中4只引腳是有效的,兩只用于供電,只有2只引腳可以用來(lái)傳輸數(shù)據(jù)。PS/2通信協(xié)議是一種雙向同步串行通信協(xié)議。通信的兩端通過(guò)Clock(時(shí)鐘腳)同步,并通過(guò)Data(數(shù)據(jù)腳)交換數(shù)據(jù)。任何一方如果想抑制另外一方通信時(shí),只需要把Clock(時(shí)鐘腳)拉到低電平。每一數(shù)據(jù)幀包含11~12個(gè)位,具體含義如表1所列。更多的PS/2說(shuō)明可以參考網(wǎng)上的應(yīng)用介紹。
表1 PS/2數(shù)據(jù)幀格式說(shuō)明
1個(gè)起始位 總是邏輯0
8個(gè)數(shù)據(jù)位 低位在前
1個(gè)奇偶校驗(yàn)位 奇校驗(yàn)
1個(gè)停止位 總是邏輯1
1個(gè)應(yīng)答位 僅用在主機(jī)對(duì)設(shè)備的通信中
表2 DS12C887時(shí)鐘控制寄存器功能說(shuō)明
地址 功能說(shuō)明
7F00H 秒存儲(chǔ)單元
7F01H 秒鬧鐘存儲(chǔ)單元
7F02H 分存儲(chǔ)單元
7F03H 分鬧鐘存儲(chǔ)單元
7F04H 時(shí)存儲(chǔ)單元
7F05H 時(shí)鬧鐘存儲(chǔ)單元
7F06H 星期存儲(chǔ)單元
7F07H 日期存儲(chǔ)單元
7F08H 月份存儲(chǔ)單元
7F09H 年份存儲(chǔ)單元
7F0AH 控制芯片是否立即進(jìn)行更新、晶振是否起振、可編程方波參數(shù)設(shè)置
7F0BH 各個(gè)位用于控制芯片更新是否禁止、周期/鬧鐘/更新結(jié)束3種中斷允許設(shè)置、可編 程方波輸出、數(shù)據(jù)存取格式(二進(jìn)制/BCD)、時(shí)制設(shè)置、夏令時(shí)允許標(biāo)志。
7F0CH 該寄存器只讀,低4位無(wú)用,高4位由高到低分別是中斷請(qǐng)求標(biāo)志位、周期中斷標(biāo)志、鬧鐘中斷標(biāo)志、更新結(jié)束中斷標(biāo)志。
7F0DH 該寄存器只讀,低7位無(wú)用,最高位VRT如為0表示內(nèi)置電池能量耗盡
PS/2接口與單片機(jī)的連接如原理圖7所示,由于PS/2鍵盤(pán)要向單片機(jī)發(fā)送數(shù)據(jù)時(shí),總是先將第5腳時(shí)鐘線拉低,這樣就可以將PS/2接口的第5腳與單片機(jī)的外中斷輸入引腳相連,一旦PS/2要向單片機(jī)發(fā)送數(shù)據(jù),單片機(jī)就可以以外中斷的方式優(yōu)先響應(yīng)PS/2鍵盤(pán)的輸入請(qǐng)求,開(kāi)始接收數(shù)據(jù),接收完畢后,PS/2鍵盤(pán)將時(shí)鐘線恢復(fù)為高電平。
由表1可知,單片機(jī)以外中斷方式接收PS/2鍵盤(pán)數(shù)據(jù)時(shí),每接收一幀數(shù)據(jù)就要中斷11次,接收完成后,只要對(duì)其中8位有效數(shù)據(jù)進(jìn)行比較或查表,就可以知道哪個(gè)按鍵被按下。例如把小鍵盤(pán)區(qū)的數(shù)字鍵通碼進(jìn)行排序制表,根據(jù)查表的次數(shù)就可知道是哪個(gè)數(shù)字按鍵被按下。這就是PS/2鍵盤(pán)編程的思路。單片機(jī)成功接收了PS/2鍵盤(pán)數(shù)據(jù)確定是哪個(gè)按鍵后,就可轉(zhuǎn)到相應(yīng)的程序段執(zhí)行指定的功能,如設(shè)定時(shí)間,設(shè)定亮度、設(shè)定鬧鈴等。
2.DS12C887的設(shè)置和讀寫(xiě)
DS12C887內(nèi)部共有128個(gè)寄存器,前14個(gè)為時(shí)鐘控制寄存器,剩下114個(gè)供編程者自由使用。14個(gè)時(shí)鐘控制寄存器中的前10個(gè)用于存儲(chǔ)時(shí)鐘參數(shù),后4個(gè)用于控制DS12C887的各功能組件工作狀態(tài)。在DS12C887的第13腳片選端(CS)與P2.7相連接情況下,14個(gè)時(shí)鐘控制寄存器地址及具體功能說(shuō)明如表2所示。
在本文所示電路連接情況下,DS12C887就相當(dāng)于是單片機(jī)的一個(gè)外部并行擴(kuò)展RAM,數(shù)據(jù)讀寫(xiě)采用MOVX指令直接一次性讀出或?qū)懭?,很是方便。在程序初始根?jù)要求對(duì)相關(guān)功能寄存器進(jìn)行設(shè)定,然后在每次循環(huán)當(dāng)中讀出當(dāng)前各時(shí)間寄存器的數(shù)據(jù),經(jīng)單片機(jī)處理后分別送到兩片MAX7219的指定位置顯示即可,具體可參考源程序。
3.MAX7219的初始化和數(shù)據(jù)寫(xiě)入
MAX7219是一款專用數(shù)碼管驅(qū)動(dòng)芯片,內(nèi)部設(shè)有動(dòng)態(tài)掃描電路,它以串行通信方式接收到單片機(jī)的顯示數(shù)據(jù)后,對(duì)指定位置的數(shù)碼管顯示內(nèi)容進(jìn)行更新,為單片機(jī)節(jié)省了寶貴的軟、硬件資源。MAX7219的一個(gè)顯著特點(diǎn)是可以通過(guò)設(shè)定亮度控制寄存器的數(shù)值來(lái)控制所接數(shù)碼管的顯示亮度。MAX7219內(nèi)部有14個(gè)寄存器,用于控制數(shù)碼管顯示的內(nèi)容和狀態(tài),各寄存器功能列表如表3所示。
表3 MAX7219寄存器功能說(shuō)明
編號(hào) 功能說(shuō)明
0 空操作地址
1?8 第1?8個(gè)數(shù)碼管顯示地址
9 譯碼方式控制寄存器,為0FFH表示使用內(nèi)部BCD譯碼器,為00H表示不使用
A 亮度調(diào)節(jié)控制寄存器,分16級(jí),參數(shù)范圍:00H—0FH
B 掃描位數(shù)控制寄存器,根據(jù)所接數(shù)碼管數(shù)量確定,參數(shù)范圍:00H—07H (1只—8只)
C 顯示開(kāi)關(guān)控制寄存器,為1所有數(shù)碼正常顯示,為0關(guān)閉所有數(shù)碼管
D 顯示器檢測(cè)控制寄存器,為1所接數(shù)碼管的各段全部點(diǎn)亮,用于檢測(cè)是否有損壞,再送入0,恢復(fù)正常顯示內(nèi)容
MAX7219的初始化就是對(duì)后5個(gè)寄存器進(jìn)行設(shè)置,由于檢測(cè)只需在電路板焊接好進(jìn)行一次就可以,所以程序初始主要是寫(xiě)入譯碼方式、顯示亮度、掃描位數(shù)、顯示開(kāi)關(guān)4個(gè)控制寄存器相應(yīng)數(shù)值。到這里就可以發(fā)現(xiàn)通過(guò)PS/2鍵盤(pán)設(shè)定數(shù)碼管顯示亮度,就是識(shí)別按鍵后對(duì)MAX7219的亮度控制寄存器重新寫(xiě)入新數(shù)值。
MAX7219每個(gè)寄存器的寫(xiě)入分兩步,第一步先寫(xiě)入寄存器地址;第二步再寫(xiě)入寄存器數(shù)據(jù),具體的寫(xiě)入語(yǔ)句見(jiàn)源程序。這里簡(jiǎn)要介紹一下MAX7219級(jí)聯(lián)狀態(tài)下數(shù)據(jù)寫(xiě)入思路,這個(gè)電路板上用到兩片MAX7219(U5、U6),由原理圖7可見(jiàn)U6的輸入端(DIN)接到U5的輸出端(DOUT),這樣就稱U6為后級(jí),U5為前級(jí),寫(xiě)入子程序段執(zhí)行一次就把地址和數(shù)據(jù)先送到后級(jí)的U6,再執(zhí)行一次才送到U5,以此類推,如果3片MAX7219級(jí)聯(lián),寫(xiě)入子程序就要執(zhí)行三次才能分別將數(shù)據(jù)送到相應(yīng)的MAX7219。
4.DS18B20數(shù)據(jù)讀取和處理
DS18B20內(nèi)部結(jié)構(gòu)和工作原理就不介紹了。單片機(jī)對(duì)讀取到的溫度數(shù)據(jù)進(jìn)行適當(dāng)處理,就是將讀出的二進(jìn)制數(shù)據(jù)轉(zhuǎn)換成BCD碼,再將轉(zhuǎn)換到的BCD碼高低位分離,送到MAX7219的相應(yīng)位置顯示即可。
編好的程序?qū)懭雴纹瑱C(jī),一個(gè)原汁原味的單片機(jī)電子鐘就制作好了,夜間的運(yùn)行效果如圖12所示。
制作調(diào)試問(wèn)題匯總
1.試驗(yàn)板搭接是必須的,否則無(wú)法確定原理線路正確性。
2.DS12C887有一個(gè)上電穩(wěn)定時(shí)間,在程序初始進(jìn)行幾十毫秒的延時(shí)即可,否則會(huì)讀出不正確的數(shù)據(jù),因?yàn)檫@個(gè)問(wèn)題編程時(shí)多花了2天時(shí)間。PS/2鍵盤(pán)設(shè)定好亮度后,將亮度參數(shù)保存到DS12C887的7F0EH單元,重新上電后應(yīng)能讀出上次設(shè)定的亮度參數(shù),但每次讀出的均為0,百思不解,上網(wǎng)搜索也無(wú)結(jié)果,反復(fù)試驗(yàn)思考,終于發(fā)現(xiàn)DS12C887的用戶RAM區(qū)上電需要一個(gè)穩(wěn)定時(shí)間,否則讀出的數(shù)據(jù)始終是0。
3.MAX7219對(duì)供電電壓穩(wěn)定性要求較高,大小兩個(gè)濾波電容要緊靠芯片布置,參數(shù)設(shè)置要恰當(dāng)。在試驗(yàn)板搭接階段經(jīng)常發(fā)現(xiàn)MAX7219顯示會(huì)錯(cuò)亂,查找各類網(wǎng)頁(yè)資料,就是要設(shè)置濾波電容,但試驗(yàn)板上沒(méi)有緊靠芯片設(shè)置,而且采用的是飛線,一直到制成PCB后這個(gè)問(wèn)題才得到解決。
4.MAX7219的質(zhì)量問(wèn)題。網(wǎng)購(gòu)是現(xiàn)在電子元件獲取的主要途徑,但發(fā)現(xiàn)特便宜的MAX7219質(zhì)量無(wú)法保證,所以大家網(wǎng)購(gòu)電子元件時(shí),要注意這個(gè)問(wèn)題。
5.網(wǎng)上的參考資料要多對(duì)比,才能確定其正確性。
待改進(jìn)之處
1.可在板上合適的位置增加幾個(gè)獨(dú)立按鍵,日常使用調(diào)節(jié)更方便些;
2.顯示內(nèi)容可增加農(nóng)歷和濕度;
3.可以用光敏電阻配合串行A/D轉(zhuǎn)換芯片(如TLC549)實(shí)現(xiàn)顯示亮度的自動(dòng)調(diào)節(jié),以適應(yīng)環(huán)境光線的變化,這樣子就更加具有專業(yè)性了。
程序或硬件電路,讀者可結(jié)合自己的想法,做出更加合理的改動(dòng)。
51單片機(jī)相關(guān)文章:51單片機(jī)教程
評(píng)論