《單片機應(yīng)用與設(shè)計》課件項目三_第1頁
《單片機應(yīng)用與設(shè)計》課件項目三_第2頁
《單片機應(yīng)用與設(shè)計》課件項目三_第3頁
《單片機應(yīng)用與設(shè)計》課件項目三_第4頁
《單片機應(yīng)用與設(shè)計》課件項目三_第5頁
已閱讀5頁,還剩211頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

項目三單片機顯示電路與矩陣鍵盤設(shè)計

3.1中斷系統(tǒng)3.2STC89C51RC/RD+系列單片機的定時器3.3數(shù)碼管的靜、動態(tài)顯示設(shè)計3.4LCD顯示控制3.5矩陣鍵盤的設(shè)計制作指南3顯示電路與矩陣鍵盤硬件電路制作指南本章知識總結(jié)

學(xué)習(xí)目標

了解單片機中斷的概念并掌握單片機中斷的用法;

了解單片機定時器的概念并掌握單片機定時器的用法;

掌握數(shù)碼管靜態(tài)顯示的原理,能進行電路設(shè)計與程序設(shè)計;

掌握數(shù)碼管動態(tài)顯示的原理,能進行電路設(shè)計與程序設(shè)計;

掌握按鍵消抖的方法;

掌握矩陣鍵盤電路的設(shè)計與編程方法;

了解LCD的原理及使用方法。能力目標

能夠完成單片機數(shù)碼管顯示電路與矩陣鍵盤電路的設(shè)計與編程;在編寫程序過程中,能夠熟練地應(yīng)用單片機中斷與定時器;在電路或程序出現(xiàn)問題時,能夠解決軟硬件問題。

3.1中斷系統(tǒng)

這里主要介紹51子系列單片機的中斷源和中斷系統(tǒng)結(jié)構(gòu)。

3.1.1中斷的概念

在程序運行過程中,由于某種原因引起的緊急事件向CPU發(fā)出請求處理信號,要求CPU去處理這個緊急事件,CPU在允許的情況下將會響應(yīng)處理信號,停止正在執(zhí)行的程序,而去執(zhí)行相應(yīng)的處理程序,處理結(jié)束后,再繼續(xù)執(zhí)行中止了的程序,這樣的過程稱為中斷。中斷處理過程如圖3.1所示。圖3.1中斷處理過程關(guān)于中斷的幾個術(shù)語:

(1)主程序:CPU正常情況下運行的程序。

(2)中斷源:向CPU提出中斷申請的設(shè)備。

(3)中斷請求:由中斷源向CPU所發(fā)出的請求中斷的信號。

(4)中斷響應(yīng):CPU在滿足條件情況下接受中斷申請,終止現(xiàn)行程序執(zhí)行轉(zhuǎn)而為申請中斷的對象服務(wù)。

(5)中斷服務(wù)程序:為服務(wù)對象服務(wù)的程序。

(6)斷點:現(xiàn)行程序被中斷的地址。

(7)中斷返回:中斷服務(wù)程序結(jié)束后返回到原來程序。利用中斷可以實行分時操作,提高CPU效率。在實時系統(tǒng)中,參數(shù)和信息實時地反饋給CPU,可根據(jù)實際情況實現(xiàn)實時處理。另外,進行故障處理如掉電等也可向CPU發(fā)出中斷請求,由CPU進行相應(yīng)的處理。

3.1.2MCS-51單片機的中斷系統(tǒng)

MCS-51單片機的中斷系統(tǒng)提供了5個中斷源,而STC89C51RC/RD+系列單片機一共提供了8個中斷源。

1.中斷源

MCS-51單片機中斷系統(tǒng)提供的5個中斷源可以分為三類。

1)外部中斷

(1):外部中斷0請求,由引腳(P3.2)輸入,低電平/下降沿有效,中斷請求標志為IE0。

(2):外部中斷1請求,由引腳(P3.3)輸入,低電平/下降沿有效,中斷請求標志為IE1。

2)定時器溢出中斷

(1)定時器/計數(shù)器T0:溢出中斷請求,中斷請求標志為TF0。

(2)定時器/計數(shù)器T1:溢出中斷請求,中斷請求標志為TF1。

2)定時器溢出中斷

(1)定時器/計數(shù)器T0:溢出中斷請求,中斷請求標志為TF0。

(2)定時器/計數(shù)器T1:溢出中斷請求,中斷請求標志為TF1。

3)串行口中斷

串行口中斷請求:當(dāng)串行口完成一幀數(shù)據(jù)的發(fā)送或接收時,便請求中斷,中斷標志為TI或RI。

MCS-51系列單片機的中斷結(jié)構(gòu)如圖3.2所示。

2.中斷相關(guān)的寄存器

MCS-51中斷系統(tǒng)是在4個特殊功能寄存器控制下工作的,通過對這4個特殊功能寄存器的各位進行置位(置1)或復(fù)位(置0)操作,可實現(xiàn)各種中斷控制功能。這4個特殊功能寄存器分別是定時/計數(shù)器控制寄存器(TCON)、串行口中斷控制寄存器(SCON)、中斷允許控制寄存器(IE)和中斷優(yōu)先級控制寄存器(IP)。圖3.2中斷結(jié)構(gòu)圖

1)定時/計數(shù)器控制寄存器(TCON)

TCON為定時/計數(shù)器控制寄存器,其字節(jié)地址為88H,可位尋址,位地址范圍為88H~8FH。它除控制定時/計數(shù)器T0和T1的溢出中斷外,還控制外部中斷的觸發(fā)方式和鎖存外部中斷請求標志位。

TCON的格式如下:

TCON各位功能說明:

(1)?IT0:外部中斷0的中斷觸發(fā)方式選擇位,當(dāng)IT0位為0時,外部中斷0為電平觸發(fā),低電平有效;

當(dāng)IT0位為1時,外部中斷0為邊沿觸發(fā),下降沿有效。

(2)?IE0:外部中斷0的中斷請求標志位,當(dāng)IE0位為l時,表示外部中斷0正在向CPU請求中斷,且當(dāng)CPU響應(yīng)該中斷時由硬件自動對IE0進行清零(邊沿觸發(fā)方式時)。

(3)?IT1:外部中斷1的中斷觸發(fā)方式選擇位,功能與IT0的相同。

(4)?IEl:外部中斷1的中斷請求標志位,功能與IE0的相同。

(5)?TR0:定時器/計數(shù)器T0的啟動標志位,當(dāng)TR0位為0時,不允許T0計數(shù)工作;當(dāng)TRO位為l時,允許T0定時或計數(shù)工作。

(6)?TF0:定時器/計數(shù)器T0的溢出中斷請求標志位。在定時器/計數(shù)器T0被允許計數(shù)后,從初值開始加l計數(shù),當(dāng)產(chǎn)生計數(shù)溢出時由硬件自動將TF0位置為1,通過TF0位向CPU申請中斷,一直保持到CPU響應(yīng)該中斷后才由硬件自動將TF0位清零。當(dāng)TF0位為0時,表示T0未計數(shù)或計數(shù)未產(chǎn)生溢出。當(dāng)T0工作在不允許中斷時,TF0標志可供程序查詢。

(7)?TR1:定時器/計數(shù)器T1的啟動標志位,功能與TR0的相同。

(8)?TF1:定時器/計數(shù)器T1的溢出中斷請求標志位。功能與TF0的相同。

