第9章-中斷、定時(shí)計(jì)數(shù)器及串口的C語言編程_第1頁
第9章-中斷、定時(shí)計(jì)數(shù)器及串口的C語言編程_第2頁
第9章-中斷、定時(shí)計(jì)數(shù)器及串口的C語言編程_第3頁
第9章-中斷、定時(shí)計(jì)數(shù)器及串口的C語言編程_第4頁
第9章-中斷、定時(shí)計(jì)數(shù)器及串口的C語言編程_第5頁
已閱讀5頁,還剩70頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、239.1.1中斷的應(yīng)用9.1.2中斷應(yīng)用編程4中斷的應(yīng)用包括中斷向量的設(shè)置和中斷子程序的編寫。5 1中斷設(shè)定 中斷的設(shè)定包括開啟中斷開關(guān)(設(shè)定IE寄存器)、設(shè)定中斷優(yōu)先級(設(shè)定IP寄存器)、設(shè)定中斷信號觸發(fā)類型(設(shè)定TCON寄存器)等。 (1)設(shè)置中斷開關(guān) 例如,開啟中斷總開關(guān)并啟用INT0中斷可使用以下語句: IE=0 x81;/開啟總開關(guān),啟用INT0中斷 同理,若要開啟總開關(guān)并打開INT1中斷開關(guān),可以使用以下語句: IE=0 x84;/開啟總開關(guān),啟用INT1中斷 (2)設(shè)置中斷優(yōu)先級,即設(shè)置IP寄存器 例如,要提高INT1的優(yōu)先級,可以使用以下語句: IP=0 x04;/設(shè)定INT

2、1中斷具有最高優(yōu)先級 (3)設(shè)置外部中斷信號觸發(fā)類型,即設(shè)置TCON寄存器,可將觸發(fā)類型設(shè)置為低電平觸發(fā)或負(fù)邊緣觸發(fā)方式。 例如: TCON=0 x04;/設(shè)定INT1采用負(fù)邊緣觸發(fā)方式6 2中斷子程序 中斷子程序的結(jié)構(gòu)與函數(shù)的結(jié)構(gòu)類似,不過中斷子程序不能接受從外部傳入的變量,也沒有返回值。中斷子程序在調(diào)用之前不需要聲明,但需要在主程序中進(jìn)行中斷的相關(guān)設(shè)置。 中斷子程序第一行的格式如下: void 中斷子程序名稱(void) interrupt 中斷編號using 寄存器組 中斷子程序不能被主程序調(diào)用,中斷子程序的命名只要符合標(biāo)識符命名規(guī)則即可。 Keil C 提供了031共32個(gè)中斷編號,不

3、過8051通常只使用編號04。例如,聲明外部中斷INT0,則中斷標(biāo)識為“interrupt 0”;若要聲明T0定時(shí)計(jì)數(shù)器中斷,則應(yīng)標(biāo)識為“interrupt 1”。 中斷源、中斷編號及中斷入口地址的對應(yīng)關(guān)系如表9-1所示。7中斷源中斷編號中斷入口地址外部中斷000003H定時(shí)器0中斷1000BH外部中斷120013H定時(shí)器1中斷3001BH串行口中斷40023H表9-1 中斷源與中斷編號 using右邊的寄存器組是指中斷子程序里所要采用的寄存器組。8051內(nèi)部有4組寄存器組,即RB0RB3。通常主程序默認(rèn)使用RB0,中斷子程序應(yīng)根據(jù)需要使用其他寄存器組,以避免數(shù)據(jù)的沖突。若不指定寄存器組,則可

4、省略該字段。 例如,外部中斷INT0的子程序名為my_int0,使用了第0組寄存器(可省略)。子程序如下: void my_int0(void) interrupt 0/中斷子程序,單燈左移 unsigned char saveLED=LED;/存中斷前LED燈狀態(tài)EA=0;/關(guān)總中斷l(xiāng)eft(3); /單燈左移3圈EA=1;/開總中斷LED=saveLED;/恢復(fù)中斷前LED燈狀態(tài) 8中斷程序及主程序編制完成后,單擊Keil界面中的Debug按鈕進(jìn)入仿真狀態(tài),選擇“Peripherals”“Interrupt”菜單(見圖9-1),此時(shí)系統(tǒng)將打開“Interrupt System”對話框,如圖

5、9-2所示。9 3中斷子程序的仿真圖9-1 Peripherals菜單圖9-2 中斷系統(tǒng)對話框 對話框中包含5個(gè)中斷源,隨著程序的運(yùn)行,中斷系統(tǒng)對話框中的值會不斷發(fā)生變化,通過觀察對話框可以了解程序的運(yùn)行狀態(tài)。10 1外部中斷INT1實(shí)例演練圖9-3 外部中斷1實(shí)驗(yàn)電路11【例9-1】實(shí)驗(yàn)電路如圖9-3所示 P0口驅(qū)動共陽極7段LED數(shù)碼管;當(dāng)主程序正常執(zhí)行時(shí),7段LED數(shù)碼管將從十六進(jìn)制0開始正向顯示到F(循環(huán)顯示),每0.5s加1。按下按鈕開關(guān)K1,進(jìn)入INT1中斷子程序,7段LED數(shù)碼管將從F開始閃爍并反向顯示至0,每0.5s減1。 首先聲明delay()函數(shù),將共陽極7段LED數(shù)碼管的

