单片机上机试题.docx
《单片机上机试题.docx》由会员分享,可在线阅读,更多相关《单片机上机试题.docx(52页珍藏版)》请在冰豆网上搜索。
单片机上机试题
1.片内RAM40H、41H单元中分别存放着两个8位二进数,要求取出两个单元中的低半字节合并成一个字节存放在42H。
(40H的低半字节在高位上)
常用直接寻址方式:
ORG0000H
START:
MOVA,40H
ANLA,#0FH
SWAPA
MOV42H,A
MOVA,41H
ANLA,#0FH
ORL42H,A
SJMP$
END
采用间址:
ORG0000H
START:
MOVR1,#40H
MOVA,@R1
ANLA,#0FH
SWAPA
INCR1
XCHA,@R1
ANLA,#0FH
ORLA,@R1
INCR1
MOV@R1,A
SJMP$
END
使用变量:
•BUFEQU40H
•ORG0000H
•MOVR1,#BUF
•MOVA,@R1
•ANLA,#0FH
•SWAPA
•INCR1
•XCHA,@R1
•ANLA,#0FH
•ORLA,@R1
•INCR1
•MOV@R1,A
•SJMP$
•END
2.编制程序使y按下式赋值:
VAREQU30H
FUNCEQU31H
START:
MOVA,VAR
JZCOMP
JNBACC.7,POSI
MOVA,#0FFH
SJMPCOMP
POSI:
MOVA,#01H
COMP:
MOVFUNC,A
SJMP$
END
3.求无符号数累加和。
•片内RAM从60H开始的连续8个单元数据之和,放在R3R4中
ORG0000H
LJMPADD1
ORG0100H
ADD1:
MOVR3,#00H
MOVR4,#00H
MOVR2,#8
MOVR0,#60H
LOOP:
MOVA,R4
ADDA,@R0
MOVR4,A
CLRA
ADDCA,R3
MOVR3,A
INCR0
DJNZR2,LOOP
SJMP$
END
4已知数据0~9的平方,设变量x的值在工作寄存器R0中,查表后求x2的值放回累加器,试编制程序。
ORG0000H
MOVA,R0
MOVDPTR,#TABLE
MOVCA,@A+DPTR
SJMP$
TABLE:
DB00H,01H,04H,09H,16H,25H,36H,49H,64H,81H
END
5.用程序实现c=a2+b2。
设a、b均小于10,a存在片内RAM31H单元中,b存在32H单元中,把c存入33H单元中。
ORG0000H
MOVSP,#60H
MOVA,31H
LCALLSQR
MOVR1,A
MOVA,32H
LCALLSQR
ADDA,R1
MOV33H,A
L:
SJMPL
;子程序
SQR:
MOVDPTR,#TAB
MOVCA,@A+DPTR
RET
TAB:
DB0,1,4,9,16,25,36,49,64,81
END
6.P1.0~P1.3为输出口,P3.0~P3.3为输入口,使LED灯显示开关的状态。
ORG0000H
L1:
MOVC,P3.0
MOVP1.0,C
MOVC,P3.1
MOVP1.1,C
MOVC,P3.2
MOVP1.2,C
MOVC,P3.3
MOVP1.3,C
SJMPL1
END
7.使用外部中断0,以P1口的8个LED灯显示外部中断次数。
每中断一次,LED指示灯显示按照二进制加1。
同时,采用P3.4~P3.7控制4个LED灯进行“跑马灯”循环显示,来模拟CPU执行主程序。
ORG0000H
LJMPMAIN
ORG0003H;中断入口
LJMPINTN0
ORG0030H
MAIN:
MOV30H,#00H;计中断次数,开始清零
SETBEX0;允许INT0中断
SETBIT0;边沿触发方式
SETBEA;开中断
MOVP1,#0FFH;P1口指示灯初始状态
;----------模拟主程序-------------------------
LOOP1:
MOVA,#0EFH
LOOP:
MOVP3,A
LCALLDELAY;延时0.25S
RLA
JBACC.0,LOOP
SJMPLOOP1
;-------中断服务程序---------------------
INTN0:
PUSHACC;保护现场
INC30H;中断次数加1
MOVA,30H
CPLA
MOVP1,A;点亮指示灯
POPACC;恢复现场
RETI;中断返回
;-------------------------------------------------------------
DELAY:
MOVR5,#04H;延时子程序
DL1:
MOVR6,#0
DL2:
MOVR7,#0
DJNZR7,$
DJNZR6,DL2
DJNZR5,DL1
RET
•8.P1口接有8个发光二极管,编程使8个指示灯轮流点亮,每个灯亮0.25s,单片机晶振为12MHz。
•分析:
fosc=12MHz,1M=1μs
•16位定时器最大定时时间:
•t=(216-初值)×机器周期
•=(65536-0)×1μs=65.5ms
•0.25s=5×50ms
•定时50ms初值:
•50×103=65536-初值;
•初值=15536=3CB0H
ORG0000H
AJMPMAIN
ORG000BH;中断入口
AJMPINTT0
ORG0030H;主程序
MAIN:
MOV31H,#0FEH
MOVP1,31H;置第一个LED亮
MOVTMOD,#01H;T0工作于定时方式1
MOVTH0,#3CH
MOVTL0,#0B0H;定时50ms
SETBTR0;启动T1工作
SETBET0;允许T1中断
SETBEA
MOV30H,#00H;软件计时单元
WAIT:
SJMPWAIT;等待中断
INTT0:
MOVTH0,#3CH;中断服务程序
MOVTL0,#0B0H;重装计数初值
INC30H;计时单元加1
MOVA,30H
CJNEA,#05H,L1;0.25S到?
MOV30H,#00H;计时单元清0
MOVA,31H
RLA;左移一位
MOV31H,A
MOVP1,A;下一个发光二极管亮
L1:
RETI;中断返回
•9.P1口接有8个发光二极管,使用T1作为计数器,计外部脉冲的个数,每计3个脉冲产生中断,利用LED指示灯显示中断的次数。
ORG0000H
AJMPMAIN
ORG001BH;T1中断入口
AJMPINTT1
ORG0030H;主程序
MAIN:
MOVTMOD,#60H;T1工作于计数方式2
MOVTH1,#253;T1计数初值(256-3)
MOVTL1,#253
SETBTR1;启动T1工作
SETBET1;允许T1中断
SETBEA;开中断
MOV30H,#00H;中断次数计数单元清零
WAIT:
SJMPWAIT;等待中断
;-------------------------------;中断服务程序
INTT1:
INC30H;次数单元加1
MOVA,30H
CPLA
MOVP1,A
RETI;中断返回
10.方式0数据发送的设计
查询方式:
ORG0000H
LJMPMAIN
ORG0030H
MAIN:
MOVSCON,#00H;串口方式0
MOVSBUF,#0fH;发送数据
L1:
JNBTI,L1;等待串口方式完毕
CLRTI;清发送中断标志
SJMP$
END
采用中断方式
ORG0000H
LJMPMAIN
ORG0023H;串口中断向量入口
LJMPUARTINT
ORG0030H
MAIN:
MOVSP,#60H
MOVSCON,#00H;串口方式0
SETBEA;开中断
SETBES;允许串口中断
MOVSBUF,#0f0H;发送数据
SJMP$
UARTINT:
CLRTI;中断服务程序
RETI
END
11.让P1口灯轮流亮起来
•ORG0000H
•LJMPMAIN
•ORG0030H
MAIN:
MOVA,#0FEH;初始值
MOVSCON,#00H;串口方式0
•L1:
MOVSBUF,A;发送数据
•JNBTI,$;发送完毕?
•CLRTI
•LCALLDLEAY;延时0.3S
•RLA;左移1位
•JBACC.7,L1;8位循环完毕?
•L2:
MOVSBUF,A;发送数据
•JNBTI,$
•CLRTI
•LCALLDLEAY;延时
•RRA;右移1位
•JBACC.0,L2;8位循环完毕?
•SJMPL1;重新开始
•DLEAY:
MOVR7,#03H
DL1:
MOVR6,#0
DL2:
MOVR5,#0
DJNZR5,$
DJNZR6,DL2
DJNZR7,DL1
RET
•12.在某控制系统中有甲、乙两个单片机,甲单片机首先将P1口上拨动开关状态发送给乙单片机。
乙单片机将接收的数据输出至P1,点亮相应端口的LED。
设串口波特率采用9600(实验台fosc=11.0592MHz),电路如图所示:
•
•方式1的波特率:
•B=T1的溢出率×2SMOD/32
=2SMOD/32×fosc/(12×(256-TH1))
•取SMOD=0则:
9600=11.0592×106/((12×(256-TH1))×32)
•TH1=253,串口禁止中断。
•定时器T1工作于方式2(8位自动重装初值),禁止中断。
ORG0000H
MOVTMOD,#20H;T1方式2
MOVTH1,#253;初值253,B=9600
MOVTL1,#253
MOVSCON,#40H;串口方式1
MOVPCON,#00H;SMOD=0
SETBTR1;启动T1
LL:
MOVP1,#0FFH
MOVSBUF,P1;发送数据
JNBTI,$
CLRTI
SJMPLL
END
ORG0000H
MOVTMOD,#20H;T1方式2
MOVTH1,#253;初值253,B=9600
MOVTL1,#253
MOVSCON,#40H;串口方式1
MOVPCON,#00H;SMOD=0
SETBTR1;启动T1
SETBREN;允许串口接收
LL:
MOVP1,SBUF;接收数据
JNBRI,$
CLRRI
SJMPLL
END
13.P1口控制LED进行倒计时显示。
ORG0000H
LJMP0030H
ORG000BH
LJMPINTT0
ORG0030H
MOVTMOD,#01H
MOVTH0,#3CH
MOVTL0,#0B0H;50ms
SETBTR0
SETBET0
SETBEA
MOV30H,#00;计时单元清零
MOV31H,#09H;初值
MOVDPTR,#TAB
MOVA,31H
MOVCA,@A+DPTR
MOVP1,A;显示“9”
SJMP$
;---------
INTT0:
MOVTH0,#3CH
MOVTL0,#0B0H
INC30H
MOVA,30H
CJNEA,#20,L2;1S到?
MOV30H,#0;计时单元清零
DEC30H;倒计时单元减1
MOVA,30H
CJNEA,#0FFH,L1;9秒完成?
CLRTR0
SJMPL2
L1:
MOVDPTR,#TAB
MOVCA,@A+DPTR;转换成七段码
MOVP1,A
L2:
RETI
TAB:
DB0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H
DB80H,90H,88H,83H,0C6H,0A1H,86H,8EH;共阳极7段码表
14.在LED显示器上显示“12345678”
使用P1口作段口、P3口作位口
;---------------------------------------------
;74LS138:
C-->P27,B-->P26,A-->P25,Y7-->8255CS,A1A0-->A1A0
;---------------------------------------------
ORG0000H
LJMP0030H
ORG0030H
MOVR0,#30H;显示缓冲器首址
MOVA,#01
MOVR7,#08;8个LED
CHU:
MOV@R0,A
INCA;送入12345678
INCR0
DJNZR7,CHU
;-------------------
MOVDPTR,#7FFFH;8255初始化
MOVA,#10000000H;控制字
MOVX@DPTR,A
;-------------------
STAR:
LCALLDISP
AJMPSTAR
;-------------------------
DISP:
MOVR0,#30H;显示缓冲器首址
MOVR3,#01H;位码
MOVR7,#08H;8个LED
DIR1:
MOVA,@R0;取显示数据
MOVDPTR,#TAB;7段码表
MOVCA,@A+DPTR;查表求得7段码
MOVDPTR,#7FFCH
MOVX@DPTR,A;7段码送段口
MOVA,R3;位码
INCDPTR
MOVX@DPTR,A;位码送位口
LCALLDL1;延时1ms
RLA;位码左移
MOVR3,A
INCR0;指向下一位
DJNZR7,DIR1;8位显示完毕?
MOVDPTR,#7FFCH;段口
MOVA,#00H;暗码
MOVX@DPTR,A;关显示
RET
;-----------------------
TAB:
DB0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H
DB80H,90H,88H,83H,0C6H,0A1H,86H,8EH;共阳极7段码表
;------------------------
DL1:
MOVR6,#02H;1ms延时
DL11:
MOVR5,#248
DJNZR5,$
DJNZR6,DL11
RET
;------------------------
•15YE_JING.ASM
•
;-----------------------------------------------------------------------
;E=P10RW=P11RS=P12I/O操作
;-----------------------------------------------------------------------
COMEQU27H;命令寄存器单元
TIMEEQU30H;延时单元
;-------------------------------------
HANG1EQU80H;液晶第一行
HANG2EQU90H;液晶第二行
HANG3EQU88H;液晶第三行
HANG4EQU98H;液晶第四行
;------------------------------------
EEQUP1.0
RWEQUP1.1
RSEQUP1.2
;------------------------------------
ORG0000H
AJMP0030H
ORG0030H
LCALLINI;初始化
;---------------------------
MAIN1:
MOVCOM,#HANG1;第1行
MOVDPTR,#WEL_1
LCALLW_LINE
MOVCOM,#HANG2;第2行
MOVDPTR,#WEL_2
LCALLW_LINE
MOVCOM,#HANG3;第3行
MOVDPTR,#WEL_3
LCALLW_LINE
MOVCOM,#HANG4;第4行
MOVDPTR,#WEL_4
LCALLW_LINE
;--------------------------
STAR:
LJMPSTAR
;----------------------------
W_LINE:
MOVA,COM
LCALLSEND_I;写行
MOVR2,#16;16个
W_L1:
MOVA,#00H
MOVCA,@A+DPTR;取数据
LCALLSEND_D
INCDPTR
DJNZR2,W_L1
RET
;-----------------------------------------------------
INI:
MOVA,#33H;基本指令,8bit模式,基本指令
LCALLSEND_I
LCALLDELAY
MOVA,#0cH;显示开,游标关,反白关
LCALLSEND_I
LCALLDELAY
MOVA,#01H;清除显示
LCALLSEND_I
LCALLDELAY
MOVA,#06H;进入设定点,游标右移,画面不移动
LCALLSEND_I
LCALLDELAY
RET
;------------------------
DELAY:
MOVR7,#6;延时3ms
D2:
MOVR6,#248
DJNZR6,$
DJNZR7,D2
RET
;----------------------------
WEL_1:
DB'山东理工大学'
WEL_2:
DB'电气电子工程学院'
WEL_3:
DB'单片机互动教学室'
WEL_4:
DB'DTS-A教学平台'
;-----------------------------
;发送数据子程序
;-----------------------------
SEND_D:
LCALLCHK_BUSY;检测模块内部工作状态
SETBRS;RS=1选择数据寄存器
CLRRW;RW=0写状态
MOVP0,A;送数据到数据口
SETBE
NOP
NOP
CLRE
RET
;----------------------
;发送指令子程序
;----------------------
SEND_I:
LCALLCHK_BUSY;检测模块内部工作状态
CLRRS;RS=0选择指令寄存器
CLRRW;RW=0写状态
MOVP0,A;送数据到数据口
SETBE
NOP
NOP
CLRE
RET
;----------------------
;测忙碌子程序
;----------------------
CHK_BUSY:
MOVP0,#0FFH
CLRRS;RS=0选择指令寄存器
SETBRW;RW=1读状态
SETBE
JBP0.7,$;判别BF位
CLRE
RET
;--------------------
16.8255做显示器接口
1、设计8255的译码电路;
•2、确定8255的端口地址;
•3、在LED显示器上显示“12345678”
;---------------------------------------------
;74LS138:
C-->P27,B-->P26,A-->P25,Y7-->8255CS,A1A0-->A1A0
;---------------------------------------------
ORG0000H
LJMP0030H
ORG0030H
MOVR0,#30H;显示缓冲器首址
MOVA,#01
MOVR7,#08;8个LED
CHU:
MOV@R0,A
INCA;送入12345678
INCR0
DJNZR7,CHU
;-------------------
MOVDPTR,#7FFFH;8255初始化
MOVA,#10000000H;控制字
MOVX@DPTR,A
;-------------------
STAR:
LCALLDISP
AJMPSTAR
;-------------------------
DISP:
MOVR0,#30H;显示缓冲器首址
MOVR3,#01H;位码
MOVR7,#08H;8个LED
DIR1:
MOVA,@R0;取显示数据
MOVDPTR,#TAB;7段码表
MOVCA,@A+DPTR;查表求得7段码
MOVDPTR,#7FFCH
MOVX@DPTR,A;7段码送段口
MOVA,R3;位码
INCDPTR
MOVX@DPTR,A;位码送位口
LCALLDL1;延时1ms
RLA;位码左移
MOVR3,A
INCR0;指向下一位
DJNZR7,DIR1;8位显示完毕?
MOVDPTR,#7FFCH;段口
MOVA,#00H