2)串行口中斷控制寄存器(SCON)

SCON為串行口中斷控制寄存器,字節(jié)地址為98H,也可以進行位尋址。串口的接收和發(fā)送數(shù)據(jù)中斷請求標志位(R1、TI)被鎖存在串行口中斷控制寄存器SCON中。

SCON的格式如下:中斷標志位功能說明:

(1)?TI:串行口發(fā)送中斷請求標志位。

CPU將一個數(shù)據(jù)寫入發(fā)送緩沖器SBUF時,就啟動發(fā)送,每發(fā)送完一幀串行數(shù)據(jù)后,硬件置位TI。但CPU響應(yīng)中斷時,并不清除TI中斷標志,必須在中斷服務(wù)程序中由軟件對TI清零。

(2)?RI:串行口接收中斷請求標志位。

在串行口允許接收時,每接收完一幀數(shù)據(jù),由硬件自動將RI位置為1。CPU響應(yīng)中斷時,并不清除RI中斷標志,也必須在中斷服務(wù)程序中由軟件對TI標志清零。

3)中斷允許控制寄存器(IE)

MCS-51對中斷源的開放或屏蔽是由中斷允許寄存器IE控制的,IE的字節(jié)地址為0A8H,可以按位尋址,當(dāng)單片機復(fù)位時,IE被清為0。通過對IE的各位置1或清0操作,實現(xiàn)開放或屏蔽某個中斷源是否允許中斷。

IE的格式如下:

(1)?EA:總中斷允許控制位,當(dāng)EA?=?0時,屏蔽所有的中斷;當(dāng)EA?=?1時,開放所有的中斷。

需要注意的是,即使EA?=?1,但是每個中斷源是允許還是被禁止,還需要有每個中斷源的中斷允許位確定。

(2)?ES:串行口中斷允許控制位,當(dāng)ES?=?0時,屏蔽串行口中斷;當(dāng)ES?=?1且EA?=?1時,開放串行口中斷。

(3)?ET1:定時/計數(shù)器T1的中斷允許控制位,當(dāng)ET1?=?0時,屏蔽T1的溢出中斷;當(dāng)ET1?=?1且EA?=?1時,開放T1的溢出中斷。

(4)?EX1:外部中斷1的中斷允許控制位,當(dāng)EX1?=?0時,屏蔽外部中斷1的中斷;當(dāng)EX1?=?1且EA?=?1時,開放外部中斷1的中斷。

(5)?ET0:定時/計數(shù)器T0的中斷允許控制位,功能與ET1的相同。

(6)?EX0:外部中斷0的中斷允許控制位,功能與EX1的相同。

MCS-51復(fù)位以后,IE被清零,所有的中斷請求被禁止。如要開放中斷,只需將相應(yīng)的中斷允許位置1即可。例如:

EA=1;//開放總中斷

EX0=1;//開外部中斷0

4)中斷優(yōu)先級控制寄存器(IP)

MCS-51單片機有兩個中斷優(yōu)先級,分別為高級優(yōu)先級和低級優(yōu)先級,可以由軟件進行設(shè)定。

IP的格式如下:

(1)?PS:串行口中斷優(yōu)先級控制位,PS?=?1,設(shè)定串行口為高優(yōu)先級;PS?=?0,設(shè)定串行口為低優(yōu)先級。

(2)?PT1:定時器T1中斷優(yōu)先級控制位,PT1?=?1,設(shè)定T1為高優(yōu)先級;PT1?=?0,設(shè)定T1為低優(yōu)先級。

(3)?PX1:外部中斷1中斷優(yōu)先級控制位,PX1?=?1,設(shè)定外部中斷1為高優(yōu)先級;

PX1?=0,設(shè)定外部中斷1為低優(yōu)先級。

(4)?PT0:定時器T0中斷優(yōu)先級控制位,PT0?=?1,設(shè)定T0為高優(yōu)先級;PT0?=?0,設(shè)定T0為低優(yōu)先級。

(5)?PX0:外部中斷0中斷優(yōu)先級控制位,PX0?=?1,設(shè)定外部中斷0為高優(yōu)先級;

PX0?=?0,設(shè)定外部中斷0為低優(yōu)先級。系統(tǒng)復(fù)位后,IP低5位全部清零,所有中斷源均設(shè)定為低優(yōu)先級中斷,當(dāng)CPU同時收到幾個同一優(yōu)先級的中斷請求時,哪一個中斷請求能優(yōu)先得到響應(yīng),取決于內(nèi)部查詢次序。首先響應(yīng)優(yōu)先級較高的中斷源的中斷請求,排列如下:

3.?C語言中斷服務(wù)函數(shù)

中斷服務(wù)函數(shù)的定義形式如下:

函數(shù)類型函數(shù)名(形式參數(shù))[interruptn][usingm]

n:中斷源的編號,5個中斷源的編號如表3-1所示。

m:寄存器組號,取值范圍為0~3。在單片機中一共有4組R0~R7的寄存器,中斷的產(chǎn)生可以通過設(shè)置切換寄存器組實現(xiàn)。使用C語言編程時,內(nèi)存是由編譯器分配的,在編程時,寄存器組號可以不寫。

例如,定時/計數(shù)器0溢出函數(shù):

voidtime0(void)interrupt1

例如,外部中斷0函數(shù):

voidintersvrl(void)interrupt0表3-1中斷源的編號

4.外部中斷應(yīng)用舉例

【例3.1】試根據(jù)圖3.3編寫程序,以完成如下任務(wù)。由P2口控制的8位LED(第一排8位LED,A1~A8)以500?ms亮、500?ms滅的頻率閃爍,按一下按鍵由P0口控制的8位LED(第二排8位LED,A9~A16)亮,再按一下則由P0口控制的8位LED(第二排8位LED,A9~A16)滅。初始時,P2口控制的LED狀態(tài)為全滅。圖3.3例3.1原理圖解析:

圖中按鍵連接到了P3.3也就是外部中斷1端,因此程序中需要使用中斷函數(shù),而從題目要求可知,中斷需要完成的就是每當(dāng)按下按鍵后,使P0口控制的LED的狀態(tài)就變化一次,而沒有中斷請求時,程序就正常執(zhí)行P2口控制的LED完成500?ms亮、500?ms滅的程序。

【知識引入:按鍵的消抖】

按鍵在按下或釋放的瞬間,由于機械彈性作用的影響,會產(chǎn)生一段時間的觸點機械抖動,然后觸點才能穩(wěn)定下來,如果不加消抖,在程序中會誤判斷按鍵按下多次,所以在使用按鍵時,需要對按鍵進行消抖。抖動的時間約持續(xù)10?ms。

按鍵的消抖可以采用硬件消抖,也可以采用軟件消抖,大多數(shù)情況下,一般采用軟件消抖的方法。軟件消抖采取的措施是在檢測到有按鍵按下時,執(zhí)行一個10?ms的延時程序,然后再確認按鍵鍵電平是否仍保持閉合狀態(tài)電平,如果仍是閉合狀態(tài)電平,則確認該鍵處于閉合狀態(tài),從而消除抖動的影響。簡單地說,初次判斷按鍵按下后,利用延時,把產(chǎn)生抖動的時間渡過,然后再判斷是否按鍵按下。首先編寫沒有中斷時,P2口控制的LED以500?ms的時間亮、滅的程序。根據(jù)前面我們講授的知識,我們很容易寫出程序的代碼,代碼如下:

P2=0xff;

delay_10ms(50);

P2=0x0;

delay_10ms(50);

10?ms的延時程序,我們可以利用之前編寫的帶參數(shù)延時函數(shù)即可,程序代碼如下:

voiddelay_10ms(unsignedintz)

{

unsignedintx,y;

for(x=z;x>0;x--)

for(y=1150;y>0;y--);

}

接下來我們需要使用外部中斷了,外部中斷的使用方法如下:

(1)編寫中斷服務(wù)函數(shù)。

(2)控制相應(yīng)的外部中斷控制位和開放總中斷。

(1)中斷服務(wù)函數(shù)如下:

voidint_rupt1()interrupt2//中斷服務(wù)函數(shù)的函數(shù)名和中斷源編號,由于是外部中斷1,所以編號為2

{

}

在中斷服務(wù)函數(shù)中,需要完成的功能是P0口控制的LED,按鍵每按下一次,狀態(tài)改變一次,因此在函數(shù)中,需要判斷按鍵是否按下。通過電路圖我們可以得知,當(dāng)按鍵按下后,P3.3必然為低電平0,所以判斷按鍵是否按下可以使用以下語句:

sbitkey=P3^3;

if(key==0) //初次判斷按鍵是否按下

delay_10ms(1); //延時10ms去抖

if(key==0) //再次判斷按鍵是否按下,如果確認按下,既可以執(zhí)行相應(yīng)的語句

同樣,判斷按鍵是否釋放也是同樣的原理,語句如下:

while(!key); //判斷按鍵是否釋放

delay_10ms(1); //延時10ms消抖

while(!key); //再次判斷按鍵是否釋放語句“while(!key);”是判斷按鍵是否釋放,由于按下時,key值為0,因此釋放時,key值應(yīng)為1。當(dāng)按鍵按下時,key=0,執(zhí)行語句“while(!key);”時,!key=1,因此while語句成立,所以執(zhí)行空語句,直到key=1時,說明按鍵釋放,!key=0,while語句不成立,執(zhí)行10?ms延時去抖,然后再次判斷按鍵是否釋放。

(2)控制相應(yīng)的外部中斷控制位。要使用外部中斷1,就需要打開外部中斷1控制位。要使用中斷,就需要對中斷允許控制寄存器(IE)進行操作。前面介紹過,外部中斷1的中斷允許控制位為EX1,當(dāng)EX1?=?1且EA?=?1時,開放外部中斷1的中斷,同時需要對中斷源的出發(fā)方式進行設(shè)置,因此可以用以下語句:

EX1=1; //開外部中斷1

IT1=1; //下降沿觸發(fā)

EA=1; //開總中斷

綜上所述,程序代碼如下:

#include<reg52.h>

sbitkey=P3^3;

unsignedcharx=0x0; //定義中間變量

/*10ms延時程序*/

voiddelay_10ms(unsignedintz)

{

unsignedintx,y;

for(x=z;x>0;x--)

for(y=1150;y>0;y--);

}

/*中斷服務(wù)函數(shù)*/

voidint_rupt1()interrupt2

{

if(key==0)

{

delay_10ms(1);

if(key==0)

{

x=~x; //將x值取反

P0=x;

while(!key);

delay_10ms(1);

while(!key);

}

}

}

voidmain()

{

EX1=1;

//開外部中斷1

IT1=1;

//下降沿觸發(fā)

EA=1;

//開總中斷

P0=0;

//將P0口置0,使其控制的LED滅

while(1)

{

P2=0xff;

delay_10ms(50);

P2=0x0;

delay_10ms(50);

}

}

3.2STC89C51RC/RD+系列單片機的定時器

STC89C51RC/RD+系列單片機的定時器0和定時器1,與傳統(tǒng)8051的定時器完全兼容,當(dāng)定時器1作為波特率發(fā)生器時,定時器0可以當(dāng)兩個8位定時器用。

單片機內(nèi)部設(shè)有兩個16位的可編程定時器/計數(shù)器,簡稱定時器0(T0)和定時器1(T1)。16位的定時器/計數(shù)器實質(zhì)上是一個加1計數(shù)器,可實現(xiàn)定時和計數(shù)兩種功能,其功能由軟件控制和切換。定時器/計數(shù)器屬于硬件定時和計數(shù),是單片機中效率高且工作靈活的部件。

(1)定時功能。計數(shù)器的加1信號由振蕩器的12分頻信號產(chǎn)生,每過一個機器周期,計數(shù)器加1,直至計數(shù)器溢出,即對機器周期數(shù)進行統(tǒng)計。因此,計數(shù)器每加1就代表1個機器周期。

定時器的定時時間與系統(tǒng)的時鐘頻率有關(guān)。一個機器周期等于12個時鐘期,所以計數(shù)頻率應(yīng)為系統(tǒng)時鐘頻率的1/12(機器周期)。如晶振頻率是12?MHz,則機器周期為1?μs。通過改變定時器的定時初值,并適當(dāng)選擇定時器的長度,以調(diào)整定時時間的長短。

(2)計數(shù)功能。計數(shù)是對單片機外部事件進行計數(shù),為了與請求中斷的外部事件區(qū)分開,稱這種外部事件為外部計數(shù)事件。外部計數(shù)事件由脈沖引入,單片機的P3.4和P3.5為外部計數(shù)脈沖輸入端。

3.2.1定時器的相關(guān)寄存器

1.模式寄存器(TMOD)

TMOD是TimerMode的縮寫,(地址為89H)作用是設(shè)置T0、T1的工作方式。低4位用于控制T0,高4位用于控制T1。各位功能如表3-2所示。TMOD的格式如下:表3-2TMOD各位功能表

2.模式控制寄存器(TCON)

TCON是TimerControl的縮寫,用于控制定時器(Timer)的啟動和停止,并指示Timer是否溢出。TCON各位功能如表3-3所示。TCON在特殊功能寄存器的地址是88H,格式如下:表3-3TCON各位功能表

3.2.2定時器的相關(guān)工作方式

例:T0在軟件方式啟動定時器,讓P1.1口輸出頻率為100?Hz的方波信號(占空比為50%的矩形波),如圖3.4所示。

1.定時器/計數(shù)器0工作模式

1)工作模式0

工作模式0下Timer寄存器只有13位,如圖3.5所示。計數(shù)值的高8位裝入TH1(TH0)中,TL1(TL0)的低5位裝入剩下的五位計數(shù)值。TL0低5位溢出向TH0進位,TH0計數(shù)溢出置位TCON中的溢出標志位TF0。GATE(TMOD.3)?=?0時,如TR0?=?1,則定時器計數(shù)。GATE?=?1時,允許由外部輸入INT1控制定時器1,INT0控制定時器0,這樣可實現(xiàn)脈寬測量。圖3.5工作模式0當(dāng)?=?0時,多路開關(guān)連接到系統(tǒng)時鐘的分頻輸出,T0對時鐘周期計數(shù),T0工作在定時方式。

當(dāng)=?1時,多路開關(guān)連接到外部脈沖輸入P3.4/T0,即T0工作在計數(shù)方式。

計數(shù)初始值設(shè)計步驟如下:

(1)將定時時長t除以12/fsoc。

(2)用8192減去上一步驟得到的數(shù)。

