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

下載本文檔

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

文檔簡(jiǎn)介

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

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

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

6

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

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

1.指示燈

例6-1用51單片機(jī)的并行口P1口驅(qū)動(dòng)8個(gè)發(fā)光二極管,使8個(gè)發(fā)光二極管從上到下輪流點(diǎn)亮。輸出低電平0時(shí),LED有電流通過(guò)發(fā)光,輸出高電平1時(shí),無(wú)電流通過(guò)不發(fā)光

匯編語(yǔ)言如下: MOVA,#0FEHAGAIN:MOVP1,A LCALLDELAY RLA SJMPAGAINDELAY:MOVR7,#20 MOVR6,#250 DJNZR6,$ DJNZR7,DELAYC51語(yǔ)言程序如下:(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++);//延時(shí)

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

//為了下一次循環(huán)LED燈從上到下點(diǎn)亮,置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++);//延時(shí)

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

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

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

中斷響應(yīng)過(guò)程

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

1.89X52中斷源89X52有6個(gè)中斷源,分別為兩個(gè)外部事情中斷請(qǐng)求源和4個(gè)內(nèi)部中斷源分別為:定時(shí)計(jì)數(shù)器T0、T1、T2計(jì)數(shù)溢出事情中斷請(qǐng)求和串行口發(fā)送或者接受完一個(gè)字節(jié)數(shù)據(jù)中斷請(qǐng)求源。89S51有5個(gè)中斷源,沒(méi)有T2計(jì)數(shù)溢出中斷。(1)外部中斷源外中斷0和外中斷1的中斷標(biāo)志位和它們的觸發(fā)方式控制位在特殊功能寄存器定時(shí)器控制寄存器(TCON)中的低4位.D7D6D5D4D3D2D1D0TF1TR1TF0TR0IE1IT1IE0IT0定時(shí)器控制寄存器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的中斷請(qǐng)求標(biāo)志位。當(dāng)外部中斷源(P3.2)引腳上有有效的中斷請(qǐng)求信號(hào),則置位IE0,向CPU請(qǐng)求中斷,當(dāng)CPU響應(yīng)該中斷時(shí)由硬件清“0”IE0。IT1外部中斷1觸發(fā)方式選擇位。IT1=0,外中斷1為電平觸發(fā)方式,IT1=1,外中斷1為邊沿觸發(fā)方式。IE1外中斷1的中斷請(qǐng)求標(biāo)志位。IE1=1,外中斷1向CPU請(qǐng)求中斷,CPU響應(yīng)中斷請(qǐng)求后,由硬件清“0”IE1位。

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

2.中斷控制

中斷允許寄存器IE

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

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

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

ET1定時(shí)器T1的中斷允許位。

ES串行口中斷允許位。

ET2定時(shí)器T2的中斷允許位。

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

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

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外部中斷源的擴(kuò)展。

如圖6-10中,共有6個(gè)外部中斷源,分別為0號(hào)、1號(hào)、2號(hào)、3號(hào)、4號(hào)、5號(hào)中斷源,中斷請(qǐng)求采用電平觸發(fā)方式,0號(hào)中斷源的中斷優(yōu)先級(jí)別最高,單片機(jī)優(yōu)先響應(yīng),單片機(jī)接受到0號(hào)中斷源中斷請(qǐng)求時(shí),8個(gè)LED燈閃爍顯示10次,1號(hào)、2號(hào)、3號(hào)、4號(hào)、5號(hào)中斷源為低級(jí)中斷源,當(dāng)有其中一個(gè)發(fā)出中斷請(qǐng)求信號(hào)時(shí),則觸發(fā)外部中斷的中斷服務(wù)程序中,通過(guò)查詢P1.0~P1.4的狀態(tài),判定是哪一個(gè)中斷請(qǐng)求,然后執(zhí)行響應(yīng)的中斷服務(wù)程序,查詢的順序,決定這幾個(gè)中斷源中斷優(yōu)先級(jí),先查詢的優(yōu)先級(jí)別高,后查詢的優(yōu)先級(jí)別低,本例中低優(yōu)先級(jí)中斷源的中斷優(yōu)先循序?yàn)?號(hào)、4號(hào)、3號(hào)、2號(hào)、1號(hào)。中斷請(qǐng)求,然后在主程序:ORG0000HLJMPMAINORG0003H;外中斷0中斷入口地址LJMPPINT0ORG0013H;外中斷1中斷入口地址LJMPPINT1ORG0030HMAIN:CLRIT0;設(shè)置外中斷0為電平觸發(fā)方式CLRIT1;設(shè)置外中斷1為電平觸發(fā)方式MOVIE,#85H;設(shè)置CPU中斷允許,外中斷0、外中斷1中斷允許MOVIP,#01H;設(shè)置外中斷0為高級(jí),外中斷1為低級(jí)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;保護(hù)現(xiàn)場(chǎng)SETBEA;開中斷JNBP1.4PINT1_5JNBP1.3PINT1_4JNBP1.2PINT1_3JNBP1.1PINT1_2JNBP1.0PINT1_1RETURN:CLREA;關(guān)中斷POPPSWPOPACC;恢復(fù)現(xiàn)場(chǎng)SETBEA;開中斷RETIPINT1_5:……;5號(hào)中斷服務(wù)程序AJMPRETURNPINT1_4:……;4號(hào)中斷服務(wù)程序 AJMPRETURNPINT1_3:……;3號(hào)中斷服務(wù)程序 AJMPRETURNPINT1_2:……;2號(hào)中斷服務(wù)程序 AJMPRETURNPINT1_1:……;1號(hào)中斷服務(wù)程序 AJMPRETURNC51程序如下:#include<reg52.h>voiddelay();//延時(shí)函數(shù)聲明voidPINT1_5();//5號(hào)中斷調(diào)用的函數(shù)聲明voidPINT1_4();//4號(hào)中斷調(diào)用的函數(shù)聲明voidPINT1_3();//3號(hào)中斷調(diào)用的函數(shù)聲明voidPINT1_2();//2號(hào)中斷調(diào)用的函數(shù)聲明voidPINT1_1();//1號(hào)中斷調(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號(hào)中斷調(diào)用的函數(shù)定義

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

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

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

