第六章-AT89系列單片機內(nèi)部資源及應(yīng)用_第1頁
第六章-AT89系列單片機內(nèi)部資源及應(yīng)用_第2頁
第六章-AT89系列單片機內(nèi)部資源及應(yīng)用_第3頁
第六章-AT89系列單片機內(nèi)部資源及應(yīng)用_第4頁
第六章-AT89系列單片機內(nèi)部資源及應(yīng)用_第5頁
已閱讀5頁,還剩113頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

2023/2/31單片機原理與應(yīng)用電子課件第6

章AT89系列單片機的內(nèi)部資源及應(yīng)用

2023/2/32本章主要內(nèi)容:6.1AT89系列單片機的并行口及其應(yīng)用6.2AT89系列單片機的中斷系統(tǒng)6.3AT89系列單片機定時/計數(shù)器

6

.4AT89系列單片機的串行接口及串行通信

§6.1AT89系列單片機的并行口及其應(yīng)用

1.指示燈

例6-1用51單片機的并行口P1口驅(qū)動8個發(fā)光二極管,使8個發(fā)光二極管從上到下輪流點亮。輸出低電平0時,LED有電流通過發(fā)光,輸出高電平1時,無電流通過不發(fā)光

匯編語言如下: MOVA,#0FEHAGAIN:MOVP1,A LCALLDELAY RLA SJMPAGAINDELAY:MOVR7,#20 MOVR6,#250 DJNZR6,$ DJNZR7,DELAYC51語言程序如下:(1)查表法#include<reg52.h>Voidmain(){unsignedcharLED[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}unsignedchari;unsignedintj;while{1}{for(i=0;i<8;i++){P1=LED[i];for(j=0;j<30000;j++);//延時

if(i==8)i=0xff;

//為了下一次循環(huán)LED燈從上到下點亮,置i為ffH}}}(2)移位法#include<reg52.h>#include<intrins.c>voidmain(){unsignedchari,a=0xfe;unsignedintj;while{1}{P1=a;a=_crol_(a,1);//調(diào)用循環(huán)左移函數(shù)_crol_,變量a循環(huán)左移1位

for(j=0;j<30000;j++);//延時

}}2.蜂鳴器當P1.0引腳輸出0時,三極管導(dǎo)通,在蜂鳴器兩端加工作電壓,蜂鳴器發(fā)出聲音,當P1.0引腳輸出1時,三極管截止,蜂鳴器不發(fā)聲。例6-2編程使蜂鳴器響鈴10次,每次響鈴發(fā)出250Hz的聲音,持續(xù)時間為0.5s,靜音1s,單片機使用12MHz的晶振。實現(xiàn)該功能的程序如下:MOVR3,#10AA1:CLRP1.0MOVR1,#250AA2:LCALLDELAY2;調(diào)用延時2ms子程序CPLP1.0DJNZR1,AA2;250Hz響鈴0.5s

SETBP1.0MOVR2,#2AA3:MOVR1,#250AA4:LCALLDELAY2DJNZR1,AA4DJNZR2,AA3;靜音1sDJNZR3,AA1RET

DELAY2:MOVR7,#10;延時2ms程序AA5:MOVR6,#100DJNZR6,$;雙周期指令,執(zhí)行一次耗時DJNZR7,AA5RET6.2AT89系列單片機的中斷系統(tǒng)6.2.1中斷的基本概念二級中斷嵌套過程

中斷響應(yīng)過程

6.2.2AT89系列單片機的中斷系統(tǒng)89S52中斷系統(tǒng)結(jié)構(gòu)

1.89X52中斷源89X52有6個中斷源,分別為兩個外部事情中斷請求源和4個內(nèi)部中斷源分別為:定時計數(shù)器T0、T1、T2計數(shù)溢出事情中斷請求和串行口發(fā)送或者接受完一個字節(jié)數(shù)據(jù)中斷請求源。89S51有5個中斷源,沒有T2計數(shù)溢出中斷。(1)外部中斷源外中斷0和外中斷1的中斷標志位和它們的觸發(fā)方式控制位在特殊功能寄存器定時器控制寄存器(TCON)中的低4位.D7D6D5D4D3D2D1D0TF1TR1TF0TR0IE1IT1IE0IT0定時器控制寄存器TCONIT0=0,外部中斷0觸發(fā)方式選擇為電平觸發(fā)方式。IT0=1,外部中斷0觸發(fā)方式選擇為邊沿觸發(fā)方式。

IT0外部中斷0觸發(fā)方式控制位。IT0=0,外部中斷0觸發(fā)方式選擇為電平觸發(fā)方式。IT0=1,外部中斷0觸發(fā)方式選擇為邊沿觸發(fā)方式。

IE0是外中斷0的中斷請求標志位。當外部中斷源(P3.2)引腳上有有效的中斷請求信號,則置位IE0,向CPU請求中斷,當CPU響應(yīng)該中斷時由硬件清“0”IE0。IT1外部中斷1觸發(fā)方式選擇位。IT1=0,外中斷1為電平觸發(fā)方式,IT1=1,外中斷1為邊沿觸發(fā)方式。IE1外中斷1的中斷請求標志位。IE1=1,外中斷1向CPU請求中斷,CPU響應(yīng)中斷請求后,由硬件清“0”IE1位。

(2)內(nèi)部中斷源TF0定時計數(shù)器T0計數(shù)溢出中斷標志位。T0允許計數(shù)后,從計數(shù)初值開始加1計數(shù),當計數(shù)計滿后(計數(shù)器所有位均為“1”),再加1,則計數(shù)溢出,此時由硬件自動置“1”TF0,向CPU請求中斷,一直保持到CPU響應(yīng)該中斷時才由內(nèi)部硬件清“0”。TF1定時計數(shù)器T1計數(shù)溢出中斷標志位。T1允許計數(shù)后,從計數(shù)初值開始加1計數(shù),當計數(shù)溢出時,硬件自動置“1”TF1,向CPU請求中斷,一直到CPU響應(yīng)中斷時由硬件清“0”。89X52內(nèi)部中斷源定時計數(shù)器T2。定時計數(shù)器T2中斷:定時計數(shù)T2的計數(shù)溢出標志位TF2為“1”,或者T2的外部中斷標志位EXF2為“1”,作為有效的中斷請求,向CPU請求中斷。CPU響應(yīng)中斷時不能自動清0,必須由軟件清0。串行口中斷串行口的接受中斷標志RI(SCON.0)和發(fā)送中斷標志TI(SCON.1)邏輯或以后作為內(nèi)部的一個中斷源。當串行口發(fā)送緩沖器發(fā)送完一個字符數(shù)據(jù)后,由硬件自動把發(fā)送中斷標志位TI置“1”,向CPU請求中斷,需要注意的是,CPU響應(yīng)中斷后,發(fā)送中斷標志位TI不會自動清“0”,必須由用戶在中斷處理程序中用軟件清“0”