(3)用科學(xué)計算器把上一步驟的得數(shù)轉(zhuǎn)換成13位二進制數(shù),高位如果是空的用0補上,依次填入TH1(TH0)的8位和和TL1(TL0)的低5位中。

TCON寄存器的設(shè)置如表3-4所示。表3-4工作模式0的TCON寄存器設(shè)置單片機的晶振為12?MHz,定時器內(nèi)的計數(shù)加“1”,耗時為1?μs,現(xiàn)在要計時5?ms,即定時器寄存器中的數(shù)應(yīng)該增加5000。因此存入定時器計數(shù)器的數(shù)值應(yīng)該是8192-5000(0110001111000)。將13位中的高8位存入TH0中,即TH0=0xC7,低五位存入TL0,即TL0=0x18。

程序部分如下:

#include<reg52.h>

sbitd1=P1^1;

voidmain(void)

{

TMOD=0x0;//定時器初始化

TH0=0xc7;

TL0=0x18;

TR0=1;

while(1)

{

if(TF0==1)

{

d1=~d1;

TR0=0;

TH0=0xc7;

TL0=0x18;

}

}

}

2)工作模式1

工作模式1下的Timer是一個16位的定時器或計數(shù)器,Timer寄存器TLx和THx共16位全部用來裝計數(shù)值,如圖3.6所示。

此模式下,定時器配置為位定時器/計數(shù)器,由TL0的位和TH0的位所構(gòu)成。TL0的8位溢出向TH0進位,TH0計數(shù)溢出置位TCON中的溢出標志位TF0。

當(dāng)GATE?=?0(TMOD.3)時,如TR0?=?1,則定時器計數(shù)。GATE?=?1時,允許由外部輸入INT0控制定時器0,這樣可實現(xiàn)脈寬測量。

圖3.6工作模式當(dāng)=?0時,多路開關(guān)連接到系統(tǒng)時鐘的分頻輸出,T0對時鐘周期計數(shù),T0工作在定時方式。

當(dāng)=?1時,多路開關(guān)連接到外部脈沖輸入P3.4/T0,即T0工作在計數(shù)方式。

計數(shù)初始值設(shè)計步驟如下:

(1)將定時時長t除以12/fsoc。

(2)用65536減去上一步驟得到的數(shù)。

(3)用科學(xué)計算器把上一步驟的得數(shù)轉(zhuǎn)換成十六進制形式,分別將高8位和低8位裝入TH1(TH0)和TL1(TL0)。

此時,TCON寄存器的設(shè)置如表3-5所示。表3-5工作模式1的TCON寄存器設(shè)置表

單片機的晶振為12?MHz,定時器內(nèi)的計數(shù)加“1”,耗時為1?μs,現(xiàn)在要計時5?ms,即定時器寄存器中的數(shù)應(yīng)該增加5000。因此存入定時器計數(shù)器的數(shù)值應(yīng)該是65536-5000。將其存入TH0和TL0中,即將65536-5000轉(zhuǎn)化為十六進制數(shù)(EC78)將高位存入TH0?=?EC,低位存入TL0?=?78。

程序部分如下:

#include<reg52.h>

sbitd1=P1^0;

voidmain(void)

{

TMOD=0x01;//定時器初始化

TH0=0xce;

TL0=0x78;

TR0=1;

while(1)

{

if(TF0==1)

{

d1=~d1;

TR0=0;

TH0=0xce;

TL0=0x78;

}

}

}

3)工作模式2

模式2下的Timer是一個具有自動重新載入功能的8位定時器或計數(shù)器,如圖3.7所示,TL1(TL0)作為Timer寄存器。模式2下的Timer具有自動重新載入計數(shù)初始值的功能。在初始化Timer時,計數(shù)初始值同時裝載到Timer寄存器TH1(TH0)和TL1(TL0)中,當(dāng)完成一次計數(shù)后Timer溢出之時,TL1(TL0)會自動從TH1(TH0)中復(fù)制原來保存的計數(shù)初始值,不需要再次向Timer寄存器TL1(TL0)中裝入計數(shù)初始值。只需要把標志位TF1(TF0)清零,Timer就可以再次啟動重復(fù)計數(shù)過程了。圖3.7工作模式2計數(shù)初始值設(shè)計步驟如下:

(1)將定時時長t除以12/fsoc。

(2)用256減去上一步驟得到的數(shù)。

(3)用科學(xué)計算器把上一步驟的得數(shù)存入TH1(TH0)和TL1(TL0)中。

此時TCON寄存器的設(shè)置如表3-6所示。

單片機的晶振為12?MHz,定時器內(nèi)的計數(shù)加“1”,耗時為1?μs,現(xiàn)在要計時5?ms,即定時器寄存器中的數(shù)應(yīng)該增加5000。定時器工作在工作方式2時,最大的計時時間為

256μs。將定時器的計時值設(shè)置成250?μs,定時器計滿20次才能計滿5?ms。即將QxFA存入TH0=0xFA,TL0=0xFA。表3-6工作模式2的TCON寄存器設(shè)置表

程序部分如下:

#include<reg52.h>

sbitd1=P1^1;

unsignedchartemp;

voidmain(void)

{

TMOD=0x02; //定時器初始化

TH0=0xfa;

TL0=0xfa;

TR0=1;

while(1)

{

if(TF0==1)

{

TF0=0

temp++;

If(temp==20)

{

temp=0;

d1=~d1;

TR0=0;

}

}

}

}

4)工作模式3

模式3下Timer0寄存器將TL0和TH0變成兩個獨立的8位Timer寄存器,如圖3.8所示。Timer0變成了兩個獨立的8位Timer,但不具備自動重新裝載計數(shù)初始值的特性。以TL0為Timer寄存器的Timer使用TMOD寄存器和TCON寄存器中原來與Timer0有關(guān)的控制位和標志位,設(shè)置的方法與前面相同。而以TH0為Timer寄存器的Timer使用原來Timer1的溢出標志位TF1和啟動/關(guān)閉控制位TR1,但不能用作計數(shù)器使用。對定時器1,在模式3時,定時器1停止計數(shù),效果與將TR1設(shè)置為0相同。

圖3.8工作模式兩個獨立的8位Timer與模式2下的8位Timer功能相似,但少了自動重裝計數(shù)初值的功能,其設(shè)置方法參見Timer的工作模式2。

模式3是為了增加一個附加的8位定時器計數(shù)器而提供的,使單片機具有三個定時器/計數(shù)器。模式3只適用于定時器/計數(shù)器0,定時器T1處于模式3時相當(dāng)于TR1=0,停止計數(shù),而T0可作為兩個定時器用。

2.定時器/計數(shù)器1工作模式

1)模式0(13位定時器/計數(shù)器)

模式0下定時器計數(shù)器1作為13位定時器/計數(shù)器,有TL1的低5位和TH1的8位所構(gòu)成,如圖3.9所示。模式0的操作對于定時器1和定時器0是相同的。

當(dāng)?=?0時,多路開關(guān)連接到系統(tǒng)時鐘的分頻輸出,T1對時鐘周期計數(shù),T1工作在定時方式。

當(dāng)=?1時,多路開關(guān)連接到外部脈沖輸入P3.5/T1,即T1工作在計數(shù)方式。圖3.9工作模式0

2)模式1(16位定時器/計數(shù)器)

模式1下定時器計數(shù)器作為位定時器/計數(shù)器,如圖3.10所示。

