《機(jī)電一體化《單片機(jī)原理及應(yīng)用》山東大學(xué)網(wǎng)絡(luò)教育考試模擬題及答案.doc》由會(huì)員分享,可在線閱讀,更多相關(guān)《機(jī)電一體化《單片機(jī)原理及應(yīng)用》山東大學(xué)網(wǎng)絡(luò)教育考試模擬題及答案.doc(20頁珍藏版)》請?jiān)谘b配圖網(wǎng)上搜索。
《單片機(jī)原理及應(yīng)用》
除非特別聲明,編程題可以使用匯編語言編寫,也可以使用C語言編寫
1、 分析程序的執(zhí)行結(jié)果,將結(jié)果填寫到空格中。
ORG 0000H
MOV 30H,#50H
MOV R0,#30H
MOV A,@R0 ;(A= 50H )
MOV A,#79H
MOV B,#20H ;(A= 79H B= 20H )
DIV AB ;(A= 03H B= 19H )
PUSH B
MOV B,#0AH
MUL AB ;(A= 1EH B= 00H )
POP B
ADD A,B ;(A= 37H B= 19H )
MOV 30H,A ;(30H單元的內(nèi)容= 37H )
MOV 20H,30H
CLR 01H ;(20H單元的內(nèi)容= 37H )
MOV A,20H ;(PSW中P的內(nèi)容= 1 )
CPL A
RR A ;( PSW中C的內(nèi)容= 0 )
SWAP A ;(A= 46H )
ADDC A,#0F0H ;(A= 36H )
;(PSW中P的內(nèi)容= 0 )
;( PSW中C的內(nèi)容= 1 )
RL A ;(A= 6CH )
;(PSW中P的內(nèi)容= 0 )
;( PSW中C的內(nèi)容= 0 )
LOOP: AJMP LOOP
2、 將MCS51內(nèi)部RAM60H~65H單元存放的12個(gè)16進(jìn)制數(shù)變?yōu)锳SCII碼,放到0090H單元開始的外部RAM中。[使用匯編語言編寫]
MAIN:
MOV R0,#60H
MOV R2,#6
MOV DPTR, #0090H
HASC:
MOV A,@R0
ANL A,#0FH ;屏蔽高四位
ADD A,#0DH
MOVC A,@A+PC ;查表低四位轉(zhuǎn)換為ASCII碼
MOVX @DPTR,A ;送如外部RAM
INC DPTR
MOV A,@R0
ANL A,#0F0H
SWAP A
ADD A,#6
MOVC,@A+PC ;高四位轉(zhuǎn)換為ASCII碼
MOVX @DPTR,A
INC R0
INC DPTR
DJNZ R2,HASC
END
ASCTAB:DB 30H 31H 32H 33H 34 H 35H 36H 37H 38H 39H
DB41H 42H 43H 44H 45H 46H
3、 某一故障檢測系統(tǒng),當(dāng)出現(xiàn)故障1時(shí),線路1上出現(xiàn)上升沿;當(dāng)出現(xiàn)故障2時(shí),線路2上出現(xiàn)下降沿。沒有故障時(shí),線路1為低電平,線路2為高電平。出現(xiàn)故障時(shí),相應(yīng)的指示燈變亮。故障消失后,指示燈熄滅。試用MSC1211為單片機(jī)實(shí)現(xiàn)該故障檢測功能,畫出電路原理圖,并寫出相應(yīng)程序。
4、 用MSC1211的T0定時(shí)/計(jì)數(shù)器,設(shè)計(jì)程序,實(shí)現(xiàn)在P1.0輸出周期為200ms的占空比為1:1的方波,輸出500個(gè)方波后停止輸出。
解:ORG 0000H
LJMP MAIN
ORG 000BH ;T0口中斷服務(wù)程序入口地址
LJMP INT_T0
MAIN: MOV TMOD,#00H ;T0工作于方式0定時(shí)
MOV TL0,#0CH
MOV TH0,#1EH ;設(shè)定秒中斷周期為1ms
MOV A,200 ;設(shè)定輸出周期為200 ms
MOV R2,1000 ;輸出500個(gè)方波
SETB TR0
SETB ET0
SETB EA
SETB P1.0
SJMP $
INT_T0:MOV TL0,#0CH
MOV TH0,#1EH ;T0重裝時(shí)間常數(shù)
CPL P1.0 P1.0位取反
DEC R2
JZ ENDP ;若R2為0,則結(jié)束程序,否則返主程序繼續(xù)輸出
RETI ;返主程序
ENDP: END
5、 利用MSC1211的A/D構(gòu)成數(shù)據(jù)采集系統(tǒng)。使用模擬通道0進(jìn)行連續(xù)數(shù)據(jù)采集,采集8次后取得平均值,存放到預(yù)先分配好的100個(gè)內(nèi)存單元中,這100個(gè)單元存滿后,再從第一個(gè)單元進(jìn)行覆蓋保存。寫出完整的程序清單(應(yīng)在適當(dāng)?shù)牡胤郊映绦蜃⑨專?
解:#include
#include
extern void autobaud(void);//聲明外部函數(shù)
extern void bipolar(void);
float a[100]={0},w[8]={0};int out=0;long result,temp;int j;
int AUXinterrupts(void)interrupt6 using1//中斷服務(wù)程序
{
if(PAI==6) //處理AD中斷
{
w[out++]=bipolar();
temp=w[out];
SUMR0=temp&0xff;
SUMR1=(temp>>8)&0xff;
SUMR2=(temp>>16)&0xff;
SUMR3=(temp>>24)&0xff;
if(out==8)
{
SUM=SUMR3<<24+SUMR2<<16+SUMR1<<8+SUMR0;
}
SUM/=8;
a[j++]=SUM;
if(j>=100)
{j=0;}
}
}
min(void)
{
float dummy;
int decimation;
decimationg=1440;//抽取因子
PDCON&=0x77;//打開ADC
ACLK=9;//模擬采樣頻率
ADMUX=0;//使用通道0
ADCON0=0x30;//內(nèi)部基準(zhǔn)2.5V,緩沖器關(guān),BOD關(guān),PGA=0
ADCON1=0x01;//雙極性,自動(dòng)穩(wěn)定模式,偏移增益自校準(zhǔn)
ADCON2=decimation&0xff;//寫入抽取因子低字節(jié)
ADCON3=(decimation>>8)&0x07;//寫入抽取因子高字節(jié)
AIE=&0x20;
autobaud();
//等待校準(zhǔn)
for(i=0;i<4;i++)
{
while(!(AIE&0X20))
{
dummy=ADRESL;
}
SSCON=0;//清除求和寄存器
EAI=1;
While(1);
}
}
6、 變量k從0變到150,變化步長為10。對于每一個(gè)值,使用整形數(shù)算術(shù)運(yùn)算計(jì)算8*k,k*k*k和(40*k/150)^3。這三個(gè)值通過MSC1211的D/A轉(zhuǎn)換后同步輸出(均使用電壓輸出模式)。試編寫程序?qū)崿F(xiàn)。
解:include
data unsigned int k,j,i;
void main(void)
{
PDCON&=~0X48;
ADCON0=0X30;
DACSEL=6;
DACSEL=4;
DACL=0X24;
DACSEL=5;
DACH=0x24;
while(1)
{
DACSEL=0;DAC=0x8000;
for(j=0;j<100;j++)
DAC=0;
for(k=0;k<151;k+=10)
{
DACSEL=1;DAC=8*k;
DACSEL=2;DAC=k*k*k;
DACSEL=3;i=40*k/150;DAC=i*i*i;
DACSEL=6;DACL=0Xfc;
}
}
}
7、 利用MSC1211或8051設(shè)計(jì)應(yīng)答方式下的多機(jī)通訊程序。通訊參數(shù):晶振為11.0592MHz,9600,n,8,1。通訊過程如下:主機(jī)首先發(fā)送從機(jī)地址,從機(jī)收到地址后進(jìn)行比較,如果地址相符,則將從機(jī)地址回發(fā)給主機(jī)作為應(yīng)答信號(hào)。主機(jī)收到從機(jī)的地址應(yīng)答信號(hào)后,將內(nèi)存單元中的120個(gè)數(shù)據(jù)發(fā)送給從機(jī),并進(jìn)行數(shù)據(jù)塊校驗(yàn)(將各個(gè)數(shù)據(jù)進(jìn)行異或),若校驗(yàn)正確,則從機(jī)發(fā)送00H給主機(jī),否則發(fā)送0FFH給主機(jī),主機(jī)重新發(fā)送數(shù)據(jù)。(應(yīng)在適當(dāng)?shù)牡胤郊映绦蜃⑨專?
解:主機(jī)程序如下:
ORG 0000H
LJMP MAINT ;跳至主程序入口地址
ORG 0023H ;串行口中斷服務(wù)程序入口
LJMP INTST
MAINT: MOV SCON,#90H ;置工作方式2,并允許接收
MOV TMOD,#20H ;置T1工作方式2
MOV TH1,#0FDH
MOV TL1,#0FDH
MOV DPTR,#ADDR ;設(shè)置數(shù)據(jù)塊首址ADDR的地址指針
MOV R0,#120 ;設(shè)置發(fā)送字節(jié)數(shù)
MOV R1,#00H ;設(shè)置校驗(yàn)和的初值
MOV R2,#NAME
SETB TB8 ;置位TB8位,作為發(fā)送地址楨信息特征
SETB TR1
SETB EA ;CPU開中斷
SETB ES ;允許串行口中斷
MOV A,R2 ;發(fā)送地址楨信息
MOV SBUF,A
SJMP $
;中斷服務(wù)程序
INTST: MOV A,TB8 ;判斷是發(fā)送地址還是數(shù)據(jù),若為數(shù)據(jù)則轉(zhuǎn)LOOP0
CJNE A,01H,LOOP0
CLR TI ;地址楨信息發(fā)送完后清發(fā)送中斷
LOOP0:JB RI,LOOP1 ;檢查是否是接受中斷?若RI=1則轉(zhuǎn)入接受乙機(jī)發(fā)送應(yīng)答信息
CLR TI ;因RI=0,表明是甲機(jī)發(fā)送中斷數(shù)據(jù)的中斷請求。CPU響應(yīng)中斷,在中斷服務(wù)程序中應(yīng)清中斷標(biāo)志
MOV A,TB8;
CJNE A,#01H,LOO3 ;若為發(fā)送數(shù)據(jù)中斷則轉(zhuǎn)LOOP3繼續(xù)發(fā)送數(shù)據(jù)
LJMP ENDT ;甲機(jī)發(fā)送一數(shù)據(jù)完畢跳至中斷返回程序
LOOP1:CLR RI ;清接受中斷標(biāo)志
MOV A,TB8 ;判斷是發(fā)送地址還是數(shù)據(jù),若為數(shù)據(jù)則轉(zhuǎn)LOOP2
CJNE A,#01H,LOOP4;若TB8為0則接受的為乙機(jī)數(shù)據(jù)校驗(yàn)應(yīng)答
MOV A,SBUF ;取乙機(jī)的應(yīng)答數(shù)據(jù)
CJNE A,@R2,LOOP2 ;若乙機(jī)應(yīng)答信息不是從機(jī)地址,則地址傳送不正確,則轉(zhuǎn)LOOP2程序重新發(fā)送地址信息,否則清TB8,發(fā)送數(shù)據(jù)
CLR TB8
LOOP3:MOVX A,@DPTR ;取下一個(gè)數(shù)
MOV SBUF,A ;啟動(dòng)串行口,發(fā)送新的數(shù)據(jù)
XRL A,@R1
MOV @R1,A
INC DPTR ;修改地址指針
DEC R0 ;修改發(fā)送字節(jié)數(shù)記數(shù)值
CJNE R0,#00H,ENDT ;判別120個(gè)字節(jié)數(shù)據(jù)都發(fā)送完沒有。如果沒有發(fā)送完則跳至中斷返回程序。繼續(xù)發(fā)送
MOV A,@R1
MOV SBUF,A ;數(shù)據(jù)全部發(fā)送完畢則發(fā)送校驗(yàn)和
LJMP ENDT
LOOP4:MOV A,SBUF ;取乙機(jī)的應(yīng)答數(shù)據(jù)
CJNE A,#00H,LOOP5 ;若數(shù)據(jù)發(fā)送不正確,則轉(zhuǎn)LOOP5重新發(fā)送
CLR ES ;全部發(fā)送完畢,禁止串行口中斷
LOOP5:MOV DPTR,#ADDR ;設(shè)置數(shù)據(jù)塊首址ADDR的地址指針
MOV R0,#120 ;設(shè)置發(fā)送字節(jié)數(shù)
MOV R1,#00H ;設(shè)置校驗(yàn)和的初值
LJMP LOOP2
LOOP2:MOV A,R2 ;發(fā)送地址楨信息
MOV SBUF,A
RETI
ENDT: RETI
END
從機(jī)程序如下:
ORG 0000H
LJMP MAINR ;跳至主程序入口地址
ORG 0023H ;串行口中斷服務(wù)程序入口
LJMP INTSR
MAINR:MOV SCON,#0B0H ;置工作方式2,并允許接收
MOV TMOD,#20H ;置T1工作方式2
MOV TH1,#0FDH
MOV TL1,#0FDH
MOV DPTR,#ADDR ;設(shè)置數(shù)據(jù)塊接收首址為ADDR
MOV R0,#120 ;設(shè)置接收字節(jié)數(shù)
MOV R2,#NAME
MOV R1,#00H ;設(shè)置校驗(yàn)和的初值
SETB RB8 ;置位RB8位,作為接受地址信息特征
SETB TR1
SETB EA ;CPU開中斷
SETB ES ;允許串行口中斷
SJMP $
;中斷服務(wù)程序
INTSR: MOV A, RB8 ;判斷是接收地址還是數(shù)據(jù),若為數(shù)據(jù)則轉(zhuǎn)LOOP0
CJNE A,01H,LOOP0
CLR RI ;地址楨信息接受完后清接收中斷
MOV A,SBUF
XRL A,@R2
JZ LOOP ;若地址相符則轉(zhuǎn)LOOP,否則中斷返回
LJMP ENDR
LOOP: CLR SM2
CLR RB8
MOV A,@R2
MOV SBUF,A ;想主機(jī)發(fā)送從機(jī)地址
LJMP ENDR
LOOP0:JB RI,LOOP1 ;檢查是否是接受中斷?若RI=1則轉(zhuǎn)入接受甲機(jī)發(fā)送的數(shù)據(jù)
CLR TI ;因RI=0,表明是乙機(jī)發(fā)送中斷數(shù)據(jù)的中斷請求。CPU響應(yīng)中斷,在中斷服務(wù)程序中應(yīng)清中斷標(biāo)志
LJMP ENDR ;甲機(jī)發(fā)送一數(shù)據(jù)完畢跳至中斷返回程序
LOOP1:CLR RI ;清接受中斷標(biāo)志
DEC @R0
JZ LOOP2 ;數(shù)據(jù)未接收完則中斷返回,若接收完則轉(zhuǎn)LOOP2,校驗(yàn)
MOV A,SBUF ;取甲機(jī)發(fā)送的數(shù)據(jù)
MOVX @DPTR,A
XRL A,@R1
MOV @R1,A
LOOP2:MOV A,SBUF :取甲機(jī)發(fā)送的校驗(yàn)和
XRL A,@R1
JZ RIGHT
LJMP WRONG
RIGHT:MOV A,#00H
MOV SBUF,A
LJMP ENDR
WRONG:MOV A,#0FFH
MOV SBUF,A
MOV DPTR,#ADDR ;設(shè)置數(shù)據(jù)塊接收首址為ADDR
MOV R0,#120 ;設(shè)置接收字節(jié)數(shù)
LJMP ENDR
ENDR: RETI
END
《單片機(jī)原理及應(yīng)用》
1、分析程序的執(zhí)行結(jié)果,將結(jié)果填寫到空格中。
ORG 0000H
MOV 30H,#50H
MOV R0,#30H
MOV A,@R0 ;(A= 50H )
MOV A,#79H
MOV B,#20H ;(A= 79H B= 20H )
DIV AB ;(A= 03H B= 19H )
PUSH B
MOV B,#0AH
MUL AB ;(A= 1E B= 00H )
POP B
ADD A,B ;(A= 37H B= 19H )
MOV 30H,A ;(30H單元的內(nèi)容= 37H )
LOOP: AJMP LOOP
2、 MCS51內(nèi)部RAM50H~55H單元存放的12個(gè)16進(jìn)制數(shù)變?yōu)锳SCII碼,放到2800H單元開始的外部RAM中。
MAIN:
MOV R0,#50H
MOV R2,#6
MOV DPTR, #2800H
HASC:
MOV A,@R0
ANL A,#0FH ;屏蔽高四位
ADD A,#0DH
MOVC A,@A+PC ;查表低四位轉(zhuǎn)換為ASCII碼
MOVX @DPTR,A ;送如外部RAM
INC DPTR
MOV A,@R0
ANL A,#0F0H
SWAP A
ADD A,#6
MOVC,@A+PC ;高四位轉(zhuǎn)換為ASCII碼
MOVX @DPTR,A
INC R0
INC DPTR
DJNZ R2,HASC
END
ASCTAB:DB 30H 31H 32H 33H 34 H 35H 36H 37H 38H 39H
DB41H 42H 43H 44H 45H 46H
3、 編制四個(gè)十六進(jìn)制單字節(jié)數(shù)相加后求平均的程序。
假設(shè)4個(gè)16進(jìn)制的單字節(jié)分別為a,b,c,d,計(jì)算結(jié)果方到e中
#include
#define uchar unsigned char
void main(void)
{
uchar a,b,c,d,e;
e=(a+b+c+d)/4;
while(1);
}
4、 用8031的T0定時(shí)/計(jì)數(shù)器,設(shè)計(jì)程序,實(shí)現(xiàn)在P1.0輸出50ms的方波,輸出100個(gè)方波后停止輸出。
#include
#define uchar unsigned char
uchar a;
void main(void)
{
TMOD=0X01;
TL0=0XB0;
TH0=0X3C;
EA=1;
ET0=1;
TR0=1;
while(1)
{
if(a==100)
{
EA=0;
TR0=0;
}
}
}
void timer0(void) interrupt 1
{
TL0=0XB0;
TH0=0X3C;
cpl p1.0;
a++;
}
5、 甲單片機(jī)利用方式1將內(nèi)部RAM30H~37H單元的ASCII碼發(fā)送到乙機(jī)。編制甲機(jī)發(fā)送和乙機(jī)接收的程序(加奇校驗(yàn))。
A機(jī)發(fā)送程序設(shè)計(jì)
ST:
MOV TMOD,#20H
MOV TL1,#0E8H
MOV TH1,#0E8H
SETB TR1
MOV SCON ,#50H
MOV R0,#30H
MOV R1,#08H
LOOP:
MOV A,@R0
CALL FS
INC R0
DJNZ R1,LOOP
RET
FS:
MOV C,P
CPL C
MOV ACC.7,C
MOV SBUF A
WAIT:
JNB TI,WAIT
CLR TI
RET
B機(jī)的接受程序設(shè)計(jì)
接受串口發(fā)來的程序,假設(shè)存放在30H—37H中
ST:
MOV TMOD,#20H
MOV TL1,#0E8H
MOV TH1,#0E8H
SETB TR1
MOV SCON ,#50H
MOV R0,#30H
MOV R1,#08H
LOOP:
CALL JS
JNC ERROR
MOV @R0,A
INC R0
DJNZ R1,LOOP
RET
ERROR:………;出錯(cuò)處理,如返回出錯(cuò)信息等
RET
JS:
JNB RI JS
CLR RI
MOV A, SBUF
MOV P C
ANL A,#7FH
RET
6、 試用8031和8155實(shí)現(xiàn)鍵盤和LED動(dòng)態(tài)顯示。畫出原理示意圖并編制鍵盤掃描程序和LED動(dòng)態(tài)顯示程序(16個(gè)鍵的鍵盤掃描和6位LED顯示)。
鍵盤掃描子程序:
#include
#include
#define uchar unsigned char
#define uint unsigned int
uchar num,i;
uint temp;
void main(void)
{
while(1)
{
keych();
}
}
void keych()
{
for(i=0;i<4;i++)
{
temp=0xfe;
temp= _crol_(temp, i);
P0=temp;
temp=P0;
temp=temp&0xf0;
if(temp!=0xf0)
{ delay();
if((P0&0xf0)!=0xf0)
{
switch(temp)
{
case 0x70:
jpch;
break;
case 0xb0:
jpch;
break;
case 0xd0:
jpch;
break;
case 0xe0:
jpch;
break;
}
}
}
}
}
Void jpch(void)
{
…..//按鍵掃描處理程序
}
LED動(dòng)態(tài)掃描子程序
假設(shè)各端口都已初始化
#include
Unsigned char duanx[]={0x3f,0x06,0x5b,0x4f,0x66,0xbd}
Unsigned char weix[]={0x80,0x40,0x20,0x10,0x80,0x40}
Void main(void)
Init();//初始化各端口
P1=0
While(1)
{
Unsigned char ;
For (i=0;i<6,i++)
{
P0=duanx[i];
P1++
P0=weix[i];
Delay();
P1=0;
P0=0;
}
i=0;
p1=0
}
5、利用8031和8位A/D(ADC0809)構(gòu)成數(shù)據(jù)采集系統(tǒng)。每隔20ms采集通道0的一次數(shù)據(jù),將采集的數(shù)據(jù)存放在30H的內(nèi)部RAM中。畫出原理示意圖,寫出較完整的程序清單。(提示:需要用定時(shí)器和外部中斷)。
《單片機(jī)原理及應(yīng)用》
一、 分析程序的執(zhí)行結(jié)果,將結(jié)果填寫到空格中。
1、 MOV 40H,#80H
MOV R0,#40H
MOV A,@R0 ;(A= 80H )
MOV B,#20H
DIV AB ;(A= 04H B= 00H )
MOV @R0,A ;最終結(jié)果存于內(nèi)存單元 40H 中。
2、 MOV A,#2AH
RR A
MOV B,A
MUL AB ;(A= B9H B= 01H )
(OV= 1 CY= 0 )
3、 MOV A,#0B2H
MOV R1,#055H
ANL A,R1 ;(A= 10H )
ORL A,R1 ;(A= 55H )
XRL A,R1 ;(A= 00H )
SWAP A ;(A= 00H )
4、 設(shè)內(nèi)存20H的內(nèi)容為30H,30H的內(nèi)容為46H,46H的內(nèi)容為57H
MOV R0,#30H
MOV A,@R0 ;(PSW中P的內(nèi)容= 1 )
XCH A,R0
ADD A,#0DBH
SUBB A,#74H ;(A= 96H )
;(PSW中P的內(nèi)容= 0 )
;( PSW中C的內(nèi)容= 0 )
5、 MOV 25H,#39H
CLR 2AH ;(25H)=( 00111001 B)
CPL 2CH ;(25H)=( 00101001 B)
SETB 2EH ;(25H)=( 01101001 B)
MOV C,28H ;( PSW中C的內(nèi)容= 1 )
二、 程序設(shè)計(jì)
1、MCS51內(nèi)部RAM 40H~60H單元存放著有符號(hào)16進(jìn)制數(shù),將其中能被2整除的數(shù),存放到0090H單元開始的外部RAM中。[使用匯編語言編寫]
解: ORG 0000H
JMP START
START: MOV SP,#60H
MOV DPTR,#0090H
MOV R0,#40H
MOV R1, #21
LOOP0: MOV A,@R0
MOV B, #2
DIV AB
MOV R2, B
CJNZ R2, #0, LOOP1 ;余數(shù)為0則繼續(xù),不為0則轉(zhuǎn)移
MOV A,@R0
MOV @DPTR,A
INC DPTR
LOOP1: INC R0
DJNZ R1, LOOP0
END
2、用MSC1211的T1定時(shí)/計(jì)數(shù)器,定時(shí)0.1S中斷,使P1口的8個(gè)發(fā)光二極管每隔1S 循環(huán)點(diǎn)亮。設(shè)系統(tǒng)主頻為6MHZ。
解:ORG 0000H
LJMP MAIN ;轉(zhuǎn)主程序
ORG 001BH ;T1中斷服務(wù)程序入口地址
LJMP T1-ISR
ORG 0100H
MAIN:MOV SP,#60H ;設(shè)置堆棧指針
MOV P1,#01H ;設(shè)置P1.1發(fā)光
MOV TMOD,#10H ;T1初始化
MOV TL1,#B0H
MOV TH1,#3CH
SETB TR1 ;啟動(dòng)T0計(jì)數(shù)
SETB ET1 ;允許T0中斷
SETB EA ;CPU開中斷
SJMP $ ;等待
T1_ISR:MOV TL1,#B0H
MOV TH1,#3CH
MOV A,P1 ;P1口循環(huán)左移
RL A
MOV P1,A
EXIT: RETI
END
3、設(shè)有甲、乙兩臺(tái)單片機(jī),以工作方式3進(jìn)行串行通訊,設(shè)晶振為11.0592MHz,波特率為9600,甲機(jī)將內(nèi)存單元中的120個(gè)數(shù)據(jù)作補(bǔ)偶校驗(yàn)后發(fā)送給乙機(jī),乙機(jī)對接收到的數(shù)據(jù)進(jìn)行奇偶校驗(yàn),若校驗(yàn)正確,則從機(jī)發(fā)送00H給甲機(jī),甲機(jī)繼續(xù)發(fā)送數(shù)據(jù),校驗(yàn)不正確,則發(fā)送0FFH給甲機(jī),甲機(jī)重新發(fā)送原數(shù)據(jù),編寫乙機(jī)的接收程序。(應(yīng)在適當(dāng)?shù)牡胤郊映绦蜃⑨專?
解:ORG 0000H
AJMP MAIN
ORG 0023H
LJMP SE2_INT
MAIN:
MOV SP,#60H
MOV TMOD #20H
MOV TH1,#0FDH ;設(shè)置波特率為9600bps
MOV TL1,#0FDH
MOV SCON,#90H ;串行口工作方式3,允許接收
MOV DPTR,#2000H;接收數(shù)據(jù)區(qū)
MOV R1,#120
SETB TR1
SETB EA
SETB ES
SJMP $ ;等待接收中斷
SE2_INT:
JB RI,LOOPA
CLR T1
LJMP ENDR
LOOPA:CLR RI
MOV A,SBUF
MOV C,P ;奇偶校驗(yàn)
JC LOOP1 ;如8位數(shù)是奇,則轉(zhuǎn)LOOP1再檢測RB8位
ORL C,RB8 ; 如8位數(shù)為偶,再檢測RB8位,RB8=1,則9位數(shù)據(jù)為奇,補(bǔ)偶
JC LOOP2 ;錯(cuò),轉(zhuǎn)LOOP2
LJMP LOOP3 ;補(bǔ)偶正確,轉(zhuǎn)LOOP3
LOOP1: ANL C, RB8 ;8位數(shù)為奇,再檢測RB8位
JC LOOP3 ;RB8=1,補(bǔ)偶正確,轉(zhuǎn)LOOP3
LOOP2: MOV A ,#0FFH ;檢測不正確發(fā)送FF給甲機(jī)
MOV SBUF,A
JMP ENDR
LOOP3: MOVX @DPTR ,A
MOV A,#00H
MOV SBUF,A
INC DPTR
DJNZ R1, ENDR
CLR ES ;停止接收
ENDR: RETI
2、某一故障檢測系統(tǒng),當(dāng)出現(xiàn)故障時(shí),線路出現(xiàn)下降沿;沒有故障時(shí),線路為高電平。出現(xiàn)故障時(shí),相應(yīng)的指示燈變亮。故障消失后,指示燈熄滅。試用MSC1211為單片機(jī)實(shí)現(xiàn)該故障檢測功能,畫出電路原理圖,并寫出相應(yīng)程序。
4、 變量k從20變到200,變化步長為20。對于每一個(gè)值,使用整形數(shù)算術(shù)運(yùn)算計(jì)算8*k,k*k*k和(40*k/150)^3。這三個(gè)值通過MSC1211的D/A轉(zhuǎn)換后同步輸出(均使用電壓輸出模式)。試編寫程序?qū)崿F(xiàn)。
解: #include 〈Reg1211.h〉
data unsigned int i , j ;
void main (void)
{
PDCON &=0x37 ; //同時(shí)開啟ADC和DAC模塊
ADCON0 =0x30 ; //內(nèi)部參考電壓2.5V
DACSEL =6; //選擇將要訪問DAC加載寄存器LOADCON
DACL = 0XFC ; //設(shè)置DAC1、2、3通道同步更新模式
DACSEL = 4; //選擇DAC0、1控制寄存器
DACL =0x24; //DAC IDAC 關(guān)閉,內(nèi)部參考電壓
DACH =0x24; //DAC1 IDAC 關(guān)閉,內(nèi)部參考電壓
DACSEL=5; //選擇 DAC2、3控制寄存器
DACL =0x24 ; //DAC2 IDAC 關(guān)閉,內(nèi)部參考電壓
DACH=0x24; //DAC3 IDAC 關(guān)閉,內(nèi)部參考電壓
while (1)
{
DACSEL = 0; //選擇DAC1數(shù)據(jù)寄存器
DAC = 0x8000 ;//送DAC1要轉(zhuǎn)換的數(shù)據(jù)
for (j=0 ; j <100 ; j++ ) ;// 延時(shí)
DAC =0 ;
for (i=20 ; i<200 ; i+=20 ) ;
{
DACSEL = 1;
DAC = 8*k ;
DACSEL =2 ;
DAC = k*k*k ;
DECSEL = 3;
j = 40*k/150 ;
j = j^3 ;
DACSEL = 6 ;
DACL = 0XFC ;
}
}
}
鏈接地址:http://m.appdesigncorp.com/p-12814293.html