2.中斷控制

中斷允許寄存器IE

D7D6D5D4D3D2D1D0EA——ET2ESET1EX1ET0EX0EAAT89S系列單片機的CPU中斷允許控制位。

EX0外中斷0的中斷允許位。

EX1外中斷1的中斷允許位。

ET1定時器T1的中斷允許位。

ES串行口中斷允許位。

ET2定時器T2的中斷允許位。

1中斷允許;0,中斷屏蔽。中斷優(yōu)先級寄存器IPD7D6D5D4D3D2D1D0————PT2PSPT1PX1PT0PX0PX0外部中斷0的中斷優(yōu)先級控制位。PT0定時計數(shù)器T0中斷優(yōu)先級控制位。PX1外部中斷1的中斷優(yōu)先級控制位。PT1定時計數(shù)器T1中斷優(yōu)先級控制位。PS串行口中斷優(yōu)先級控制位。PT2定時計數(shù)器T2中斷優(yōu)先級控制位。中斷源中斷優(yōu)先級外中斷0最高定時器T0中斷外中斷1定時器T1中斷串行口中斷定時器T2中斷最低在同一級別的中斷源請求源中,中斷優(yōu)先順序為:

中斷源入口地址外部中斷00003H定時器T0000BH外部中斷10013H定時器T1001BH串行口中斷0023H定時器T2002BH6.2.3外部事件中斷及應(yīng)用1.外部事件中斷源的初始化1)設(shè)置外部事件中斷請求信號的觸發(fā)方式。如果外部中斷觸發(fā)方式采用電平觸發(fā)方式,IT0或者IT1位清0,如果用邊沿觸發(fā)方式,IT0或者IT1位置“1”。2)開放CPU中斷允許位:SETBEA。3)設(shè)置外部事件中斷允許控制位:SETBEX0或者SETBEX1。4)設(shè)置中斷源中斷優(yōu)先級。2.外部中斷應(yīng)用舉例例6-3如圖6-9所示,P1.0~P1.7為輸出線,外接指示燈L0~L7,采用外部中斷0電平觸發(fā)方式改變指示燈L0~L7的顯示狀態(tài)。正常顯示時,燈L0~L7自上而下逐一點亮,當有外部中斷請求時,燈L0~L7全部點亮并閃爍顯示10次。閃爍完成后,繼續(xù)從暫停的位置接著逐個點亮燈的操作。主程序:ORG0000HLJMPMAINORG0003HLJMPINT0ORG0030HMAIN:MOVSP,#70H;設(shè)置堆棧區(qū)CLRIT0;電平觸發(fā)方式SETBEA;開放CPU中斷允許SETBEX0;設(shè)置外中斷0中斷允許CLRPX0MOVA,#0FEHDISPLAY:MOVP1,AACALLDELAY;延時RLAAJMPDISPLAYDELAY:MOVR7,#200;延時子程序DEL0:MOVR6,#100DJNZR6,$DJNZR7,DEL0RET中斷服務(wù)程序:ORG3000HINT0:PUSHACC;保護現(xiàn)場PUSHPSWCLRP3.0;MOVR5,#10REPEAT:MOVA,#00H;全部點亮MOVP1,AACALLDELAYMOVA,#0FFH;全部熄滅MOVP1,AACALLDELAYDJNZR5,REPEAT;閃爍10次POPPSWPOPACCRETIEND#include<reg52.h>#include<intrins.h>voiddelay();sbitP3_0=P3^0;unsignedchara;main(){a=0xfe;IT0=0;//外中斷0電平觸發(fā)方式

EA=1;EX0=1;PX0=0;while(1){P1=a;a=_crol_(a,1);//左移,產(chǎn)生下一個顯示控制碼

delay();};}voiddelay(){unsignedintb;b=20000;while(b>0)b--;}extern0()interrupt0using1//中斷函數(shù)

{

unsignedchari;P3_0=0;for(i=10;i>0;i--)//閃爍10次

{P1=0x00;delay();P1=0xff;delay();}}例6-4外部中斷源的擴展。

如圖6-10中,共有6個外部中斷源,分別為0號、1號、2號、3號、4號、5號中斷源,中斷請求采用電平觸發(fā)方式,0號中斷源的中斷優(yōu)先級別最高,單片機優(yōu)先響應(yīng),單片機接受到0號中斷源中斷請求時,8個LED燈閃爍顯示10次,1號、2號、3號、4號、5號中斷源為低級中斷源,當有其中一個發(fā)出中斷請求信號時,則觸發(fā)外部中斷的中斷服務(wù)程序中,通過查詢P1.0~P1.4的狀態(tài),判定是哪一個中斷請求,然后執(zhí)行響應(yīng)的中斷服務(wù)程序,查詢的順序,決定這幾個中斷源中斷優(yōu)先級,先查詢的優(yōu)先級別高,后查詢的優(yōu)先級別低,本例中低優(yōu)先級中斷源的中斷優(yōu)先循序為5號、4號、3號、2號、1號。中斷請求,然后在主程序:ORG0000HLJMPMAINORG0003H;外中斷0中斷入口地址LJMPPINT0ORG0013H;外中斷1中斷入口地址LJMPPINT1ORG0030HMAIN:CLRIT0;設(shè)置外中斷0為電平觸發(fā)方式CLRIT1;設(shè)置外中斷1為電平觸發(fā)方式MOVIE,#85H;設(shè)置CPU中斷允許,外中斷0、外中斷1中斷允許MOVIP,#01H;設(shè)置外中斷0為高級,外中斷1為低級LOOP:……LJMPLOOP的中斷服務(wù)程序:PINT0:PUSHACCPUSHPSWSETBRS1

