《單片機(jī)技術(shù)》課件項(xiàng)目四 單片機(jī)頻率計(jì)設(shè)計(jì)_第1頁
《單片機(jī)技術(shù)》課件項(xiàng)目四 單片機(jī)頻率計(jì)設(shè)計(jì)_第2頁
《單片機(jī)技術(shù)》課件項(xiàng)目四 單片機(jī)頻率計(jì)設(shè)計(jì)_第3頁
《單片機(jī)技術(shù)》課件項(xiàng)目四 單片機(jī)頻率計(jì)設(shè)計(jì)_第4頁
《單片機(jī)技術(shù)》課件項(xiàng)目四 單片機(jī)頻率計(jì)設(shè)計(jì)_第5頁
已閱讀5頁,還剩97頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

一、學(xué)習(xí)目標(biāo)1.了解定時(shí)/計(jì)數(shù)器的結(jié)構(gòu)及其工作原理。2.掌握單片機(jī)的定時(shí)/計(jì)數(shù)器控制方式。3.掌握應(yīng)用單片機(jī)進(jìn)行頻率測(cè)試控制的原理。4.掌握液晶的使用方法。二、學(xué)習(xí)任務(wù)任務(wù)一方波信號(hào)的產(chǎn)生;任務(wù)二單片機(jī)驅(qū)動(dòng)液晶;任務(wù)三單片機(jī)簡易頻率計(jì)設(shè)計(jì)。三、任務(wù)分解任務(wù)一方波信號(hào)的產(chǎn)生【任務(wù)描述】本任務(wù)采用AT89C51單片機(jī),利用定時(shí)/計(jì)數(shù)器T0通過P1.1引腳輸出周期為500Hz的方波。【任務(wù)描述】【任務(wù)分析】從P1.1引腳輸出周期為500Hz的方波信號(hào),實(shí)際就是要產(chǎn)生周期為2ms的方波,只要每1ms將信號(hào)的幅值由0變到1或由1變到0即可,可采用取反指令來實(shí)現(xiàn)。為了提高CPU的效率,可采用定時(shí)中斷的方式,每1ms產(chǎn)生一次中斷,在中斷服務(wù)程序中將輸出信號(hào)取反即可?!鞠嚓P(guān)知識(shí)】內(nèi)設(shè)2個(gè)16位可編程定時(shí)/計(jì)數(shù)器T0,T1具有計(jì)數(shù)方式和定時(shí)方式4種工作模式一、定時(shí)器的結(jié)構(gòu)及工作原理組成:兩個(gè)16位的定時(shí)器T0和T1,以及他們的工作方式寄存器TMOD和控制寄存器TCON等組成。內(nèi)部通過總線與CPU相連。定時(shí)器T0和T1各由兩個(gè)8位特殊功能寄存器TH0、TL0、TH1、TL1構(gòu)成。工作方式寄存器TMOD:用于設(shè)置定時(shí)器的工作模式和工作方式;控制寄存器TCON:用于啟動(dòng)和停止定時(shí)器的計(jì)數(shù),并控制定時(shí)器的狀態(tài);單片機(jī)復(fù)位時(shí),兩個(gè)寄存器的所有位都被清0。8051定時(shí)器內(nèi)部結(jié)構(gòu)框圖一、定時(shí)器的結(jié)構(gòu)及工作原理兩個(gè)可編程的定時(shí)器/計(jì)數(shù)器T1、T0。每個(gè)定時(shí)器內(nèi)部結(jié)構(gòu)實(shí)際上就是一個(gè)可編程的加法計(jì)數(shù)器,由編程來設(shè)置它工作在定時(shí)狀態(tài)還是計(jì)數(shù)狀態(tài)。兩種工作模式: (1)計(jì)數(shù)器工作模式

就是對(duì)外部事件進(jìn)行計(jì)數(shù)。計(jì)數(shù)脈沖來自相應(yīng)的外部輸入引腳T0(P3.4)或T1(P3.5)。當(dāng)輸入信號(hào)發(fā)生由1至0的負(fù)跳變(下降沿)時(shí),計(jì)數(shù)器(TH0,TL0或TH1,TL1)的值增1。計(jì)數(shù)的最高頻率一般為振蕩頻率的1/24。Why? (2)定時(shí)器工作模式

也是通過計(jì)數(shù)實(shí)現(xiàn)的。計(jì)數(shù)脈沖來自內(nèi)部時(shí)鐘脈沖,每個(gè)機(jī)器周期計(jì)數(shù)值增1,每個(gè)機(jī)器周期=12個(gè)振蕩周期,因此計(jì)數(shù)頻率為振蕩頻率的1/12。所以定時(shí)時(shí)間=計(jì)數(shù)值×機(jī)器周期。4種工作方式(方式0-方式3)。一、定時(shí)器的結(jié)構(gòu)及工作原理當(dāng)控制信號(hào)定時(shí)器工作在定時(shí)方式;加1計(jì)數(shù)器對(duì)脈沖f進(jìn)行計(jì)數(shù),每來一個(gè)脈沖,計(jì)數(shù)器加1,直到計(jì)時(shí)器計(jì)滿溢出;因?yàn)?,即一個(gè)計(jì)數(shù)脈沖的周期就是一個(gè)機(jī)器周期;計(jì)數(shù)器計(jì)數(shù)的是機(jī)器周期脈沖個(gè)數(shù)。從而實(shí)現(xiàn)定時(shí)。當(dāng)控制信號(hào)定時(shí)器工作在計(jì)數(shù)方式;加1計(jì)數(shù)器對(duì)來自輸入引腳T0(P3.4)和T1(P3.5)的外信號(hào)脈沖進(jìn)行計(jì)數(shù),每來一個(gè)脈沖,計(jì)數(shù)器加1,直到計(jì)時(shí)器計(jì)滿溢出;TxTHxTFxTLxTRxINTx定時(shí)計(jì)數(shù)