此模式下,定時器1配置為位定時器/計數(shù)器,由TL1的8位和TH1的8位所構(gòu)成。TL1的8位溢出向TH1進位,TH1計數(shù)溢出置位TCON中的溢出標志位TF1。

當(dāng)=?0時,多路開關(guān)連接到系統(tǒng)時鐘的分頻輸出,T1對時鐘周期計數(shù),T1工作在定時方式。

當(dāng)=?1時,多路開關(guān)連接到外部脈沖輸入P3.5/T1,即T1工作在計數(shù)方式。圖3.10工作模式1

3)模式2(8位自動重裝模式)

模式2下定時器計數(shù)器1作為可自動重裝載的位計數(shù)器,如圖3.11所示。

TL1的溢出不僅置位TF1,而且將TH1內(nèi)容重新裝入TL1,TH1內(nèi)容由軟件預(yù)置,重裝時TH1內(nèi)容不變。圖3.11工作模式23.2.3定時器應(yīng)用舉例

例:用定時器0,工作方式1,以查詢方式完成8位LED循環(huán)點亮的程序,時間間隔為1?s,電路圖可以使用項目二中的電路,如圖3.12所示。

1.定時器查詢方式的使用方法

定時器查詢方式使用步驟如下:

(1)對定時器初始化并賦初值;

(2)啟動定時器;

(3)查詢定時器溢出標志位是否為1,定時器溢出標志位為TF0、TF1,當(dāng)有溢出時,標志位被置為1。圖3.128位LED原理圖說明:51單片機的定時器,在各種工作模式下,最大就是16位的,最大計數(shù)值為65535,如果我們選用12?M的晶振,最大定時值就是1?×?65535μs?=?65535μS。那么,如果我們直接用定時器來完成1?s的延時,顯然是達不到的,因此如果想要用定時器定時比定時器本身時間長的定時,則需要讓定時器反復(fù)執(zhí)行多次,來達到目標延時的時間。例如:我們想要延時1?s,那么我們可以讓定時器每次定時10?ms,那么只需100次,就可以達到延時1?s的要求。程序代碼如下:

#include<reg52.h>

voidmain()

{

unsignedcharcount,temp=0x01;

TMOD=0x01; //設(shè)置定時器0為工作方式1

TH0=(65535-10000)/256; //高8位賦值

TL0=(65535-10000)%256; //低8位賦值

TR0=1; //啟動定時器0 while(1)

{

if(temp==0) //當(dāng)初始值移位等于0時,重新賦值

{

temp=0x01;

}

P2=temp;

temp=temp<<1;

for(count=0;count<100;count++)

//執(zhí)行100次10ms定時,即1s {

while(TF0==0); //查詢標志位是否為1,如為1,表示定時時間到,為0則繼續(xù)等待

TF0=0; //手動將溢出標志位清零

TH0=(65535-10000)/256; //再次向高8位賦值,準備下一次定時

TL0=(65535-10000)%256; //再次向高8位賦值,準備下一次定時

}

}

}

2.定時器中斷方式的使用方法

定時器中斷方式使用方法如下:

(1)對定時器初始化并賦初值;

(2)啟動定時器;

(3)編寫中斷服務(wù)函數(shù),在中斷服務(wù)函數(shù)中,完成相應(yīng)的功能(在本題目中,則是完成8位LED循環(huán)點亮功能);

(4)定時原理與查詢方式相同,都需要讓定時反復(fù)執(zhí)行多次來達到定時的要求。

具體步驟如下:

(1)選擇定時器和工作模式;

(2)定時器初始化;

(3)打開定時器中斷源;

(4)打開總中斷;

(5)啟動定時器;

(6)編寫中斷服務(wù)函數(shù)。

程序代碼如下:

#include<reg52.h>

unsignedcharcount=0,temp=0x01;

voidtimer_0()interrupt1 //中斷服務(wù)函數(shù)

{

TH0=(65535-10000)/256; //重新賦值

TL0=(65535-10000)%256; //重新賦值

count++;

if(count==100) //定時時間達到1s執(zhí)行LED移位功能

{

count=0;

P2=temp;

temp=temp<<1;

if(temp==0)

{

temp=0x01;

}

}

}

voidmain()

{

TMOD=0x01; //定時器0,工作方式1

TH0=(65535-10000)/256; //賦初值

TL0=(65535-10000)%256; //賦初值

ET0=1; //開定時器0中斷

EA=1; //開總中斷

TR0=1; //啟動定時器

P2=0;

while(1);

}

3.3數(shù)碼管的靜、動態(tài)顯示設(shè)計

3.3.1數(shù)碼管概述

1.數(shù)碼管的概述

數(shù)碼管是一種半導(dǎo)體發(fā)光器件,其基本單元是發(fā)光二極管。

數(shù)碼管按段數(shù)分為七段數(shù)碼管(七段分別叫做a段、b段、c段、d段、e段、f段、g段)和八段數(shù)碼管(八段分別叫做a段、b段、c段、d段、e段、f段、g段、dp段(小數(shù)點)),如圖3.13所示。八段數(shù)碼管比七段數(shù)碼管多一個發(fā)光二極管單元(多一個小數(shù)點顯示)。數(shù)碼管按顯示數(shù)字的位數(shù)可分為1位、2位、3位、4位數(shù)碼管,如圖3.14所示的為一個1位和4位數(shù)碼管。

圖3.13八段數(shù)碼管圖3.141位和4位數(shù)碼管

2.數(shù)碼管的連接方式

數(shù)碼管的連接方式分為共陽極接法和共陰極接法。

共陽數(shù)碼管是指將數(shù)碼管中所有發(fā)光二極管的陽極接到一起形成公共陽極(COM)的數(shù)碼管。在應(yīng)用時應(yīng)將公共極COM接到+5?V,當(dāng)某一字段發(fā)光二極管的陰極為低電平時,相應(yīng)字段就點亮,當(dāng)某一字段的陰極為高電平時,相應(yīng)字段就不亮,如圖3.15所示。

共陰數(shù)碼管是指將數(shù)碼管中所有發(fā)光二極管的陰極接到一起形成公共陰極(COM)的數(shù)碼管。在應(yīng)用時應(yīng)將公共極COM接到地線GND上,當(dāng)某一字段發(fā)光二極管的陽極為高電平時,相應(yīng)字段就點亮,當(dāng)某一字段的陽極為低電平時,相應(yīng)字段就不亮,如圖3.16所示。圖3.15共陽接法圖3.16共陰接法3.3.2數(shù)碼管的顯示方式

數(shù)碼管要正常顯示,就要用驅(qū)動電路來驅(qū)動數(shù)碼管的各個段碼。因此,根據(jù)數(shù)碼管驅(qū)動方式的不同,數(shù)碼管分為靜態(tài)顯示和動態(tài)顯示兩種。

1.靜態(tài)顯示

靜態(tài)顯示的驅(qū)動也稱直流驅(qū)動,是指每個數(shù)碼管的每一個段碼都由一個單片機的I/O端口進行驅(qū)動,或者使用專用譯碼器譯碼進行驅(qū)動,當(dāng)送入一次段碼后,顯示可一直保持,直到送入新段碼為止。靜態(tài)顯示的優(yōu)點是編程簡單,顯示亮度高,占用CPU時間少,方便控制;缺點是占用I/O端口多,如驅(qū)動4個數(shù)碼管靜態(tài)顯示則需要4?×?8?=?40根I/O端口來驅(qū)動,而一個STC89C52單片機可用的I/O端口只有32個,硬件電路復(fù)雜,成本較高。

