版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、8051內(nèi)部資源,常熟理工學(xué)院 物理與電子工程學(xué)院 2011.4,Chap8 8051內(nèi)部資源,8.1 外部中斷:INT0、INT1 8.2 定時/計數(shù)器:T0、T1 8.3 串行口:RXD、TXD,8.1 外部中斷,8051外部中斷,中斷 中斷源 中斷優(yōu)先級 中斷嵌套,8051外部中斷,中斷:當(dāng)CPU正處理某項事務(wù)時,若外界或內(nèi)部發(fā)生緊急事件,要求CPU暫停正在處理的工作轉(zhuǎn)而去處理這個緊急事件,待處理完以后再回到原來被中斷的地方,繼續(xù)執(zhí)行原來被中斷了的程序,這樣的過程稱為中斷。(堆棧) 中斷源:向CPU提出中斷請求的源稱為中斷源 外部跳變信號(下降延) 外部低電平等 (0),8051外部中斷
2、,中斷優(yōu)先級:當(dāng)幾個中斷源同時請求中斷時,CPU應(yīng)優(yōu)先響應(yīng)最需緊急處理的中斷請求。為此,需要規(guī)定各個中斷源的優(yōu)先級。在優(yōu)先級高的中斷請求處理完了以后。再響應(yīng)優(yōu)先級低的中斷請求。 中斷嵌套:當(dāng)CPU正在處理一個優(yōu)先級低的中斷請求的時,如果發(fā)生另一個優(yōu)先級比它高的中斷請求,CPU能暫停當(dāng)前處理的中斷,轉(zhuǎn)去處理優(yōu)先級高的中斷請求,待處理完以后,再回到原來正在處理的低級中斷程序,這種高級中斷源能中斷低級中斷源的中斷處理稱為中斷嵌套。,8051中斷,8051單片機有 5個中斷源 2個中斷優(yōu)先級(2級中斷嵌套),優(yōu)先級可通過編程實現(xiàn) IE(中斷允許寄存器):中斷源的中斷請求是否能得到響應(yīng),受IE的控制;
3、IP(中斷優(yōu)先級寄存器):各個中斷源的優(yōu)先級可由IP的各位來確定;同一優(yōu)先級中的各中斷源同時請求中斷時,由內(nèi)部的查詢邏輯來確定響應(yīng)的次序。,8051中斷源,8051五個中斷源 INT0中斷(P3.2) T0中斷 (P3.4) INT1中斷(P3.3) T1中斷 (P3.5) 串行中斷(P3.0、P3.1),8051中斷入口(ROM)地址和優(yōu)先級,8051 INT0中斷機理,當(dāng)INT0引腳輸入如下信號: 下降沿(IT0=1)或 低電平(IT0=0) CPU自動(硬件)產(chǎn)生中斷標志(IE0=1),此時 若INT0中斷允許(使能EX0=1,EA=1),則CPU立即停止當(dāng)前程序,跳轉(zhuǎn)到INT0對應(yīng)的中
4、斷入口(ROM保留地址0 x0003)執(zhí)行中斷服務(wù)程序(中斷服務(wù)程序后CPU自動對中斷標志清零:IE0=0),待INT0中斷服務(wù)程序執(zhí)行完畢后再回原執(zhí)行程序處; 若若INT0中斷未允許,則程序不能跳轉(zhuǎn)到INT0中斷入口,不執(zhí)行中斷服務(wù)程序(中斷標志IE0不能自動清0)。 問提:中斷標志IE0的產(chǎn)生與中斷使能是否有關(guān)?,INT0中斷方式執(zhí)行流程,#include reg51.h unsigned char i=0; /*int0中斷服務(wù)程序*/ void INT0_ISR(void) interrupt 0 delay(200); if((P3 /等待中斷 ,INT0 查詢方式,void mai
5、n(void) IT0=1; /EX0=1;EA=1; while(1) /查詢方式1: if(IE0= =1) IE0=0;/手動清中斷標志 /P1=+I; _- P2=LED_segbufi P0=LED_biti I+; If(I=6) I=0 delay(500); ,void main(void) while(1) /查詢方式2: while(IE0= =0) ; /等待INT0外部中斷 IE0=0; /手動清中斷標志 / ,8051中斷系統(tǒng),與中斷有關(guān)的SFR,注:*表示可以位尋址,TCON:定時計數(shù)器控制寄存器,TF1、TF0 :T1、T0溢出標志 TR1、TR0 :T1、T0啟
6、動控制位(TR=1:啟動定時器) IE1、IE0 :INT1、INT0中斷標志 IT1、IT0 :INT1、INT0觸發(fā)方式控制位(IT=1:下降沿觸發(fā),IT=0:低電平觸發(fā)) TF1、TF0、IE1、IE0都具有自動清零功能。,SCON:串行口控制寄存器,SM0 SM1串行模式選擇 SM2 多機通訊允許位:方式0時,此位應(yīng)該為0;模式1時,當(dāng)接收到停止位時,該位將置位;方式2或方式3時,當(dāng)接收的第9位數(shù)據(jù)為1時,將置位 REN 串行接收允許位 TB8 在模式2和模式3中,將被發(fā)送數(shù)據(jù)的第9位 RB8:在方式0中,該位不起作用;在方式1中該位為接收數(shù)據(jù)的停止位;在方式2和方式3 中為接收數(shù)據(jù)的
7、第9 位 TI 串行發(fā)送結(jié)束標志,由軟件清零 RI 串行接收結(jié)束標志,由軟件清零,IE:中斷允許寄存器,EA: 使能標志位。 1:所有中斷使能;0:禁止所有中斷 ET2:T2中斷使能 ES: 串行通信中斷使能 ET1:T1中斷使能 EX1:INT1中斷使能 ET0:T0中斷使能 EX0:INT0中斷使能,IP:中斷優(yōu)先級寄存器,- 保留 - 保留 PT2:T2中斷優(yōu)先級 PS: 串行通信中斷優(yōu)先級 PT1:T1中斷優(yōu)先級 PX1:INT1優(yōu)先級 PT0:T0中斷優(yōu)先級 PX0:INT0優(yōu)先級,與中斷有關(guān)的各位,PX0、PT0、PX1、PT1、PS EX0、ET0、EX1、ET1、ES、EA I
8、T0、IT1 TR0、TR1 IE0、 IE1 、TF0、TF1、 TI 、RI 以上各位可位尋址,且均為高電平有效,8051外部中斷編程示例,#include reg51.h /C51 中斷程序框架 /*int0中斷服務(wù)程序*/ void INT0_ISR (void) interrupt 0 using 0 /中斷服務(wù)程序 / /*主函數(shù)*/ void main (void) IT0=1; EX0 = 1; EA = 1; / 打開中斷源 while (1) ; /等待中斷 ,中斷服務(wù)函數(shù)與寄存器的定義,為了滿足在C語言源程序中直接編寫中斷服務(wù)程序的要求,C51編譯器對函數(shù)的定義進行了擴展
9、,增加了一個擴展關(guān)鍵字interrupt。它是函數(shù)定義時的一個選項,加上這個選項即可將一個函數(shù)定義成中斷服務(wù)函數(shù)。 定義格式為: 函數(shù)類型 函數(shù)名(形式參數(shù)表) interrupt n using n ,中斷服務(wù)函數(shù)與寄存器的定義,函數(shù)類型 函數(shù)名(形式參數(shù)表) interrupt n using n 關(guān)鍵字interrupt后面的n是中斷號,n的范圍為031。編譯器從8n+3處產(chǎn)生中斷向向量,具體的中斷號n和中斷向量取決于8051單片機芯片型號,常用中斷源和中斷向量如表所示。,中斷服務(wù)函數(shù)與寄存器的定義,工作寄存器:8051片內(nèi)RAM中有4個工作寄存器組,每個寄存器組中含8個工作寄存器(R0
10、R7)。 C51編譯器擴展了一個關(guān)鍵字using,專門用來選擇8051單片機的工作寄存器組。 在定義一個函數(shù)時,using后面的n是一個03的常數(shù),分別表示4個功能完全一樣的工作寄存器組。 在定義一個函數(shù)時,using是一個選項,若缺省編譯器自動分配一個寄存器組作絕對寄存器組訪問。需要注意的是,關(guān)鍵字using和interrupt的后面都不允許跟帶運算符的表達式。,中斷服務(wù)函數(shù)與寄存器的定義,void INT0_ISR(void) interrupt 0 void TIMER0_ISR(void) interrupt 1 void INT1_ISR(void) interrupt 2 void
11、 TIMER1_ISR(void) interrupt 3 void UART_ISR(void) interrupt 4 ,中斷服務(wù)函數(shù)與寄存器的定義_ Keil C51命令,DEFINE BUTTON(定義按鈕)命令 定義:DEFINE BUTTON “按鈕名”,“命令” 在Debug-Function Editor(Open Ini File)中定義外中斷按鈕: define button INT0(P3.2) , PORT3=PORT30 x04 define button T0(P3.4) , PORT3=PORT30 x10 define button INT1(P3.3) , P
12、ORT3=PORT30 x08 define button T1(P3.5) , PORT3=PORT30 x20 每按鈕一次對P3.2取反 刪除:KILL BUTTON n define button “clr drtr”,”dptr=0” kill button 1,中斷服務(wù)函數(shù)與寄存器的定義_ Keil C51命令,EVAL EVAL (1/256) 0 x00 EVAL (256/256) 0 xFF PORT3 0 xFF ex0_isr_counter 詢問變量的值,中斷如何擴充1,定時器中斷作為外部中斷使用 把8051的T1 、T0用作對外部脈沖計數(shù)方式。每當(dāng)P3.4(T0)或P
13、3.3(T1)引腳上發(fā)生負跳變時, T1 和T0的計數(shù)器加1。利用這個特性,可以把P3.4和P3.3引腳作為外部中斷請求輸入線,而定時器的溢出中斷作為外部中斷請求標志。,中斷如何擴充1,定時器中斷作為外部中斷使用(軟件) 定時器T1對外部計數(shù) /*TH1、TL1采用16進制賦值*/ void int0(void) interrupt 3 /*中斷服務(wù)程序*/ void main(void) TMOD=(TMOD /*TL1=-1%256; */ while(1) ; ,中斷如何擴充2,中斷和查詢結(jié)合的方式,中斷如何擴充2,#include sbit LED_A=P10; sbit LED_B=
14、P11; sbit LED_C=P12; sbit IA=P13; sbit IB=P14; sbit IC=P15;,中斷如何擴充2,void main(void) IT0=1;IT1=1; EX0=1;EX1=1; EA=1; LED_A=0;LED_B=0;LED_C=0; IA=1;IB=1;IC=1; while(1); ,中斷如何擴充2,void int0(void) interrupt 0 LED_A=0;LED_B=0;LED_C=0; IE1=0; EX1=1; void int1(void) interrupt 2 EX1=0; if(IA=0) LED_A=1; else
15、 if(IB=0) LED_B=1; else if(IC=0) LED_C=1; ,中斷如何擴充3,利用硬件擴充多個中斷源 采用一個8/3優(yōu)先編碼器74LS148,把多個中斷源信號作為一個中斷效果很好。 I7-I0優(yōu)先級逐步降低 GS為標志位:判斷是否有有效輸入,中斷如何擴充3,軟件設(shè)計思路 #include unsigned char status; bit flag; void int1(void) interrupt 2 using 2 flag=1; /*設(shè)置標志*/ status=P1; /*存狀態(tài)*/ ,中斷如何擴充3,軟件設(shè)計思路 void main(void) PX1=1;
16、/*置INT1高優(yōu)先級中斷*/ EX1=1; EA=1; /*INT1開中斷,CPU開中斷*/ while(1) if(flag) /*有中斷*/ switch(status) /*根據(jù)中斷源分支*/ case 0: break; /*處理0*/ case 1: break; /*處理1*/ case 2: break; case 3: break; default:; flag=0; ,8.2 定時器,問題提出,void delay(unsigned char n) unsigned char i; for(i=0;in;i+) ; ,void delay(unsigned int n) u
17、nsigned int i; for(i=0;in;i+) ; ,問題提出(fosc=11.0592MHz),y1=32.82+17.34*x1(us) y2=41.79+26.01*x2(uS),8051 定時/計數(shù)器,8051單片機內(nèi)部有2個16位可編程的定時計數(shù)器,即T0和T1(8052提供3個,這第三個稱為T2)。,什么是內(nèi)部定時、外部計數(shù)? 8051計數(shù)器的計數(shù)方式?遞增、溢出,8051 定時/計數(shù)器,定時器/計數(shù)器結(jié)構(gòu)框圖,內(nèi)部定時:輸入的時鐘脈沖由晶振的輸出經(jīng)12分頻后得到; 外部計數(shù):接相應(yīng)的外部輸入引腳T0(P3.4)或T1(P3.5)。在這種情況下,當(dāng)檢測到輸入引腳上的下降
18、沿(電平由高跳變到低)時,計數(shù)器就加1。,8051 定時/計數(shù)器工作機理,定時器:對機器周期計數(shù),即n12/fosc 計數(shù)器:對T0引腳上的脈沖計數(shù) 定義定時器(T0)工作方式: 13位、 16位、8位 設(shè)置T0定時初使值,若為16位定時方式,則定時初值可為0(定時最大)65535(定時最小)。舉n=50000,則計數(shù)初值應(yīng)為65536-50000=15536=0 x3CB0,需對TH0、TL0賦計數(shù)初值: TH0=0 x3C;TL0=0 xB0; TH0=(65536-50000)/256; TL0= (65536-50000)%256;,8051 定時/計數(shù)器工作機理,手工啟動定時器(TR
19、0=1)后,T0開始對機器周期計數(shù)(硬件對TH0、TL0構(gòu)成的16位計數(shù)器遞增計數(shù));當(dāng)計至TH0=0 xff,TL0=0 xff后,再計一次則定時器產(chǎn)生溢出(溢出標志TF0=1): 此時 若T0中斷允許(使能ET0=1,EA=1),則CPU立即停止當(dāng)前程序,跳轉(zhuǎn)到T0對應(yīng)的中斷入口(ROM保留地址0 x000B)執(zhí)行中斷服務(wù)程序(中斷服務(wù)程序后CPU自動對溢出標志清零:TF0=0),待T0中斷服務(wù)程序執(zhí)行完畢后再回原執(zhí)行程序處; void TIMER0_ISR(void) interrupt 1 /定時器0中斷服務(wù)程序 若T0中斷未允許,則程序不能跳轉(zhuǎn)到T0中斷入口,不執(zhí)行中斷服務(wù)程序(中斷
20、標志此時TF0不能自動清0)。,8051定時/計數(shù)器工作機理,8051 定時/計數(shù)器機理,進入定時器中斷服務(wù)程序后,必須重新對TH0、TL0賦初值(之前硬件已把TH0、TL0修改了): void TIMER0_ISR(void)interrupt 1 TH0=(65536-COUNT)/256; TL0=(65536-COUNT)%256; / void TIMER0_ISR(void)interrupt 1 / TH0=(65536-COUNT)/256; TL0=(65536-COUNT)%256; 問題:以上兩種賦初值方式哪種更好?,8051 定時/計數(shù)器中斷方式編程,#define C
21、OUNT 50000,void main(void) TMOD=0 x0; /定時/計數(shù)器方式定義 TH0= (65536-COUNT)/256; TL0= (65536-COUNT)%256; /定時/計數(shù)器賦初值 ET0=1; EA=1; /定時器0中斷允許 TR0=1; /定時器0定時開始 while(1); /等待定時/計數(shù)器中斷溢出(TF0) ,void TIMER0_ISR(void) interrupt 1 using 1 /進入中斷服務(wù)程序后,CPU自動清TF0溢出標志位 TH0= (65536-COUNT)/256; TL0= (65536-COUNT)%256; /重新賦計
22、數(shù)值 /中斷服務(wù)程序 ,8051 定時/計數(shù)器查詢方式編程,/中斷方式 #define COUNT 50000 void TIMER0_ISR(void) interrupt 1 /進入后,CPU自動清TF0標志 TH0= (65536-COUNT)/256; TL0= (65536-COUNT)%256; / void main(void) TMOD=0 x0; TH0= (65536-COUNT)/256; TL0= (65536-COUNT)%256; ET0=1; EA=1; TR0=1; while(1) ; ,/查詢方式 #define COUNT 50000 /*void TIM
23、ER0_ISR(void) interrupt 1 /進入后,CPU自動清TF0標志 TH0= (65536-COUNT)/256; TL0= (65536-COUNT)%256; / */ void main(void) TMOD=0 x0; TH0= (65536-COUNT)/256; TL0= (65536-COUNT)%256; /ET0=1; EA=1; TR0=1; while(1) /添加查詢語句; ,8051 定時/計數(shù)器查詢方式編程,/查詢方式 #define COUNT 50000 void main(void) TMOD=0 x0; TH0= (65536-COUNT)
24、/256; TL0= (65536-COUNT)%256; /ET0=1; EA=1; TR0=1;,while(1) /定時/計數(shù)器查詢方式1 if(TF0= =1) TF0=0; /手工清溢出標志 TH0= (65536-COUNT)/256; TL0= (65536-COUNT)%256; / ,while(1) /定時/計數(shù)器查詢方式2 while(!TF0); /定時等待 TF0=0; /手工清溢出標志 TH0= (65536-COUNT)/256; TL0= (65536-COUNT)%256; / ,8051定時器工作原理,將定時/計數(shù)初使值載入TH0,TL0 啟動定時/計數(shù)器
25、TR0=1 定時/計數(shù)器溢出CPU自動置位溢出標志TF0,8051 內(nèi)部定時示例,例1:設(shè)單片機fosc=12MHz,要求在P1.0引腳上輸出周期為2ms的方波。,分析: 用T0實現(xiàn),采用中斷方式 機器周期:T=1us 計數(shù)值:每隔1ms進入一次T0中斷,中斷服務(wù)程序?qū)1_0取反。因此計數(shù)值n=1ms/1us=1000次 TH0=(65536-1000)/256; TL0=(65536-1000)%256;,8051 內(nèi)部定時示例,例1:設(shè)單片機fosc=12MHz,要求在P1.0引腳上輸出周期為2ms的方波。 程序基本框架,8051 內(nèi)部定時示例,例1:設(shè)單片機fosc=12MHz,要求在
26、P1.0引腳上輸出周期為2ms的方波。,定時器主函數(shù)初使化 TMOD方式定義(T0、16位內(nèi)部定時方式) 確定計數(shù)初值TH0、TL0 T0中斷使能 T0啟動,void main (void) TMOD=0 x?; TH0=(65536-1000)/256; TL0=(65536-1000)%256; ET0=1; EA=1; TR0=1; while (1); ,8051 內(nèi)部定時示例,例1:設(shè)單片機fosc=12MHz,要求在P1.0引腳上輸出周期為2ms的方波。,定時器中斷服務(wù)程序 重新賦計數(shù)初值TH0、TL0 對P1_0取反,void TIMER0_ISR (void) interrup
27、t 1 TH0=(65536-1000)/256; TL0=(65536-1000)%256; P1_0=P1_0; ,8051 內(nèi)部定時示例,例1:設(shè)單片機fosc=12MHz,要求在P1.0引腳上輸出周期為2ms的方波。參考程序見P172,如何用查詢方式實現(xiàn)?,8051 內(nèi)部定時示例,例2:設(shè)單片機fosc=12MHz,要求在P1.0引腳上輸出周期為2ms,占空比為75的矩形波。在例1基礎(chǔ)上應(yīng)作何修改?,8051 內(nèi)部定時示例,例2:設(shè)單片機fosc=12MHz,要求在P1.0引腳上輸出周期為2ms,占空比為75的矩形波。在例1基礎(chǔ)上應(yīng)作何修改?,8051 內(nèi)部定時示例,例3:設(shè)單片機fo
28、sc=12MHz,要求在P1.0引腳上輸出周期為2S的方波。在例1基礎(chǔ)上應(yīng)作何修改?,8051 內(nèi)部定時示例,例4:循環(huán)點亮紅、綠、黃燈,時間間隔為1秒。,8051 外部計數(shù)器應(yīng)用示例,例1:外部中斷擴充,8051 外部計數(shù)器應(yīng)用示例,例2:高速公路車數(shù)統(tǒng)計與顯示模塊設(shè)計 例3:簡易頻率計設(shè)計,8051 定時/計數(shù)器應(yīng)用示例,對外部脈沖計數(shù)時要注意對外部脈沖消抖,按鍵時存在抖動,必須消抖:硬件、軟件法,8051 定時/計數(shù)器應(yīng)用示例,硬件消抖(采用基本RS觸發(fā)器),8051 定時/計數(shù)器應(yīng)用示例,軟件消抖(延時采樣),void TIMER0_ISR(void) interrupt 1 dela
29、y(100); if(P3_4= =1) return; /*判別是否為有效T0中斷,以抗干擾*/ /*中斷服務(wù)程序*/ ,8051 定時/計數(shù)器,定時計數(shù)器有四種工作方式。其工作方式由兩個SFR決定 定時方式寄存器:TMOD 定時控制器:TCON,8051 定時/計數(shù)器,TMOD:定時器方式寄存器,8051 定時/計數(shù)器,TMOD:定時器方式寄存器 GATE:門控信號 1:LINT#*TR, C/T啟動受雙重控制 0:L=1, C/T的啟動僅受TR0或TR1控制,與INT無關(guān) CT#:計數(shù)器、定時器選擇位 1:計數(shù)器(對T0:P3.4、T1:P3.5外部脈沖計數(shù)) 0:定時器(對內(nèi)部機器周期
30、計數(shù)) M1、M0:工作方式選擇位,8051 定時/計數(shù)器,M1和M0:工作方式選擇位,8051 定時/計數(shù)器,方式0 (M1M000):13位,TH(高8位),TL(低5位),滿計數(shù)值213; C/T#=0 內(nèi)部定時; C/T#=1 外部計數(shù)。 C/T#啟動后立即加1計數(shù),當(dāng)13位計數(shù)滿時,TH向高位進位,此進位將使TF=1(中斷溢出標志),即產(chǎn)生中斷請求。若C/T允許中斷(ET0、ET1=1、EA=1),則響應(yīng)中斷,執(zhí)行中斷服務(wù)程序。當(dāng)CPU轉(zhuǎn)向中斷服務(wù)程序時,TF=0(自動清0),8051 定時/計數(shù)器,方式1(M1M001):16位,由TH和TL寄存器各提供8位,滿計數(shù)值為216。 方
31、式2(M1M010):8位可自動重載的C/T#,滿計數(shù)值為28。 在方式0和方式1中,當(dāng)計數(shù)滿后,若要進行下一次定時計數(shù),須用軟件向TH和TL重裝預(yù)置計數(shù)初值。方式2中TH和TL被當(dāng)作兩個8位計數(shù)器,計數(shù)過程中,TH寄存8位初值并保持不變,由TL進行8位計數(shù)。計數(shù)溢出時,除產(chǎn)生溢出中斷請求外,還自動將TH中初值重裝到TL,即重裝載。除此之外,方式2也同方式0。 方式3(略),8051 定時/計數(shù)器,定時器計數(shù)器的初始化及其步驟 使用8051的T0、T1前,應(yīng)對它進行編程初始化,主要是對TCON和TMOD編程;計算和裝載計數(shù)初值(TH、TL)。 一般完成以下幾個步驟: TMOD:確定C/T#工作
32、方式 TH、TL:計算計數(shù)初值,并裝載TH、TL IE:中斷方式時,需打開中斷使能 TCON:啟動定時器計數(shù)器(TRl、TR0),8051 定時/計數(shù)器,說明以下語句功能 TMOD=0 x10; TMOD=(TMOD,8051 定時/計數(shù)器,定時器初值的計算 在內(nèi)部定時方式下, T0、T1對內(nèi)部機器周期計數(shù),若fosc=6MHz,一個機器周期為12/fosc=2us,所以 方式0 13位定時器最大定時間隔=2132us=16.384ms 方式1 16位定時器最大定時間隔=2162us=131.072ms 方式2 8位定時器最大定時間隔 =28 2us=512us 例:若使T0、T1工作在方式1
33、,要求定時1ms,求計數(shù)初值。設(shè)計數(shù)初值為x,則有: (216x)2us=1000us x=216500=0FEOCH 因此,TH,TL可置500,8051 定時/計數(shù)器,定時計數(shù)器的應(yīng)用實例 例1 :設(shè)fosc=6MHz,要求在P1.0腳上輸出周期為2ms的方波。 解:采用定時器T0的方式1編程 要求定時間隔1ms,每次時間到P1.0取反。機器周期=12fosc=2us 計數(shù)次數(shù)n=1000us2us500 由于計數(shù)器遞增計數(shù),為得到500個計數(shù)之后的定時器溢出,必須給定時器置初值65536500。,8051 定時/計數(shù)器,用查詢方式在P1.0引腳上產(chǎn)生周期為2ms的方波 #include
34、sbit P1_0=P10; void main(void) TMOD=0 x01; /*定時器0方式1 */ TR0=1; /*啟動T0 */ for(;) TH0= (655361000)/256; /*裝載計數(shù)初值*/ TL0= (655361000)256; do while(!TF0); /*查詢等待TF0置位*/ P1_0=!P1_0; /*定時時間到P1.0反相 */ TF0=0; /*軟件清TF0 */ ,8051 定時/計數(shù)器,用中斷方式在P1.0引腳上產(chǎn)生周期為2ms的方波 #include sbit P1_0=P10; void T0(void) interrupt 1
35、using 1 /*T0中斷服務(wù)程序入口*/ P1_0=!P1_0; /*P1.0取反*/ TH0= (65536500)/256; /*計數(shù)初值重載*/ TL0=(65536500)256; void main(void) TMOD=0 x01; /*TC0工作在定時器方式l*/ TH0=(65536500)/256; /*計數(shù)初值*/ TL0=(65536500)256; ET0=1; EA=1; /*中斷使能*/ TR0=1; /*啟動T0*/ while(1); ,8051 定時/計數(shù)器,中斷擴充:內(nèi)部定時器T0用作外中斷 void T0 (void) interrupt 1 /*中斷
36、服務(wù)程序*/ void main (void) TMOD = 0 x66; /*T0用作計數(shù)器,采用方式2具有自動裝載功能*/ ET0 = 1; EA = 1; TH0=0 xFF; TL0=0 xFF; TR0 = 1; while (1); define button Toggle T0 (P3.4) , PORT3 = 0 x10,8.3 串行口,PC機RS232串口,RS232串口是每臺計算機的必要配備,通常PC含有COM1、COM2。 一般計算機 COM1:9 Pin COM2:25 Pin 新一代的計算機均為9 Pin。 RS232通訊端口。在計算機上的RS232均是公頭,即使是2
37、5 Pin也是公頭,注意與 打印機端口(25 Pin)區(qū)分。,PC機串口地址,RS232串口,RS232串口引腳功能,RS232(DB9與DB25對比),9 Pin與25 Pin的關(guān)系,8051串口,8051有一個可編程的全雙工串口。用于串行通信的UART(通用異步接收發(fā)送) 。 TXD端發(fā)送數(shù)據(jù); RXD端接收數(shù)據(jù)。 串口可實現(xiàn)短距離(10m)機間通信。 RS232C和PC機進行通信時可使用驅(qū)動芯片(MAX232) 。,8051串口,對應(yīng)有兩個緩沖器SBUF。(共用一個地址),接收緩沖器。 接收:b=SBUF;,發(fā)送緩沖器; 發(fā)送:SBUF=a;,8051串口,8051有接收結(jié)束標志(RI:
38、receive interrupt)和發(fā)送結(jié)束標志(TI:transfer interrupt);該標志為高電平有效,且必須手工清0(RI=0、TI=0)。 串口的編程可采用中斷方式或查詢方式 采用查詢方式編程時,可設(shè)置最長等待時間,以確保其它程序正常運行 8051串口中斷程序格式: void UART_ISR(void) interrupt 4,串口通信,三線制,交叉線,串口通信分類,同步( synchronous ) 異步( asynchronous ),串口通信格式(異步),111位起始位(0)9位數(shù)據(jù)位(低位在前)1位停止位(1) 非傳輸時保持“1” 如圖發(fā)送數(shù)據(jù)為:0 xCB,串口通
39、信格式,TTL電平(有效距離1m) RS232電平(有效距離10m) RS485電平(有效距離5km ),RS232邏輯電平的定義,1:15V3V 0: 3V15V 與TTL、CMOS邏輯有區(qū)別,因此必須對其進行電平轉(zhuǎn)換,TTL-RS232電平比較(0 x35),TTLRS232電平轉(zhuǎn)換,TTLRS232電平轉(zhuǎn)換電路,串口通信方式,串口通信方式 點對點 PC機與MCU(PC與智能儀表間的通信) MCU與MCU 點對多:多機通信,串口通信模式,上位機主動發(fā) 發(fā)單字節(jié)指令 發(fā)多字節(jié)指令 定長字節(jié)指令: 起始字節(jié):0 xAA 控制數(shù)據(jù)地址:0 x01 控制數(shù)據(jù) 和校驗:控制數(shù)據(jù)的和 結(jié)束字節(jié):0 x
40、55 不定長字節(jié)指令 結(jié)束標志chr$(13)+chr$(10),串口通信模式-單字節(jié)發(fā)送,單字節(jié)通信,上位機主動 上位機程序 串口通信工具:scomm32 自己編程: 控件實現(xiàn)(VB) API函數(shù)實現(xiàn)(VC) 下位機程序 接收:中斷方式 發(fā)送:查詢方式,PC機串口通信實現(xiàn),兩種方式實現(xiàn) 控件MSCOMM32.OCX 應(yīng)用程序接口函數(shù):API(OpenFile(),PC機串口通信(MSCOMM32.OCX),首先為工程添加MSCOMM32.ocx等控件 添加如下代碼:包括串口初始化,發(fā)送、接收等操作 Private Sub Form_Load() If MSComm1.PortOpen The
41、n MSComm1.PortOpen = False 關(guān)閉串口 MSComm1.CommPort = 1 設(shè)置串口1 MSComm1.Settings = 9600,N,8,1 設(shè)置串口波特率 MSComm1.InputMode = comInputModeBinary 設(shè)置串口通信模式-二進制模式 MSComm1.InputLen = 1 設(shè)置每次從輸入緩沖區(qū)取出的字節(jié)數(shù) If MSComm1.PortOpen = False Then MSComm1.PortOpen = True 打開串口 End Sub,PC機串口通信(MSCOMM32.OCX),Public Sub Command1
42、_Click() Dim ao(0 To 0) As Byte Dim av As Variant Dim ai(1 To 4) As Byte 存放數(shù)據(jù)的窗體級變量,因為得到的數(shù)據(jù)尚需進一步處理 Dim tt As Long Dim count As Integer MSComm1.InBufferCount = 0 清輸入/輸出緩沖區(qū) MSComm1.OutBufferCount = 0 ao(0) = int(val(Text1.text) 取出待發(fā)送的數(shù)據(jù) MSComm1.Output = ao() 串口發(fā)送數(shù)據(jù) tt = GetTickCount 利用API函數(shù)取得系統(tǒng)時間 Do 等
43、待輸入緩沖區(qū)數(shù)據(jù)=1或延時3秒鐘結(jié)束 Loop Until MSComm1.InBufferCount = 1 Or GetTickCount - tt 3000 If MSComm1.InBufferCount =1 Then 如果輸入緩沖區(qū)有1字節(jié)的數(shù)據(jù),則取出數(shù)據(jù)并處理 av = MSComm1.Input 從輸入緩沖區(qū)取出數(shù)據(jù) ai(1) = av(0) Text2.Text = ai(1) Exit Sub Else MsgBox “請檢查” + “電源、串口連線、波特率設(shè)置后重試!”, vbOKOnly + vbCritical, “串口錯誤:” 串口通信失敗提示信息 End If
44、 End Sub,PC機串口通信(MSCOMM32.OCX),新建標準模塊,在標準模塊中添加 Declare Function GetTickCount Lib kernel32 () As Long,串口通信注意點,為了確保發(fā)送的數(shù)據(jù)都能被準確接收: 格式統(tǒng)一: 統(tǒng)一單字節(jié)發(fā)送與接收的格式(起始位數(shù)據(jù)位停止位) 多字節(jié)發(fā)送時,應(yīng)先制定雙方的通信協(xié)議。 波特率統(tǒng)一:(最大:115200bps) 統(tǒng)一發(fā)送與接收的速率(波特率(bps:bit per second):每秒鐘發(fā)送的位數(shù));波特率可用內(nèi)部時鐘T1或T2(8052)獲得;典型波特率:9600bps。 通信時應(yīng)設(shè)置最長等待時間,8051串
45、口中斷機理,執(zhí)行串口發(fā)送指令SBUF=a;通過TXD口發(fā)送串行數(shù)據(jù),發(fā)送結(jié)束后CPU自動產(chǎn)生發(fā)送結(jié)束標志(TI=1);此時若串行中斷使能(ES=1,EA=1) ,則程序立即停止當(dāng)前程序,跳轉(zhuǎn)置中斷號為4的串行口中斷入口地址(0 x0023),執(zhí)行中斷服務(wù)程序void UART_ISR(void) interrupt 4 ,CPU不具有自動清零功能; 同樣,若串口在RXD引腳接收到數(shù)據(jù),硬件自動產(chǎn)生接收結(jié)束標志(RI=1),若此時若串行中斷使能(ES=1,EA=1),則程序立即停止當(dāng)前程序,跳轉(zhuǎn)置中斷號為4的串行口中斷入口地址(0 x0023),執(zhí)行中斷服務(wù)程序void UART_ISR(voi
46、d) interrupt 4 ,CPU不具有自動清零功能,可通過b=SBUF;指令取出暫存在數(shù)據(jù)緩沖區(qū)內(nèi)的數(shù)據(jù)。 為什么串口中斷不具有硬件自動清中斷標志功能? 因為接收與發(fā)送結(jié)束都能進入同一中斷,因此在不具有自動清標志功能,需加判斷標志語句。,8051串口中斷機理,串口中斷使能:ES、EA 串行發(fā)送與接收結(jié)束會進入同一中斷服務(wù)程序 void UART(void) interrupt 4 因此,若采用中斷方式,在中斷服務(wù)程序中必須先判別中斷是發(fā)送還是接收中斷,以便進一步處理。(SBUF=a;bSBUF;),8051串口相關(guān)寄存器,串口初始化 數(shù)據(jù)格式設(shè)置 SCON 波特率設(shè)置 TMOD TH1、
47、TL1 PCON TR1 ES、EA 串口發(fā)送與接收 SBUF RI、TI,8051串口初始化(格式設(shè)置),SCON:串行口控制寄存器,波特率(bps):每秒鐘傳輸?shù)奈粩?shù)。方式1、3必須借助于T1 10位通信:1位起始位(0)8位數(shù)據(jù)位1位停止位(1) T1溢出率1 / T1定時時間,8051串口初始化(格式設(shè)置),SM2:多機通信使能控制位(方式2,3); REN(Receive Enable)串行接收允許位; TB8(Transmit Bit 8)在方式2、3中,將被發(fā)送數(shù)據(jù)的第9位 (奇偶校驗位等); RB8(Receive Bit 8第9位) 在方式0中,該位不起作用; 在方式1中該位
48、為接收數(shù)據(jù)的停止位; 在方式2、3中為接收數(shù)據(jù)的第9位。 TI、RI發(fā)送/接收結(jié)束標志位,軟件(手工)清零;,8051串口工作方式,方式0: 移位寄存器輸入輸出方式。數(shù)據(jù)通過RXD輸入出,TXD輸出移位脈沖CP。該方式下,收發(fā)數(shù)據(jù)為8位,低位在前。波特率固定為fosc12,發(fā)送:SBUF=a; (發(fā)送條件:TI = 0,8位輸出結(jié)束時TI=1) 接收:b=SBUF; (接收條件: REN=1 / 11010000 PCON=0 x00; TMOD=(TMOD ,8051串口數(shù)據(jù)發(fā)送與接收,發(fā)送數(shù)據(jù) SBUF=a; /發(fā)送數(shù)據(jù) while(TI=0); /等待發(fā)送(結(jié)束標志) TI=0; /手工
49、清發(fā)送標志 接收數(shù)據(jù) while(RI=0); /等待接收(結(jié)束標志) RI=0; /手工清接收標志 b=SBUF; /接收數(shù)據(jù),8051串口通信框架(中斷方式),void UART_ISR(void) interrupt 4 unsigned char a; if(RI=1) /若接收到數(shù)據(jù) a=SBUF; /保存接收的數(shù)據(jù) RI=0; /手工清接收結(jié)束標志 SBUF=a+1; /串口發(fā)送回復(fù)數(shù)據(jù) while(TI=0); /等待發(fā)送結(jié)束 TI=0; /手工清發(fā)送標志 ,void main(void) init_sbuf(); /串口初使化 ES=1; /串口中斷使能 EA=1; while
50、(1); /等待串口中斷 ,問題,為什么8051單片機常用11.0592MHz的晶振? 串口通信時應(yīng)注意些什么問題? 8051單片機串口通信有幾種方式?各種方式有何異同?,8051串口通信實驗,8051單片機發(fā)送實驗 單片機連續(xù)發(fā)送0 x35,用示波器觀察AT89S51 TXD(P3.1)和MAX232 T1OUT(MAX232第14腳)信號,畫出波形分析并比較兩波形; 8051單片機接收實驗 PC機借助sscom32發(fā)送任意數(shù)據(jù)(a),單片機接收后回復(fù)數(shù)據(jù)(a+1); PC機發(fā)送實驗 用VB自編串口發(fā)送程序以實現(xiàn)實驗2。 注:10位通信格式,9600bps,如何設(shè)置最長等待時間?,temp_
51、time=TH0*256+TL0; while(RI=0) if(TH0*256+TL0) -temp_time=1000| (temp_time -TH0*256+TL0)=65536-1000) break; /等待接收(結(jié)束標志) RI=0; /手工清接收標志 b=SBUF; /接收數(shù)據(jù),8051串口通信小結(jié),初始化步驟 使用串口前,應(yīng)對它進行初始化。 設(shè)置產(chǎn)生波特率的T1(TMOD、TH1、TL1、ET1、EA、TR1); 串行口控制(SCON、PCON); 中斷控制(ES、EA)。具體步驟如下: 確定串行口控制編程SCON; 確定Tl工作方式編程TMOD寄存器; 計算T1初值裝載TH
52、l、TLl; 啟動T1編程TCON中的TRl位; 串行口在中斷(查詢方式除外)方式下,需開CPU和源中斷編程IE寄存器。(是否有必要使ET11?),8051串行口示例1,unsigned char data110=M,C,S,-,5,1,0 x0d,0 x0a,0 x00; void main() unsigned char i; sbuf_init(); while(1) i=0; while( data1i!=0 x00) SBUF=data1i; while(TI=0); TI=0; i+; ,8051串行口示例2,8051與PC機通信程序(查詢方式) unsigned char com
53、municate(unsigned char c) switch(c) case 0 x41: proc1(); return(0 x42); break; case 0 x42: proc2(); return(0 x43); break; case 0 x43: proc3(); return(0 x44); break; default:; void main(void) while(1) while(RI=0); RI=0; a1=SBUF; /MCU接收數(shù)據(jù) b1=communicate(a1); /MCU處理數(shù)據(jù) SBUF=b1; while(TI=0); TI=0; /MCU發(fā)送
54、數(shù)據(jù) ,8051 點對點通信,8051機間通信的C編程,雙機通信也稱點對點通信,可用于MCU和MCU間通信,也用于MCU與PC間通信。 在較大規(guī)模的測控系統(tǒng)中,一般采用分布式控制。 上位機進行管理。 下位機完成各種各樣的檢測控制。,8051 點對點通信,上位機實現(xiàn):編輯、查詢、統(tǒng)計、報表打印等管理功能,下位機實現(xiàn):控制、數(shù)據(jù)采集等檢測控制功能,8051 點對點通信,通信雙方的約定:發(fā)送機:SYSTEM1 ,接收機:SYSTEM2 A先送 “AA”信號,B收到后應(yīng)答“BB”,表示B同意接收。當(dāng)A收到“BB”后,開始發(fā)送數(shù)據(jù),每發(fā)送一次求“校驗和”,假定數(shù)據(jù)塊長度為16個字節(jié),數(shù)據(jù)緩沖區(qū)為buf,數(shù)據(jù)塊發(fā)送完后馬上發(fā)送“校驗和” B接收數(shù)據(jù)并將其轉(zhuǎn)貯到數(shù)據(jù)緩沖區(qū)buf每接收到一個數(shù)據(jù)便計算一次“校驗和”,當(dāng)收齊一個數(shù)據(jù)塊后,再接收A發(fā)來的校驗和,并將它與B求出的校驗和比較。 若兩者相等,接收正確,B機回答0 x00; 若兩者不等,接收不正確,B機回答0 xFF,請求重發(fā)。 A收到0 x00的回答后,結(jié)束發(fā)送。若收到的答復(fù)非
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 叉車司機崗前合規(guī)化考核試卷含答案
- 太陽能利用工操作技能知識考核試卷含答案
- 化工工藝試驗工安全管理強化考核試卷含答案
- 數(shù)控火焰切割機操作工崗前操作安全考核試卷含答案
- 光纖篩選工安全管理能力考核試卷含答案
- 主提升機操作工復(fù)試模擬考核試卷含答案
- 工藝扎染工崗前跨界整合考核試卷含答案
- 數(shù)字孿生應(yīng)用技術(shù)員安全操作知識考核試卷含答案
- 2024年鹽亭縣招教考試備考題庫附答案
- 工業(yè)設(shè)計工藝師安全管理競賽考核試卷含答案
- 2026年陜西省森林資源管理局局屬企業(yè)公開招聘工作人員備考題庫及參考答案詳解1套
- 英語A級常用詞匯
- 2023-2024學(xué)年深圳市初三中考適應(yīng)性考試英語試題(含答案)
- NB-T 47013.15-2021 承壓設(shè)備無損檢測 第15部分:相控陣超聲檢測
- 人教新起點英語五上《Unit5shopping》課件-課件
- 各品牌挖掘機挖斗連接尺寸數(shù)據(jù)
- 四川省成都市八年級上學(xué)期物理期末考試試卷及答案
- GB/T 38697-2020塊菌(松露)鮮品質(zhì)量等級規(guī)格
- 三菱FX3U系列PLC編程技術(shù)與應(yīng)用-第二章課件
- RoHS培訓(xùn)資料課件
- 協(xié)調(diào)控制系統(tǒng)
評論
0/150
提交評論