;把工作寄存器區(qū)切換到2區(qū),中斷處理程序中使用2區(qū)R0~R7MOVR1,#10;閃爍顯示10次FLASH:CLRAMOVP1,A;P1口燈全亮ACALLDELAYCPLAMOVP1,A;P1口燈全熄滅ACALLDELAYDJNZR1,FLASHPOPPSWPOPACCRETI的中斷服務(wù)程序:PINT1:CLREA;關(guān)中斷PUSHACCPUSHPSW;保護現(xiàn)場SETBEA;開中斷JNBP1.4PINT1_5JNBP1.3PINT1_4JNBP1.2PINT1_3JNBP1.1PINT1_2JNBP1.0PINT1_1RETURN:CLREA;關(guān)中斷POPPSWPOPACC;恢復(fù)現(xiàn)場SETBEA;開中斷RETIPINT1_5:……;5號中斷服務(wù)程序AJMPRETURNPINT1_4:……;4號中斷服務(wù)程序 AJMPRETURNPINT1_3:……;3號中斷服務(wù)程序 AJMPRETURNPINT1_2:……;2號中斷服務(wù)程序 AJMPRETURNPINT1_1:……;1號中斷服務(wù)程序 AJMPRETURNC51程序如下:#include<reg52.h>voiddelay();//延時函數(shù)聲明voidPINT1_5();//5號中斷調(diào)用的函數(shù)聲明voidPINT1_4();//4號中斷調(diào)用的函數(shù)聲明voidPINT1_3();//3號中斷調(diào)用的函數(shù)聲明voidPINT1_2();//2號中斷調(diào)用的函數(shù)聲明voidPINT1_1();//1號中斷調(diào)用的函數(shù)聲明sbitP1_0=P1^0;sbitP1_1=P1^1;sbitP1_2=P1^2;sbitP1_3=P1^3;sbitP1_4=P1^4;unsignedchara;main(){IT0=0;//外中斷0電平觸發(fā)方式

IE=0x85;IP=0x01;…while(1);}voiddelay(){unsignedintb;b=20000;while(b>0)b--;}voidPINT1_5(){……

}//5號中斷調(diào)用的函數(shù)定義

voidPINT1_4(){……}//4號中斷調(diào)用的函數(shù)

voidPINT1_3(){……}//3號中斷調(diào)用的函數(shù)

voidPINT1_2(){……}//2號中斷調(diào)用的函數(shù)

voidPINT1_1(){……}//1號中斷調(diào)用的函數(shù)extern0()interrupt0using2//0號中斷函數(shù){unsignedchari;for(i=10;i>0;i--){P1=0x00;delay();P1=0xff;delay();

}}extern1()interrupt1//外部中斷1中斷函數(shù){if(P1_4==0)PINT1_5();//1-5號中斷為同級中斷,按照查詢順序只響應(yīng)一個

elseif(P1_3==0)PINT1_4(); elseif(P1_2==0)PINT1_3(); elseif(P1_1==0)PINT1_2(); elseif(P1_0==0)PINT1_1();}6.3AT89系列單片機定時/計數(shù)器6.3.1定時/計數(shù)器的一般結(jié)構(gòu)和工作原理定時/計數(shù)器結(jié)構(gòu)圖

1.定時方式從計數(shù)器中計數(shù)初值a開始加1計數(shù),直至計數(shù)溢出所占用的時間為:例如:某單片機應(yīng)用系統(tǒng),使用12MHz的晶振,定時/計數(shù)器為16位的定時計數(shù)器,計數(shù)初值為15536,則該定時/計數(shù)器定時時間多長。單片機的機器周期T為:定時時間t為:2.計數(shù)方式計數(shù)方式是對外部輸入的脈沖信號計數(shù),外部輸入的脈沖信號從特定的引腳上輸入,計數(shù)器對脈沖信號加1計數(shù),即信號發(fā)生從1到0的負跳變,計數(shù)器自動加1。

6.3.2定時/計數(shù)器T0、T1功能和使用方法有關(guān)的特殊功能寄存器有以下幾個:TH0、TL0、TH1、TL1、TMOD、TCON,中斷相關(guān)的寄存器還有IE、IP

1.方式寄存器TMODD7D6D5D4D3D2D1D0GATEM1M0GATEM1M08位中低4位D0~D3用于控制定時/計數(shù)器T0,高4位D4~D7用于控制定時/計數(shù)器T1。

(1)M1M0工作方式選擇位M1M0功能說明00方式0,13位定時/計數(shù)方式01方式1,16位定時/計數(shù)方式10方式2,8位自動重裝初值定時/計數(shù)方式11方式3,T0分為兩個獨立的8位定時/計數(shù)器,T1停止計數(shù)(2)定時/計數(shù)模式選擇位0為定時方式1為計數(shù)方式

(3)GATE門控位GATE=1時,上必須為高電平時,TR0=1或者TR1=1定時計數(shù)器計數(shù)GATE=0時,是否啟動定時/計數(shù)器開始計數(shù),不受外部引腳輸入電平的控制

2.控制寄存器TCOND7D6D5D4D3D2D1D0TF1TR1TF0TR0IE1IT1IE0IT0TR0為定時/計數(shù)器T0的運行控制位。TR1T1運行控制位

當GATE=0時,TR0為1時啟動T0計數(shù)開始,TR0為0時停止T0計數(shù)

當GATE=1時,引腳為高電平且TR0為1時啟動T0計數(shù)開始,引腳為高電平且TR1為1時啟動T0計數(shù)

TF0T0溢出標志位。TF1T1溢出標志位3.T0、T1的工作方式

(1)方式013位的定時計數(shù)方式

定時時間

a----計數(shù)初值計數(shù)器的計數(shù)范圍為1~213(2)方式116位的定時計數(shù)方式

定時時間

計數(shù)器的計數(shù)范圍為1~65536例6-6設(shè)f=12MHZ,定時/計數(shù)器T0工作于方式1,產(chǎn)生50ms定時,試分別采用中斷和查詢的方式編程實現(xiàn)P1.0引腳產(chǎn)生周期為1s的方波。要使得P1.0引腳產(chǎn)生周期為1s的方波,則P1.0引腳高低電平持續(xù)的時間應(yīng)精確為500ms,本例使用定時/計數(shù)器T0精確定時50ms,則10次50ms中斷時定時時間為500ms。中斷方式:在T0中斷服務(wù)程序中設(shè)置一個計數(shù)單元,計數(shù)初值為10每次50ms中斷時候,計數(shù)單元數(shù)值減1,當計數(shù)單元數(shù)值減為0時,恰好是10次中斷,即時間為500ms,500ms到來時引腳P1.0取反。查詢方式:在主程序中不斷查詢TF0的狀態(tài),當TF0為1時,表示50ms定時時間已到,在主程序中判斷是否10次50ms定時已到,如是則P1.0引腳取反,若否則繼續(xù)循環(huán)等待。用查詢方式,每次TF0置1后,TF0必須由軟件清0。

計數(shù)初值:a=15536=3CB0H(十六進制)

即計數(shù)器中TL0的初值為B0H,TH0的初值為3CH

TMOD定時/計數(shù)器寄存器:定時/計數(shù)器T0工作于方式1,故M1M0=01;工作于定時工作方式,=0;GATE=0,則TMOD=01H①中斷方式設(shè)置定時/計數(shù)器工作于方式1,定時方式,同時中斷允許。主程序:

ORG0000HLJMPMAINORG000BHLJMPINTT0

MAIN:MOVSP,#60HMOVTH0,#3CHMOVTL0,#0B0HMOVTMOD,#1

MOVIE,#82H;允許T0向CPU申請中斷

SETBTR0;啟動T0開始計數(shù)