2.動態(tài)顯示

數(shù)碼管動態(tài)顯示是單片機中應(yīng)用最為廣泛的一種顯示方式之一。動態(tài)顯示是將所有數(shù)碼管的8個段a、b、c、d、e、f、g、dp并聯(lián)在一起,另外為每個數(shù)碼管的公共極COM增加位選通控制電路,位選通由各自獨立的I/O線控制,當(dāng)單片機輸出字段碼時,所有數(shù)碼管都接收到相同的段碼,哪一位數(shù)碼管發(fā)光,取決于單片機對位選通COM端電路的控制。通過分時輪流控制各個數(shù)碼管的COM端,就使各個數(shù)碼管輪流受控顯示,這就是動態(tài)顯示。利用人的視覺暫留現(xiàn)象及發(fā)光二極管的余輝效應(yīng),使人感覺像是所有數(shù)碼管同時在顯示。動態(tài)顯示能夠節(jié)省大量的I/O端口,并且功耗更低,但在編程量上比靜態(tài)顯示的要大。3.3.3數(shù)碼管顯示程序的設(shè)計

【例3.2】在圖3.17所示電路中,使數(shù)碼管的每個段依次點亮,時間間隔500?ms,用靜態(tài)顯示。

解析:

(1)硬件電路。從圖中可知,使用了74HC573芯片,并且芯片處于直通狀態(tài)(輸出數(shù)據(jù)等于輸入數(shù)據(jù)),AT89S52的P2.0~P2.7分別控制數(shù)碼管的a段~f段。因此根據(jù)題目要求,只要控制與數(shù)碼管各段相連的P2.0~P2.7就可以達到題目要求。

(2)程序流程。要想達到題目要求,只需要使P2.0~P2.7循環(huán)輸出1,再加入500?ms延時即可。為了使程序簡潔,我們可以使用左移和循環(huán)語句來編寫程序。圖3.17數(shù)碼管靜態(tài)顯示程序代碼如下:

#include<reg52.h>

voiddelay_10ms(unsignedintz)

{unsignedintx,y;

for(x=z;x>0;x--)

for(y=1150;y>0;y--);

}

voidmain()

{????unsignedinttemp,k;

while(1)

{

temp=0x01;

for(k=0;k<8;k++)

{

P2=temp;

delay_10ms(50);

temp=temp<<1;

delay_10ms(50);

}

}

【知識引入:C語言數(shù)組】

數(shù)組實際上就是一組同類型的數(shù),有一維數(shù)組、二維數(shù)組和字符數(shù)組。

1.一維數(shù)組

1)一維數(shù)組的定義

一維數(shù)組定義形式如下:

類型說明符數(shù)組名[常量表達式];

在C語言中數(shù)組必須要先定義,后使用。

類型說明符——說明該數(shù)組中每個元素的數(shù)據(jù)類型。

數(shù)組名——數(shù)組的名稱,命名規(guī)則與變量名命名相同。

常量表達式——表示該數(shù)組具有的元素個數(shù),也稱為數(shù)組的長度。

如:

inta[3];//定義整型數(shù)組a,有3個元素,下標從0到2,即a[0]、a[1]、a[2]

2)一維數(shù)組的引用

C語言中不能對整個數(shù)組進行整體操作,只能對數(shù)組元素逐個進行處理。一維數(shù)組引用形式如下:

數(shù)組名[下標]說明:

(1)數(shù)組引用中的下標為整型常量或整型表達式或整型變量,它表示了元素在數(shù)組中的順序號即位置。

(2)?C編譯系統(tǒng)對數(shù)組下標不進行越界檢查。

(3)如果下標是實數(shù),C編譯器自動將它轉(zhuǎn)換為整形數(shù)據(jù)。

3)一維數(shù)組初始化

數(shù)組初始化,表示在定義數(shù)組時對數(shù)組元素賦予初值。例如:

inta[5]={2,4,6,8,10}大括號中的數(shù)據(jù)依次賦給對應(yīng)的元素的初始值,中間用逗號隔開,具體說明如下:

(1)大括號中賦初值的數(shù)據(jù)必須是常量或常量表達式,且類型應(yīng)與數(shù)組定義類型一致,如不一致,則強制轉(zhuǎn)換。

(2)初始化時,允許只對部分元素賦值,這時,數(shù)組前面部分相當(dāng)個數(shù)的元素賦予給定的初值,其余元素初始化為0。例如“inta[8]={1,2,3,4}”,則數(shù)組元素a[0]~a[3]的值為1~4,其余的數(shù)組元素的值均為0。

(3)當(dāng)給出全部數(shù)組元素的初始化值時,定義數(shù)組可不指定數(shù)組長度,例如

inta[]={2,4,6,8,10,12,14,16,18,20};

(4)未指定初始化的數(shù)組和普通變量一樣,各元素的值是隨機的未知值。

(5)賦予給定的初值,其余元素初始化為0。

2.二維數(shù)組

1)二維數(shù)組的定義

二維數(shù)組定義形式如下:

類型說明符數(shù)組名[常量表達式1][常量表達式2];

例如:

intx[3][4];定義數(shù)組x為3×4(三行四列)的數(shù)組,數(shù)組元素都是整型量,具體如下:

x[0][0]x[0][1]x[0][2]x[0][3]

x[1][0]x[1][1]x[1][2]x[1][3]

x[2][0]x[2][1]x[2][2]x[2][3]

在內(nèi)存中按行存放。

2)二維數(shù)組的引用

二維數(shù)組引用形式如下:數(shù)組名[下標1][下標2]

例如:

x[1][2] //x數(shù)組第2行第3列元素

x[0][3] //x數(shù)組第1行第4列元素

3)二維數(shù)組元素的初始化

(1)按行給二維數(shù)組賦初值,例如

intx[2][3]={{8,9,1},{2,0,3}};

第一個大括號是給第一行元素賦值,第二個大括號是給第二行元素賦值。

(2)按行連續(xù)賦初值,例如

intx[2][3]={8,9,1,2,0,3};

按行依次給數(shù)組元素賦值。

【例3.3】在3.2電路圖的基礎(chǔ)上,試編寫數(shù)碼管以200?ms的速度0~9循環(huán)顯示的程序。采用靜態(tài)顯示。

解析:

例3.3與例3.2原理圖相同,唯一的區(qū)別是在顯示時,例3.2中是顯示每個段,而在本題目中,則是顯示數(shù)字0~9,因此在控制時不僅僅只有1個段亮,而是需要幾個段同時亮來組成數(shù)字0~9。如表3-7所示。

我們只需要使P2口輸出以上0~9的段碼并延時,就可以達到要求。需要指出的是,共陽數(shù)碼管和共陰數(shù)碼管的段碼是不同的,在編寫程序時要注意。表3-70~9段碼表

程序代碼如下:

#include<reg52.h>

unsignedcharcodetable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};

voiddelay_10ms(unsignedintz)

{

unsignedintx,y;

for(x=z;x>0;x--)

for(y=1150;y>0;y--);

}

voidmain(void)

{

unsignedchari=0;

while(1) //死循環(huán)

{

P2=table[i]; //將數(shù)組的值賦給P2

delay_10ms(20);

i++; //下標值加1

if(i==10) //當(dāng)i=10時,數(shù)組下標已經(jīng)超出了范圍,讓數(shù)組下標重新歸0

{

i=0;

}

}

}