控制信號(hào)K“1”啟動(dòng),計(jì)數(shù)器運(yùn)行;“0”停止,計(jì)數(shù)器停止;定時(shí)器/計(jì)數(shù)器原理框圖加1計(jì)數(shù)器控制信號(hào)K可以控制計(jì)數(shù)器的“啟動(dòng)”和“停止”,

TCON(88H)振蕩周期:是振蕩脈沖的周期,也成為“拍”,用P表示。就是晶體振蕩器的周期,或外部振蕩脈沖的周期。是MCS-51單片機(jī)的最小時(shí)序單位。P1P2S1振蕩周期時(shí)鐘周期機(jī)器周期機(jī)器周期指令周期XTAL2(OSC)S2S3S4S5S6S1S2S4S5S3S6P1P1P1P1P1P1P1P1P1P1P1P2P2P2P2P2P2P2P2P2P2P2時(shí)鐘周期:是振蕩源信號(hào)經(jīng)二分頻后形成的時(shí)鐘脈沖信號(hào),用S表示。每個(gè)時(shí)鐘周期分成P1、P2兩個(gè)節(jié)拍,又被稱為一個(gè)狀態(tài)。是MCS-51單片機(jī)的最基本的時(shí)序單位。機(jī)器周期:通常將完成一個(gè)基本操作所需的時(shí)間稱為機(jī)器周期,由6個(gè)狀態(tài)(12拍)組成,所以一個(gè)機(jī)器周期可以依次表示為S1P1、S2P2……S6P1、S6P2。通常算術(shù)邏輯操作發(fā)生在節(jié)拍P1期間,而內(nèi)部寄存器到寄存器的傳送發(fā)生在節(jié)拍P2期間。指令周期:是指CPU執(zhí)行一條指令所需要的時(shí)間。是MCS-51單片機(jī)的最大的時(shí)序單位,由若干個(gè)振蕩周期組成。一個(gè)指令周期通常含有1~4個(gè)機(jī)器周期,MCS-51典型的指令周期為一個(gè)機(jī)器周期。

振蕩周期、時(shí)鐘周期、機(jī)器周期和指令周期在每個(gè)機(jī)器周期的S5P2期間采樣檢測(cè)引腳輸入電平。若前一個(gè)機(jī)器周期采樣值為“1”,后一個(gè)機(jī)器周期采樣值為“0”,則計(jì)數(shù)器加1。新的計(jì)數(shù)值在檢測(cè)到輸入引腳電平發(fā)生“1”到“0”的負(fù)跳變(下降沿)后,于下一個(gè)機(jī)器周期的S3P1期間裝入計(jì)數(shù)器中。由于CPU需要兩個(gè)機(jī)器周期來識(shí)別一個(gè)“1”到“0”的跳變信號(hào),所以最高的計(jì)數(shù)頻率為振蕩周期的1/24。P1P2S1振蕩周期狀態(tài)周期機(jī)器周期機(jī)器周期指令周期XTAL2(OSC)S2S3S4S5S6S1S2S4S5S3S6P1P1P1P1P1P1P1P1P1P1P1P2P2P2P2P2P2P2P2P2P2P2定時(shí)/計(jì)數(shù)器對(duì)輸入信號(hào)的要求外部計(jì)數(shù)脈沖的最高頻率為系統(tǒng)振蕩器頻率的1/24,例如選用12MHz頻率的晶體,則可輸入500KHz的外部脈沖。輸入信號(hào)的高、低電平至少要分別保持一個(gè)機(jī)器周期。 如圖所示,圖中Tcy為機(jī)器周期??删幊潭〞r(shí)器的工作方式、啟動(dòng)、停止、溢出標(biāo)志、計(jì)數(shù)器等都是可編程的——通過設(shè)置寄存器TMOD,TCON,TH0,TL0,TH1和TL1實(shí)現(xiàn)。當(dāng)設(shè)置了定時(shí)器的工作方式并啟動(dòng)定時(shí)器工作后,定時(shí)器就按被設(shè)定好的工作方式獨(dú)立工作,不再占用CPU,只有在計(jì)數(shù)器計(jì)滿溢出時(shí)才向CPU申請(qǐng)中斷,占用CPU。由此可見,定時(shí)器是單片機(jī)中工作效率高且應(yīng)用靈活的部件。二、定時(shí)器的TMOD和TCON寄存器8051單片機(jī)定時(shí)器主要有幾個(gè)特殊功能寄存器組成: TMOD,TCON,TH0,TL0,TH1,TL1。TMOD:設(shè)置定時(shí)器的工作方式;TCON:控制定時(shí)器的啟動(dòng)和停止;TH0和TL0