MOV30H,#10;T0中斷次數(shù)計數(shù)單元初始化為10SJMP$T0中斷服務(wù)程序:INTT0:MOVTH0,#3CHMOVTL0,#0B0HDJNZ30H,RETT0

MOV30H,#10CPLP1.0;P1.0取反RETT0:RETIC51程序如下:#include<reg52.h>sbitP1_0=P1^0;unsignedchara=10;main(){TH0=0x3c;

TL0=0xb0;TMOD=0x01;IE=0X82;TR0=1;while(1);}timer0()interrupt1using1{TH0=0x3c;//重賦計數(shù)初值

TL0=0xb0;a--;if(a==0){a=10;P1_0=~P1_0;}}②查詢方式采用查詢方式,此時T0仍然工作方式1的定時方式,但是,設(shè)置為不允許T0向CPU申請中斷。程序如下:ORG0000HMOVSP,#60HMOVTH0,#3CHMOVTL0,#0B0HMOVTMOD,#1MOVIE,#00H;關(guān)閉中斷允許MOV30H,#10SETBTR0WAIT:JNBTF0,$;TF0=0循環(huán)等待,TF0=1繼續(xù)往下執(zhí)行CLRTF0;TF0清0,以便下次定時50ms的查詢MOVTH0,#3CH;50ms定時的計數(shù)初值再次賦給定時/計數(shù)器T0MOVTL0,#0B0HDJNZ30H,WAIT;計數(shù)單元減1不為0,繼續(xù)等待MOV30H,#10

;計數(shù)單元減1為0,則再次把計數(shù)初值賦給計數(shù)單元CPLP1.0;P1.0取反LJMPWAIT;返回WAIT,繼續(xù)查詢等待C51程序如下:#include<reg52.h>sbitP1_0=P1^0;unsignedchara;main(){TH0=0x3c;TL0=0xb0;TMOD=0x01;IE=0;TR0=1;while(1){for(a=10;a>0;a--){while(TF0==0);TF0=0;TH0=0x3c;TL0=0xb0;}P1_0=~P1_0;}}(3)方式2:8位自動重裝初值定時/計數(shù)方式

定時/計數(shù)器T0方式2邏輯結(jié)構(gòu)(4)方式3T0分為兩個獨立的8位計數(shù)器TL0和TH0,TL0計數(shù)器使用定時/計數(shù)器T0的所有控制位和狀態(tài)標志位:GATE、引腳(P3.2)、T0(P3.4)、TR0、TF0,TL0作為一個獨立的8位定時器或者外部事件計數(shù)器,TL0計數(shù)溢出時置“1”溢出標志TF0,同時,TL0計數(shù)器清0,TL0的計數(shù)初值必須由軟件賦值。TH0只能工作于8位的定時方式,并借用定時/計數(shù)器T1的控制位和狀態(tài)標志位TR1和TF1。TR1=1時,定時/計數(shù)器TH0開始計數(shù),當TH0計數(shù)溢出時置“1”溢出標志TF1。6.3.3定時/計數(shù)器的初始化編程及應(yīng)用例6-8占空比不同信號發(fā)生器

10ms90msP1.0引腳輸出周期為100ms周期信號,高電平10ms,低電平90ms使用定時/計數(shù)器T0產(chǎn)生10ms定時,T0工作于方式1,則計數(shù)初值如下:a=65536-10000=55536=D8F0H(十六進制)具體程序如下:ORG0000HLJMPMAINORG000BHLJMPPINT0ORG0030HMAIN:MOVSP,#60HMOV31H,#9;設(shè)置一個計數(shù)器MOVTMOD,#01;定時/計數(shù)器初始化MOVTH0,#0D8HMOVTL0,#0F0HMOVIE,#81HCLRP1.0CLR00H

SETB

TR0HERE:AJMPHEREPINT0:PUSHACCPUSHPSWMOVTH0,#0D8HMOVTL0,#0F0HJB00H,LOW;若00H為1,則輸出90msSETBP1.0SETB00HSJMPOUTLOW:CLRP1.0DJNZ31H,OUTMOV31H,#9CLR00HOUT:POPPSWPOPACCRETI例6-9

秒表的程序設(shè)計

單片機使用12MHz的晶振,定時/計數(shù)器T0工作于方式2,產(chǎn)生250μs定時,每1s使秒表顯示緩沖器30H~32H實時計時.緩沖器分配如下:30H高四位為小時的十位,低四位為小時的個位31H高四位為分鐘的十位,低四位為分鐘的個位;32H高四位為秒的十位,低四位為秒的個位。每1秒鐘秒加1計時,當計時到59秒,下1秒到來時為1分鐘,秒清0,分鐘加1,當計時到59分59秒,下1秒到來時為1小時,分鐘、秒清0,小時加1能夠計時的最長計時時間為99小時59分59秒。解:(1)確定TMOD定時/計數(shù)器T0工作于方式2的定時方式的定時方式

D7D6D5D4D3D2D1D0GATEM1M0GATEM1M0****0010(2)計算計數(shù)初值由定時時間的計算公式:計數(shù)初值a=6T0中斷4000次時時間為1s

(3)程序如下:

ORG0000HLJMPMAIN;設(shè)置跳轉(zhuǎn)到主程序 ORG000BH;T0中斷服務(wù)程序入口地址 LJMPPINTT0;設(shè)置跳轉(zhuǎn)到中斷服務(wù)程序 ORG0030HMAIN:MOVSP,#60H;主程序MOV36H,#10HMOV37H,#0A0H;4000=(0FA0H)中斷次數(shù)放入計數(shù)單元MOVTMOD,#02HMOVTL0,#6MOVTH0,#6MOVIE,#82HSETBTR0SJMP$PINTT0:PUSHPSW;T0中斷服務(wù)程序PUSHACCSETBRS0;選擇1區(qū)的工作寄存器DJNZ37H,RETURNDJNZ36H,RETURN;4000次中斷未到中斷返回MOV36H,#10HMOV37H,#0A0H;4000次中斷到來,計數(shù)器單元恢復(fù)初始值MOVR0,#32HMOVA,@R0ADDA,#1DAA;調(diào)整為十進制相加MOV@R0,ACJNEA,#60H,RETURN;修改秒表計時值,秒單元加1,不為60秒中斷返回MOV@R0,#0;為60秒,秒單元清0,分鐘單元加1DECR0MOVA,@R0ADDA,#1DAAMOV@R0,ACJNEA,#60H,RETURN;若為60分鐘,分鐘單元清0,小時單元加1MOV@R0,#0DECR0MOVA,@R0ADDA,#1DAAMOV@R0,ARETURN:POPACC;恢復(fù)現(xiàn)場 POPPSW RETI;中斷返回C51程序如下:#include<reg52.h>unsignedinta=4000;unsignedchartime_buf[]={0,0,0};main(){TH0=0x06;TL0=0x06;TMOD=0x02;IE=0x82;TR0=1;while(1){}}timer0()interrupt1using1//T0的中斷函數(shù){a--;if(a==0){a=4000;time_buf[2]+=1;//秒單元加1if(time_buf[2]>=60)//若為60秒

