這一篇我們來學(xué)習(xí)帶時鐘顯示功能的四位數(shù)碼管開發(fā)應(yīng)用,也就是通過四位數(shù)碼管分別顯示秒鐘,分鐘,或者小時,那么這個功能在單片機項目開發(fā)當(dāng)中應(yīng)用非常廣泛的,比如,跑步機,桑拿設(shè)備,電飯煲,電磁爐,電子鐘,微波爐,工廠產(chǎn)量看板,電力控制設(shè)備,還有汽車的車載時鐘等等很多電子設(shè)備,其實這些設(shè)備有很多都是使用單片機內(nèi)部的定時器來實現(xiàn)的,另外有一些使用是時鐘芯片來實現(xiàn),那么這些程序是如何編寫的? 比如這一款電飯煲就是用四位數(shù)碼管來設(shè)計的 而這一款就是用液晶顯示屏來做顯示的 不管用是用液晶顯示屏還是數(shù)碼管來設(shè)計的他們都是用來做時鐘顯示時間。 那么我們現(xiàn)在開始來進(jìn)入講解程序代碼之前,我們先來了解一個非常重要的引腳,也就是數(shù)碼管的LP段選引腳,指的就是數(shù)碼管中間的這兩個小點,也就是冒號。如果我們想讓數(shù)碼管的這兩個小點點亮顯示的話,也就是數(shù)碼管的LP段選點亮顯示,那么就必須在DIG2位引腳鏈接電源VCC,也就是高電平,然后在LP段選引腳連接電源GND,這樣電路導(dǎo)通以后有電流流過LP段選內(nèi)部的發(fā)光二級管,所以LP段也就是這個冒號才能夠點亮顯示。了解了數(shù)碼管的LP段選引腳的功能以后,我們接著再來看它是如何跟單片機連接的。 圖中LP這個段選引腳連接的網(wǎng)絡(luò)編號是ELP,他是跟單片機的P2.6 IO口連接在一起的,那么我們想讓數(shù)碼管的LP段點亮顯示的話,只要編寫程序給ELP,也就是P2.6 IO口一個低電平0就可以,若給高電平1的話,LP段就會熄滅,再就是想讓這個LP段不斷的顯示亮滅亮滅的一個循環(huán)過程的話,就要使用到定時器和中斷函數(shù)去控制才能實現(xiàn)。 接著我們來看本篇的工程代碼 #include #define uint unsigned int #define uchar unsigned char uchar num,num2,shi,ge,bai,qian,miao,fen; sbit wei=P2^4; //聲明位鎖存器LE鎖存端引腳 sbit duan=P2^3; //聲明段鎖存器LE鎖存端引腳 sbit ELP=P2^6; //數(shù)碼管的ELP段發(fā)光二極管 void delayms(uint ms) //延時函數(shù) { uint i,j; for(i=ms;i>0;i--); for(j=110;j>0;j--); } uchar code digtal[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //數(shù)碼管0-9數(shù)字 void Timer() //定時器0和定時器1初始化操作 { TMOD=0x11; //0001 0001 TH0=(65536-50000)/256; //裝初值 TL0=(65536-50000)%256; TH1=(65536-50000)/256; TL1=(65536-50000)%256; EA=1; //打開總中斷 ET0=1; ET1=1; TR0=1; TR1=1; } void display(uchar qian,uchar bai,uchar shi,uchar ge) { wei=1; //將位鎖存器的LE鎖存端開關(guān)打開 P0=0x80; //把位選電平信號0000 0100傳送到位鎖存器輸出端 wei=0; //把位選電平信號輸送完成以后,將LE鎖存端開關(guān)斷開 duan=1; //將段鎖存器的LE鎖存端開關(guān)打開 P0=digtal[qian]; //轉(zhuǎn)送段選電平信號,shi變量數(shù)值的變化會跟中斷函數(shù)的中斷次數(shù)有關(guān) duan=0; //把段選電平信號輸送完成以后,將段鎖存器的LE鎖存端開關(guān)斷開 delayms(400); //延時 wei=1; P0=0x40; wei=0; duan=1; P0=digtal[bai]; duan=0; delayms(400); wei=1; P0=0x20; wei=0; duan=1; P0=digtal[shi]; duan=0; delayms(400); wei=1; P0=0x10; wei=0; duan=1; P0=digtal[ge]; duan=0; delayms(400); } void main() { Timer(); //初始化定時器0和定時器1操作 while(1) //不斷的對數(shù)碼管動態(tài)掃描檢測數(shù)字是否有變化 { display(qian,bai,shi,ge); //數(shù)碼管顯示 } } void T0_Timer() interrupt 1 { TH0=(65536-50000)/256; //重新初值 TL0=(65536-50000)%256; num++; if(num==20) //中斷20次,說明到了1秒鐘時間 { miao++; num=0; //把num變量重新清0,重新再計20次 if(miao==60) { fen++; //如果秒鐘到了60,fen變量加1 miao=0; if(fen==60) fen=0; //如果fen變量到了60,fen變量清0 } qian=fen/10; //將分鐘的第十位數(shù)數(shù)值分離出來 bai=fen%10; //將分鐘的個位數(shù)數(shù)值分離出來 shi=miao/10; //將秒鐘的第十位數(shù)數(shù)值分離出來 ge=miao%10; //將秒鐘的個位數(shù)數(shù)值分離出來 } } void T1_Timer() interrupt 3 { TH1=(65536-50000)/256; //重新初值 TL1=(65536-50000)%256; num2++; if(num2==10) //如果這個num2值加到10次,說明500ms到了 { num2=0; //num2數(shù)值清0 ELP=~ELP; //讓發(fā)光二極管取反,現(xiàn)實亮再到滅,再亮,再滅不斷循環(huán)這個過程 } } 另外還有一點要特別說明的是,實驗使用到的數(shù)碼管LP段選引腳,剛才已經(jīng)講過了,LP段選引腳就是跟網(wǎng)絡(luò)編號ELP連接在一起的,而ELP對應(yīng)的就是單片機的P2.6 IO口,所以在使用這個引腳之前,需要對著這個引腳進(jìn)行聲明。 這次的實驗中用到了兩個定時器,也就是定時器0和定時器1,所以我們寫了兩個中斷函數(shù),先來看這一段代碼,就是定時器0中斷函數(shù),作用就是讓四位數(shù)碼管顯示時間的,顯示分鐘和秒鐘。 這一段代碼就是定時器1中斷函數(shù),作用就是讓秒鐘和分鐘中間的冒號點亮或者熄滅一個循環(huán)過程。 首先我們是給定時器0定時50ms產(chǎn)生一次中斷,當(dāng)每中斷一次NUM2變量就會加1,若中斷函數(shù)中斷了10次,說明500ms時間已經(jīng)到了,這是IF語句判斷num2變量的數(shù)值已經(jīng)等于10,因為條件判斷成立,接著就會進(jìn)入括號里面執(zhí)行語句,首先執(zhí)行這條語句,給NUM2變量的數(shù)值重新清0,然后給ELP這個IO口引腳的電平不斷的進(jìn)行取反操作。 好,現(xiàn)在我們就把上面編寫好的程序下載到單片機里面,觀察四位數(shù)碼管是否能正常顯示時間。 當(dāng)下載完成以后,四位數(shù)碼管顯示沒有問題,并且能正常的加1計數(shù)顯示,那么這就是通過定時器功能來實現(xiàn)數(shù)碼管時間顯示的開發(fā)應(yīng)用,好了,今天就交流到這里吧,我們下次再見! |
|