【例3.4】按鍵與數(shù)碼管。設(shè)計一個用按鍵控制數(shù)碼管顯示電路。初始時數(shù)碼管顯示0,每按一次按鍵,數(shù)碼管顯示的數(shù)值加1,加到9后再按按鈕時,數(shù)碼管返回0。

解析:

(1)硬件電路。從題目要求來看,除去按鈕之外,數(shù)碼管顯示的數(shù)字為0~9,因此硬件電路可以借鑒例3.3的電路,但是題目中需要有按鈕所以需要在例3.3的電路的基礎(chǔ)上加入按鈕。硬件電路如圖3.18所示。圖3.18按鍵控制數(shù)碼管電路

(2)程序分析。程序中顯示0~9的代碼與例3.3相似,在本題目中顯示0~9的數(shù)字時,需要判斷按鍵是否按下,如果按鍵已經(jīng)確定按下,則顯示的數(shù)字加1。所以,程序代碼只需加入判斷按鍵是否按下,再結(jié)合例3.3中的代碼,就可以達到要求。

程序代碼如下:

#include<reg52.h>

sbitkey=P1^7; //定義按鍵

unsignedcharcodetable[]=

{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};

//以數(shù)組的形式定義0~9段碼值,方便使用

voiddelay_10ms(unsignedintz)

{

unsignedintx,y;

for(x=z;x>0;x--)

for(y=1150;y>0;y--);

}

voidmain(void)

{

unsignedchari=0; //定義一個變量i,方便引用數(shù)組元素

P2=table[0]; //使數(shù)碼管的初始值顯示0

while(1)

{

if(key==0) //判斷按鍵是否按下

{

delay_10ms(1); //延時消抖

if(key==0) //再次判斷是否按下

{

i++; //i的值加1

if(i==10) //當(dāng)i=10時,將i置為0

{

i=0;

}

P2=table[i];

//將數(shù)組中的元素賦值給P2,數(shù)組下標由變量i控制

while(!key); //按鍵釋放判斷

delay_10ms(1);

while(!key);

}

}

}

}

【例3.5】在圖3.19所示的電路中,編寫數(shù)碼管動態(tài)掃描程序,在數(shù)碼管上顯示1~6。

解析:

(1)原理圖分析。圖中采用2片74HC573作為驅(qū)動,2片573輸入端連接單片機P2口,輸出端一個連接段選端,一個連接位選端。2片74HC573的11腳分別連接P1.6和P1.7,可以通過對P1.6和P1.7的控制,來控制74HC573,以節(jié)約I/O口的使用。當(dāng)然電路還可以只用一片74HC573,連接到段選端,位選端連接到其他I/O口上,但是這樣連接比上圖中要多使用4個I/O引腳。圖3.19數(shù)碼管動態(tài)顯示原理圖同時P2口在輸出時,如果不控制2片74HC573的話,那么P2口的數(shù)據(jù)就會同時加到數(shù)碼管的位選端和段選端,會在顯示時造成混亂,所以在給數(shù)碼管送段碼時,相應(yīng)控制位選的74HC573就要處于鎖存狀態(tài),相反在送位選碼時,相應(yīng)控制段選的74HC573就要處于鎖存狀態(tài)。動態(tài)顯示的過程如下:

首先給數(shù)碼管送段選碼,多位數(shù)碼管進行動態(tài)顯示時,所有的段都并聯(lián)在一起,我們?nèi)绻胱屇骋晃伙@示,只需控制相應(yīng)的位選,字符就會顯示在制定的數(shù)碼管上,而其他的沒有選中的數(shù)碼管都處于熄滅的狀態(tài),持續(xù)1~2?ms時間,關(guān)閉所有顯示,然后再送給數(shù)碼管新的段選碼,重復(fù)上述過程,直到每一位數(shù)碼管都掃描完,這個過程就是動態(tài)掃描。雖然數(shù)碼管是循環(huán)點亮的,但是每個數(shù)碼管的點亮?xí)r間都很短,人眼感覺不出變化,給人一種穩(wěn)定的顯示效果。

(2)程序分析。根據(jù)動態(tài)顯示的過程再結(jié)合題目分析可知,題目要求數(shù)碼管按照從左到右依次顯示數(shù)字1~6,在編寫程序時,我們先給數(shù)碼管送數(shù)字“1”段選碼,然后控制數(shù)碼管最左邊位選,延時1~2?ms后,關(guān)閉所有顯示,這樣就完成了數(shù)字“1”的顯示;再給數(shù)碼管送數(shù)字“2”段選碼,然后控制數(shù)碼第二位的位選,延時1~2?ms后,關(guān)閉所有顯示,就完成了數(shù)字“2”的顯示,這樣的過程一共執(zhí)行6次,就可以完成在數(shù)碼管上動態(tài)顯示數(shù)字1~6。因此可以得知,程序一共執(zhí)行6次,只是每次所送的段碼和位碼不同而已,程序的框架是一樣的。根據(jù)動態(tài)顯示原理,結(jié)合原理圖,就可以寫出程序的框架如下:

P2=段選碼; //由于使用的是P2口,所以先讓P2口送段選碼給數(shù)碼管

P1.7=1; //由于使用74HC573作為段選控制,所以需要對其鎖存端進行控制,

//打開段選控制的鎖存端,使573處于直通狀態(tài)(輸出與輸入相同),將數(shù)據(jù)送到數(shù)碼管段選端

P1.7=0; //關(guān)閉段選鎖存端P1.7,將數(shù)據(jù)鎖存(使數(shù)碼管的段選端保持所送的

//段選碼)

P1.6=1; //由于使用74HC573作為位選控制,所以需要對其鎖存端進行控制,

//打開位選控制的鎖存端,使573處于直通狀態(tài)(輸出與輸入相同),

//將數(shù)據(jù)送到數(shù)碼管位選端(控制哪一個數(shù)碼管顯示)

P2=位選碼; //P2口送位選碼

延時; //延時(1~2)ms

P2=0xff; //共陰數(shù)碼管,關(guān)閉所有顯示

P1.6=0; //關(guān)閉位選鎖存端P1.6程序代碼如下:

#include<reg52.h>

sbitwk=P1^6; //定義鎖存器位選端

sbitdk=P1^7; //定義鎖存器段選端

/*將段選碼寫成數(shù)組的形式*/

unsignedcharcodetab[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};

/*將位選碼寫成數(shù)組的形式*/

unsignedcharcodecol[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf};

/*1~2ms延時*/

voiddelay()

{

unsignedchari;

for(i=0;i<255;i++);

}

/*主函數(shù)*/

voidmain()

{

unsignedchark;

while(1)

{

for(k=1;k<7;k++)//控制循環(huán)次數(shù),一共6次 {

P2=tab[k]; //給P2口送段選碼

dk=1; //打開段選控制的鎖存端,將數(shù)據(jù)送到數(shù)碼管段選端

dk=0; //關(guān)閉段選鎖存端P1.7,將數(shù)據(jù)鎖存

wk=1; //打開位選控制的鎖存端,將數(shù)據(jù)送到數(shù)碼管位選端

P2=col[k-1]; //送位選碼

delay(); //延時(1~2)ms

P2=0xff; //關(guān)閉所有顯示

wk=0; //關(guān)閉位選鎖存端P1.6

}

}

}