voidPINT1_1(){……}//1號(hào)中斷調(diào)用的函數(shù)extern0()interrupt0using2//0號(hào)中斷函數(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號(hào)中斷為同級(jí)中斷,按照查詢順序只響應(yīng)一個(gè)

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系列單片機(jī)定時(shí)/計(jì)數(shù)器6.3.1定時(shí)/計(jì)數(shù)器的一般結(jié)構(gòu)和工作原理定時(shí)/計(jì)數(shù)器結(jié)構(gòu)圖

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

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

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

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

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

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

當(dāng)GATE=0時(shí),TR0為1時(shí)啟動(dòng)T0計(jì)數(shù)開始,TR0為0時(shí)停止T0計(jì)數(shù)

當(dāng)GATE=1時(shí),引腳為高電平且TR0為1時(shí)啟動(dòng)T0計(jì)數(shù)開始,引腳為高電平且TR1為1時(shí)啟動(dòng)T0計(jì)數(shù)

TF0T0溢出標(biāo)志位。TF1T1溢出標(biāo)志位3.T0、T1的工作方式

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

定時(shí)時(shí)間

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

定時(shí)時(shí)間

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

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

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

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

ORG0000HLJMPMAINORG000BHLJMPINTT0

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

MOVIE,#82H;允許T0向CPU申請(qǐng)中斷

SETBTR0;啟動(dòng)T0開始計(jì)數(shù)

MOV30H,#10;T0中斷次數(shù)計(jì)數(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;//重賦計(jì)數(shù)初值

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