6、驅(qū)動信號放置在數(shù)組中: char TAB16=0 xc0,0 xf9,0 xa4,0 xb0,0 x99,0 x92,0 x83,0 xf8,0 x80,0 x90,0 x98,0 x83,0 xc6,0 xa1,0 x86,0 x8e; 在主程序中,每隔0.5s就順序輸出一次字符數(shù)組中的編碼,而在中斷子程序中,每隔0.5s就反序輸出一次字符數(shù)組中的編碼。12【例9-1】【參考代碼】/*/ 外部中斷1實(shí)例程序/*/*主程序數(shù)碼管0F順序顯示,中斷程序F0倒序顯示,P0口接數(shù)碼管*/#include#define SEG P0void delay(int);/延時(shí)函數(shù)unsigned char

7、tab16=0 xc0,0 xf9,0 xa4,0 xb0,0 x99,/04驅(qū)動代碼0 x92,0 x83,0 xf8,0 x80,0 x90,/59驅(qū)動代碼0 x98,0 x83,0 xc6,0 xa1,0 x86,0 x8e;/af驅(qū)動代碼/=主程序=13【例9-1】【參考代碼】main() int i; IE=0 x84;/開總中斷,開外部中斷1 TCON=0 x04;/INT1設(shè)置為負(fù)邊緣觸發(fā) while(1)/循環(huán)執(zhí)行 for(i=0;i=0;i-) SEG=tabi;delay(250);/延時(shí)0.25秒SEG=0 xff;/數(shù)碼管滅delay(250); EA=1;15【例9-

8、1】【參考代碼】/=延時(shí)1ms子函數(shù)=void delay(int x) int i,j; for(i=0;ix;i+) for(j=1;j120;j+);/延時(shí)1毫秒 16 2外部中斷INT0與INT1實(shí)例演練圖9-4 外部中斷0/1實(shí)驗(yàn)電路17【例9-2】實(shí)驗(yàn)電路如圖9-4所示 編寫程序完成以下功能:程序正常運(yùn)行時(shí),P2所連接的8個(gè)LED燈不斷閃爍。按下K0按鈕開關(guān)將進(jìn)入INT0中斷狀態(tài),P2連接的8個(gè)LED燈將變成單燈左移(單燈從右向左移動),左移3圈后,恢復(fù)中斷前的狀態(tài),程序?qū)⒗^續(xù)執(zhí)行8燈閃爍的功能。按下K1按鈕開關(guān)將進(jìn)入INT1中斷狀態(tài),P2連接的8個(gè)LED燈將變成單燈右移(單燈從左

9、向右移動),右移3圈后,恢復(fù)中斷前的狀態(tài),程序?qū)⒗^續(xù)執(zhí)行8燈閃爍的功能。 假定單燈左移(INT0)中斷的優(yōu)先級高于單燈右移(INT1)中斷的優(yōu)先級。 根據(jù)功能需求,可以先在程序開始處聲明delay()函數(shù)、左移left()函數(shù)和右移right()函數(shù),然后在主程序里每隔0.25s改變一次LED燈的亮滅狀態(tài)。 在INT0中斷子程序中,先點(diǎn)亮最右端LED燈,然后每隔0.25s LED燈左移一次,從右向左單燈左移3圈后,返回主程序;在INT1中斷子程序中,先點(diǎn)亮最左端LED燈,每隔0.25s LED燈右移一次,從左向右單燈右移3圈后,返回主程序。18【例9-2】主程序與兩個(gè)子程序的流程如圖9-5所示