{time_buf[2]=0;//秒單元清0 time_buf[1]+=1;//分鐘單元加1 if(time_buf[1]>=60)//若為60分{ time_buf[1]=0;//分鐘單元清0 time_buf[0]+=1;//小時單元加1}}} }6.3.4AT89S系列單片機看門狗定時器的編程方法例如AT89S52看門狗定時器由一個13位定時器及WDTRST(字節(jié)地址為6AH)寄存器構(gòu)成。開啟看門狗定時器后,13位定時器會自動加1計數(shù),如不對定時器復(fù)位則每計數(shù)8192,個機器周期溢出一次,并產(chǎn)生一個高電平復(fù)位信號,使單片機系統(tǒng)復(fù)位。對于12MHZ的時鐘脈沖每8192us(約8.192ms)產(chǎn)生一個復(fù)位信號,啟動看門狗定時器,當系統(tǒng)超過8.192ms沒有對看門狗定時器復(fù)位,看門狗定時器溢出,讓系統(tǒng)復(fù)位,為了系統(tǒng)既能正常工作又不會出現(xiàn)死機(程序跑飛),大約在8ms內(nèi)必須喂狗一次,即對看門狗定時器進行復(fù)位。啟動看門狗命令格式如下:MOV

0A6H,

#1EHMOV

0A6H,

#0E1H;啟動看門狗對0A6H單元依次寫入數(shù)據(jù)1EH和0E1H,激活看門狗監(jiān)視定時器,如果程序正常執(zhí)行,在看門狗監(jiān)視定時器溢出時間前,再次復(fù)位看門狗監(jiān)視定時器。

c51語言來完成此功能,程序如下:#include<reg52.h>sfr

WDTRST=0xa6;main(){

……;WDTRST=0x1e;//啟動看門狗WDTRST=0xe1;While(1)

{

WDTRST=0x1e;//喂狗

WDTRST=0xe1;

……;

……;這部分執(zhí)行時間必須少于8ms(對12MHZ時鐘)}}6.4AT89系列單片機的串行接口及串行通信51系列單片機提供一個全雙工的異步串行接口

異步通信數(shù)據(jù)格式

6.4.1串行口的基本通信方式例如:串行通信的波特率為2400,表示每秒鐘內(nèi)傳輸2400位二進制數(shù)。若字符格式為:1位數(shù)據(jù)位,8位數(shù)據(jù)位,無校驗位,1位停止位,這樣每秒鐘內(nèi)數(shù)據(jù)傳輸240個字符。波特率是指每秒鐘內(nèi)傳輸?shù)亩M制數(shù)的位數(shù)

6.4.2單片機串行口及控制寄存器串行口發(fā)送緩沖器和接收緩沖器SBUF

串行口控制寄存器SCON

PCON中SMOD位,用來控制串行口的波特率

1.

串行口控制寄存器SCONSCON的數(shù)據(jù)格式

D7D6D5D4D3D2D1D0SM0SM1SM2RENTB8RB8TIRISM0,SM1是串行口工作方式選擇位

SM0SM1工作方式功能說明波特率00方式0移位寄存器方式fosc/1201方式18位異步通信方式可變10方式29位異步通信方式fosc/64,fosc/32,11方式39位異步通信方式可變SM2方式2和方式3的多機通信控制位

如SM2=1,接受到的第9位數(shù)據(jù)(RB8)為0時不置位RI,則接收到的數(shù)據(jù)丟失,只有接收到的第9位數(shù)據(jù)(RB8)為1時,才將接受到的前8位數(shù)據(jù)送入SBUF,并置位RI,產(chǎn)生中斷請求。當SM2=0時,不論第9位接收到的是0還是1,都將接收到前8位數(shù)據(jù)送入SBUF中,并將RI置1,產(chǎn)生中斷請求。REN串行接受允許控制位。REN=1時,允許串行口接受數(shù)據(jù);REN=0時,禁止串行口接受數(shù)據(jù)。TB8方式2和方式3時發(fā)送數(shù)據(jù)的第9位數(shù)據(jù)。RB8方式2和方式3時接收到的第9位數(shù)據(jù)。TI串行口發(fā)送中斷標志位。RI串行口接收中斷標志位。當串行口發(fā)送完一幀數(shù)據(jù),硬件自動將TI置1,并向CPU請求中斷。TI必須由軟件清0。當串行口接收完一幀數(shù)據(jù),硬件自動將TI置1,并向CPU請求中斷。RI必須由軟件清0。2.

電源控制寄存器PCONSMOD波特率加倍選擇位。串行口工作在方式1、方式2、方式3時,如果SMOD=1,則串行口波特率加倍;若SMOD=0,則波特率不會提高。D7D6D5D4D3D2D1D0SMOD——————GF1GF0PDIDL6.4.3單片機串行通信工作方式1.

方式0:同步移位寄存器工作方式輸入/用于擴展并行輸出口

(1)方式0發(fā)送數(shù)據(jù)由RXD引腳串行輸出,TXD引腳輸出同步移位脈沖信號

(2)方式0接收2.方式1(1)方式1發(fā)送當TI=0時,執(zhí)行指令MOVSBUF,A,CPU向串行口發(fā)送緩沖器SBUF寫入一個字節(jié)的數(shù)據(jù),啟動串行口發(fā)送。

在TXD引腳上輸出一幀信息,先發(fā)送起始位0,接著從低位開始輸出8位數(shù)據(jù),最后輸出停止位1,發(fā)送后置位中斷標志TI,輸出完一個字符后串行口停止工作,CPU執(zhí)行程序判斷TI為1后軟件清0TI中斷標志,再向SBUF寫入數(shù)據(jù),啟動串行口發(fā)送下一個字符。

(2)方式1接收接收到的數(shù)據(jù)裝入接收數(shù)據(jù)緩沖器SBUF,置位RI,表示串行口接收到有效的一幀信息,向CPU請求中斷。CPU響應(yīng)中斷時,取走SBUF接收數(shù)據(jù)緩沖器中已經(jīng)接收的一個字節(jié)數(shù)據(jù),如MOVA,SBUF,并軟件清“0”RI接收中斷標志位,如CLRRI。

接著串行口輸入控制電路重新搜索RXD端上電平負跳變,接收下一個數(shù)據(jù)。3.方式2和方式3(1)方式2和方式3發(fā)送類似于方式1

