肖海玲
(廣州科技職業(yè)技術(shù)大學(xué) 廣東省廣州市 510550)
綜合應(yīng)用在8位數(shù)碼管的萬年鐘系統(tǒng)設(shè)計(jì),完成可調(diào)式的時(shí)分秒、年月日和鬧鐘等功能設(shè)計(jì)。該系統(tǒng)主要由4個(gè)模塊組成:單片機(jī)控制芯片、外部晶振、外部按鍵、鬧鐘、8位數(shù)碼管等。
硬件設(shè)計(jì)過程中,采用74HC595級聯(lián)的方式設(shè)計(jì)單片機(jī)電子時(shí)鐘電路,系統(tǒng)使用過程中,采用AT89C52單片控制器外接的方式,其中時(shí)間、日期、鬧鐘由3個(gè)按鍵來實(shí)現(xiàn),滿足單片機(jī)的時(shí)鐘與復(fù)位電路的設(shè)計(jì)。如圖1所示。
從電路圖分析得知,8位數(shù)碼管如果按照動(dòng)態(tài)掃描的方法接線,需要提供8個(gè)位選口和8個(gè)段碼口,直接占用單片機(jī)16個(gè)IO口,占用了單片機(jī)太多的IO口資源了。為了解決這個(gè)問題,利用74HC595的目的就是減少I/O口的使用數(shù)量,直接利用74HC595的3個(gè)數(shù)字I/O口連接單片機(jī)就足以控制8個(gè)數(shù)碼管。
硬件設(shè)計(jì)是關(guān)鍵,也是軟件設(shè)計(jì)的基礎(chǔ)。單片機(jī)向74HC595發(fā)送一個(gè)字節(jié)數(shù)據(jù),數(shù)據(jù)是通過DS串行數(shù)據(jù)輸入端進(jìn)入74HC595,在SHCP產(chǎn)生一個(gè)上升沿作用下,將DS上的數(shù)據(jù)從高到低按位移入74HC595中,需要SHCP產(chǎn)生8次上升沿;當(dāng)移位結(jié)束后,就會全部進(jìn)入到移位寄存器,最后在STCP的一個(gè)上升沿作用下,移位寄存器里的數(shù)據(jù)送入到輸出鎖存器并進(jìn)行Q0—Q7引腳并行輸出[1]。

圖1:74HC595級聯(lián)在單片機(jī)電子時(shí)鐘拓展IO口設(shè)計(jì)應(yīng)用的整體結(jié)構(gòu)圖

圖2:74HC595芯片運(yùn)行的流程圖

圖3:數(shù)碼管設(shè)計(jì)的可調(diào)式電子鐘
利用74HC595在運(yùn)行IO拓展應(yīng)用中,實(shí)際只占用到單片機(jī)的IO口,這樣設(shè)計(jì)的思路也可運(yùn)用到其他嵌入式的控制芯片領(lǐng)域,可大大減少單片機(jī)IO口占用資源的問題。如果需要完成更多引腳的功能實(shí)現(xiàn),需級聯(lián)接入多個(gè)74HC595,本文的實(shí)現(xiàn)是需要將第一片的74HC595的Q7’腳的串行數(shù)據(jù)輸出端級聯(lián)到下一片74HC595芯片的串行輸入DS數(shù)據(jù)輸入端。同時(shí),電路的實(shí)現(xiàn)還需要設(shè)置這兩個(gè)控制端,低電平時(shí)/MR(10腳)將移位寄存器的數(shù)據(jù)清零,所以將其接Vcc電源;高電平時(shí)OE(13腳)將禁止輸出,將其接GND電源。
74HC595芯片依次讀入8位數(shù)據(jù)運(yùn)行的流程圖如圖2。
74HC595芯片是一個(gè)8位串行輸入/8位串行或并行輸出的移位緩存器,可以直接驅(qū)動(dòng)8個(gè)IO口,為控制數(shù)碼管的8個(gè)段碼與8個(gè)位選碼的電路搭接,需采用2片74HC595進(jìn)行級聯(lián)。在74HC595電路搭建的過程中,通過單片機(jī)的一個(gè)I0口直接控制74HC595的DS數(shù)據(jù)端口,之后將數(shù)據(jù)進(jìn)行8位數(shù)據(jù)并行輸出[2]。需考慮74HC595串行輸出數(shù)據(jù)的先后順序問題,這里的前后級主要依據(jù)是:74HC595的3個(gè)控制端與單片機(jī)直接連接的U2作為后級,而前級的U1的串行DS數(shù)據(jù)輸入端是通過后級U2的Q7’腳的串行數(shù)據(jù)輸出端輸出得到。其中,兩片的STCP和SHCP端是連接在一起,這樣兩片的芯片都具有相同移位脈沖源和相同的鎖存信號,最后一起輸出數(shù)據(jù)到并口Q0-Q7。在編程8位數(shù)碼管時(shí),需優(yōu)先考慮輸出段選還是位選信號。位選信號是選中8位中一個(gè)數(shù)碼管,然后選擇輸出段選碼信號,使該數(shù)碼管顯示所需要的內(nèi)容,延時(shí)一段時(shí)間后,再選中另一個(gè)數(shù)碼管,再輸出對應(yīng)的段碼,高速交替,這樣動(dòng)態(tài)掃描克服了人眼余輝的閃爍現(xiàn)象。
單片機(jī)的軟件設(shè)計(jì)依據(jù)電路的搭接方式而編程,以下是單片機(jī)向74HC595發(fā)送一個(gè)字節(jié)數(shù)據(jù)的功能代碼send_595()和并行輸出數(shù)據(jù)的代碼out_595()設(shè)計(jì),采用C語言編程:

