單片機知識總結
使用C語言編寫單片機中斷應【例7-1】設系統(tǒng)時鐘頻率為P20=!P20;//將P2.0取反用程序時,用中斷號6MHz,利用T0定時,每隔1si=20;//重新給計數(shù)變區(qū)分每一個中斷。例如,將P2.0的狀態(tài)取反。量賦值voidX0_ISR(void)interrupt0{}解:所要求的定時時間1s超過}}//外部中斷0中斷函數(shù)了定時器的定時能力(時鐘頻
下面舉例說明12T模式下,voidT0_ISR(void)interrupt1{}率為6MHz,12分頻時,16位
//定時器T0中斷函數(shù)STC12C5A60S2單片機串行通定時器的最長定時時間為voidX1_ISR(void)interrupt2{}131.072ms)信程序的編制方法。,所以無法采用定//外部中斷1中斷函數(shù)【例8-1】設有甲、乙兩臺單時器直接實現(xiàn)1s的定時。voidT1_ISR(void)interrupt3{}將定時器的定時時間設為片機,編寫程序,使兩臺單片//定時器T1中斷函數(shù)機間實現(xiàn)如下串行通信功能。50ms,在中斷服務程序中對定voidUART1_ISR(void)(假設系統(tǒng)時鐘為時器溢出中斷請求進行計數(shù),interrupt4{}//串行口1中斷
11.0592MHz。)當計夠20次時,將P2.0的狀
函數(shù)
甲機(發(fā)送機):將首址為態(tài)取反,否則直接返回主程序,
voidADC_ISR(void)interruptADDRT的128字節(jié)外部RAM從而達到1s的定時。5{}//ADC中斷函數(shù)
數(shù)據(jù)塊順序向乙機發(fā)送;選擇T0為16位定時器方式,
【例5-1】編程實現(xiàn)通過延時函乙機(接收機):將接收的數(shù)據(jù),方式字為01H。系統(tǒng)時鐘頻率數(shù),P1.0輸出方波信號,并通
順序存放在以首址為ADDRR為6MHz,12分頻時,計數(shù)單過示波器觀察程序輸出波形的
的外部RAM中。位時間間隔為2μs。T0的計數(shù)周期。
甲機(發(fā)送機)匯編語言程序:初值為:#include“stc12.h”
$INCLUDE(STC12.INC);包//STC12C5A60S2單片機寄存
含單片機寄存器定義文件$INCLUDE(STC12.INC);器定義頭文件
包含STC12C5A60S2寄存器定ORG0000H
sbitP10=P1^0;//定義P1.0引
LJMPMAINT義文件
腳;主程序入口ORG0000Hvoiddelay(unsignedlongcnt);//ORG0023HLJMPMAIN;轉延時函數(shù)聲明
LJMPINTSE1;串口1主程序
voidmain(void){
中斷服務程序入口ORG000BHP10=1;
ORG0100H;T0中斷服務程序入口地址while(1)//主程序循環(huán)
MAINT:MOVSP,#60HLJMPT0_ISR{delay(60000);
;設置堆棧指針ORG0100HP10=~P10;}}
MOVSCON,#01000000B;置MAIN:MOVSP,#60Hvoiddelay(unsigned
;設置堆棧指針串行口工作方式1longcnt)//延時函數(shù)
MOVTMOD,#01H;T初始化MOVTMOD,#20H;定{while(cnt>0)cnt--;}
MOVTL0,#58H時器1為工作方式2
MOVTH0,#9EHMOVTH1,#0FDH;9600bps如圖所示的中斷線路可實現(xiàn)系
MOVA,#20;加器A置20的時間常數(shù)統(tǒng)的故障顯示,當系統(tǒng)的各部
SETBT0;允外T0中斷MOVTL1,#0FDH分工作正常時,4個故障源輸
SETBEA;CPU開中斷SETBTR1;啟動定時器1
入端全為低電平,指示燈全熄
SETBTR0;啟動T0計數(shù)SETBES;串行口開中斷滅。若當某部分出現(xiàn)故障,則
SJMP$;等待SETBEA;開中斷
對應的輸入線由低電平變?yōu)楦?/p>
T0_ISR:MOVTL0,#58HMOVDPTR,#ADDRT;ADDRT
電平,從而引起單片機中斷,
MOVTH0,#9EH;重是首址,可以使用EQU定義
試設計判定故障源的程序,并
新裝入時間常數(shù)MOVR0,#00H;字節(jié)數(shù)初值
進行相應的燈光顯示。
DECA;累加器A內容減1MOVXA,@DPTR;取
解:通過或非門,將上升沿轉
JNZEXIT第一個發(fā)送字節(jié)
換為下降沿,利用下降沿中斷
CPLP2.0MOVSBUF,A;啟動串行口發(fā)
方式實現(xiàn)。
MOVA,#20;送
匯編語言程序如下:累加器A重載20
SJMP$;等待中斷
ORG0000HEXIT:RETI
LJMPMAIN;轉主程序END;中斷服務程序
ORG0003H程序中的符號“$”表示“本條
INTSE1:CLRTILJMPINT_X0;轉中斷服指令地址”,指令“SJMP$”
;將中斷標志清零
務程序相當于:“HERE:LJMPCJNER0,#7FH,LOOPTORG0100HHERE”。;判斷128B是否發(fā)送完,若沒完,MAIN:MOVSP,#60H#include“stc12.h”//包則轉MOVP2,#0FFH;指示燈全熄
含STC12C5A60S2的寄存器定CLRES;全部發(fā)送完畢,禁止滅
義文件串行口中斷SETBIT0;為邊沿觸發(fā)中
sbitP20=P2^0;//聲明P2.0LJMPENDT;轉中斷返回斷方式
的引腳位變量LOOPT:INCR0SETBEX0;允許中斷
unsignedchari;//聲明計數(shù);修改計數(shù)值
SETBEA;CPU開中斷
變量。C語言程序中盡量不要INCDPTR;修改地址指針
SJMP$;等待中斷
使用ACCMOVXA,@DPTR;取發(fā)送
INT_X0:MOVA,P1;對
voidmain(void)數(shù)據(jù)
應關系:LED0--P2.0--P1.0,其{MOVSBUF,A;啟動串行口他類推//SP=0x60;//使用C語言設ENDT:RETI;中斷返回CPLA計程序時,可以不設置堆棧指ENDANLA,#0FH
針MOVP2,ATMOD=0x01;乙機接收匯編語言程序:RETIEND
TL0=0x58;$INCLUDE(STC12.INC);包對應的C語言版程序:
TH0=0x9E;含單片機寄存器定義文件#include“stc12.h”i=20;//計數(shù)變量賦初值
ORG0000H//包含寄存器定義頭文ET0=1;//允許T0中斷LJMPMAINR;轉主程序件EA=1;//開放總的中斷
ORG0023HvoidX0_ISR(void)interrupt0TR0=1;//啟動T0計數(shù)LJMPINTSE2//外部中斷函數(shù)
while(1);//等待中斷;串口1中斷服務程序入口
{P2=~P1;}
}ORG0100Hvoidmain(void)
voidT0_ISR(void)interrupt1MAINR:MOVSP,#60H{unsignedchari;
//定時器T0中斷函數(shù);設置堆棧指針P2=0x0f;//熄滅所有的指示燈
{MOVSCON,#01010000B;置IT0=1;//外部中斷0為邊沿觸
TL0=0x58;//重新裝入時間串行口工作方式1,允許接收發(fā)方式
常數(shù)MOVTMOD,#20H;定時器1
EX0=1;//允許外部中斷0
TH0=0x9E;為工作方式2
EA=1;//允許總的中斷i--;//計數(shù)變量減1MOVTH1,#0FDH;產生while(1);//等待中斷if(i==0){//若減到0,9600bps的時間常數(shù)}則將P2.0取反MOVTL1,#0FDH
SETBTR1;啟動定時器1
SETBES;串行口開中斷SETBEA;開中斷
MOVDPTR,#ADDRR;數(shù)據(jù)緩沖區(qū)首址送DPTRMOVR0,#00H;置傳送字節(jié)數(shù)初值
SJMP$;等待中斷
;中斷服務程序INTSE2:CLRRI;清接收中斷標志
MOVA,SBUF;取接收的數(shù)據(jù)MOVX@DPTR,A;接收的數(shù)據(jù)送緩沖區(qū)CJNER0,#7FH,LOOPR;判接收完沒有;若沒有,轉LOOPR繼續(xù)接收
CLRES;若接收完,則關串行口中斷LJMPENDRLOOPR:INCR0;修改計數(shù)值
INCDPTR;修改地址指針ENDR:RETI;中斷返回END
【例8-2】設有甲、乙兩臺單片機,以工作方式2進行串行通信。每幀為11位,可程控的第9位數(shù)據(jù)為奇偶校驗用的補偶位。編程實現(xiàn)如下所述的應答通信功能:
甲機取一數(shù)據(jù),進行奇偶校驗后發(fā)送。
乙機對收到的數(shù)據(jù)進行奇偶校驗,若補偶正確則乙機向甲機發(fā)出應答信息“00H”,代表“數(shù)據(jù)發(fā)送正確”,甲機接收到此信息后再發(fā)送下一個字節(jié)。若奇偶校驗錯誤,則乙機向甲機發(fā)出應答信息“0FFH”,代表“數(shù)據(jù)不正確”,要求甲機再次發(fā)送原數(shù)據(jù),直至數(shù)據(jù)發(fā)送正確。甲機發(fā)送128字節(jié)數(shù)據(jù)后停止發(fā)送。乙機接收128字節(jié)數(shù)據(jù)。甲機匯編源程序:
$INCLUDE(STC12.INC);包含STC12C5A60S2單片機寄存器定義文件
ADDRTEQU0000HORG0000H
LJMPMAINT;跳至主程序入口地址
ORG0023H;串口1中斷服務程序入口LJMPINTSETORG0100HMAINT:MOVSP,#60HMOVPCON,#80H;波特率加倍
MOVSCON,#10010000B;置工作方式2,并允許接收
MOVDPTR,#ADDRT;設置數(shù)據(jù)塊首址ADDRT的地址指針
MOVR0,#00H設置發(fā)送字節(jié)初值
SETBES;允許串行口中斷SETBEA;CPU開中斷MOVXA,@DPTR;取第一個發(fā)送數(shù)據(jù)MOVC,P;數(shù)據(jù)補偶MOVTB8,CMOVSBUF,A;啟動串行口,發(fā)送數(shù)據(jù)SJMP$
;中斷服務程序INTSET:
JBRI,LOOPT1;接收中斷?若RI=1,則轉接收乙機發(fā)送的應答信息
CLRTI;因RI=0,則必有TI=1,表明是甲機發(fā)送數(shù)據(jù)的中斷請求
LJMPENDT;甲機發(fā)送一數(shù)據(jù)完畢跳至中斷返回程序LOOPT1:CLRRI;清接收中斷標志MOVA,SBUF;取乙機的應答數(shù)據(jù)
SUBBA,#01H;判斷乙機應答信息是否為“00H”JCLOOPT2;數(shù)據(jù)傳送正確,則轉LOOPT2
MOVXA,@DPTR;數(shù)據(jù)傳送不正確時,要求重新發(fā)送MOVC,PMOVTB8,CMOVSBUF,A;啟動串行口,重發(fā)一次數(shù)據(jù)
LJMPENDT;跳中斷返回程序LOOPT2:INCDPTR;修改地址指針,發(fā)送下一個數(shù)據(jù)INCR0;修改發(fā)送字節(jié)數(shù)計數(shù)值MOVXA,@DPTR;下一個數(shù)據(jù)補偶MOVC,P
MOVTB8,C;不能直接使用MOVTB8,PMOVSBUF,A;啟動串行口,發(fā)送新的數(shù)據(jù)
CJNER0,#80H,ENDT;數(shù)據(jù)發(fā)送完?若沒有發(fā)送完,則中斷返回
CLRES;全部發(fā)送完畢,禁止串行口中斷ENDT:RETI;中斷返回END
乙機匯編語言程序:
$INCLUDE(STC12.INC);包含STC12C5A60S2單片機寄存器定義文件
ADDRREQU0000HORG0000H
LJMPMAINR主程序入口ORG0023H;串行中斷入口LJMPINTSER;轉至串行口中斷服務程序ORG0100HMAINR:MOVSP,#60HMOVPCON,#80H;波特率加倍
MOVSCON,#10010000B;置串行口為工作方式2,允許接收
MOVDPTR,#ADDRR;數(shù)據(jù)指針首址
MOVR0,#00H;接收數(shù)據(jù)字節(jié)數(shù)初值
SETBES;串行口開中斷SETBEA;CPU開中斷SJMP$等待中斷
;串行口中斷服務程序
INTSER:JBRI,LOOPR1;若RI=1,則轉接收程序入口CLRTI;若RI=0,必有TI=1,是發(fā)送中斷,故應清零LJMPENDR;跳至中斷返回程序
LOOPR1:CLRRI;清接收中斷標志
MOVA,SBUF;讀取接收的數(shù)據(jù)
MOVC,P;奇偶校驗JCLOOPR2;如8位數(shù)為奇,則轉LOOPR2再檢測RB8位
ORLC,RB8
JCLOOPR3;奇偶校驗錯誤時,轉LOOPR3LJMPLOOPR4;補偶正確,轉LOOPR4
LOOPR2:ANLC,RB8;8位數(shù)為奇,再檢測RB8位JCLOOPR4;RB8=1,補偶正確,轉LOOPR4
LOOPR3:MOVA,#0FFH;發(fā)出應答信息“0FFH”給甲機,表明數(shù)據(jù)不正確MOVSBUF,ALJMPENDR;跳至中斷返回程序
LOOPR4:MOVX@DPTR,A;將接收的正確數(shù)據(jù)送數(shù)據(jù)緩沖區(qū)
MOVA,#00H;數(shù)據(jù)傳送正確,發(fā)出應答信息“00H”給甲機
MOVSBUF,AINCR0;修改指針I(yè)NCDPTR
CJNER0,#80H,ENDR;若數(shù)據(jù)沒有接收完畢,則跳至中斷返回
CLRES;接收完畢,關串行口中斷ENDR:RETI;中斷返回END
編程實現(xiàn)如下功能:
主機:先向從機發(fā)送一幀地址信息,然后再向從機發(fā)送10個數(shù)據(jù)信息。
從機:接收主機發(fā)來的地址幀信息,并與本機的地址號相比較,若不符合,仍保持SM2=1不變;若相等,則使SM2清零,準備接收后續(xù)的數(shù)據(jù)信息,直至接收完10個數(shù)據(jù)信息。
主機匯編語言程序:
$INCLUDE(STC12.INC);包含STC12C5A60S2單片機寄存器定義文件
ADDRTEQU0000HSLAVEEQU5;從機地址號ORG0000HLJMPMAINT;主程序入口地址
ORG0023HLJMPINTST;串口1中斷入口地址ORG0100HMAINT:MOVSP,#60HMOVSCON,#0C0H;串行口方式3
MOVTMOD,#20H;置T1工作方式2
MOVTH1,#0FAH;置4800波特率
MOVTL1,#0FAH;相應的時間常數(shù)
MOVDPTR,#ADDRT;置數(shù)據(jù)地址指針MOVR0,#00H;發(fā)送數(shù)據(jù)字節(jié)計數(shù)清零
MOVR2,#SLAVE;從機地址號→R2
SETBTR1;啟動T1SETBES串行口開中斷SETBEA;CPU開中斷SETBTB8;置位TB8,作為地址幀信息特征
MOVA,R2;發(fā)送地址幀信息MOVSBUF,ASJMP$;等待中斷
;串行口中斷服務程序:INTST:CLRTI;清發(fā)送中斷標志CLRTB8;清TB8位,為發(fā)送數(shù)據(jù)幀信息做準備MOVXA,@DPTR;發(fā)送一個數(shù)據(jù)字節(jié)MOVSBUF,AINCDPTR;修改指針
INCR0
CJNER0,#0AH,LOOPT;判數(shù)據(jù)字節(jié)是否發(fā)送完CLRESLOOPT:RETIEND
從機匯編語言程序:
$INCLUDE(STC12.INC);包含STC12C5A60S2單片機寄存器定義文件
ADDRREQU0000HSLAVEEQU5;從機地址號
ORG0000HLJMPMAINR;從機主程序入口地址ORG0023HLJMPINTSR;串口1中斷入口地址ORG0100HMAINR:MOVSP,#60HMOVSCON,#0F0H;串行口方式3,SM2=1,REN=1,接收狀態(tài)
MOVTMOD,#20H;置T1為工作方式2
MOVTH1,#0FAH;置4800波特率
MOVTL1,#0FAH;相應的時間常數(shù)
MOVDPTR,#ADDRR;置數(shù)據(jù)地址指針
MOVR0,#0AH;置接收數(shù)據(jù)字節(jié)數(shù)指針SETBTR1;啟動T1SETBES;串行口開中斷SETBEA;CPU開中斷SJMP$;等待中斷
INTSR:CLRRI;清接收中斷標志MOVA,SBUF;取接收信息
MOVC,RB8;取RB8(信息特征位)→CJNCLOOPR1;RB8=0為數(shù)據(jù)幀信息,轉LOOPR1XRLA,#SLAVE;RB8=1為地址幀信息,與本機地址號SLAVE比較JZLOOPR2;地址相等,則轉LOOPR2LJMPENDR;地址不相等,則轉中斷返回ENDRLOOPR2:CLRSM2;清SM2,為后面接收數(shù)據(jù)幀信息做準備LJMPENDR;中斷返回LOOPR1:MOVX@DPTR,A;接收的數(shù)據(jù)→數(shù)據(jù)緩沖區(qū)
INCDPTR;修改地址指針
DJNZR0,ENDR;數(shù)據(jù)字節(jié)沒全部接收完,則轉LOOPR2SETBSM2;全部接收完,置SM2=1ENDR:RETI;中斷返回END
【例9-2】編程實現(xiàn)利用STC12C5A60S2單片機ADC通道2采集外部模擬電壓信號,8位精度,采用查詢方式循環(huán)進行轉換,并將轉換結果保存于30H單元中。假設時鐘頻率為18.432MHz。
解:取8位精度時,可設置ADRJ=0,直接使用轉換結果寄存器ADC_RES的值。由于復位后,ADRJ=0,因此,按照ADC的編程要點進行初始化
后,直接判斷ADC_FLAG標志是否為1,若為1,則讀出ADC_RES寄存器的值,并存入30H即可;若為0,則繼續(xù)等待。
匯編語言程序代碼如下:$INCLUDE(STC12.INC);包含STC12C5A60S2單片機寄存器定義文件
ADC_DATEQU30H;A/D轉換結果
ORG0000HLJMPMAINORG0050HMAIN:
MOVSP,#70H;設置堆棧
ORLADC_CONTR,#80H;開A/D轉換電源MOVA,#20HLCALL
DELAY;開電源后加適當延時,1ms以內即可MOVP1ASF,#04H;設置P1.2的模擬量功能MOV
ADC_CONTR,#11100010B;選擇P1.2作為A/D轉換通道
MOVA,#05HLCALL
DELAY;如果切換A/D轉換通道,則需要加延時WAIT_AD:
ORLADC_CONTR,#00001000B;啟動A/D轉換
MOVA,#00010000B;判斷A/D轉換是否完成
ANLA,ADC_CONTRJZ
WAIT_AD;A/D轉換尚未完成,繼續(xù)等待
ANLADC_CONTR,#11100111B;將ADC_FLAG清零MOVA,ADC_RES;讀取A/D轉換結果
MOVADC_DAT,A;保存A/D轉換結果LJMP
WAIT_AD;等待下一次轉換完成DELAY:;延時子程序PUSH
02;將寄存器組0的R2入棧PUSH
03;將寄存器組0的R3入棧PUSH
04;將寄存器組0的R4入棧MOVR4,ADELAY_LOOP0:MOVR3,#200;2個時鐘周期
Delay_LOOP1:MOVR2,#249;2個時鐘周期
DELAY_LOOP:DJNZR2,DELAY_LOOP;4個時鐘周期DJNZR3,DELAY_LOOP1;4個時鐘周期DJNZR4,DELAY_LOOP0;4個時
鐘周期
POP04POP03POP02RETEND
【例9-3】編程實現(xiàn)利用STC12C5A60S2單片機ADC通道2采集外部模擬電壓信號,10位精度,采用中斷方式進行轉換,并將轉換結果保存于30H和31H單元中。假設時鐘頻率為18.432MHz。
解:按照編程要點進行初始化時,可設置ADRJ=1。在中斷服務程序中讀出ADC_RES寄存器的值,屏蔽高6位后存入31H單元,讀出ADC_RESL寄存器的值,存入30H單元。匯編語言程序代碼如下:$INCLUDE(STC12.INC);包含STC12C5A60S2單片機寄存器定義文件
ADC_HIEQU31H;A/D轉換結果高2位
ADC_LOWEQU30H;A/D轉換結果低8位
ORG0000HLJMPMAINORG002BHLJMP
ADC_ISR;ADC中斷服務程序入口
ORG0050HMAIN:
MOVSP,#70H;設置堆棧ORL
ADC_CONTR,#80H;開A/D轉換電源
MOVA,#20HLCALL
DELAY;開電源后要加適當延時,1ms以內即可MOVP1ASF,#04H;設置P1.2的模擬量功能
MOV
ADC_CONTR,#11100010B;選擇P1.2作為A/D轉換通道MOVA,#05HLCALL
DELAY;如果切換A/D轉換通道,則需要加延時ORLAUXR1,#04H;設置ADC轉換結果存儲格式(ADRJ=1)ORL
ADC_CONTR,#00001000B;啟動A/D轉換SETB
EADC;EADC=1,開放ADC的中斷控制位
SETB
EA;開放CPU總中斷SJMP
$;循環(huán)等待中斷
ADC_ISR:;ADC中斷服務程序入口
ANLADC_CONTR,#11100111B;將ADC_FLAG清零
MOVA,ADC_RES;讀取A/D轉換結果高2位ANL
A,#03H;屏蔽高6位
MOVADC_HI,
A;保存A/D轉換結果高2位MOVA,ADC_RESL;讀取A/D轉換結果低8位MOVADC_LOW,A;保存A/D轉換結果低8位ORLADC_CONTR,#00001000B;重新啟動A/D轉換RETI
DELAY:;延時子程序PUSH
02;將寄存器組0的R2入棧PUSH
03;將寄存器組0的R3入棧PUSH
04;將寄存器組0的R4入棧MOVR4,ADELAY_LOOP0:MOVR3,#200;2個時鐘周期
Delay_LOOP1:MOVR2,#249;2個時鐘周期
DELAY_LOOP:DJNZR2,DELAY_LOOP;4個時鐘周期DJNZR3,DELAY_LOOP1;4個時鐘周期DJNZR4,DELAY_LOOP0;4個時鐘周期
POP04POP03POP02RETEND
擴展閱讀:單片機知識點總結 考試大題
單片機考點總結及考試大題
1.2.3.4.
單片機由CPU、存儲器及各種I/O接口三部分組成。
單片機即單片微型計算機,又可稱為微控制器和嵌入式控制器。MCS-51系列單片機為8位單片機,共40個引腳,MCS-51基本類型有8031、8051和8751.MCS-51單片機共有16位地址總線,P2口作為高8位地址輸出口,P0口可分時復用為低8位地址輸出口和數(shù)據(jù)口。MCS-51單片機片外可擴展存儲最大容量為216=64KB,地址范圍為0000HFFFFH。(1.以P0口作為低8位地址/數(shù)據(jù)總線;2.以P2口作為高8位地址線)
5.MCS-51片內有128字節(jié)數(shù)據(jù)存儲器(RAM),21個特殊功能寄存器(SFR)。(1)MCS-51片內有128字節(jié)數(shù)據(jù)存儲器(RAM),字節(jié)地址為00H7FH;(2)21個特殊功能寄存器(SFR)(21頁23頁);
(3)當MCS-51上電復位后,片內各寄存器的狀態(tài),見34頁表2-6。PC=0000H,SP=07H,P0~P3=FFH
6.程序計數(shù)器PC:存放著下一條要執(zhí)行指令在程序存儲器中的地址,即當前PC值或現(xiàn)行值。程序計數(shù)器PC是16位寄存器,沒有地址,不是SFR.
7.PC與DPTR的區(qū)別:PC和DPTR都用于提供地址,其中PC為訪問程序存儲器提供地址,而DPTR為訪問數(shù)據(jù)存儲器提供地址。8.MCS-51內部有2個16位定時/計數(shù)器T0、T1,1個16位數(shù)據(jù)指針寄存器DPTR,其中MOVEDPTR,#data16是唯一的16位數(shù)據(jù)傳送指令,用來設置地址指針DPTR。9.程序狀態(tài)字寄存器PSW(16頁)(2)PSW寄存器中各位的含義;Cy:進位標志位,也可以寫為C。Ac:輔助進位標志位。
RS1、RS0:4組工作寄存區(qū)選擇控制位。RS10011RS00101所選的4組寄存器0區(qū)(內部RAM地址00H~07H)1區(qū)(內部RAM地址08H~0FH)2區(qū)(內部RAM地址10H~17H)3區(qū)(內部RAM地址18H~1FH)P為奇偶標志位:該標志位用來表示累加器A中為1的位數(shù)的奇偶數(shù)P=1,A中1的個數(shù)為奇數(shù);P=0,A中1的個數(shù)為偶數(shù)。
另:使用加法指令時,累加器A中的運算結果對各個標志位的影響:(1)如果位7有進位,則置1進位標志位Cy,否則清0Cy;(2)如果位3有進位,置1輔助進位標志位Ac,否則清0Ac;
(3)如果位6有進位,而位7沒有進位,或者位7有進位,而位6沒有,則溢出標志位OV置1,否則清0OV。即只要位7和位6中有一個進位,而另一個沒進位,OV就置1.10.MCS-51指令系統(tǒng)的七種尋址方式,熟練掌握各尋址方式。(40頁)。尋址方式寄存器尋址方式直接尋址方式使用的變量尋址空間R0~R7、A、B、C(位)4組通用工作寄存區(qū)、部分特殊功能寄存器DPTR、AB內部RAM128B、特殊功能寄存器寄存器間接尋址方式立即尋址方式基址寄存器加變址寄存器間接尋址方式位尋址方式相對尋址方式@R1,@R0,SP@R1,@R0,@DPTR#data@A+DPTR,@A+PCPC+偏移量片內RAM片外數(shù)據(jù)存儲器程序存儲器內部RAM20H~2FH單元的128個可尋址位、SFR中的可尋址位(85個)程序存儲器12.MCS-51有5個中斷源,2級中斷優(yōu)先級。5個中斷源名稱及其中斷入口地址分別是什么?哪些中斷源的中斷請求標志位在響應中斷時由硬件自動清除?那些中斷源的中斷請標志位必須使用軟件清除?記住各個中斷請求標志位,優(yōu)先級標志位,觸發(fā)方式標志位。(102頁108頁)中斷源外部中斷0定時器/計數(shù)器T0外部中斷1定時器/計數(shù)器T1串行口中斷入口地址0003H000BH0013H001BH0023H響應中斷時中斷請求標志位硬件自動清除IE0硬件自動清除TF0硬件自動清除IE1硬件自動清除TF1軟件清除TI或RI前面4種都是硬件自動清0,串行中斷必須使用軟件清除,因為串行接收和發(fā)送共享串行中斷,在中斷處理中必須使用T1和R1判斷串行接收還是發(fā)送中斷。
13.MCS-51的串行口為全雙工的異步串行通信口,串行口有幾種工作方式?每種工作方式的幀格式和波特率是什么?串行口有4種工作方式:SM00011SM10101方式功能說明0123同步異位寄存器方式(用于擴展I/O口)波特率固定,為fosc/128位異步收發(fā),波特率可變(有定時器控制)9位異步收發(fā),波特率為fosc/64或fosc/329位異步收發(fā),波特率可變(有定時器控制)SM0、SM1:串行口4中工作方式的選擇位
TXDP3.1RXDP3.0REN允許串行接收設240字符每秒異步通訊240*10=2400bitSCON:串行口控制PCON波特率設置15.系統(tǒng)總線
按其功能通常把系統(tǒng)總線分為三組:(1)、地址總線(AddressBus,簡寫AB)地址總線用于傳送單片機發(fā)出的地址信號,以便進行存儲單元和I/O端口的選擇。地址總線是單向的,只能由單片機向外送出。地址總線的數(shù)目決定著可直接訪問的存儲單元數(shù)目。MCS-51單片機最多可以擴展64KB,即65536個地址單元,因此,地址總線為16條。(2)、數(shù)據(jù)總線(DataBus,簡寫DB)
。MCS-51單片機是8位字長,所以,數(shù)據(jù)總線的位數(shù)也是8位的。數(shù)據(jù)總線是雙向的,可以進行2個方向的傳送。控制總線)
15.單片機外部擴展存儲器地址分配的方法線選法和譯碼法。外部擴展存儲器容量大小的確定方法(1)由該存儲器芯片上的地址根數(shù)決定,如程序存儲器芯片27128有A0A13共14根地址線,故27128的存儲容量=214=16KB;(2)用存儲器芯片型號后面的數(shù)字÷8即可得到該芯片的存儲容量,如27128的存儲容量=128÷8=16KB;
16.P0口作第八位的地址、數(shù)據(jù)總線,P2口作為高位地址線,PSEN:ALE作為P0口低八位所存控制,EA-ROM的選擇控制16.存儲器擴展的讀寫控制:
外擴的RAM芯片既能讀出又能寫入,所以通常都有讀寫控制引腳,記為OE和WE。外擴的RAM的讀寫控制引腳分別與MCS-51的RD和WR引腳相連。
外擴的EPROM在正常使用中只能讀出,不能寫入,故EPROM的芯片沒有寫入控制引腳,只有讀出引腳,記為OE,該引腳與MCS-51的PSEN相連。
17.在MCS-51單片機系統(tǒng)中,外接程序存儲器和數(shù)據(jù)存儲器共用16位地址線和八8位數(shù)據(jù)線,為何不發(fā)生沖突?
外接程序存儲器和數(shù)據(jù)存儲器雖然共用16位地址線和8位數(shù)據(jù)線,但由于訪問外擴程序存儲器時是PSEN信號有效,而訪問數(shù)據(jù)存儲器時是RD或WR信號有效。而這些控制信號是由MCS-51執(zhí)行訪問外部外序存儲器和或訪問外部數(shù)據(jù)存儲器的指令產生,任何時候只能執(zhí)行1種指令,只產生1種控制信號,所以不會產生數(shù)據(jù)沖突的問題。
已知8051單片機的fosc=12MHZ,用T1定時,試編程P1.1周期為2ms的方波
MOVTMOD,#20H;T1方式2定時MOVTH1,#06H;定時250μsMOVTL1,#06HSETBTR1
L2:MOVR2,#04HL1:JNBTF1,$CLRTF1
DJNZR2,L1CPLP1.1SJMPL2
請回答:(共16分)
1.下圖中外部擴展的程序存儲器和數(shù)據(jù)存儲器容量各是多少?(2分)2.兩片存儲器芯片的地址范圍分別是多少?(地址線未用到的位填1)(6分,)3.請編寫程序,要求:
(1)將內部RAM30H~3FH中的內容送入1#6264的前16個單元中;(4分)(2)將2#6264的前4個單元的內容送入40H~43中;(4分)
解:1.外擴程序存儲器的容量是8K,外擴數(shù)據(jù)存儲器的容量是16K
2.2764范圍:
C000H~DFFFH
1#范圍:A000H~BFFFH2#范圍:6000H~7FFFH
3.請編寫程序(1)
MOV
R1,#10H
MOVMOVLOOP:MOV
DPTR,@0A000HR0,#30HA,@R0
MOVX@DPTR,A
INCINC
DJNZ
RET
(2)
MOVMOVMOV
R1,#04HDPTR,#6000HR0,#40HDPTR
R0R1,LOOP
LOOP:MOVX
MOV
A,@DPTR
@R0,A
INCINCDJNZRET
DPTRR0R1,LOOP
將外部數(shù)據(jù)存儲器中的5000H50FFH單元全部清零(10分)。答:ORG0100H(1分)MOVDPTR#5000H
MOVR0,#00H
CLRA(3分)
LOOP:MOVX@DPTR,A
INCDPTR(3分)DJNZR0,LOOP(2分)
HERE:SJMPHERE(RET或SJMP$等)(1分)
題9.9電路圖可以參考圖9-10,PA口每一位接二極管的正極,二極管的負極接地。PB口每1位接一開關和上拉電阻,開關另一端直接接地。這樣只需要將讀到的PB口的值送給PA口就可以滿足題目要求了。
ORG
0100H
;設置PA口方式0輸出,PB口方式0輸入
MIAN:MOV
A,#10000010B
MOVDPTR,#0FF7FH;控制口地址送DPTR
;送方式控制字
MOVX@DPTR,AMOV
DPTR,#0FF7DH;PB口地址送DPTR
;讀入開關信息
MOVXA,@DPTRMOV
DPTR,#0FF7CH;PA口地址送DPTR
;PA口的內容送PB口點亮相應的二極管
MOVX@DPTR,AEND
友情提示:本文中關于《單片機知識總結》給出的范例僅供您參考拓展思維使用,單片機知識總結:該篇文章建議您自主創(chuàng)作。
來源:網(wǎng)絡整理 免責聲明:本文僅限學習分享,如產生版權問題,請聯(lián)系我們及時刪除。