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

下載本文檔

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

文檔簡(jiǎn)介

項(xiàng)目三單片機(jī)顯示電路與矩陣鍵盤設(shè)計(jì)

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

學(xué)習(xí)目標(biāo)

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

了解單片機(jī)定時(shí)器的概念并掌握單片機(jī)定時(shí)器的用法;

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

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

掌握按鍵消抖的方法;

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

了解LCD的原理及使用方法。能力目標(biāo)

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

3.1中斷系統(tǒng)

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

3.1.1中斷的概念

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

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

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

(3)中斷請(qǐng)求:由中斷源向CPU所發(fā)出的請(qǐng)求中斷的信號(hào)。

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

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

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

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

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

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

1.中斷源

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

1)外部中斷

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

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

2)定時(shí)器溢出中斷

(1)定時(shí)器/計(jì)數(shù)器T0:溢出中斷請(qǐng)求,中斷請(qǐng)求標(biāo)志為TF0。

(2)定時(shí)器/計(jì)數(shù)器T1:溢出中斷請(qǐng)求,中斷請(qǐng)求標(biāo)志為TF1。

2)定時(shí)器溢出中斷

(1)定時(shí)器/計(jì)數(shù)器T0:溢出中斷請(qǐng)求,中斷請(qǐng)求標(biāo)志為TF0。

(2)定時(shí)器/計(jì)數(shù)器T1:溢出中斷請(qǐng)求,中斷請(qǐng)求標(biāo)志為TF1。

3)串行口中斷

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

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

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

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

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

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

TCON的格式如下:

TCON各位功能說明:

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

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

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

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

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

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

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

(7)?TR1:定時(shí)器/計(jì)數(shù)器T1的啟動(dòng)標(biāo)志位,功能與TR0的相同。

(8)?TF1:定時(shí)器/計(jì)數(shù)器T1的溢出中斷請(qǐng)求標(biāo)志位。功能與TF0的相同。

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

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

SCON的格式如下:中斷標(biāo)志位功能說明:

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

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

(2)?RI:串行口接收中斷請(qǐng)求標(biāo)志位。

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

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

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

IE的格式如下:

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

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

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

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

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

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

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

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

EA=1;//開放總中斷

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

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

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

IP的格式如下:

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

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

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

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

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

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

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

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

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

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

n:中斷源的編號(hào),5個(gè)中斷源的編號(hào)如表3-1所示。

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

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

voidtime0(void)interrupt1

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

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

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)滅。初始時(shí),P2口控制的LED狀態(tài)為全滅。圖3.3例3.1原理圖解析:

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

【知識(shí)引入:按鍵的消抖】

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

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

P2=0xff;

delay_10ms(50);

P2=0x0;

delay_10ms(50);

10?ms的延時(shí)程序,我們可以利用之前編寫的帶參數(shù)延時(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ù)名和中斷源編號(hào),由于是外部中斷1,所以編號(hào)為2

{

}

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

sbitkey=P3^3;

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

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

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

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

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

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

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

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

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

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

EA=1; //開總中斷

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

#include<reg52.h>

sbitkey=P3^3;

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

/*10ms延時(shí)程序*/

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+系列單片機(jī)的定時(shí)器

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

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

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

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

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

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

1.模式寄存器(TMOD)

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

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

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

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

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

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

1)工作模式0

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

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

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

(1)將定時(shí)時(shí)長(zhǎng)t除以12/fsoc。

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

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

TCON寄存器的設(shè)置如表3-4所示。表3-4工作模式0的TCON寄存器設(shè)置單片機(jī)的晶振為12?MHz,定時(shí)器內(nèi)的計(jì)數(shù)加“1”,耗時(shí)為1?μs,現(xiàn)在要計(jì)時(shí)5?ms,即定時(shí)器寄存器中的數(shù)應(yīng)該增加5000。因此存入定時(shí)器計(jì)數(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;//定時(shí)器初始化

TH0=0xc7;

TL0=0x18;

TR0=1;

while(1)

{

if(TF0==1)

{

d1=~d1;

TR0=0;

TH0=0xc7;

TL0=0x18;

}

}

}

2)工作模式1

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

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

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

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

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

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

(1)將定時(shí)時(shí)長(zhǎng)t除以12/fsoc。

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

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

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

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

程序部分如下:

#include<reg52.h>

sbitd1=P1^0;

voidmain(void)

{

TMOD=0x01;//定時(shí)器初始化

TH0=0xce;

TL0=0x78;

TR0=1;

while(1)

{

if(TF0==1)

{

d1=~d1;

TR0=0;

TH0=0xce;

TL0=0x78;

}

}

}

3)工作模式2

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

(1)將定時(shí)時(shí)長(zhǎng)t除以12/fsoc。

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

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

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

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

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

程序部分如下:

#include<reg52.h>

sbitd1=P1^1;

unsignedchartemp;

voidmain(void)

{

TMOD=0x02; //定時(shí)器初始化

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

1.定時(shí)器查詢方式的使用方法

定時(shí)器查詢方式使用步驟如下:

(1)對(duì)定時(shí)器初始化并賦初值;

(2)啟動(dòng)定時(shí)器;

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

#include<reg52.h>

voidmain()

{

unsignedcharcount,temp=0x01;

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

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

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

TR0=1; //啟動(dòng)定時(shí)器0 while(1)

{

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

{

temp=0x01;

}

P2=temp;

temp=temp<<1;

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

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

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

TF0=0; //手動(dòng)將溢出標(biāo)志位清零

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

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

}

}

}

2.定時(shí)器中斷方式的使用方法

定時(shí)器中斷方式使用方法如下:

(1)對(duì)定時(shí)器初始化并賦初值;

(2)啟動(dòng)定時(shí)器;

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

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

具體步驟如下:

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

(2)定時(shí)器初始化;

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

(4)打開總中斷;

(5)啟動(dòng)定時(shí)器;

(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) //定時(shí)時(shí)間達(dá)到1s執(zhí)行LED移位功能

{

count=0;

P2=temp;

temp=temp<<1;

if(temp==0)

{

temp=0x01;

}

}

}

voidmain()

{

TMOD=0x01; //定時(shí)器0,工作方式1

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

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

ET0=1; //開定時(shí)器0中斷

EA=1; //開總中斷

TR0=1; //啟動(dòng)定時(shí)器

P2=0;

while(1);

}

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

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ù)點(diǎn))),如圖3.13所示。八段數(shù)碼管比七段數(shù)碼管多一個(gè)發(fā)光二極管單元(多一個(gè)小數(shù)點(diǎn)顯示)。數(shù)碼管按顯示數(shù)字的位數(shù)可分為1位、2位、3位、4位數(shù)碼管,如圖3.14所示的為一個(gè)1位和4位數(shù)碼管。

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

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

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

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

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

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

1.靜態(tài)顯示

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

2.動(dòng)態(tài)顯示

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

【例3.2】在圖3.17所示電路中,使數(shù)碼管的每個(gè)段依次點(diǎn)亮,時(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就可以達(dá)到題目要求。

(2)程序流程。要想達(dá)到題目要求,只需要使P2.0~P2.7循環(huán)輸出1,再加入500?ms延時(shí)即可。為了使程序簡(jiǎn)潔,我們可以使用左移和循環(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);

}

}

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

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

1.一維數(shù)組

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

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

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

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

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

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

常量表達(dá)式——表示該數(shù)組具有的元素個(gè)數(shù),也稱為數(shù)組的長(zhǎng)度。

如:

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

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

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

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

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

(2)?C編譯系統(tǒng)對(duì)數(shù)組下標(biāo)不進(jìn)行越界檢查。

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

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

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

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

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

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

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

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

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

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

2.二維數(shù)組

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

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

類型說明符數(shù)組名[常量表達(dá)式1][常量表達(dá)式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ù)組名[下標(biāo)1][下標(biāo)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}};

第一個(gè)大括號(hào)是給第一行元素賦值,第二個(gè)大括號(hào)是給第二行元素賦值。

(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ū)別是在顯示時(shí),例3.2中是顯示每個(gè)段,而在本題目中,則是顯示數(shù)字0~9,因此在控制時(shí)不僅僅只有1個(gè)段亮,而是需要幾個(gè)段同時(shí)亮來組成數(shù)字0~9。如表3-7所示。

我們只需要使P2口輸出以上0~9的段碼并延時(shí),就可以達(dá)到要求。需要指出的是,共陽數(shù)碼管和共陰數(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++; //下標(biāo)值加1

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

{

i=0;

}

}

}

【例3.4】按鍵與數(shù)碼管。設(shè)計(jì)一個(gè)用按鍵控制數(shù)碼管顯示電路。初始時(shí)數(shù)碼管顯示0,每按一次按鍵,數(shù)碼管顯示的數(shù)值加1,加到9后再按按鈕時(shí),數(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ù)字時(shí),需要判斷按鍵是否按下,如果按鍵已經(jīng)確定按下,則顯示的數(shù)字加1。所以,程序代碼只需加入判斷按鍵是否按下,再結(jié)合例3.3中的代碼,就可以達(dá)到要求。

程序代碼如下:

#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; //定義一個(gè)變量i,方便引用數(shù)組元素

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

while(1)

{

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

{

delay_10ms(1); //延時(shí)消抖

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

{

i++; //i的值加1

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

{

i=0;

}

P2=table[i];

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

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

delay_10ms(1);

while(!key);

}

}

}

}

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

解析:

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

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

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

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

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

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

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

//段選碼)

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

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

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

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

延時(shí); //延時(shí)(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延時(shí)*/

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(); //延時(shí)(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顯示,時(shí)間間隔1?s,采用定時(shí)器中斷方式編寫程序。

解析:

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

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

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

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

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

#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í)器中斷函數(shù)

{

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

TL0=(65535-20000)%256;

t++; //計(jì)算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; //定時(shí)器T0的高四位

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

ET0=1; //開定時(shí)器T0中斷

EA=1; //開總中斷

TR0=1; //啟動(dòng)定時(shí)器

while(1)

{

ge=second%10; //時(shí)間取個(gè)位

shi=second/10; //時(shí)間取十位

P2=tab[ge]; //個(gè)位顯示

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

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

1.?1602的引腳

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

1602采用標(biāo)準(zhǔn)的16腳接口,其中:

第1腳:VSS為電源地。

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

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

第5腳:RW為讀寫信號(hào)線,高電平(1)時(shí)進(jìn)行讀操作,低電平(0)時(shí)進(jìn)行寫操作。

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

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

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

2.基本操作時(shí)序

讀狀態(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)及光標(biāo)設(shè)置如表3-9所示。

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

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

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

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

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

5.讀操作時(shí)序

讀操作時(shí)序如圖3.24所示。

6.寫操作時(shí)序

寫操作時(shí)序如圖3.25所示。

7.時(shí)序參數(shù)

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

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

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

延時(shí)15?ms

寫指令38H

延時(shí)15?ms

寫指令38H

延時(shí)15?ms

寫指令38H

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

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

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

寫指令01H;顯示清屏

寫指令06H;顯示光標(biāo)移動(dòng)設(shè)置

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

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

解析:

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

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論