上述代碼過程中,假設(shè)單片機(jī)要發(fā)送一個(gè)字節(jié)的數(shù)據(jù)0XFC,展開的二進(jìn)制數(shù)據(jù)是1111 1100,執(zhí)行的DS=ucData&0x80后,將字節(jié)的最高位1給到74HC595的Q0引腳,在時(shí)鐘線作用下進(jìn)行左移8次[4]結(jié)束后的結(jié)果是Q0- Q7的結(jié)果是0011 1111。
第三步:/完成并行數(shù)據(jù)輸出


在編程的時(shí)候就會遇到到底是選擇先發(fā)送位選信號,還是先發(fā)送段選碼信號的問題,需結(jié)合電路設(shè)計(jì)的搭接。若先傳位選信號,在電路圖中將先準(zhǔn)備輸出位選碼信號數(shù)據(jù)端的74HC595必須設(shè)置在前級U1的位置,后級U2位置放置傳送段選碼信號的74HC595,若搭接的電路優(yōu)先傳送段選碼信號,則74HC595芯片的對應(yīng)位置的功能就相反,如圖1所示。若順序不正確會導(dǎo)致錯(cuò)誤結(jié)果,主要因?yàn)?4HC595是一個(gè)字節(jié)一個(gè)字節(jié)傳送數(shù)據(jù)的芯片。
下面是以先傳段選信號編程的邏輯順序:
send_595(a[i]);//先傳段選碼,顯示的數(shù)據(jù)
send_595(b[i]);//再傳位選碼.顯示在哪一個(gè)數(shù)碼管上
out_595();
其中,send_595()函數(shù)里的參數(shù)由一維數(shù)組提供,可設(shè)置多個(gè)一維數(shù)組,用于存放傳輸?shù)臄?shù)據(jù)。這里有將所有的段選信號碼和位選信號碼分別放在a[i]和b[i]一維數(shù)組里,需注意一維數(shù)組里存放段選碼的數(shù)據(jù)主要依據(jù)8位數(shù)碼管是共陰極或者共陽極筆形碼的問題。
對于獨(dú)立按鍵,按鍵在閉合和斷開時(shí),觸點(diǎn)會存在抖動(dòng)現(xiàn)象。按鍵閉合和斷開過程中存在抖動(dòng)期,一般為5~10 ms之間,為了保證CPU對鍵的閉合做一次處理,必須去除抖動(dòng),在鍵的穩(wěn)定閉合或斷開時(shí),才讀鍵的狀態(tài)。可從硬件設(shè)計(jì)和軟件設(shè)計(jì)兩個(gè)方面解決按鍵抖動(dòng)問題:在硬件方面,采用兩個(gè)“與非”門構(gòu)成一個(gè)RS觸發(fā)器只能消除一個(gè)按鍵消抖的問題,而本文的萬年鐘可調(diào)式設(shè)計(jì)需涉及到4個(gè)按鍵,如果采用硬件的RS觸發(fā)器消抖的方法就會占用太多的電路空間問題和過多的成本問題,建議采用軟件消抖的方法。軟件消抖方法:當(dāng)判別到鍵盤上有鍵閉合后,延時(shí)一段時(shí)間再判別鍵盤的狀態(tài),若仍有鍵閉合,則認(rèn)為鍵盤上有一個(gè)鍵處于穩(wěn)定的閉合狀態(tài),否則認(rèn)為鍵抖動(dòng),除了按鍵消抖的問題,軟件上還要解決等鍵釋放問題,要保證無論按鍵按下多久,只執(zhí)行一次。以下代碼就是軟件消抖的方法:

代碼中的按鍵處理程序可選擇按鍵按下一次修改秒,再按一次修改分,再按一次修改時(shí);
再按一次修改日期,再按一次修改月份,再按一次修改年,重復(fù)上述過程,日期與時(shí)間可以轉(zhuǎn)換。
通過數(shù)碼管與按鍵設(shè)計(jì)的調(diào)式電子鐘,顯示13點(diǎn)02分08秒,如圖3所示。
通過基于74HC595芯片在單片機(jī)電子時(shí)鐘拓展IO口設(shè)計(jì)中應(yīng)用,不僅能解決單片機(jī)IO口緊張資源問題,實(shí)現(xiàn)了對IO口的充分利用,比通過單片機(jī)數(shù)據(jù)端口省時(shí)省力,還解決了硬件成本開銷問題,還有利于單片機(jī)加入更多模塊,方便拓展更多應(yīng)用系統(tǒng)功能領(lǐng)域。