:存放定時(shí)器T0的初值或計(jì)數(shù)結(jié)果;TH0存放高8位,TL0存放低8位;TH1和TL1

:存放定時(shí)器T1的初值或計(jì)數(shù)結(jié)果;TH1存放高8位,TL1存放低8位;

8位分為兩組,高4位控制T1,低4位控制T0。(1)GATE—門控位

0:

以TRX(X=0,1)來啟動(dòng)定時(shí)器/計(jì)數(shù)器運(yùn)行。

1:

用外中斷引腳(INT0*或INT1*)上的高電平和TRX來啟 動(dòng)定時(shí)器/計(jì)數(shù)器運(yùn)行。(2)M1、M0—工作方式選擇位

M1M0

工作方式

00

方式0,13位定時(shí)器/計(jì)數(shù)器。

01

方式1,16位定時(shí)器/計(jì)數(shù)器。

10

方式2,8位常數(shù)自動(dòng)重新裝載

11

方式3,僅適用于T0,

T0分成兩個(gè)8位計(jì)數(shù)器,T1停止計(jì)數(shù)。(3)C/T*—計(jì)數(shù)器模式和定時(shí)器模式選擇位

0:

定時(shí)器模式。

1:

計(jì)數(shù)器模式。(4)TMOD無位地址,不能位尋址。(5)復(fù)位時(shí),TMOD所有位均為“0”。低4位與外部中斷有關(guān),后面介紹。高4位的功能如下:

(1)TF1、TF0

—計(jì)數(shù)溢出標(biāo)志位 定時(shí)器T0或T1計(jì)數(shù)溢出時(shí),由硬件自動(dòng)將此位置“1”;

TFx可以由程序查詢,也是定時(shí)中斷的請(qǐng)求源;

(2)TR1、TR0

—計(jì)數(shù)運(yùn)行控制位

TRx=1:

啟動(dòng)定時(shí)器/計(jì)數(shù)器工作

TRx=0:

停止定時(shí)器/計(jì)數(shù)器工作MCS-51單片機(jī)的定時(shí)器/計(jì)數(shù)器是可編程的,但在進(jìn)行定時(shí)或計(jì)數(shù)之前要對(duì)程序進(jìn)行初始化,具體步驟如下:(1)對(duì)TMOD賦值,以確定定時(shí)器的工作模式;(2)置定時(shí)/計(jì)數(shù)器初值,直接將初值寫入寄存器的TH0、TL0或TH1、TL1;(3)根據(jù)需要,對(duì)IE置初值,開放定時(shí)器中斷;(4)對(duì)TCON寄存器中的TR0或TR1置位,啟動(dòng)定時(shí)/計(jì)數(shù)器,置位以后,計(jì)數(shù)器即按規(guī)定的工作模式和初值進(jìn)行計(jì)數(shù)或開始定時(shí)。初值計(jì)算:

設(shè)計(jì)數(shù)器的最大值為M,則置入的初值X為:計(jì)數(shù)方式:X=M-計(jì)數(shù)值定時(shí)方式:由(M-X)T=定時(shí)值,得X=M-定時(shí)值/TT為計(jì)數(shù)周期,是單片機(jī)的機(jī)器周期。(模式0:M為213,模式1:M為216,模式2和3:M為28)例如:機(jī)器周期為1μs時(shí),若工作在模式0,則最大定時(shí)值為:213×1μs=8.192ms

若工作在模式1,則最大定時(shí)值為:216×1μs=65.536ms三、定時(shí)器的工作方式MCS-51的定時(shí)器T0有4種工作方式: 即:方式0,方式1,方式2,方式3。MCS-51的定時(shí)器T1有3種工作方式: 即:方式0,方式1,方式2。1.方式0

M1、M0設(shè)置為00,為13位計(jì)數(shù)器,以T1為例,其框圖如下:計(jì)數(shù)脈沖輸入加1計(jì)數(shù)器TH1D12D11D10D9D8D7D6D5TL1×

×

×

D4D3D2D1D0在這種方式下,16位寄存器TH1和TL1只用13位,由TH1的8位和TL1的低5位組成。TL1的高3位不定。當(dāng)TL1的低5位計(jì)數(shù)溢出時(shí),向TH1進(jìn)位。而TH1計(jì)數(shù)溢出時(shí),則向中斷標(biāo)志位TF1進(jìn)位(即硬件將TF1置1),并請(qǐng)求中斷??赏ㄟ^查詢TF1是否置“1”或考察中斷是否發(fā)生來判定定時(shí)器T1的操作完成與否。當(dāng)C/T=0時(shí),為定時(shí)工作模式,開關(guān)接到振蕩器的12分頻器輸出上,計(jì)數(shù)器對(duì)機(jī)器周期脈沖計(jì)數(shù)。其定時(shí)時(shí)間為:

(213-初值)×振蕩周期×12