;計(jì)數(shù)單元減1為0,則再次把計(jì)數(shù)初值賦給計(jì)數(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位自動(dòng)重裝初值定時(shí)/計(jì)數(shù)方式

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

10ms90msP1.0引腳輸出周期為100ms周期信號(hào),高電平10ms,低電平90ms使用定時(shí)/計(jì)數(shù)器T0產(chǎn)生10ms定時(shí),T0工作于方式1,則計(jì)數(shù)初值如下:a=65536-10000=55536=D8F0H(十六進(jìn)制)具體程序如下:ORG0000HLJMPMAINORG000BHLJMPPINT0ORG0030HMAIN:MOVSP,#60HMOV31H,#9;設(shè)置一個(gè)計(jì)數(shù)器MOVTMOD,#01;定時(shí)/計(jì)數(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è)計(jì)

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

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

(3)程序如下:

ORG0000HLJMPMAIN;設(shè)置跳轉(zhuǎn)到主程序 ORG000BH;T0中斷服務(wù)程序入口地址 LJMPPINTT0;設(shè)置跳轉(zhuǎn)到中斷服務(wù)程序 ORG0030HMAIN:MOVSP,#60H;主程序MOV36H,#10HMOV37H,#0A0H;4000=(0FA0H)中斷次數(shù)放入計(jì)數(shù)單元MOVTMOD,#02HMOVTL0,#6MOVTH0,#6MOVIE,#82HSETBTR0SJMP$PINTT0:PUSHPSW;T0中斷服務(wù)程序PUSHACCSETBRS0;選擇1區(qū)的工作寄存器DJNZ37H,RETURNDJNZ36H,RETURN;4000次中斷未到中斷返回MOV36H,#10HMOV37H,#0A0H;4000次中斷到來(lái),計(jì)數(shù)器單元恢復(fù)初始值MOVR0,#32HMOVA,@R0ADDA,#1DAA;調(diào)整為十進(jìn)制相加MOV@R0,ACJNEA,#60H,RETURN;修改秒表計(jì)時(shí)值,秒單元加1,不為60秒中斷返回MOV@R0,#0;為60秒,秒單元清0,分鐘單元加1DECR0MOVA,@R0ADDA,#1DAAMOV@R0,ACJNEA,#60H,RETURN;若為60分鐘,分鐘單元清0,小時(shí)單元加1MOV@R0,#0DECR0MOVA,@R0ADDA,#1DAAMOV@R0,ARETURN:POPACC;恢復(fù)現(xiàn)場(chǎng) 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;//小時(shí)單元加1}}} }6.3.4AT89S系列單片機(jī)看門狗定時(shí)器的編程方法例如AT89S52看門狗定時(shí)器由一個(gè)13位定時(shí)器及WDTRST(字節(jié)地址為6AH)寄存器構(gòu)成。開啟看門狗定時(shí)器后,13位定時(shí)器會(huì)自動(dòng)加1計(jì)數(shù),如不對(duì)定時(shí)器復(fù)位則每計(jì)數(shù)8192,個(gè)機(jī)器周期溢出一次,并產(chǎn)生一個(gè)高電平復(fù)位信號(hào),使單片機(jī)系統(tǒng)復(fù)位。對(duì)于12MHZ的時(shí)鐘脈沖每8192us(約8.192ms)產(chǎn)生一個(gè)復(fù)位信號(hào),啟動(dòng)看門狗定時(shí)器,當(dāng)系統(tǒng)超過(guò)8.192ms沒(méi)有對(duì)看門狗定時(shí)器復(fù)位,看門狗定時(shí)器溢出,讓系統(tǒng)復(fù)位,為了系統(tǒng)既能正常工作又不會(huì)出現(xiàn)死機(jī)(程序跑飛),大約在8ms內(nèi)必須喂狗一次,即對(duì)看門狗定時(shí)器進(jìn)行復(fù)位。啟動(dòng)看門狗命令格式如下:MOV

0A6H,

#1EHMOV

0A6H,

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

c51語(yǔ)言來(lái)完成此功能,程序如下:#include<reg52.h>sfr

WDTRST=0xa6;main(){

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

{

WDTRST=0x1e;//喂狗

WDTRST=0xe1;

……;

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

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

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

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

串行口控制寄存器SCON

PCON中SMOD位,用來(lái)控制串行口的波特率

1.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

例如:已知振蕩頻率

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

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

1.RS-232C的電氣特性及幀格式RS-232C的電氣標(biāo)準(zhǔn)為-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)單片機(jī)和PC機(jī)的通信

6.4.6RS-422、RS-485標(biāo)準(zhǔn)串行總線接口1.RS-422標(biāo)準(zhǔn)接口

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

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

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輸出擴(kuò)展并行口。

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

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

SCON,#00H;設(shè)置串行口工作于方式0MOVR0,#30HMOVR2,#02HCIRCU:MOVA,@R0;先發(fā)送30H單元數(shù)據(jù)MOVSBUF,A;數(shù)據(jù)送入串口發(fā)送緩沖器,啟動(dòng)串口發(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并行輸入口擴(kuò)展。如圖6-33所示的16位接口電路讀入數(shù)據(jù),并把數(shù)據(jù)分別存放在30H和31H單元,其中0#74LS165的輸入數(shù)據(jù)D0~D7存放于30H單元,對(duì)應(yīng)D0存放在30H.0位,D7存放在30H.7位,1#74LS165的輸入數(shù)據(jù)D0~D7存放于31H單元。

串行口擴(kuò)展16位的并行輸入電路

MOV

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

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

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

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

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

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

CLRRI;清除接收標(biāo)志,準(zhǔn)備下次接收

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

INCR0;修改存儲(chǔ)單元地址

DJNZR1,WAIT;兩個(gè)字節(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.單機(jī)、多機(jī)通信應(yīng)用

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

;循環(huán)檢測(cè)RI是否為1,為1,接收SBUF中的數(shù)據(jù)SJMPWAIT;不為1,繼續(xù)等待NEXT:MOVA,SBUF;取SBUF中接收的一個(gè)字節(jié)的數(shù)據(jù)MOV@R0,A;存放于存儲(chǔ)單元INCR0;修改單元地址指針,便于存放下一個(gè)數(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所示,單片機(jī)系統(tǒng)使用11.0592MHz的晶體振蕩器,串行通信的波特率為4800,0#單片機(jī)可以向1#單片機(jī)發(fā)送數(shù)據(jù),1#單片機(jī)也可以向0#單片機(jī)發(fā)送數(shù)據(jù),兩個(gè)單片機(jī)之間可以進(jìn)行全雙工串行通信。圖6-342個(gè)單片機(jī)串行通信解:(1)分析根據(jù)程序設(shè)計(jì)要求,0#單片機(jī)和1#單片機(jī)地位相同,功能相似,任何一方都可以主動(dòng)與對(duì)方通信,也可以相應(yīng)對(duì)方的通信請(qǐng)求。為了實(shí)現(xiàn)雙工通信,定義2種通信協(xié)議:0#單片機(jī)發(fā)送/1#單片機(jī)接收0#單片機(jī)需要向1#單片機(jī)發(fā)送數(shù)據(jù)時(shí),0#單片機(jī)先發(fā)出一個(gè)“接收數(shù)據(jù)請(qǐng)求”命令,1#單片機(jī)接收到命令后,如果準(zhǔn)備好接收,則向0#單片機(jī)發(fā)送“接收準(zhǔn)備就緒”命令,0#單片機(jī)接收到這個(gè)響應(yīng)命令后,開始向?qū)Ψ桨l(fā)送數(shù)據(jù),直到通信結(jié)束,兩個(gè)單片機(jī)返回初始狀態(tài)。②0#單片機(jī)接收/1#單片機(jī)發(fā)送0#單片機(jī)需要從1#單片機(jī)接收數(shù)據(jù)時(shí),0#單片機(jī)先發(fā)出一個(gè)“發(fā)送數(shù)據(jù)請(qǐng)求”命令,1#單片機(jī)接收到命令后,如果準(zhǔn)備好發(fā)送,則向0#單片機(jī)發(fā)送“發(fā)送準(zhǔn)備就緒”命令,0#單片機(jī)接收到這個(gè)響應(yīng)命令后,立即進(jìn)入接收數(shù)據(jù)狀態(tài),直到通信結(jié)束,兩個(gè)單片機(jī)返回初始狀態(tài)。程序中的幾個(gè)命令,分別用一個(gè)字節(jié)的數(shù)據(jù)表示如下:“接收數(shù)據(jù)請(qǐng)求”命令——01H“接收準(zhǔn)備就緒”命令——02H“發(fā)送數(shù)據(jù)請(qǐng)求”命令——10H“發(fā)送準(zhǔn)備就緒”命令——20H程序中設(shè)置兩個(gè)標(biāo)志位,位地址分別為00H和01H00H——本機(jī)發(fā)送狀態(tài)標(biāo)志位。若為0,表示本機(jī)發(fā)送命令狀態(tài);若為1,表示本機(jī)發(fā)送數(shù)據(jù)狀態(tài)。01H——本機(jī)接收狀態(tài)標(biāo)志位。若為0,表示本機(jī)接收命令狀態(tài);若為1,表示本機(jī)接收數(shù)據(jù)狀態(tài)。(2)程序0#單片機(jī)的初始化程序:ORG0000HLJMPMAINORG0023HLJMPSINTMAIN:ORG0030HMOVTMOD,#20H;T1工作于方式2,定時(shí)方式MOVPCON,#00H;SMOD=0MOVTH1,#0FAH;波特率為4800時(shí),T1的計(jì)數(shù)初值MOVTL1,#0FAHSETBTR1;啟動(dòng)定時(shí)/計(jì)數(shù)器T1MOV

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

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

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

;數(shù)據(jù)塊沒(méi)發(fā)送完,直接中斷返回,R7中為數(shù)據(jù)塊長(zhǎng)度CLR00H;數(shù)據(jù)塊發(fā)送完,置本機(jī)為發(fā)送命令狀態(tài)RETURN:RETIC51程序如下:#include<reg52.h>bitbit0,bit1;//定義兩個(gè)位標(biāo)志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ù)請(qǐng)求”命令while(1);}uart()interrupt4using1//串口中斷函數(shù){if(RI==1)//若為接收中斷

{RI=0; if(bit1==1){//判接收狀態(tài)標(biāo)志位,若為接收數(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ù)請(qǐng)求”命令

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

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

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

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

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

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

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

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

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

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

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

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

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(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)論