10、依次為:(a)主程序 (b)INT0中斷子程序 (c)INT1中斷子程序圖9-5 INT0/INT1兩個(gè)外部中斷實(shí)例流程圖19【例9-2】【參考代碼】/*/外部中斷0與外部中斷1實(shí)例/主程序?qū)崿F(xiàn)8燈閃爍,/中斷INT0單燈左移三圈,中斷INT1單燈右移三圈,P2口接流水燈/*#include#define LED P2void left(int);/單燈左移函數(shù)void delay(int);/延時(shí)函數(shù)void right(int);/單燈右移函數(shù)/=主程序=20【例9-2】【參考代碼】main() IE=0 x85;/允許中斷INT0,INT1請求中斷 IP=0 x01;/設(shè)定INT0具有最

11、高優(yōu)先級 TCON=0 x05;/都設(shè)為負(fù)邊沿觸發(fā) LED=0 xff;/全滅 while(1) delay(250);/延時(shí)0.25秒LED=LED;/LED燈閃爍 21【例9-2】【參考代碼】/=外部中斷0子程序=void my_int0(void) interrupt 0/中斷INT0 unsigned saveLED=LED;/保存中斷前LED燈狀態(tài) EX0=0;/關(guān)中斷 left(3);/單燈左移3圈 EX0=1;/開中斷 LED=saveLED;/恢復(fù)中斷前LED燈狀態(tài)22【例9-2】【參考代碼】/=外部中斷1子程序=void my_int1(void) interrupt 2/中

12、斷INT1 unsigned saveLED=LED;/保存中斷前LED燈的狀態(tài) EX1=0;/關(guān)中斷 right(3);/單燈右移3圈 EX1=1;/開中斷 LED=saveLED;/恢復(fù)中斷前LED燈狀態(tài)23【例9-2】【參考代碼】/=延時(shí)子函數(shù)=void delay(int x)/延時(shí)函數(shù) int i,j; for(i=0;ix;i+) for(j=1;j120;j+);/延時(shí)1毫秒 24【例9-2】【參考代碼】/=單燈左移函數(shù)=void left(int x)/單燈左移 int i,j; for(i=0;ix;i+)/左移次數(shù)x次 LED=0 xfe;/重裝初值for(j=0;j8;j

13、+) delay(250);/延時(shí)0.25秒 LED=(LED1)|0 x01; 25【例9-2】【參考代碼】/=單燈右移函數(shù)=void right(int x)/單燈右移 int i,j; for(i=0;ix;i+)/右移次數(shù) LED=0 x7f;/重裝初值for(j=0;j1)|0 x80; 269.2.1定時(shí)/計(jì)數(shù)器的設(shè)置9.2.2定時(shí)/計(jì)數(shù)器應(yīng)用編程2751單片機(jī)的定時(shí)/計(jì)數(shù)器的計(jì)數(shù)終點(diǎn)值是固定的(8位模式最大計(jì)數(shù)值為256,13位模式為8192,16位模式為65536),計(jì)算定時(shí)或計(jì)數(shù)的初值時(shí),需要根據(jù)情況往前推算。例如,選擇8位計(jì)數(shù)模式,由于計(jì)數(shù)終值固定為256,若需要計(jì)數(shù)100

14、個(gè),則計(jì)數(shù)初值應(yīng)為256100=156。 各工作模式下的初值設(shè)置方式如下: (1)工作模式0(Mode 0):該模式下的定時(shí)/計(jì)數(shù)器的計(jì)數(shù)位數(shù)有13位,TLx計(jì)數(shù)寄存器只使用了5位,計(jì)數(shù)值可達(dá)25=32,當(dāng)?shù)?位TLx計(jì)滿32后,即向高8位寄存器THx進(jìn)位。以定時(shí)或計(jì)數(shù)6000個(gè)脈沖為例,該模式最多可計(jì)數(shù)213=8192個(gè)脈沖,故對該工作模式下的THx與TLx初始值的設(shè)置可按如下方式進(jìn)行: TLx=(8192-6000)% 32;/取余數(shù)放入TLx中 THx=(8192-6000)/ 32;/取商放入THx中28 1初值的設(shè)定 (2)工作模式1(Mode 1):該工作模式下的計(jì)數(shù)位數(shù)為16位,

15、當(dāng)?shù)?位TLx計(jì)滿256后,即向高8位寄存器THx進(jìn)位。若以定時(shí)或計(jì)數(shù)50000個(gè)脈沖為例,該模式最多可計(jì)數(shù)216=65536個(gè)脈沖,其初始值的設(shè)置可按如下方式進(jìn)行: TLx=(65536-50000)% 256/取余數(shù)放入TLx中 THx=(65536-50000)/ 256;/取商放入THx中 (3)工作模式2(Mode 2):在該模式下,TLx與THx是兩個(gè)8位的定時(shí)/計(jì)數(shù)器,其中TLx作為計(jì)數(shù)寄存器使用,而THx作為自動加載寄存器使用。為了使TLx寄存器在自動加載后再次從設(shè)定的初值開始計(jì)數(shù),設(shè)定初值時(shí)應(yīng)將TLx與THx的初值設(shè)為相同。以定時(shí)或計(jì)數(shù)100個(gè)脈沖為例,其初始值的設(shè)置如下:

16、TLx=256-100;/填入計(jì)數(shù)值 THx=256-100;/填入自動加載值 (4)工作模式3(Mode 3):該工作模式提供了兩個(gè)8位的定時(shí)/計(jì)數(shù)器,TL0和TH0分別用于兩個(gè)定時(shí)器的計(jì)數(shù)。定時(shí)/計(jì)數(shù)器的初值設(shè)置方法與Mode2一樣。29 定時(shí)/計(jì)數(shù)器的應(yīng)用方式有兩種:一種為查詢方式,另一種為中斷方式。 查詢方式是指主程序不斷地查詢定時(shí)/計(jì)數(shù)器的標(biāo)志位TFx是否有變化,通過判定該位的變化來決定程序的走向;此種方式不需要中斷子程序。 中斷方式是指主程序?qū)W⒂谄渌虑?,?dāng)定時(shí)/計(jì)數(shù)器申請中斷時(shí),轉(zhuǎn)去中斷子程序處理相關(guān)數(shù)據(jù)。采用中斷方式需要進(jìn)行初始化設(shè)置,包括設(shè)定中斷信號、設(shè)定計(jì)數(shù)初值、啟動定時(shí)

17、/計(jì)數(shù)器以及編寫中斷子程序等。30 2定時(shí)/計(jì)數(shù)器的使用方式 (1)設(shè)定中斷信號。主要包括: 開啟中斷開關(guān)(IE寄存器)。例如,開啟T0中斷: IE=0 x82;/開啟中斷總開關(guān)EA,開啟T0中斷 設(shè)置中斷優(yōu)先級(IP寄存器)。例如,設(shè)置T1的中斷優(yōu)先等級為高優(yōu)先級: IP=0 x02;/提升T0中斷的優(yōu)先等級 設(shè)定定時(shí)/計(jì)數(shù)器的工作方式(TCON寄存器)。例如,設(shè)置T1為內(nèi)部定時(shí)器、啟動方式為軟件啟動、工作模式為Mode1,可采用如下語句進(jìn)行設(shè)置: TMOD=0 x01;/設(shè)定為內(nèi)部定時(shí)器,軟件啟動和Mode1 (2)啟動定時(shí)/計(jì)數(shù)器。若采用軟件啟動方式,可通過如下命令進(jìn)行設(shè)置: TRx=1

18、;/啟動定時(shí)/計(jì)數(shù)器Timer x (3)編寫中斷子程序。定時(shí)/計(jì)數(shù)器的中斷子程序格式與其他中斷子程序類似,只是中斷編號不同,定時(shí)/計(jì)數(shù)器中斷編號為1或3。3132 1定時(shí)/計(jì)數(shù)器實(shí)例演練查詢方式圖9-6 閃爍燈實(shí)驗(yàn)電路33【例9-3】實(shí)驗(yàn)電路如圖9-6所示,編寫程序?qū)崿F(xiàn)如下功能:采用查詢方式使LED燈每隔0.5s閃爍一次。 根據(jù)系統(tǒng)要求,此處需要采用定時(shí)器T0或T1來完成定時(shí)工作。若系統(tǒng)晶振頻率為12MHz,T0/T1在幾種工作模式下的定時(shí)情況說明如下: 工作在Mode0模式時(shí),每次最多可計(jì)數(shù)至8192,花費(fèi)時(shí)間約為8.192ms。若只計(jì)數(shù)至5000,需要的時(shí)間為5ms,延遲0.25s(5m

19、s50)需要重復(fù)上述計(jì)數(shù)過程50次。 工作在Mode1模式時(shí),每次最多可計(jì)數(shù)至65536,花費(fèi)時(shí)間約為65ms。若只計(jì)數(shù)至50000,需要的時(shí)間約為50ms,延遲0.25s(50ms5)需要重復(fù)上述計(jì)數(shù)過程5次。 工作在Mode2或Mode3模式下,每次最多可計(jì)數(shù)至256,花費(fèi)的時(shí)間約為0.25ms,若只計(jì)數(shù)至250,則需要的時(shí)間為0.25ms,延遲0.25s(0.25ms1000)需要重復(fù)上述計(jì)數(shù)過程1000次。34【例9-3】編寫程序?qū)崿F(xiàn)如下功能:采用查詢方式使LED燈每隔0.5s閃爍一次。 本例中,定時(shí)器采用工作模式1,計(jì)數(shù)量為50000,重復(fù)5次后,切換LED燈的狀態(tài)。 設(shè)定查詢方式時(shí)

20、需要注意以下兩點(diǎn): 不設(shè)定中斷啟用寄存器,即不開啟中斷總開關(guān)與定時(shí)器開關(guān)。 當(dāng)定時(shí)器標(biāo)志位變?yōu)?之后,還需要使用語句“TF0=0;”將定時(shí)器標(biāo)志位重新設(shè)置為0,該定時(shí)器才能重新啟用。 程序流程如圖9-7所示。圖9-7 查詢方式程序流程35【例9-3】 【參考代碼】/=/利用定時(shí)中斷,使LED左右4盞燈每0.5秒閃爍一次/=初始化設(shè)置=#include#define LED P2/P2口接流水燈#define count 50000/計(jì)數(shù)次值#define TH_M1 (65536-count)/256/計(jì)數(shù)初值的高8位#define TL_M1 (65536-count)%256/計(jì)數(shù)初值的低

21、8位/=主程序=36【例9-3】 【參考代碼】main() int i; IE=0 x82;/開總中斷,開定時(shí)器T0中斷 TMOD=0 x01;/設(shè)為定時(shí)器T0方式1 LED=0 xf0;/亮低4位 while(1) for(i=0;i5;i+)/中斷次數(shù)控制37【例9-3】 【參考代碼】 TH0=TH_M1;/設(shè)置高8位 TL0=TL_M1;/設(shè)置低8位 TR0=1;/啟動定時(shí)器T0 while(TF0=0);/等待計(jì)滿溢出,當(dāng)溢出時(shí)TF0=1 TF0=0;/清溢出位,關(guān)閉T0LED=LED;/輸出取反 38 2定時(shí)/計(jì)數(shù)器實(shí)例演練中斷方式【例9-4】采用中斷方式實(shí)現(xiàn)例9-3功能。 在主程序

22、中設(shè)定定時(shí)/計(jì)數(shù)器的工作模式后,開始計(jì)數(shù)時(shí)鐘脈沖,計(jì)數(shù)到達(dá)終值后,定時(shí)/計(jì)數(shù)器向CPU發(fā)出中斷請求信號,單片機(jī)在中斷子程序中使LED燈閃爍一次,然后返回主程序,等待下一次中斷信號的到來。程序流程如圖9-8所示。圖9-8 中斷方式程序流程39【例9-4】 【參考代碼】/=/利用定時(shí)中斷,使LED燈左右4盞燈每0.5秒閃爍一次/=#include#define LED P2/P2口接流水燈#define count 50000/計(jì)數(shù)次值#define TH_M1 (65536-count)/256/計(jì)數(shù)高8位#define TL_M1 (65536-count)%256/計(jì)數(shù)低8位int IntC

23、ount=0;40【例9-4】 【參考代碼】/=主程序=main()IE=0 x82;/開中斷TMOD=0 x01;/設(shè)為定時(shí)器T0方式1LED=0 xf0;/低4位亮TH0=TH_M1;TL0=TL_M1;/裝初值TR0=1;/啟動定時(shí)器T0while(1);41【例9-4】 【參考代碼】/=定時(shí)T0子函數(shù)=void timer0(void) interrupt 1 using 1TH0=TH_M1;/重裝初值TL0=TL_M1;if(+IntCount=5)/中斷次數(shù)(5次)控制IntCount=0;LED=LED;/取反42 3定時(shí)/計(jì)數(shù)器實(shí)例演練60s定時(shí)圖9-9 60s定時(shí)電路43【

24、例9-5】實(shí)驗(yàn)電路如圖9-9所示,兩個(gè)7段LED數(shù)碼管從00開始顯示,每隔1s數(shù)值加1,到達(dá)59后,再從00開始顯示,即為60s定時(shí)器。 。 每過60s,D1切換一次(由亮變滅或由滅變亮)。P2口驅(qū)動7段LED數(shù)碼管模塊,P1.0與P1.1為兩位數(shù)7段LED數(shù)碼管模塊的掃描信號,其中P1.0為個(gè)位數(shù)的掃描信號,P1.1為十位數(shù)的掃描信號。 根據(jù)題目要求,本例可使用T0來計(jì)時(shí),若采用Mode1工作模式,則計(jì)數(shù)個(gè)數(shù)可設(shè)定為50000(即50ms),循環(huán)次數(shù)為20即可實(shí)現(xiàn)延遲1s。設(shè)定變量初值如下: int TH_M1=(65536-50000)/256;/設(shè)置T0初值的高8位 int TL_M1=

25、(65536-50000)%256;/設(shè)置T0初值的低8位 char count0 = 20 ;/重復(fù)次數(shù)44【例9-5】實(shí)驗(yàn)電路如圖9-9所示,兩個(gè)7段LED數(shù)碼管從00開始顯示,每隔1s數(shù)值加1,到達(dá)59后,再從00開始顯示,即為60s定時(shí)器。 。 兩個(gè)7段數(shù)碼管需要驅(qū)動芯片為其提供驅(qū)動才能正常工作,驅(qū)動芯片74HC573的驅(qū)動信號分別由P1.0和P1.1提供。在數(shù)碼管的顯示過程中,單片機(jī)需要不停掃描數(shù)碼管并為其提供驅(qū)動信號。這里采用T1來控制掃描周期,每8ms掃描一次,如果T1使用Mode2模式,只要設(shè)置計(jì)數(shù)初值為250,重復(fù)執(zhí)行32次延遲時(shí)間就可以達(dá)到8ms,設(shè)定T1初值如下: int

26、 TH_M2=(256-250);/聲明T1自動加載計(jì)數(shù)量 int TL_M2=(256-250);/聲明T1計(jì)數(shù)量 char count1=32;/重復(fù)次數(shù) 說明:74HC573內(nèi)部有8個(gè)D鎖存器,當(dāng)使能(G)端為高電平時(shí),輸出Q將隨數(shù)據(jù)(D)的輸入而改變。當(dāng)使能端為低電平時(shí),輸出端將鎖存現(xiàn)有的數(shù)據(jù)值。45【例9-5】程序流程如圖9-10所示。圖9-10 60s定時(shí)流程圖46【例9-5】【參考代碼】/=/ 60s定時(shí)器實(shí)例定時(shí)中斷/=聲明=#include #define SEG P2/令LED接至P2口#define SCANP P1/定義掃描線接至P1口sbit LED=P07 ;/聲明

27、LED接至P0.7/=聲明T0定時(shí)器相關(guān)參數(shù)=#define count_M1 50000/T0(Mode1)的計(jì)數(shù)值,0.05s#define TH_M1 (65536-count_M1)/256/T0(Mode1)的計(jì)數(shù)高8位#define TL_M1 (65536-count_M1)%256/T0(Mode1)計(jì)數(shù)低8位int count_T0=0;/計(jì)算T0中斷次數(shù)47【例9-5】【參考代碼】/=聲明T1定時(shí)器相關(guān)參數(shù)=#define count_M2 250/T1(Mode2)的計(jì)數(shù)值,0.25ms#define TH_M2 (256-count_M2)/T1(Mode2)自動加載計(jì)

28、數(shù)#define TL_M2 (256-count_M2)/T1(Mode2)計(jì)數(shù)量char count_T1=0;/計(jì)算T1中斷次數(shù)/=聲明7段LED數(shù)碼管驅(qū)動信號數(shù)組(共陽)=char TAB10= 0 xc0, 0 xf9, 0 xa4, 0 xb0, 0 x99, 0 x92, 0 x83, 0 xf8, 0 x80, 0 x98;/數(shù)字09譯碼 0 1 2 3 4 5 6 7 8 9char disp2=0 xc0,0 xc0;/聲明顯示區(qū)數(shù)組,初始顯示“00”/=聲明基本變量=char seconds=0;/秒數(shù)char scan=0;/掃描信號48【例9-5】【參考代碼】/=主程

29、序=main() IE=0 x8a;/1000 1010,啟動TF0,TF1中斷 TMOD=0 x21;/0010 0001,T1采用Mode2, T0采用Mode1 TH0=TH_M1; TL0=TL_M1;/設(shè)置T0計(jì)數(shù)量高8位、低8位 TR0=1;/啟動定時(shí)器T0 TH1=TH_M2; TL1=TL_M2;/設(shè)置T1自動加載值、計(jì)數(shù)量 TR1=1;/啟動定時(shí)器T1 LED=1;/關(guān)閉LED while(1);/循環(huán)等待定時(shí)中斷到來/主程序結(jié)束49【例9-5】【參考代碼】/=T0中斷子程序-計(jì)算并顯示秒數(shù)=void T0_1S(void) interrupt 1/T0中斷子程序開始 TH0

30、=TH_M1;TL0=TL_M1;/設(shè)置T0計(jì)數(shù)量高8位、低8位 if(+count_T0=20)/若中斷20次,即0.0520=1s count_T0=0;/重新計(jì)次 seconds+;/秒數(shù)加1 if(seconds=60)/若超過60s seconds=0;/秒數(shù)歸0,重新開始 LED=LED;/切換LED狀態(tài) disp1=TABseconds/10;/填入十位數(shù)顯示區(qū) disp0=TABseconds%10;/填入個(gè)位數(shù)顯示區(qū)50【例9-5】【參考代碼】/=T1中斷子程序-掃描=void T1_8ms(void) interrupt 3/T1中斷子程序開始 if(+count_T1=3

31、2)/若中斷32次,即0.25ms32=8ms count_T1=0;/重新計(jì)次 if(+scan=3) scan=1;/scan取值為1或者2 SEG=0 xff;/關(guān)閉7段LED數(shù)碼管 SCANP=scan;/輸出掃描信號 SEG=dispscan-1;/輸出顯示信號519.3.1相關(guān)芯片介紹9.3.2串口通訊應(yīng)用編程5253 在單片機(jī)應(yīng)用系統(tǒng)中,經(jīng)常出現(xiàn)需要將串行數(shù)據(jù)轉(zhuǎn)換成并行數(shù)據(jù),或者將并行數(shù)據(jù)轉(zhuǎn)換成串行數(shù)據(jù)的情況,此時(shí)可以借助相關(guān)芯片完成轉(zhuǎn)換。 174LS164(串入并出) 在較復(fù)雜的應(yīng)用場合,如果單片機(jī)的I/O口資源不夠用,可使用74LS164芯片來擴(kuò)展并行I/O口,節(jié)約單片機(jī)I/

32、O資源。74LS164芯片是一個(gè)串行輸入并行輸出的移位寄存器,其引腳如圖9-11所示。圖9-11 74LS164引腳圖CP:時(shí)鐘輸入端。 :異步清除輸入端(低電平有效)。A,B:串行數(shù)據(jù)輸入端。Q0Q7:輸出端。VCC:工作電壓為50.5V。各引腳功能如下:54 74LS164的內(nèi)部邏輯結(jié)構(gòu)如圖9-12所示。 清除端 為低電平時(shí),輸出端Q0Q7均為低電平。串行數(shù)據(jù)輸入端A,B中任意一個(gè)為低電平時(shí)禁止輸入新數(shù)據(jù);當(dāng)A,B有一個(gè)為高電平時(shí),另一個(gè)可以作為數(shù)據(jù)輸入端輸入數(shù)據(jù),并在CP的上升沿將輸入的數(shù)據(jù)鎖存。圖9-12 74LS164內(nèi)部邏輯圖55 74LS164 真值輸出情況如表9-2所示,當(dāng)A,

33、B均為高電平H,時(shí)鐘上升沿到來時(shí),Q0 將輸出H,同時(shí)其他數(shù)據(jù)位移位輸出。即Q1 輸出Q0,Q2 輸出Q1,依此類推,Q7 輸出Q6。輸入輸出清零(/MR)時(shí)鐘CPA BQ0 Q1 Q2 Q3 Q4 Q5 Q6 Q7L L L L L L L L LHL Q0 Q1 Q2 Q3 Q4 Q5 Q6 Q7HH HH Q0 Q1 Q2 Q3 Q4 Q5 Q6HL L Q0 Q1 Q2 Q3 Q4 Q5 Q6H LL Q0 Q1 Q2 Q3 Q4 Q5 Q6表9-2 74LS164真值表56 74LS164芯片的時(shí)序邏輯如圖9-13所示。圖9-13 時(shí)序圖57 當(dāng)B為高電平時(shí),A用作數(shù)據(jù)的輸入端,在第

34、2個(gè)和第3個(gè)時(shí)鐘上升沿到來時(shí),Q0輸出低電平; 第4個(gè)脈沖上升沿到來時(shí),此時(shí)輸入端A為高電平,Q0也輸出高電平; 第5個(gè)上升沿到來時(shí),Q0在上一個(gè)時(shí)鐘周期的高電平值傳送到Q1,Q1輸出高電平,此時(shí)Q0仍與輸入端A一樣保持高電平; 第6個(gè)上升沿到來時(shí),輸入端A為低電平,Q0輸出低電平,此時(shí)Q0把自己第5個(gè)時(shí)鐘周期的高電平值傳遞給了Q1,Q1把自己第5個(gè)時(shí)鐘周期的電平值傳遞給了Q2,因此Q2開始出現(xiàn)高電平。 其他時(shí)鐘脈沖到來時(shí)的輸出依此類推,第9個(gè)上升沿到來時(shí),Q0在第2個(gè)時(shí)鐘脈沖時(shí)的數(shù)據(jù)傳遞給了Q7,此時(shí)取出的8位并行數(shù)據(jù)即為A輸入的有效串行數(shù)據(jù)。 當(dāng)清除端 為低電平時(shí),所有數(shù)據(jù)將被清除。58

35、274LS165(并入串出) 若要把并行數(shù)據(jù)經(jīng)串口傳入單片機(jī)中,需要先將并行數(shù)據(jù)轉(zhuǎn)換成串行數(shù)據(jù),然后再傳輸給單片機(jī)。74LS165是常用的并行輸入串行輸出芯片,其引腳如圖9-14所示。 CLK:時(shí)鐘輸入端(上升沿有效)。 CLK INH:時(shí)鐘禁止引腳,本引腳為高電平時(shí),輸出引腳將不隨時(shí)鐘脈沖變化而變化;本引腳為低電平時(shí),輸出引腳將隨時(shí)鐘脈沖進(jìn)行移位式串行輸出。 AH:并行數(shù)據(jù)輸入端。 SER:串行數(shù)據(jù)輸入端。 QH:輸出端。 :互補(bǔ)輸出端。 SH/ :移位控制/置入控制(低電平有效)。 VCC:輸入電壓為50.5V。各引腳功能如下:圖9-14 74LS165引腳圖59 74LS165真值輸出情

36、況如表9-3所示,當(dāng)移位/植入控制端SH/ 為低電平時(shí),并行數(shù)據(jù)(AH)被置入寄存器。當(dāng)SH/ 為高電平時(shí),并行數(shù)據(jù)置入寄存器功能被禁止。輸入內(nèi)部輸出輸出QH移位/裝載時(shí)鐘禁止時(shí)鐘串行數(shù)據(jù)輸入并行輸入AHQA QBLHHHHXLLLHXLXXXHLXahXXXXa bQA0 QB0H QAnL QAnQA0 QB0hQH0QGnQGnQH0表9-3 74LS165真值表 CLK和CLKINK在功能上是等價(jià)的,可以交換使用。當(dāng)CLK和CLKINK兩者有一個(gè)為低電平且SH/ 為高電平時(shí),另一個(gè)時(shí)鐘可用于輸入數(shù)據(jù)。例如,當(dāng)SH / 為高電平,CLKINK、SER均為低電平時(shí),CLK引腳上到來8個(gè)時(shí)鐘

37、脈沖即可將并行數(shù)據(jù)從QH引腳輸出, 引腳輸出的數(shù)據(jù)是反相的。60 74LS165芯片的時(shí)序邏輯如圖9-15所示。SH/ 為低電平時(shí),并行數(shù)據(jù)被裝入寄存器。CLK INH、SER為低電平時(shí),每到來一個(gè)CLK時(shí)鐘脈沖上升沿,就移出一位并行數(shù)據(jù)到QH引腳,移出時(shí),先移出H引腳上的數(shù)據(jù),再依次移出G,F(xiàn) A引腳上的數(shù)據(jù)。圖9-15 74LS165并轉(zhuǎn)串芯片時(shí)序圖61 3電平轉(zhuǎn)換芯片MAX232 如果是短距離的串行數(shù)據(jù)傳輸,單片機(jī)采用標(biāo)準(zhǔn)的TTL或CMOS電路就足以完成傳輸;若要進(jìn)行長距離的數(shù)據(jù)傳輸,則采用傳統(tǒng)的TTL或CMOS電路驅(qū)動能力就明顯不足,且噪聲容限(Noise Margin)太小,通信質(zhì)量

38、無法保證。此時(shí),可以采用適合遠(yuǎn)距離串行傳輸?shù)腞S-232C通信方式,MAX232芯片是此種通信方式較常采用的轉(zhuǎn)換芯片。 MAX232可將接收到的+5V電平信號轉(zhuǎn)換為10V電平信號。單片機(jī)向外發(fā)送數(shù)據(jù)時(shí),MAX232先將從單片機(jī)處接收的+5V的TTL/CMOS電平信號轉(zhuǎn)換成10V的電壓信號,然后將該信號傳送到發(fā)送線路上。單片機(jī)接收數(shù)據(jù)時(shí),MAX232將接收到的+10V信號轉(zhuǎn)換成TTL/CMOS的+5V電平信號后,再送入單片機(jī)。簡單地說,MAX232是一個(gè)電平轉(zhuǎn)換裝置,它能夠提供雙向的電平調(diào)整。62 MAX232串口通信電路如圖9-16所示。 單片機(jī)的TXD和RXD引腳分別連接MAX232的T2I

39、N和R2OUT引腳,MAX232的T2OUT引腳連接9針串口的RXD引腳,R2IN引腳連接9針串口的TXD引腳。 這樣單片機(jī)發(fā)出的數(shù)據(jù)就能夠經(jīng)由MAX232傳送給9針串行接口,然后再遠(yuǎn)程發(fā)送給其他處理器了。圖9-16 MAX232串口通信電路63 1 Mode0實(shí)例圖9-17 并行轉(zhuǎn)串行實(shí)驗(yàn)電路圖64【例9-6】并行轉(zhuǎn)串行電路如圖9-17所示 74LS165將指撥開關(guān)S1S8的狀態(tài)轉(zhuǎn)換成串行數(shù)據(jù),通過RXD引腳傳輸給單片機(jī)。編寫程序?qū)崿F(xiàn)如下功能:單片機(jī)將指撥開關(guān)的狀態(tài)反映到P0所連接的LED上。 根據(jù)74LS165的功能表,若要將并行數(shù)據(jù)加載到74LS165,則需要給74LS165的引腳1(移

40、位/植入控制端SH/ )一個(gè)負(fù)脈沖,在此利用P3.1引腳連接到74LS165的引腳1,利用語句“P31=0;”將P3.1引腳變?yōu)榈碗娖剑缓笤偈褂脙蓷l“if(P31=0);”語句增加延遲時(shí)間,最后利用“P31=1;”將P3.1引腳恢復(fù)為高電平。 65【例9-6】并行轉(zhuǎn)串行電路如圖9-17所示 74LS165加載了S1S8上的并行數(shù)據(jù)后,依照TXD引腳傳來的移位脈沖,將數(shù)據(jù)一位一位地從RXD引腳傳入單片機(jī)中。當(dāng)SBUF數(shù)據(jù)填滿后產(chǎn)生RI中斷,然后將緩沖器SBUF中的數(shù)據(jù)通過P0輸出。 程序流程如圖9-18所示。圖9-18 并轉(zhuǎn)串程序流程66【例9-6】 【參考代碼】/*/并轉(zhuǎn)串實(shí)驗(yàn)/*#incl

41、udesbit load=P31;/聲明P31位置main() SCON=0 x11;/設(shè)定為Mode0,REN=1,RI=1 /= /=SM0=SM1=SM2=REN=TB8=RB8=TI=RI= / 0 0 0 1 0 0 0 1 /=67【例9-6】 【參考代碼】 while(1) load=0;/輸出負(fù)脈沖,讓74LS165加載數(shù)據(jù)if(load=0);/延長負(fù)脈沖寬度if(load=0);/延遲負(fù)脈沖寬度load=1;/恢復(fù)高電平RI=0;/清除RIwhile(RI=0);/等待RI串行輸入中斷P0=SBUF;/RI=1時(shí)(接收完成),輸出至P0 68 2 Mode1實(shí)例圖9-19 Mode1自發(fā)自收實(shí)例電路圖9-20 Mode1自發(fā)自收程序流程69【例9-7】 單片機(jī)的發(fā)送引腳TXD與自己的接收引腳RXD相連,可以達(dá)到自發(fā)自收的目的,單片機(jī)的P2連接指撥

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論