例如:若晶振頻率為12MHz,則最長的定時(shí)時(shí)間為(213-0)×(1/12)×12us=8.191ms當(dāng)C/T=1時(shí),為計(jì)數(shù)工作模式,開關(guān)與外部引腳T1(P3.5)接通,計(jì)數(shù)器對(duì)來自外部引腳的輸入脈沖計(jì)數(shù)。當(dāng)外部信號(hào)發(fā)生負(fù)跳變時(shí)計(jì)數(shù)器加1。

GATE控制定時(shí)器Tx(T1或T0)的條件:(1)當(dāng)GATE=0時(shí),“或門”輸出恒為1,“與門”的輸出信號(hào)K由TRx決定(即此時(shí)K=TRx),定時(shí)器不受INTx輸入電平的影響,由TRx直接控制定時(shí)器的啟動(dòng)和停止。

TRx=1;計(jì)數(shù)啟動(dòng);

TRx=0;計(jì)數(shù)停止;(2)當(dāng)GATE=1時(shí),“與門”的輸出信號(hào)K由INTx輸入電平和TRx位的狀態(tài)一起決定(即此時(shí)K=TRx·INTx), 當(dāng)且僅當(dāng)TRx=1且INTx=1(高電平)時(shí),計(jì)數(shù)啟動(dòng);

否則,計(jì)數(shù)停止。

返回2.方式1

M1、M0=01,為16位的計(jì)數(shù)器,除位數(shù)外,其他與方式0相同。其定時(shí)時(shí)間為:

(216-初值)×振蕩周期×12

例如:若晶振頻率為12MHz,則最長的定時(shí)時(shí)間為

(216-0)×(1/12)×12us=65.536ms2.方式2

M1、M0=10,為自動(dòng)恢復(fù)初值的8位計(jì)數(shù)器,等效框圖如下:TLx作為8位計(jì)數(shù)器,THx作為重置初值的緩沖器。

THx作為常數(shù)緩沖器,當(dāng)TLx計(jì)數(shù)溢出時(shí),在置“1”溢出標(biāo)志TFx的同時(shí),還自動(dòng)的將THx中的初值送至TLx,使TLx從初值開始重新計(jì)數(shù)。定時(shí)器/計(jì)數(shù)器的方式2工作過程如圖(x=0,1)。優(yōu)點(diǎn):

方式0和方式1用于循環(huán)重復(fù)定時(shí)或計(jì)數(shù)時(shí),在每次計(jì)數(shù)器擠滿溢出后,計(jì)數(shù)器復(fù)0。若要進(jìn)行新一輪的計(jì)數(shù),就得重新裝入計(jì)數(shù)初值。這樣一來不僅造成編程麻煩,而且影響定時(shí)精度。而方式2具有初值自動(dòng)裝入的功能,避免了這個(gè)缺點(diǎn),可實(shí)現(xiàn)精確的定時(shí)。缺點(diǎn): 只有8位計(jì)數(shù)器,定時(shí)時(shí)間短、計(jì)數(shù)范圍小。其定時(shí)時(shí)間為:

(28-初值)×振蕩周期×12若晶振頻率為12MHz,則最長的定時(shí)時(shí)間為(28-0)×(1/12)×12us=0.256ms方式2工作過程圖

(x=0,1)。3.方式3

只適用于定時(shí)器/計(jì)數(shù)器T0。T1不能工作在方式3。 如果將T1置為方式3,則相當(dāng)于TR1=0,停止計(jì)數(shù)(此時(shí)T1可用來作串行口波特率產(chǎn)生器)。1.工作方式3下的T0

T0在方式3時(shí)被拆成兩個(gè)獨(dú)立的8位計(jì)數(shù)器:TH0和TL0。

8位計(jì)數(shù)器TL0使用T0的狀態(tài)控制位C/T*、GATE、TR0、INT0,它既可以工作在定時(shí)方式,也可以工作在計(jì)數(shù)方式。8位定時(shí)器TH0被固定為一個(gè)8位定時(shí)器(不能作外部計(jì)數(shù)模式),并使用定時(shí)器T1的狀態(tài)控制位TR1,同時(shí)占用定時(shí)器T1的中斷請(qǐng)求源TF1。此時(shí),定時(shí)器TH0的啟動(dòng)或停止只受TR1控制。

TR1=1時(shí),啟動(dòng)TH0的計(jì)數(shù);TR1=0時(shí),停止TH0的計(jì)數(shù)各引腳與T0的邏輯關(guān)系如圖所示:2.T0工作在方式3下T1的各種工作方式注意:當(dāng)T0處于方式3時(shí),T1仍可設(shè)置為方式0、方式1和方式2。當(dāng)時(shí)由于TR1、TF1和T1的中斷源都已被定時(shí)器T0(中的TH0)占用,所以定時(shí)器T1僅有控制位C/T來決定其工作在定時(shí)方式或計(jì)數(shù)方式。當(dāng)計(jì)數(shù)器計(jì)滿溢出時(shí),不能置位“TF1”,而只能將輸出送往串口。所以,此時(shí)定時(shí)器T1一般用作串口的波特率發(fā)生器,或不需要中斷的場(chǎng)合。

