《单片机原理及应用》模拟卷2
1、分析程序的执行结果,将结果填写到空格中。
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单元的内容= 37H ) LOOP: AJMP LOOP
2、将MCS51内部RAM50H~55H单元存放的12个16进制数变为ASCII码,放到2800H单元开始的外部RAM中。 解:ORG
0000H
LJMP MAIN
MAIN: MOV DPTR,#70H MOV @R1,#1120H MOV R0,#06 TOP: MOV A,@DPTR PUSH ACC ANL A,#0FH ;取出四位二进制数 PUSH ACC
CLR C
SUBB A,#0AH POP ACC ;弹回A中 JC LOOP ;该数〈10去LOOP ADD A,#07H ;否则加07H LOOP: ADD A,#30H ;加30H MOV R2,A
POP ACC
ANL #0F0H ;取出下一个四位二进制数 PUSH ACC CLR C
SUBB A,#0AH POP ACC ;弹回A中 JC LOOP ;该数〈10去LOOP1 ADD A,#07H ;否则加07H LOOP1: ADD A,#30H ;加30H SWAP A ORL A,R2 MOVX @R1,A ;将结果存到RAM中 INC DPTR INC R1 DEC R0 JNZ TOP ;判断转换完没有,未转换完则转TOP
3、用8031的T0定时/计数器,设计程序,实现在P1.0输出50ms的方波,输出100个方波后停止输出。 #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++; }
4、甲单片机利用方式1将内部RAM30H~37H单元的ASCII码发送到乙机。编制甲机发送和乙机接收的程序(加奇校验)。 A机发送程序设计 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机的接受程序设计
接受串口发来的程序,假设存放在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:………;出错处理,如返回出错信息等 RET JS:
JNB RI JS CLR RI
MOV A, SBUF MOV P C ANL A,#7FH RET
5、利用8031和8位A/D(ADC0809)构成数据采集系统。每隔20ms采集通道0的一次数据,将采集的数据存放在30H的内部RAM中。画出原理示意图,写出较完整的程序清单。(提示:需要用定时器和外部中断)。 MAIN:MOV TMOD,#01H //定时器0 初始化 MOV TL0,#10H MOV TH0,#27H MOV R0,#30H SETB TR0 SETB ET0 SETB EX0 SETB EA SJMP $
定时器0 中断服务子程序: ORG 000BH
MOV DPTR,#7EF8H //启动ADC,对IN0 通
//道进行AD 转换 CLR TR0
MOV TL0,#10H MOV TH0,#27H SETB TR0 RETI
外部中断(INT0)子程序: ORG 0003H MOVX A,@DPTR MOV @R0,A INC R0 RETI
键盘扫描子程序: KEY1: ACALL KS1 ;调用判断有无键按下子程序 JNZ LK1 AJMP KEY1
LK1: ACALL TM12s ;调用12ms 延时子程序 ACALL KS1 JNZ LK2 AJMP KEY1
LK2: MOV R2,#0FEH ;首列扫描字入R2 MOV R4,#00H ;首列号入R4
LK4: MOV DPTR,#0FD01H ;列扫描字送8155PA 口 MOV A,R2 MOVX @DPTR,A
INC DPTR ;指向8155PC 口 INC DPTR
MOVX A,@DPTR
JB ACC.0,LONE;第0 行无键按下,查第1 行 MOV A,#00H ;有键按下,该行首键号送A AJMP LKP
LONE: JB ACC.1,NEXT MOV A,#08H
LKP: ADD A,R4 ;键号=行键号+列号 PUSH ACC
LK3: ACALL KS1 ;等待键释放
JNZ LK3 POP ACC ;键释放,键号放入A RET
NEXT: INC R4 ;指向下一列,列号加1