顯示結(jié)果如圖3.20所示。圖3.20例3.5顯示結(jié)果

【例3.6】在例3.5電路圖的基礎(chǔ)上,完成從0到99顯示,時間間隔1?s,采用定時器中斷方式編寫程序。

解析:

題目中要求數(shù)碼管從0到99顯示,時間間隔1?s,也就是每1秒數(shù)字增加1。采用定時器中斷的方式就可以準確地產(chǎn)生1?s延時,但是如何能讓數(shù)字不斷的累加呢?定時器本身只能起到定時的作用,所以并不能起到累加的作用,因此我們需要引用一個變量,通過變量的數(shù)值的累加來表示定時的時間,即每當(dāng)定時器定時的時間到1?s后,變量就加1,并將變量的值顯示在數(shù)碼管上,就可以滿足題目要求。由于是0~99顯示,所以顯示的時候我們需要分成個位顯示和十位顯示,引入的變量是代表時間的,也就是說變量是多少,時間就是多少秒,我們只需對變量進行計算,分解成個位和十位然后利用動態(tài)顯示,就可以完成題目要求。

個位與十位的計算方法:如變量為32,我們要想在數(shù)碼管上顯示,就需要把個位上的“2”和十位上的“3”分解出來,具體方法是利用“%取余”、“/除”來實現(xiàn),即

個位=實際數(shù)值%10 32%10=2

十位=實際數(shù)值/10 32/10=3

分解出來的數(shù)值,在進行動態(tài)顯示時就可以完成要求了。程序代碼如下:

#include<reg52.h>

sbitwk=P1^6; //位選使能端

sbitdk=P1^7; //段選使能端

unsignedcharcodetab[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};

unsignedcharcodecol[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf};

unsignedcharsecond=0;

inti,t,ge,shi;

voiddelay()

{

unsignedchari;

for(i=0;i<255;i++);

}

voidtimer_0(void)interrupt1 //定時器中斷函數(shù)

{

TH0=(65535-20000)/256; //20ms定時賦初值

TL0=(65535-20000)%256;

t++; //計算20ms執(zhí)行次數(shù)

if(t==50) //執(zhí)行50次,正好是1s

{

t=0;

second++; //變量加1

if(second>=100)

second=0;

}

}

voidmain()

{

TMOD=0x01; //T0方式1

TH0=(65535-20000)/256; //定時器T0的高四位

TL0=(65535-20000)%256; //定時器T0的低四位

ET0=1; //開定時器T0中斷

EA=1; //開總中斷

TR0=1; //啟動定時器

while(1)

{

ge=second%10; //時間取個位

shi=second/10; //時間取十位

P2=tab[ge]; //個位顯示

dk=1;

dk=0;

P2=0xdf;

wk=1;

delay();

P2=0xff;

wk=0; P2=tab[shi];//十位顯示

dk=1;

dk=0;

P2=0xef;

wk=1;

delay();

P2=0xff;

wk=0;

}

}

顯示結(jié)果如圖3.21所示。圖3.21例3.6顯示結(jié)果*3.4LCD顯示控制

LCD液晶顯示器是LiquidCrystalDisplay的簡稱,LCD的構(gòu)造是在兩片平行的玻璃當(dāng)中放置液態(tài)的晶體,兩片玻璃中間有許多垂直和水平的細小電線,透過通電與否來控制桿狀水晶分子改變方向,將光線折射出來產(chǎn)生畫面。3.4.11602液晶簡介

1602液晶是一種工業(yè)字符型液晶,能夠同時顯示16?×?02即32個字符(16列2行),是一種專門用來顯示字母、數(shù)字、符號等的點陣型液晶模塊。1602由若干個5?×?7或者5?×?11等點陣字符位組成,每個點陣字符位都可以顯示一個字符,每位之間有一個點距的間隔,每行之間也有間隔,起到了字符間距和行間距的作用,正因為如此,1602液晶不能顯示圖形。1602液晶如圖3.22所示。圖3.221602液晶我們以長沙太陽人電子有限公司生產(chǎn)的1602液晶為例,進行說明。

1.?1602的引腳

1602引腳排列及外形尺寸如圖3.23所示。

1602采用標準的16腳接口,其中:

第1腳:VSS為電源地。

第2腳:VDD接5?V電源正極。

第3腳:VL為液晶顯示器對比度調(diào)整端,接正電源時對比度最弱,接地電源時對比度最高(對比度過高時會產(chǎn)生“黑影”,使用時可以通過一個10?kΩ的電位器調(diào)整對比度)。圖3.231602引腳圖第4腳:RS為寄存器選擇,高電平1時選擇數(shù)據(jù)寄存器,低電平0時選擇指令寄存器。

第5腳:RW為讀寫信號線,高電平(1)時進行讀操作,低電平(0)時進行寫操作。

第6腳:E(或EN)端為使能端(enable)。

第7~14腳:D0~D7為8位雙向數(shù)據(jù)端。

第15~16腳:空腳或背燈電源。15腳背光正極,16腳背光負極。

2.基本操作時序

讀狀態(tài):輸入RS?=?L,RW?=?H,E?=?H;輸出D0~D7=狀態(tài)字

寫指令:輸入RS?=?L,RW?=?L,D0~D7=指令碼,E?=?高脈沖;輸出無。

讀數(shù)據(jù):輸入RS?=?H,RW?=?H,E?=?H;輸出:D0~D7?=?數(shù)據(jù)。

寫數(shù)據(jù):輸入RS?=?H,RW?=?L,D0~D7?=?數(shù)據(jù),E?=?高脈沖;輸出無。

3.狀態(tài)字說明

各狀態(tài)字格式說明如下:

4.指令說明

顯示模式設(shè)置如表3-8所示。

顯示開/關(guān)及光標設(shè)置如表3-9所示。

數(shù)據(jù)指針設(shè)置如表3-10所示。

其他設(shè)置如表3-11所示。表3-8顯示模式設(shè)置表

表3-9顯示開/關(guān)及光標設(shè)置表

表3-10數(shù)據(jù)指針設(shè)置表

表3-11其?他?設(shè)?置?表

5.讀操作時序

讀操作時序如圖3.24所示。

6.寫操作時序

寫操作時序如圖3.25所示。

7.時序參數(shù)

時序參數(shù)如表3-12所示。圖3.24讀操作時序圖圖3.25寫操作時序圖表3-12時?序?參?數(shù)?表

8.?1602液晶的初始化過程

1602液晶的初始化過程如下:

延時15?ms

寫指令38H

延時15?ms

寫指令38H

延時15?ms

寫指令38H

(以后每次寫指令、讀/寫數(shù)據(jù)操作之前均需檢測忙信號)

寫指令38H;顯示模式設(shè)置

寫指令08H;顯示關(guān)閉

寫指令01H;顯示清屏

寫指令06H;顯示光標移動設(shè)置

寫指令0CH;顯示開機光標設(shè)置3.4.2LCD應(yīng)用舉例

【例3.7】在圖3.26所示的1602液晶電路上,任意位置上顯示一個字符,用函數(shù)實現(xiàn)。如:在1602液晶第一行,第一個位置顯示字符“M”,試編寫程序。

解析:

(1)硬件電路。硬件電路的連接可以參考長沙太陽人電子有限公司SMC1602ALCM使用說明書。需要說明的是,圖中3腳懸空,在實際應(yīng)用中,需外接滑動變阻器

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論