(1)T1工作在方式0(2)T1工作在方式1(3)T1工作在方式2【例4-1】若單片機(jī)的頻率為12MHz,請(qǐng)計(jì)算2ms所需要的定時(shí)器初值。解:在頻率為12MHz時(shí),每個(gè)計(jì)數(shù)脈沖的時(shí)間間隔為0.001ms,所以其計(jì)數(shù)脈沖個(gè)數(shù)為2/0.001=1000個(gè)。在方式0,則計(jì)數(shù)初值為:213-2000=6192=1100000110000B即:(TH0)=11000001B=0xC1(取初值X的高8位),(TL0)=00010000B=0x10(取初值X的低5位,TL0寄存器在方式0下只用到低5位,高3位未使用,TH0使用了8位,一共的計(jì)數(shù)位是8+5=13位)所以定時(shí)器的初值為(TH0)=0xC1,(TL0)=00010000B=0x10H?!救蝿?wù)實(shí)施】P1.0引腳輸出方波電路對(duì)應(yīng)的程序代碼如下:#include<reg51.h>//定義頭文件sbitP1_1=P1^1;voidtimer0(void)interrupt1//定時(shí)器0中斷服務(wù)程序

{TH0=0xE0;TL0=0x18; //裝入時(shí)間常數(shù)P1_1=!P1_1; //P1.1取反

}voidmain(void){TMOD=0x00; //定時(shí)器0方式0TH0=0xE0;TL0=0x18; //裝入時(shí)間常數(shù)TR0=1; //啟動(dòng)定時(shí)器TF0=0;EA=1; //開全局中斷

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

while(1); //主程序死循環(huán),空等待

}【進(jìn)階提高】前面我們已經(jīng)熟悉了定時(shí)器的一般應(yīng)用,如果定時(shí)器要實(shí)現(xiàn)比較長時(shí)間的定時(shí),還能用我們之前介紹的方法予以解決嗎?使用定時(shí)器T0的中斷來控制P2.0引腳LED的閃爍,要求閃爍周期2s,即亮1s,滅1s。定時(shí)器T0工作于方式1時(shí),其最大可計(jì)脈沖數(shù)次數(shù)為65536,對(duì)于12MHz的時(shí)鐘頻率,一個(gè)脈沖的寬度為1.00μs,則最大計(jì)時(shí)長度只有1.00×65536=65536μs,即大約65ms。所以要計(jì)時(shí)1s或更長的時(shí)間,還需采用一種被稱作“軟件計(jì)數(shù)”的方法:加入我們?cè)O(shè)定定時(shí)時(shí)間為50ms,設(shè)置一個(gè)變量Countor來儲(chǔ)存定時(shí)器T0的中斷次數(shù),即每產(chǎn)生1次50ms定時(shí)中斷,使變量Countor自加1,那么當(dāng)Countor自加20次時(shí),所計(jì)時(shí)間就是1s。#include<reg51.h>#defineuintunsignedint#defineucharunsignedcharsbitLED=P1^0;uintCount=0;voidmain(){TMOD=0x01;//設(shè)置定時(shí)器0為工作方式1TH0=0x3C;TL0=0xB0;EA=1;//開總中斷

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

TR0=1;//啟動(dòng)定時(shí)器0while(1){if(TF0==1){TF0=0;TH0=0x3c;//1次定時(shí)100ms,計(jì)數(shù)10次,就為1秒。

TL0=0xb0;}if(Count==20){Count=0;LED=~LED;}}}voidtime0()interrupt1{Count++;}任務(wù)二單片機(jī)驅(qū)動(dòng)液晶【任務(wù)描述】單片機(jī)驅(qū)動(dòng)液晶1602,能夠?qū)⒂⑽暮蛿?shù)字顯示出來。本任務(wù)要求設(shè)計(jì)LCD1602與單片機(jī)的接口電路,編寫程序使LCD1602的第一行顯示“OK”,第二行顯示“AT89C51”?!救蝿?wù)分析】最直接把要顯示的內(nèi)容寫在數(shù)組里,程序開始LCD初始化,寫字符顯示位置指令,滿足其各種時(shí)序要求,然后根據(jù)顯示的字符所占的位數(shù),寫個(gè)for循環(huán)語句,放入數(shù)據(jù)函數(shù),這樣就可以在指定位置開始顯示要顯示的內(nèi)容?!鞠嚓P(guān)知識(shí)】一、液晶1602驅(qū)動(dòng)方法VL-液晶屏對(duì)比度的調(diào)節(jié)L命令是對(duì)液晶屏顯示的設(shè)置H數(shù)據(jù)是要顯示的東西51單片機(jī)的1602液晶1602液晶的存儲(chǔ)器結(jié)構(gòu)1.DDRAM:顯示數(shù)據(jù)RAM,用來寄存待顯示的字符代碼。共80個(gè)字節(jié),其地址和屏幕的對(duì)應(yīng)關(guān)系如下圖:要在屏幕上顯示字符,只需向相關(guān)DDRAM中寫入該字符的ASCII碼即可。1602液晶的存儲(chǔ)器結(jié)構(gòu)2.CGROM:字符發(fā)生存儲(chǔ)器,已經(jīng)存儲(chǔ)了160個(gè)不同的點(diǎn)陣字符圖形,按ASCII碼排列,如下圖所示:字符代碼:0x00~0x0F為用戶自定義的字符圖形RAM。0x20~0x7F為標(biāo)準(zhǔn)的ASCII碼。0xA0~0xFF為日文字符和希臘文字符。1602液晶的存儲(chǔ)器結(jié)構(gòu)3.CGRAM:用戶自定義字符發(fā)生存儲(chǔ)器,共64字節(jié),地址為0x00~0x3f,可存儲(chǔ)8個(gè)5*8點(diǎn)陣圖形,其中地址0x00~0x07存儲(chǔ)字符代碼為0x00的字符圖形,0x08~0x0f存儲(chǔ)字符代碼為0x01的字符圖形,以此類推。voidLCD_write_cmd(unsignedcharcmd){ LCD_check_busy(); delay(1); LCD_RS=0; LCD_RW=0; LCD_DATA=cmd; delay(50); LCD_EN=1; delay(50); LCD_EN=0; delay(50);}液晶顯示

