单片机原理及应用技术苏家建曹柏荣汪志锋课后习题参考答案.docx
《单片机原理及应用技术苏家建曹柏荣汪志锋课后习题参考答案.docx》由会员分享,可在线阅读,更多相关《单片机原理及应用技术苏家建曹柏荣汪志锋课后习题参考答案.docx(25页珍藏版)》请在冰豆网上搜索。
![单片机原理及应用技术苏家建曹柏荣汪志锋课后习题参考答案.docx](https://file1.bdocx.com/fileroot1/2023-4/17/302e6a63-888f-48b3-93a8-24f433f93420/302e6a63-888f-48b3-93a8-24f433f934201.gif)
单片机原理及应用技术苏家建曹柏荣汪志锋课后习题参考答案
单片机原理及应用技术苏家建
课后习题参考答案
第三章MCS-51指令系统
3-1MCS-51指令系统有哪几种寻址方式?
按功能分类有哪几种指令?
3-2设A=0FH,R0=30H,片内RAM的(30H)=0AH,(31H)=0BH,(32H)=0CH,下列程序段运行后的结果?
MOVA,@R0;A=0AH
MOV@R0,32H;(30H)=0CH
MOV32H,A;(32H)=0AH
MOVR0,#31H;R0=31H
MOVA,@R0;A=(31H)=0BH
3-3
(1)R0的内容传送到R1
MOVA,R0
MOVR1,A
(2)内部RAM20H单元的内容传送到A
MOVA,20H
(3)外部RAM30H单元的内容传送到R0
MOVR1,#30H
MOVXA,@R1
MOVR0,A
(4)外部RAM30H单元的内容传送到内部RAM20H单元
MOVR1,#30H
MOVXA,@R1
MOV20H,A
(5)外部RAM1000H单元的内容传送到内部RAM20H单元
MOVDPTR,#1000H
MOVXA,@DPTR
MOV20H,A
(6)程序存储器ROM2000H单元的内容传送到R1
MOVDPTR,#2000H
CLRA
MOVCA,@A+DPTR
MOVR1,A
(7)RAM2000H单元的内容传送到内部RAM20H单元
MOVDPTR,#2000H
MOVXA,@DPTR
MOV20H,A
(8)RAM2000H单元的内容传送到外部RAM30H单元
MOVDPTR,#2000H
MOVXA,@DPTR
MOVR0,#30H
MOVX@R0,A
(9)RAM2000H单元的内容传送到外部RAM1000H单元
MOVDPTR,#2000H
MOVXA,@DPTR
MOVDPTR,#1000H
MOVX@DPTR,A
3-4设内部RAM30H=5AH,5AH=40H,40H=00H,P1=7FH,下面程序执行后的结果如何?
MOVR0,#30H;R0=30H
MOVA,@R0;A=(30H)=5AH
MOVR1,A;R1=5AH
MOV@R1,P1;(5AH)=7FH
MOVA,P1;A=7FH
MOV40H,#20H;(40H)=20H
MOV30H,40H;(30H)=00H
3-5编程,将内部RAM20H-2FH共16个连续单元清零
ORG0100H
MOVR0,#20H
MOVR2,#16
LOOP:
MOV@R0,#00H
INCR0
DJNZR2,LOOP
END
3-6编程,求出内部RAM20H单元中的数据含“1”的个数,并将结果存入21H单元中。
ORG0100H
MOV21H,#0
MOVR2,#8
MOVA,20H
CLRC
LOOP:
RLCA
JCCOUNT
DJNZR2,LOOP
SJMPSTOP
COUNT:
INC21H
DJNZR2,LOOP
STOP:
SJMP$
END
3-7编程,找出内部RAM30H-50H单元中出现FFH的次数,并将结果存入51H单元中。
ORG0100H
MOV51H,#0
MOVR0,#30H
MOVR2,#20H
LOOP:
MOVA,@R0
CJNEA,#0FFH,AGAIN
INC51H
AGAIN:
INCR0
DJNZR2,LOOP
SJMP$
END
3-8编程,计算
,并将结果存入内部的30H单元
ORG0100H
MOV30H,#0
MOV31H,#0;i的初值
MOVR0,#30H
MOVR2,#11
MOVA,31H
LOOP:
INC31H
ADDA,@R0
MOV@R0,A
MOVA,31H
RLA
DJNZR2,LOOP
SJMP$
END
3-9已知片内RAM(30H)=38H,(38H)=40H,(40H)=48H,(48H)=90H.说明下列指令源操作数的寻址方式,及指令执行的结果
MOVA,40H;A=48H直接寻址
MOVR0,A;R0=48H寄存器寻址
MOVP1,#0F0H;P1=0F0H直接寻址
MOV@R0,30H;(48H)=38H寄存器间接寻址
MOVDPTR,#3848H;DPTR=3848H直接寻址
MOV40H,38H;(40H)=(38H)=40H直接寻址
MOVR0,30H;R0=(30H)=38H寄存器寻址
MOVP0,R0;P0=38H直接寻址
MOV18H,#30H;(18H)=30H直接寻址
MOVA,@R0;A=(38H)=40H直接寻址
MOVP2,P1;P2=0F0H直接寻址
3-10设R0=32H,A=48H,片内RAM(32H)=80H,(40H)=08H.求指令运行的结果
MOVA,@R0;A=(32H)=80H
MOV@R0,40H;(32H)=(40H)=08H
MOV40H,A;(40H)=80H
MOVR0,#35H;R0=35H
3-11设A=83H,R0=17H,片内RAM(17H)=34H,求指令运行的结果
ANLA,#17H;A=03H
ORLA,17H;(17H)=(37H
XRLA,@R0;A=37H
CPLA;A=C8H
3-12编程实现片内RAM20H-2FH与30H-3FH中数据的对换
ORG0100H
MOVR0,#20H
MOVR1,#40H
MOVR2,#0FH
LOOP:
MOVA,@R0
MOV@R1,A
INCR0
INCR1
DJNZR2,LOOP
MOVR0,#30H
MOVR1,#20H
MOVR2,#0FH
LOOP1:
MOVA,@R0
MOV@R1,A
INCR0
INCR1
DJNZR2,LOOP1
MOVR0,#30H
MOVR1,#40H
MOVR2,#0FH
LOOP1:
MOVA,@R1
MOV@R0,A
INCR0
INCR1
DJNZR2,LOOP1
SJMP$
END
3-13A=34H,(30H)=4FH,ADDA,30H执行后的结果
A=83H,PSW=41H
3-14SP=25H,PC=2345H,(24H)=12H,(25H)=34H,(26)=56H,执行RET后SP=?
PC=?
SP=23H,PC=3412H
3-15SP=25H,PC=2345H,标号LABEL所在的地址3456H,执行LCALLLABEL后SP=?
PC=?
堆栈中的数据有何变化?
SP=27H(26H)=48H(27H)=23HPC=3456H
第四章程序设计基础
4-1片内RAM30H单元开始存放着一组用补码表示的有符号数,数目存于20H单元。
编程统计出正数,0,负数的数目,分别存到21H,22H,23H单元。
ORG0100H
MOV21H,#0
MOV22H,#0
MOV23H,#0
MOVR0,#30H
LOOP:
MOVA,@R0
CJNEA,#0,PD
INC22H
SJMPDONE
PD:
JBACC.7,FU
INC21H
SJMPDONE
FU:
INC23H
DONE:
INCR0
DJNZ20H,LOOP
SJMP$
END
4-2片内RAM20H-2FH.凡是满足奇偶校验的数据(1的个数为偶数)的数转存到片外8000H开始的数据区
ORG0100H
MOVR0,#20H
MOVDPTR,#8000H
MOVR2,#0FH
LOOP:
MOVA,@R0
JBPSW.0,DONE
MOVX@DPTR,A
INCDPTR
DONE:
INCR0
DJNZR2,LOOP
SJMP$
END
4-3编程,把外部RAM1000H-10FFH的数据传送到2000H开始的区域
ORG0100H
MOVR3,#10H
MOVR4,#20H
MOVDPL,#00H
MOVR2,#0
LOOP:
MOVDPH,R3
MOVXA,@DPTR
MOVDPH,R4
MOVX@DPTR,A
INCDPL
DJNZR2,LOOP
SJMP$
END
4-4片内RAM30H单元开始存放着一组无符号数,其数目在21H单元中。
编程将其中最小的数存入21H
ORG0100H
MOVR0,#30H
MOVR2,21H
MOVA,30H
LOOP:
CJNEA,@R0,PD
SJMPDONE
PD:
JNCDONE
MOV22H,@R0
XCHA,22H
DONE:
INCR0
DJNZR2,LOOP
MOV21H,A
SJMP$
END
4-5编程实现片内RAM30H单元开始的16个数按顺序颠倒过来
ORG0100H
MOVR0,#30H
MOVR1,#40H
MOVR2,#0FH
LOOP:
MOVA,@R0
MOV@R1,A
INCR0
INCR1
DJNZR2,LOOP
MOVR2,#0FH
MOVR0,#40H
MOVR1,#3FH
LOOP1:
MOVA,@R0
MOV@R1,A
INCR0
DECR1
DJNZR2,LOOP1
SJMP$
END
4-6编程实现片内RAM30H单元开始的16个数,存有最小数值的所在单元的内容改为0FFH
ORG0100H
MOVR0,#30H
MOVR2,#16
MOVA,30H
MOV22H,#0;22H存放找到的16个数中的最小值
MOV23H,#0;存放最小数值的地址放到23H
LOOP:
CJNEA,@R0,PD
SJMPDONE
PD:
JNCDONE
MOV22H,@R0
MOV23H,R0
XCHA,22H
DONE:
INCR0
DJNZR2,LOOP
MOVR0,23H
MOV@R0,#0FFH
SJMP$
END
4-7编程实现P1.7=P1.6(P1.5
P1.4)
ORG0100H
MOVC,P1.5
ANLC,/P1.4
MOV20H,C
MOVC,P1.4
ANLC,/P1.5
ORLC,20H
ANLC,P1.6
MOVP1.7,C
END
4-8编程统计片内RAM30H单元开始的16个数,有多少数大于40,小于80,将结果存入40H单元中
ORG0100H
MOVR0,#30H
MOVR2,#16
MOV40H,#0
LOOP:
MOVA,@R0
CJNEA,#40,PD
SJMPDONE
PD:
JNCPD2
SJMPDONE
PD2:
CJNEA,#80,PD3
SJMPDONE
PD3:
JCCOUNT
SJMPDONE
COUNT:
INC40H
DONE:
INCR0
DJNZR2,LOOP
SJMP$
END
第六章中断系统
6-1定时器T0和T1各有几种工作方式?
请简述。
答:
四种。
工作方式
T0
T1
最大计数模值
初值加载方式
最大计数模值
初值加载方式
方式0
213
人工加载
213
人工加载
方式1
216
人工加载
216
人工加载
方式2
28
自动加载
28
自动加载(常用于串口通信波特率发生器)
方式3
28
TH0、TL0被分成两个相互独立的8位计数器;TL0既可做定时器也可做计数器;TH0可做内部定时器。
人工加载初值
8位计数,无中断产生,自动加载初值,用于不需要中断的场合
6-2已知单片机系统时钟频率fosc=12MHz,若要求定时值分别为0.1ms、1ms、10ms,定时器T0工作在方式0,方式1和方式3时,定时器对应的初值各为多少?
定时时间
工作方式0初值
工作方式1初值
工作方式2初值
工作方式3初值
0.1ms
FC1CH
FF9CH
9CH
9CH
1ms
E018H
FC18H
10ms
D8F0H
6-3定时器/计数器T0已预置为156,工作于方式2计数,现T0引脚上输入周期为1ms的脉冲,问:
(1)此时T0的实际用途是?
(2)在什么情况下,T0溢出?
答:
(1)计数器
(2)T0可记录100个外部脉冲,即从开始启动工作,经过100ms开始溢出。
6-4设系统时钟为6MHz,利用T0和P1.0产生连续矩形波,高电平宽度为50us,低电平宽度为300us。
解:
因为系统时钟为6MHz,则一个计数脉冲为2us,若T0工作于方式1,则P1.0输出高电平T0需记录25个脉冲,计数初值为216-25=FFE7H,,则P1.0输出低电平T0需记录150个脉冲,计数初值为216-150=FF6AH,编程如下
ORG0000H
LJMPMAIN
ORG000BH
LJMPT00
ORG0100H
MAIN:
MOVSP,#60H
MOVTMOD,#01H
MOVTH0,#0FFH
MOVTL0,#0E7H
SETBEA
SETBET0
SETBP1.0
SETBTR0
SJMP$
T00:
JNBP1.0,QF
MOVTH0,#FFH
MOVTL0,#0E7H
SJMPDONE
QF:
MOVTH0,#0FFH
MOVTL0,#6AH
DONE:
CPLP1.0
RETI
END
6-5利用定时器来测量单次正脉冲宽度,采用何种方式可获得最大量程?
设f0sc=6MHz,求允许测量的最大脉冲宽度是多少?
答:
定时器方式1,最大脉冲宽度为2us*216=131.072ms
6-6试编制一程序,其功能为:
当P1.2引脚的电平上跳时,对P1.1的输入脉冲进行计数;当P1.2引脚的电平下跳时,停止计数,并将计数值写入R6与R7。
解:
P1.1接P3.4引脚,利用T0做计数器,工作于方式1,初值为0(T0未工作于中断方式)
ORG0000H
LJMPMAIN
;ORG000BH
ORG0100H
MAIN:
MOVSP,#60H
MOVR6,#0
MOVR7,#0
MOVTMOD,#05H
MOVTH0,#0
MOVTL0,#0
LOOP:
JNBP1.2,LOOP
SETBTR0
LOOP1:
JBP1.2,LOOP1
CLRTR0
MOVR6,TH0
MOVR7,TL0
SJMP$
END
6-7试用中断技术设计一发光二极管LED闪烁电路,闪烁周期为2s,要求亮1s,再暗1s。
解:
设P1.0接1发光二极管,低电平点亮;利用定时器T0,工作于定时器方式2,设系统频率为fosc=12MHz,则一个定时脉冲为1us,每次中断定时250us,则需要4000个中断实现1s的定时
利用R6,R7做软件计数器,初值分别为40,100;定时初值28-250=06H
ORG0000H
LJMPMAIN
ORG000BH
LJMPT00
ORG0100H
MAIN:
MOVSP,#60H
MOVTMOD,#02H
MOVTH0,#06H
MOVTL0,#06H
MOVR6,#40
MOVR7,#100
CLRP1.0
SETBEA
SETBET0
SETBTR0
SJMP$
T00:
DJNZR6,DONE
MOVR6,#40
DJNZR7,DONE
MOVR7,#100
DONE:
CPLP1.0
RETI
END
6-8试用中断方法设计秒、分脉冲发生器,即由8031的P1.0每秒产生一个机器周期的正脉冲,由P1.1每分钟产生一个机器周期的正脉冲。
解:
设系统时钟频率为12MHz,则一个计数脉冲为1us,利用T0做定时器记录50ms,计数初值为216-50000=3CB0H,利用R6,R7为软件计数器,初值为20,60,分别实现1s和1分钟的定时
ORG0000H
LJMPMAIN
ORG000BH
LJMPT00
ORG0100H
MAIN:
MOVSP,#60H
MOVTMOD,#01H;T0定时器,工作方式1
MOVTH0,#3CH
MOVTL0,#0B0H;装入50ms的初始值
MOVR6,#20
MOVR7,#60
CLRP1.0;P1.0,P1.1均输出低电平
CLRP1.1
SETBEA
SETBET0
SETBTR0;中断允许,开始定时
SJMP$
T00:
DJNZR6,DONE;R6-1=0,定时1秒时间到
SETBP1.0;P1.0输出1us的高电平
CLRP1.0;P1.0继续输出低电平
MOVR6,#20
DJNZR7,DONE;R7-1=0,定时1分钟时间到
SETBP1.1;P1.1输出1us的高电平
CLRP1.1;P1.1继续输出低电平
MOVR7,#60
DONE:
MOVTH0,#3CH
MOVTL0,#0B0H
RETI
END
第七章串口工作方式0——关于I0接口的扩展
7-1利用74LS164并行输出8只发光二极管,将二极管从左至右点亮,时间间隔1S左右,并循环往复,画出电路原理图,编程实现。
(P109)
ORG0100H
MOVSCON,#00H
MOVA,#80H
LOOP:
MOVSBUF,A
ACALLDEL1S
RRA
SJMPLOOP
7-4利用MCS-51系列单片机的串行接口设计键盘输入电路(P111)
第九章模拟量输入输出接口技术
9-1在一个fosc为12MHz的8031单片机系统中,接有一片DAC0832,它的地址为7FFFH,输出电压为0-5V,请画出有关逻辑框图并编写程序,使其运行后能在示波器上显示锯齿波(设示波器X方向扫描频率为50us/格,Y方向扫描频率为1V/格)。
答:
ORG0000H
LJMPMAIN
ORG0100H
MAIN:
MOVSP,#60H
MOVDPTR,#7FFFH
LOOP:
MOVA,#00H
LOOP1:
MOVX@DPTR,A;2
INCA;1
CJNEA,#0,LOOP1;2
SJMPLOOP
END
输出波形为周期是255us,幅值为5V的锯齿波.
9-2在fosc=12MHz的系统中,接有ADC0809,地址为7FF8H-7FFFH,试画出逻辑框图并编写ADC0809的初始化程序和定时取样通道2的程序(假设取样频率为1ms一次,每次取样4个数据,存于8031单片机内部RAM70h-73h中)。
答:
P1.0连接0809的START端
ORG0000H
LJMPMAIN
ORG0100H
MAIN:
MOVSP,#60H
MOVDPTR,#7FFAH
MOV70H,#0
MOV71H,#0
MOV72H,#0
MOV73H,#0
MOVR2,#4
MOVR0,#70H
LOOP:
ACALLDEL_1ms
LOOP1:
SETBP1.0
NOP
NOP
NOP
CLRP1.0
MOVXA,@DPTR
MOV@R0,A
ACALLDEL_100us
INCR0
DJNZR2,LOOP1
MOVR0,#70H
MOVR2,#4
SJMPLOOP
DEL_1ms:
MOVR7,#5;1
DEL2:
MOVR6,#100;1
DEL1:
DJNZR6,DEL1;2
DJNZR7,DEL2;2
RET
DEL_100us:
MOVR5,#5;1
DEL21:
MOVR4,#10;1
DEL11:
DJNZR4,DEL11;2
DJNZR5,DEL21;2
RET
END
9-3DAC0832与8031单片机连接时有哪些控制信号?
其作用是什么?
P201
答:
。
两个引脚,使数据线上的数据送入输入寄存器;当CPU发出控制信号
时,把输入寄存器中的数据送给DAC寄存器,并随即由D/A转换器进行转换,变成模拟信号输出。
9-4已知DAC0832的地址为7FFFH,输出电压为0-5V,编写产生矩形波的转换程序,其波形占空比为1:
4,高电平电压为2.5V,低电平电压为1.25V。
答:
ORG0000H
LJMPMAIN
ORG0100H
MAIN:
MOVSP,#60H
MOVDPTR,#7FFFH
MOVR2,#3
LOOP:
MOVA,#7FH
MOVX@DPTR,A;2
ACALLDEL
MOVA,#40H
MOVX@DPTR,A
DELL:
ACALLDEL
DJNZR2,DELL
MOVR2,#3
SJMPLOOP
DEL:
MOVR7,#10;若主频为12MHz,则波形周期为400us
DEL2:
MOVR6,#20
DEL1:
DJNZR6,DEL1
DJNZR7,DEL2
RET
END
9-5已知ADC0809的地址为7FF8H-7FFFH。
编写每隔100ms轮流采集一次8个通道数据的程序,共取样10次,其取样值存入片外RAM从3000H开始的存储单元中(设fosc=6MHz)
答:
P1.0连接0809的START端,
ORG0000H
LJMPMAIN
ORG0003H
LJMPZD0
ORG0100H
MAIN:
MOVSP,#60H
MOVR7,#7FH
MOVR6,#0F8H;放08090路地址
MOVR4,#00H
MOVR5,#30H;将采集的数据放到片外RAM3000H开始的地址
MOVR2,#8;记录8路
MOVR3,#10;记录10次
MOV20H,#10;记录延时
LOOP:
ACALLDEL_100ms
DJNZ20H,LOOP
MOV20H,#10
LOOP1:
MOVDPH,R7
MOVDPL,R6