發(fā)送數(shù)據(jù)時,除了把一個字節(jié)數(shù)據(jù)寫入SBUF發(fā)送緩沖器外,還需要把第9位數(shù)據(jù)寫入SCON的TB8。(2)方式2和方式3接收類似于方式1不同的是:RB8中存放的是第9位數(shù)據(jù)

若SM2=1,串行口工作于多機通信方式,當接收到第9位數(shù)據(jù)RB8=1時,數(shù)據(jù)有效接收,將數(shù)據(jù)分別裝入SBUF和RB8中,置位RI當接收到第9位數(shù)據(jù)RB8=0時,數(shù)據(jù)丟失,并且不置位RI。6.4.4單片機串行口的初始化編程及波特率設(shè)置1.串行口波特率方式0波特率=振蕩頻率/12方式2波特率=*振蕩頻率/64方式1和方式3的波特率:可變波特率由定時計數(shù)器T1或T2的溢出率和SMOD位一起確定。1)T1為波特率發(fā)生器方式1(方式3)波特率=

*(T1溢出率)/32定時器T1作為波特率發(fā)生器時,禁止T1中斷,T1工作于定時方式,一般選擇工作方式2(8位自動重裝初值工作方式),若計數(shù)初值為a,此時T1的溢出時間為:T1的溢出率為溢出時間的倒數(shù),此時波特率的計算公式為:方式1(方式3)波特率=*2.串行口初始化編程串行口初始化編程一般考慮如下幾個方面:(1)確定波特率

(2)確定串行口的工作方式

(3)確定串行口是否中斷允許及其中斷優(yōu)先級

例如:已知振蕩頻率

=11.0592MHz,對串行口初始化編程,設(shè)置其工作于方式1發(fā)送/接收方式,波特率為9600,允許串行口中斷。解:①波特率9600

使用定時計數(shù)器T1為波特率發(fā)生器,工作于方式2(8位自動重裝初值工作方式)定時方式,計數(shù)初值為FDH,不允許T1中斷。②串行口工作于方式1,8位異步通信方式,則SCON=50H。③允許串行口中斷,則IE=90H。初始化程序段如下:MOVTMOD,#20H;T1工作于方式2定時方式MOVTH1,#0FDHMOVTL1,#0FDH;設(shè)置計數(shù)初值SETBTR1;啟動T1MOVSCON,#50H;串行口工作于方式1,RI=0,TI=0MOVIE,#90H;設(shè)置串行口中斷允許6.4.5RS-232C串行口標準常用的串行總線有RS-232C、RS-422、RS-485總線

1.RS-232C的電氣特性及幀格式RS-232C的電氣標準為-12V~-5V為邏輯電平1,+5V~+12V為邏輯電平0。2.RS-232C與TTL的電平轉(zhuǎn)換通信距離最大為15米,傳輸速率為20kbps

2組TTL電平到RS-232C電平轉(zhuǎn)換器,2組RS-232C電平到TTL電平轉(zhuǎn)換器

T1IN(TTL)----T1OUT(RS232)T2IN(TTL)----T2OUT(RS232)R1IN(RS232)---R1OUT(TTL)

R2IN(RS232)---R2OUT(TTL)單片機和PC機的通信

6.4.6RS-422、RS-485標準串行總線接口1.RS-422標準接口

RS-422A的最大傳輸距離是300m,傳輸速度為10Mbps,在低速方式下,最大傳輸距離可達1200m。

RS-422接口電路如圖6-30所示,75174完成TTL電平到RS-422A電平轉(zhuǎn)換,經(jīng)過數(shù)據(jù)線傳輸,75175把接收到的RS-422A電平轉(zhuǎn)換為TTL電平輸出。圖6-30RS-422接口電路2.RS-485標準接口

TTL電平到RS-485電平轉(zhuǎn)換,一般使用芯片MC3487轉(zhuǎn)換,RS-485電平到TTL電平轉(zhuǎn)換,使用芯片MC3486轉(zhuǎn)換。6.4.7串行通信應(yīng)用舉例1.移位寄存器方式應(yīng)用例6-10

串行口方式0輸出擴展并行口。

如圖6-32所示,串行口外接兩片74LS164,編程使得0#74LS164的輸出端并行輸出存儲單元30H單元數(shù)據(jù),1#74LS164的輸出端并行輸出存儲單元31H單元數(shù)據(jù)。

圖6-32串行口擴展16位并行輸出電路MOV

SCON,#00H;設(shè)置串行口工作于方式0MOVR0,#30HMOVR2,#02HCIRCU:MOVA,@R0;先發(fā)送30H單元數(shù)據(jù)MOVSBUF,A;數(shù)據(jù)送入串口發(fā)送緩沖器,啟動串口發(fā)送WAIT:JNBTI,WAIT;等待數(shù)據(jù)發(fā)送結(jié)束CLRTIINCR0DJNZR2,CIRCUC51程序如下:#include<reg52.h>#defineucharunsignedchar#include<absacc.h>#definedata1DBYTE[0x30]#definedata2DBYTE[0x31]voidmain(void){SCON=0;SBUF=data1;while(TI==0);TI=0;SBUF=data2;}例6-11串行口方式0并行輸入口擴展。如圖6-33所示的16位接口電路讀入數(shù)據(jù),并把數(shù)據(jù)分別存放在30H和31H單元,其中0#74LS165的輸入數(shù)據(jù)D0~D7存放于30H單元,對應(yīng)D0存放在30H.0位,D7存放在30H.7位,1#74LS165的輸入數(shù)據(jù)D0~D7存放于31H單元。

串行口擴展16位的并行輸入電路

MOV

R1,#02H;接收字節(jié)數(shù)

MOVR0,#30H;接收數(shù)據(jù)存儲單元地址

CLRP1.0;并行輸入數(shù)據(jù)鎖入移位寄存器

NOPSETBP1.0;允許移位寄存器移位工作

MOVSCON,#10H;設(shè)置串行口工作于方式0,接收允許

WAIT:JNBRI,WAIT;查詢RI位是否為1,等待接收數(shù)據(jù)

CLRRI;清除接收標志,準備下次接收

MOVA,SBUFMOV@R0,A;存儲接收數(shù)據(jù)

INCR0;修改存儲單元地址

DJNZR1,WAIT;兩個字節(jié)數(shù)據(jù)是否接收完

RETC51程序如下:#include<reg52.h>#defineucharunsignedcharuchari,data1[];sbitP1_0=P1^0;voidmain(void){P1_0=0;nop();P1_0=1;SCON=0x10;for(i=0;i<2;i++){while(RI==0);RI=0;data1[i]=SBUF;}2.單機、多機通信應(yīng)用

