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