750x38E使能高電平命令選擇DB0-DB7使能E開使能E關(guān)寫命令子函數(shù)寫數(shù)據(jù)子函數(shù)E使能高電平數(shù)據(jù)選擇DB0-DB7使能E開使能E關(guān)段位都關(guān)上,關(guān)液晶0x380x0e=0000.11100x06=0000.0110初始化子函數(shù)初始化子函數(shù)ILIKEMCU!一共11位0X18左移一下

1602液晶總結(jié):(1)寫命令子函數(shù)(2)寫數(shù)據(jù)子函數(shù)(3)初始化子函數(shù)(4)Main第一行顯示,第二行顯示,移動(dòng)?!救蝿?wù)實(shí)施】#include<reg51.h>#include<intrins.h>#defineuintunsignedint//預(yù)定義一下#defineucharunsignedcharsbitrs=P3^5;//1602的數(shù)據(jù)/指令選擇控制線sbitrw=P3^6;//1602的讀寫控制線sbiten=P3^7;//1602的使能控制線#defineDataPortP2/*P2口接1602的D0~D7,注意不要接錯(cuò)了順序*/ucharcodetable[]="OK?";//要顯示的內(nèi)容1放入數(shù)組tableucharcodetable1[]="AT89C51";//要顯示的內(nèi)容2放入數(shù)組table1voiddelay(uintn)//延時(shí)函數(shù){uintx,y;for(x=n;x>0;x--)for(y=110;y>0;y--);}voidLCD_Check_Busy(void){while(1){DataPort=0xff;rs=0;rw=1;en=0;_nop_();en=1;if(DataPort&0x80)break;}en=0;delay(2);} voidlcd_wcom(ucharcom)//1602寫命令函數(shù)(單片機(jī)給1602寫命令){LCD_Check_Busy();//1602接收到命令后,不用存儲(chǔ),直接由HD44780執(zhí)行并產(chǎn)生相應(yīng)動(dòng)作

rs=0;//選擇指令寄存器

rw=0;//選擇寫

P2=com;//把命令字送入P2en=1;//使能線電平變化,命令送入1602的8位數(shù)據(jù)口

en=0;}voidlcd_wdat(uchardat)//1602寫數(shù)據(jù)函數(shù){ LCD_Check_Busy();rs=1;//選擇數(shù)據(jù)寄存器

rw=0;//選擇寫

P2=dat;//把要顯示的數(shù)據(jù)送入P2en=1;//使能線電平變化,數(shù)據(jù)送入1602的8位數(shù)據(jù)口

en=0;}voidlcd_init()//1602初始化函數(shù){lcd_wcom(0x38);//8位數(shù)據(jù),雙列,5*7字形

lcd_wcom(0x0c);//開啟顯示屏,關(guān)光標(biāo),光標(biāo)不閃爍

lcd_wcom(0x06);//顯示地址遞增,即寫一個(gè)數(shù)據(jù)后,顯示位置右移一位

lcd_wcom(0x01);//清屏}voidmain()//主函數(shù){ucharn,m=0;lcd_init();//液晶初始化

lcd_wcom(0x80);//顯示地址設(shè)為80H(即00H,)上排第一位(也是執(zhí)行一條命令)

for(m=0;m<4;m++)//將table[]中的數(shù)據(jù)依次寫入1602顯示

{lcd_wdat(table[m]);delay(200);}lcd_wcom(0x80+0x40);//重新設(shè)定顯示地址為0xc4,即下排第一位

for(n=0;n<8;n++)//將table1[]中的數(shù)據(jù)依次寫入1602顯示

{lcd_wdat(table1[n]);delay(200);}while(1);//動(dòng)態(tài)停機(jī)}【進(jìn)階提高】上面驅(qū)動(dòng)液晶1602實(shí)際上沒有判斷液晶忙與否,直接用了延時(shí)函數(shù)延時(shí)達(dá)到單片機(jī)與液晶的同步,下面討論下如何用判斷忙的方法驅(qū)動(dòng)液晶1602。讀忙的時(shí)序?yàn)椋篟S=L,RW=H,E=H