例6-12兩臺單片機進行串行口通信,0#單片機發(fā)送數(shù)據(jù),1#單片機接收數(shù)據(jù),0#單片機將字符串‘AT89S52Microcomputer’發(fā)送到1#單片機接收,并存儲到其內(nèi)部RAM從30H開始的存儲單元。發(fā)送字符串以數(shù)據(jù)0結(jié)束,兩個單片機的晶振頻率均為11.0592MHz,波特率均為9600。試編寫兩個單片機的串口程序。解:0#單片機和1#單片機之間串行通信使用單工通信方式,一個單片機只發(fā)送數(shù)據(jù),另外一個單片機只具有接受數(shù)據(jù)的功能。(1)兩個單片機應(yīng)該工作于方式1,8位波特率可變的異步通信方式。0#單片機工作于發(fā)送方式,SCON=40H。1#單片機工作于接收方式,SCON=50H。(2)使用定時/計數(shù)器T1作為波特率發(fā)生器,T1工作于方式2,8位自動重裝初值的工作方式,波特率為9600時,查表可知計數(shù)初值應(yīng)設(shè)定為FDH。0#單片機的發(fā)送程序如下:MOVTMOD,#20H;T1工作于方式2,定時方式MOVTH1,#0FDH;計數(shù)初值為FDHMOVTL1,#0FDHMOVSCON,#40H;串行口工作于方式1SETBTR1;啟動定時/計數(shù)器T1SETBTI;為了便于用循環(huán)實現(xiàn)數(shù)據(jù)發(fā)送,先置TIMOVR4,#0;R4作字符串表指針WAIT:JNBTI,WAITCLRTIMOVDPTR,#TABMOVA,R4MOVCA,@A+DPTR;取字符JZRETURN;字符串以0結(jié)束MOVSBUF,A;發(fā)送字符INCR4;為了取下一個字符,修改字符串指針LJMPWAIT;跳轉(zhuǎn)到等待查詢,是否發(fā)送完一個字符RETURN:RETTAB:DB‘AT89S52Microcomputer’DB0AH,0DH,0C51程序如下:#include<reg52.h>unsignedcharstring[]={"AT89S52Microcomputer\0"};//字符串常量unsignedchari=0;main(){TMOD=0X20;TH1=0XFD;TL1=0XFD;SCON=0X40;TR1=1;TI=1;while(string[i]!=0){while(TI==0);TI=0;SBUF=string[i];i++;}}1#單片機的接收程序如下:MOVTMOD,#20H;T1工作于方式2,定時方式MOVTH1,#0FDH;計數(shù)初值為FDHMOVTL1,#0FDHMOVSCON,#50H;串行口工作于方式1,接收允許REN=1SETBTR1;啟動定時/計數(shù)器T1MOVR0,#30H;設(shè)置存儲單元的地址指針WAIT:JBCRI,NEXT

;循環(huán)檢測RI是否為1,為1,接收SBUF中的數(shù)據(jù)SJMPWAIT;不為1,繼續(xù)等待NEXT:MOVA,SBUF;取SBUF中接收的一個字節(jié)的數(shù)據(jù)MOV@R0,A;存放于存儲單元INCR0;修改單元地址指針,便于存放下一個數(shù)據(jù)LJMPWAITRETC51程序如下:#include<reg52.h>unsignedcharstring[];//字符串常量unsignedchari=0;main(){TMOD=0X20;TH1=0XFD;TL1=0XFD;SCON=0X50;TR1=1;while(1){while(RI==0);RI=0;string[i]=SBUF;i++;}}

例6-13如圖6-34所示,單片機系統(tǒng)使用11.0592MHz的晶體振蕩器,串行通信的波特率為4800,0#單片機可以向1#單片機發(fā)送數(shù)據(jù),1#單片機也可以向0#單片機發(fā)送數(shù)據(jù),兩個單片機之間可以進行全雙工串行通信。圖6-342個單片機串行通信解:(1)分析根據(jù)程序設(shè)計要求,0#單片機和1#單片機地位相同,功能相似,任何一方都可以主動與對方通信,也可以相應(yīng)對方的通信請求。為了實現(xiàn)雙工通信,定義2種通信協(xié)議:0#單片機發(fā)送/1#單片機接收0#單片機需要向1#單片機發(fā)送數(shù)據(jù)時,0#單片機先發(fā)出一個“接收數(shù)據(jù)請求”命令,1#單片機接收到命令后,如果準備好接收,則向0#單片機發(fā)送“接收準備就緒”命令,0#單片機接收到這個響應(yīng)命令后,開始向?qū)Ψ桨l(fā)送數(shù)據(jù),直到通信結(jié)束,兩個單片機返回初始狀態(tài)。②0#單片機接收/1#單片機發(fā)送0#單片機需要從1#單片機接收數(shù)據(jù)時,0#單片機先發(fā)出一個“發(fā)送數(shù)據(jù)請求”命令,1#單片機接收到命令后,如果準備好發(fā)送,則向0#單片機發(fā)送“發(fā)送準備就緒”命令,0#單片機接收到這個響應(yīng)命令后,立即進入接收數(shù)據(jù)狀態(tài),直到通信結(jié)束,兩個單片機返回初始狀態(tài)。程序中的幾個命令,分別用一個字節(jié)的數(shù)據(jù)表示如下:“接收數(shù)據(jù)請求”命令——01H“接收準備就緒”命令——02H“發(fā)送數(shù)據(jù)請求”命令——10H“發(fā)送準備就緒”命令——20H程序中設(shè)置兩個標志位,位地址分別為00H和01H00H——本機發(fā)送狀態(tài)標志位。若為0,表示本機發(fā)送命令狀態(tài);若為1,表示本機發(fā)送數(shù)據(jù)狀態(tài)。01H——本機接收狀態(tài)標志位。若為0,表示本機接收命令狀態(tài);若為1,表示本機接收數(shù)據(jù)狀態(tài)。(2)程序0#單片機的初始化程序:ORG0000HLJMPMAINORG0023HLJMPSINTMAIN:ORG0030HMOVTMOD,#20H;T1工作于方式2,定時方式MOVPCON,#00H;SMOD=0MOVTH1,#0FAH;波特率為4800時,T1的計數(shù)初值MOVTL1,#0FAHSETBTR1;啟動定時/計數(shù)器T1MOV

IE,#90H;串行口中斷允許MOVSCON,#50H;串行口工作方式1,接收允許CLR00H;設(shè)置本機為發(fā)送命令狀態(tài)CLR01H;設(shè)置本機為接收命令狀態(tài)MOVA,#01H;發(fā)“接收數(shù)據(jù)請求”命令MOVSBUF,ASJMP$當01H命令發(fā)送完后,0#單片機置位TI標志位,轉(zhuǎn)入中斷服務(wù)程序執(zhí)行,中斷服務(wù)程序如下:SINT:JNBRI,SENT;非接收中斷,轉(zhuǎn)去發(fā)送處理CLRRIJB01H,R_DATA;位標志01H為1,表示為接受數(shù)據(jù)MOVA,SBUF;接收命令CJNEA,#01H,NEXT1;非“接收數(shù)據(jù)請求”命令MOVR6,#LEN_RCV;是“接收數(shù)據(jù)請求”命令,準備接收數(shù)據(jù)MOVR1,#RCV_BUF;接收數(shù)據(jù)起始地址SETB01H;設(shè)置本機為接收數(shù)據(jù)狀態(tài)MOVA,#02HMOVSBUF,A;發(fā)送“接收準備就緒”命令LJMPRETURNNEXT1:CJNEA,#10H,NEXT2;非“發(fā)送數(shù)據(jù)請求”命令MOVR7,#LEN_TRN

;是“發(fā)送數(shù)據(jù)請求”命令,設(shè)置發(fā)送數(shù)據(jù)長度MOVR0,#TRN_BUF;設(shè)置發(fā)送數(shù)據(jù)起始單元地址SETB01H;設(shè)置本機為發(fā)送數(shù)據(jù)狀態(tài)MOVA,#20HMOVSBUF,A;發(fā)送“發(fā)送準備就緒”命令NEXT2:CJNEA,#02H,NEXT3;對方“接收準備就緒”命令MOVR7,#LEN_TRN

;對方“接收準備就緒”命令,本機準備數(shù)據(jù)塊發(fā)送,設(shè)置數(shù)據(jù)塊長度MOVR0,#TRN_BUF;設(shè)置數(shù)據(jù)塊起始地址SETB00H;設(shè)置本機為發(fā)送數(shù)據(jù)狀態(tài)MOVA,@R0;取數(shù)據(jù)MOVSBUF,A;發(fā)送數(shù)據(jù)INCR0;修改單元地址LJMPRETURN;跳轉(zhuǎn)到中斷返回NEXT3:CJNEA,#20H,NOCOM;對方“發(fā)送準備就緒”命令MOVR6,#LEN_RCV;是對方“發(fā)送準備就緒”命令,本機準備接收數(shù)據(jù)MOVR1,#RCV_BUF;設(shè)置接收數(shù)據(jù)起始地址SETB01H;設(shè)置本機為接收數(shù)據(jù)狀態(tài)NOCOM:LJMPRETURN;跳轉(zhuǎn)到中斷返回R_DATA:MOVA,SBUF;取數(shù)據(jù)MOV@R1,A;存儲數(shù)據(jù)INCR1;修改存儲單元地址DJNZR6,RETURN;數(shù)據(jù)塊是否接收完,R6中為數(shù)據(jù)塊長度CLR01H;數(shù)據(jù)塊接收完,置本機為接收命令狀態(tài)LJMPRETURNSENT:CLRTI;發(fā)送處理,清TI標志JB00H,T_DATA;若位標志為1,則為本機發(fā)送數(shù)據(jù)AJMPRETURN;本機發(fā)送命令T_DATA:MOVA,@R0;取發(fā)送的數(shù)據(jù)MOVSBUF,A;發(fā)送INCR0;修改發(fā)送單元地址DJNZR7,RETURN

;數(shù)據(jù)塊沒發(fā)送完,直接中斷返回,R7中為數(shù)據(jù)塊長度CLR00H;數(shù)據(jù)塊發(fā)送完,置本機為發(fā)送命令狀態(tài)RETURN:RETIC51程序如下:#include<reg52.h>bitbit0,bit1;//定義兩個位標志unsignedchara,i=0,j=0;unsignedcharrcv_buf[#LEN_RCV],trn_buf[#LEN_TRN];//定義接收數(shù)組和發(fā)送數(shù)組main(){TMOD=0X20;PCON=0;TH1=0XFA;TL1=0XFA;TR1=1;IE=0X90;SCON=0X50;bit0=bit1=0;SBUF=0X01;//發(fā)“接收數(shù)據(jù)請求”命令while(1);}uart()interrupt4using1//串口中斷函數(shù){if(RI==1)//若為接收中斷

{RI=0; if(bit1==1){//判接收狀態(tài)標志位,若為接收數(shù)據(jù)

rcv_buf[j]=SBUF;//接收數(shù)據(jù)

j++; if(j==#LEN_RCV)bit1=0; } else{//若為接收命令,判斷命令的類型

a=SBUF;if(a==1){bit1=1;//接收到的為“接收數(shù)據(jù)請求”命令

SBUF=2;//發(fā)“接收準備就緒”命令

}elseif(a==0x10){bit1=1;//接收到的為“發(fā)送數(shù)據(jù)請求”命令

SBUF=0X20;//發(fā)“發(fā)送準備就緒”命令

}elseif(a==2){//接收到的為“接收準備就緒”命令

bit0=1; SBUF=trn_buf[i];//1#接收準備就緒,0#發(fā)送數(shù)據(jù)

i++;}elseif(a==0x20){//接收到的為“發(fā)送準備就緒”命令

bit1=1;//使本機處于接收狀態(tài)

}}}else{SBUF=trn_buf[i];//若為發(fā)送中斷,發(fā)送數(shù)據(jù)

i++; if(i==#LEN_TRN)bit0=0;}}1#單片機的程序與0#單片機程序完全一樣,不再列出。例6-14多機通信程序舉例。其中一個是主單片機,其余的是從單片機,主從單片機的功能不同,這樣的單片機應(yīng)用系統(tǒng)為多機通信系統(tǒng)。

串行口的控制寄存器SCON中的SM2為多機通信控制位。串行口以方式2或者方式3接收時,若SM2=1時,僅當接收到的第9位數(shù)據(jù)RB8為1時,數(shù)據(jù)才裝入SBUF串口接收緩沖器,置位RI;如果接收到的第9位數(shù)據(jù)RB8為0時,則不產(chǎn)生中斷標志RI,數(shù)據(jù)丟失。當SM2=0時,則接收到一個數(shù)據(jù)后,不管第9位數(shù)據(jù)RB8是何值,數(shù)據(jù)都裝入SBUF,并置位RI。多機通信中就是應(yīng)用單片機這個特性,實現(xiàn)主從式多機通信。

如圖6-35所示的多個單片機主從通信方式中,其中,89S52主單片機,連接了3個從單片機,主機控制與從機間的通信,從機的通信只能通過主機才能實現(xiàn)。多機通信系統(tǒng)結(jié)構(gòu)框圖

主從機通信的方式如下:(1)每個從機分配一個地址,占用一個字節(jié),三個從機的地址分別為0、1、2,各個從機的初始化程序?qū)⒋锌诰幊虨?位異步通信方式(方式2或者方式3),置位多機通信標志SM

溫馨提示

  • 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)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論