,據(jù)此寫判忙函數(shù):voidLCD_Check_Busy(void){while(1){DataPort=0xff;rs=0;rw=1;en=0;_nop_();en=1;if(DataPort&0x80)break;}en=0;delay(2);}任務(wù)三單片機(jī)簡易頻率計(jì)設(shè)計(jì)【任務(wù)描述】使用如圖4-12所示電路,用AT89C51設(shè)計(jì)一個(gè)數(shù)顯頻率計(jì)數(shù)器對(duì)0~300KHz的方波信號(hào)進(jìn)行測(cè)量,信號(hào)從P3.5引腳輸入,P1、P2口做輸出口,接液晶1602,編寫程序,測(cè)出從P3.5引腳輸入的方波信號(hào)的頻率并顯示出來?!救蝿?wù)分析】在計(jì)數(shù)器工作方式下,加至外部引腳的待測(cè)信號(hào)發(fā)生從1到0的跳變時(shí)計(jì)數(shù)器加1。外部輸入在每個(gè)機(jī)器周期被采樣一次,這樣檢測(cè)一次從1到0的跳變至少需要2個(gè)機(jī)器周期(24個(gè)振蕩周期),所以最大計(jì)數(shù)速率為時(shí)鐘頻率的1/24(使用12MHz時(shí)鐘時(shí),最大計(jì)數(shù)速率為500kHz),也就是說使用12MHz時(shí)鐘的AT89C51單片機(jī)設(shè)計(jì)的頻率計(jì)數(shù)器系統(tǒng),所測(cè)的信號(hào)的頻率不能大于500kHz,若大于則必須通過分頻器分頻才能測(cè)試,而本次任務(wù)的要求是對(duì)0~300KHz的信號(hào)進(jìn)行測(cè)量,所以可以直接進(jìn)行。利用AT89C51單片機(jī)的T0、T1的定時(shí)計(jì)數(shù)器功能,來完成對(duì)輸入的信號(hào)進(jìn)行頻率計(jì)數(shù)。設(shè)置定時(shí)器0工作在定時(shí)方式1,定時(shí)1秒,并產(chǎn)生方波信號(hào)從P1.1引腳輸出。設(shè)置定時(shí)器1工作在計(jì)數(shù)方式1,對(duì)輸入脈沖進(jìn)行計(jì)數(shù),溢出產(chǎn)生中斷。將定時(shí)器1中斷定義為優(yōu)先。由于16位二進(jìn)制加法計(jì)數(shù)器的最大計(jì)數(shù)值為65535,1秒之內(nèi)可能會(huì)產(chǎn)生多次溢出,所以需要在中斷處理程序里對(duì)中斷次數(shù)進(jìn)行計(jì)數(shù)。1秒到后,將中斷次數(shù)和計(jì)數(shù)器里的計(jì)數(shù)值取出進(jìn)行綜合數(shù)據(jù)處理,處理后的數(shù)據(jù)送顯示?!鞠嚓P(guān)知識(shí)】頻率計(jì)計(jì)數(shù)原理:T1工作在計(jì)數(shù)方式時(shí)最大的計(jì)數(shù)值為216,若假設(shè)1S內(nèi)溢出C1次,最后未溢出的計(jì)數(shù)值為C2,則F=C1*216+C2=C1*65536+(TH1*256+TL1)。【任務(wù)實(shí)施】本工程程序一共用了2個(gè)文件,一個(gè)是LCD1602.c和main.c。把這兩個(gè)文件都要添加到工程中,然后再編譯生成hex文件。下面分別給出LCD1602.c和main.c的代碼:LCD1602.c源文件如下://-----------------------------------------------------------------//液晶控制與顯示程序//-----------------------------------------------------------------#include<reg51.h>#include<intrins.h>#defineucharunsignedchar#defineuintunsignedintsbitRS=P2^0; //寄存器選擇線sbitRW=P2^1; //讀/寫控制線sbitEN=P2^2; //使能控制線//sbitBF=P0^7; //LCD忙標(biāo)記//-----------------------------------------------------------------//延時(shí)//-----------------------------------------------------------------voiddelay_ms(uintms){ uchari;while(ms--)for(i=0;i<120;i++);}//-----------------------------------------------------------------//忙檢查//-----------------------------------------------------------------bitLCD_Busy_Wait(){bitresult;RS=0;RW=1;EN=1;_nop_();_nop_();_nop_();_nop_();result=(bit)(P0&0x80);EN=0;returnresult;}//-----------------------------------------------------------------//寫LCD命令//-----------------------------------------------------------------voidWrite_LCD_Command(ucharcmd){while(LCD_Busy_Wait());//判斷LCD是否忙碌RS=0;RW=0;EN=0;_nop_();_nop_();P0=cmd;_nop_();_nop_();_nop_();_nop_();EN=1;_nop_();_nop_();_nop_();_nop_();EN=0;}//-----------------------------------------------------------------//發(fā)送數(shù)據(jù)//-----------------------------------------------------------------voidWrite_LCD_Data(uchardat){while(LCD_Busy_Wait());//判斷LCD是否忙碌RS=1;RW=0;EN=0;P0=dat;_nop_();_nop_();_nop_();_nop_();EN=1;_nop_();_nop_();_nop_();_nop_();EN=0;}//-----------------------------------------------------------------//LCD初始化//-----------------------------------------------------------------voidInitialize_LCD(){ Write_LCD_Command(0x38);delay_ms(10);Write_LCD_Command(0x0c);delay_ms(10);Write_LCD_Command(0x06);delay_ms(10);Write_LCD_Command(0x01);delay_ms(10);}voidlcd_pos(unsignedcharpos)//寫入顯示控制位置命令{Write_LCD_Command(pos|0x80);}//-----------------------------------------------------------------main.c源文件代碼如下:#include<reg51.h>//包含51單片機(jī)寄存器定義的頭文件#defineucharunsignedchar#defineuintunsignedintexterndelay_ms(uintx);externvoidInitialize_LCD();externvoidWrite_LCD_Command(ucharcmd);externvoidWrite_LCD_Data(uchardat);externvoidlcd_pos(ucharpos);externvoidLCD_ShowString(uchar,uchar,uchar*);ucharOutputData[16]={0};//用于存放頻率值的16進(jìn)數(shù)組uchardisplay_data[8]={0,0,0,0,0,0,0,0};//定義數(shù)組存放顯示數(shù)據(jù)的各位ucharc1,b1;sbitP1_1=P1^1;//延時(shí)程序

voidDelayMS(uintValMS){ uintuiVal,ujVal; for(uiVal=0;uiVal<ValMS;uiVal++) for(ujVal=0;ujVal<120;ujVal++);}/**************************************************函數(shù)功能:將數(shù)組轉(zhuǎn)成字符,適合1602顯示***************************************************/voidirwork(){uchari;for(i=0;i<8;i++){ if((display_data[i]%16+'0')==0x3a)//頻率值為0,就對(duì)OutputData[i]賦為0,顯示0OutputData[i]='0';

else{ OutputData[i]=display_data[i]%16+'0';//如果是10進(jìn)數(shù)就轉(zhuǎn)化為16進(jìn)進(jìn)數(shù)顯示}} OutputData[8]='H';

OutputData[9]='z'; OutputData[10]='\0';}voidconvert()//轉(zhuǎn)換程序{uchari,f2;longf,f1,k;f=c1*65536+TH1*256+TL1;f1=f-f%10; //此變量是為了讓八位LED的高位為0時(shí)不顯示而設(shè)置for(i=7;i>0;i--) //此循環(huán)將計(jì)數(shù)值轉(zhuǎn)換為顯示數(shù)組,從高位到低位依次存放在//display_data[0]至display_data[7]{display_data[i]=f%10;f=f/10;} display_data[0]=f;k=1e7; //從這開始到本子程序結(jié)束的語句完成讓八位LED的高位為0時(shí)不顯示for(i=0;i<7;i++){f2=f1/k;if(f2==0){display_data[i]=10;k=k/10;}}}voidtimer1(void)interrupt3//定時(shí)器1中斷服務(wù)程序

{c1++; }voidtimer0(void)interrupt1//定時(shí)器0中斷服務(wù)程序

{TH0=0xb1; //裝入時(shí)間常數(shù)TL0=0xe0; P1_1=!P1_1; //P1.1取反,從P1.1引腳輸出25Hz的方波信號(hào),通過導(dǎo)線連接//到P3.5引腳輸入,以方便調(diào)試程序。若使用其它信號(hào)源,則去掉即可。if(b1==49){convert();c1=0; //將計(jì)數(shù)值清零b1=0;TH1=0;TL1=0;}elseb1++;}/***************************************************函數(shù)功能:主函數(shù)***************************************************/main(void){uinti;P1_1=0;c1=0;b1=0;TH1=0;TL1=0;TMOD=0x51;TH0=0Xb1;TL0=0Xe0;IE=0x8a;TCON=0x50;Initialize_LCD();while(1){irwork();DelayMS(10);

lcd_pos(0x01);//設(shè)置顯示位置在第一行

i=0;while(OutputData[i]!='\0')//顯示到字符結(jié)束{Write_LCD_Data(OutputData[i]);//顯示字符i++;}}}【進(jìn)階提高】綜合運(yùn)用單片機(jī)中斷、定時(shí)器知識(shí),設(shè)計(jì)一4位數(shù)碼管抽獎(jiǎng)器,如圖4-13所示,按動(dòng)抽獎(jiǎng)按鈕時(shí),抽獎(jiǎng)器自動(dòng)產(chǎn)生4位隨機(jī)數(shù),當(dāng)再一次按抽獎(jiǎng)按鈕時(shí),表示抽獎(jiǎng)停止,產(chǎn)生中獎(jiǎng)號(hào)碼抽獎(jiǎng)器電路對(duì)應(yīng)的程序如下:

#include"reg51.h" /*8051單片機(jī)資源說明*/#include<stdlib.h> /*包含rand()函數(shù)*/#defineucharunsignedchar#defineuintunsignedintucharcodeBitTab[]={0x7F,0xBF,0xDF,0xEF,0xF7,0xFB};ucharcodeDispTab[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x8

溫馨提示

  • 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)論