-
单片机原理、接口及应用——嵌入式系统技术基础
习题解答
预备篇
计算机的基础知识
0.1
40H,62H,50H,64H,7DH ,FFH
0.2
812 ,104,
213, 256, 2936, 941
0.3
十进制数
原码
补码
十进制数
原码
补码
28
1CH
1CH
250
FAH
FAH
-28
9CH
E4H
-347
815BH
FEA5H
100
64H
64H
928
03A0H
03A0H
-130
8082
FF7EH
-928
83A0H
FC60H
H
0.4
机器数真值分别为
:
27,233,
-
128,
-
8,14717,31467,
-
2
7824,
-
12478
0.5
(1) 33H+5AH
=
8DH,
OV=1, CY=0
。
(2)
-29H-5DH
=
7AH, OV=0,
CY=1
。
(3)
65H-3EH
=
27H, OV=0,
CY=1
。
(4)
4CH-68H
=
E4H, OV=0,
CY=0
。
0.6
十进制数
压缩
BCD
数
非
压
缩
BCD
ASCII
码
数
38
38H
0308H
3338H
255
255H
020505H
323535H
483
483H
040803H
343833H
764
764H
070604H
373634H
1000
1000H
01000000H
31303030
H
1025
1025H
01000205H
31303235
H
0.7
ASCII
码表示的十六进制数分别为
: 105H,
7CAH, 2000H,8A50H
基础篇
第
1
章、
MC
S-51
单片机结构
1.1
单片微型计算机
(
< br>即单片机
)
是包含
CPU
、
存储器和
I/O
接
口的大规模集成芯片
,
即它本身包含了除外部设备以外构成微机
系统的各个部分
,
只需接外设即可构成
独立的微机应用系统。微机处理器仅为
CPU,CPU
是构不成
独立的微机系统的。
1.2
p>
参见教材
1.1.1
节
1
1.3
参见教材第
6
页表格
1.4
参见教材表
1.4
1.5
参见教材表
1.1
< br>和表
1.2
1.6
当
PSW=10H
表明选中的为第二组通用寄器
R0~R7
的地址为
10H~17H
1.7
程序存储器和数据存储器尽
管地址相同
,
但在数据操作时
,
所使用的指令不
同
,
选通信号也不同
,
因此不会发生错误。
1.8
内部数据
程序
外部数据
程序
1.9
振荡周期
=0.1667
μ
s
机器周期
=2
μ
s
指令周期
=2~8
μ
s
1.10
A=0,PSW=0,SP=07,P0~P3=FFH
第
2
章、<
/p>
51
系列单片机的指令系统
2.1
参见教材
< br>2.1
节
2.2
因为
A
累加
器自带零标志
,
因此若判断某内部
RA
M
单元的内容是否为零
,
必须
将其内容送到
A,JZ
指令即可进行判断。
p>
2.3
当<
/p>
A=0
时
,
两条
指令的地址虽然相同
,
但操作码不同
,
MOVC
是寻址程序存储
器
,MOVX
是寻址外部数据存储器
,
送入
A
的是两个不同存储空间的内容。
2.4
目的操作数
源操作数
寄存器
直接
SP
间接寻址
直接
直接
直接
直接
立即
寄存器间址
直接
寄存器
变址
寄存器间址
寄存器
2.5
Cy=1, OV=0,
A=94H
2.6
√
×
√
×
×
×
√
√
×
√
×
×
×
×
×
√
×
×
×
×
×
×
2.7
A=25H
(50H)=0
(51H)=25H
(52H)=70H
2.8
SP=(61H)
(SP)=(24H)
SP=(62H)
(SP)=(10H)
SP=(61H)
DPL =(10H)
SP=(60H)
DPH=(24H)
2
执行结果
将
0
送外部数据存储器的
2410
p>
单元
2.9
程序运行后内部
RAM(20H)=B4H,A=90H
2.10
机器码
源程序
7401
LA:
MOV A,#01H
F590
LB:
MOV P1,A
23
RL
A
B40AFA
CJNE,#10,LB
80F6
SJMP LA
2.11
ANL
A,#0FH
SWAP
A
ANL
P1,#0FH
ORL
P1,A
SJMP $$
2.12
MOV
A,R0
XCH
A,R1
MOV
R0,A
SJMP
$$
2.13
(1)
利用乘法指令
MOV
B,#04H
MUL AB
SJMP $$
(2)
利用位移指令
RL
A
RL
A
MOV
20H,A
ANL
A,#03H
(3)
用加法指令完成
ADD
A,ACC
MOV
R0,A
;R0=2A
MOV
A,#0
ADDC
A,#0
MOV
B,A
;B<
/p>
存
2A
的进位
MOV
A,R0
ADD
A,ACC
2.14
XRL
40H,#3CH
SJMP
$$
2.15
MOV
A,20H
ADD
A,21H
DA
A
MOV
22H,A
;
存和低字节
MOV
A,#0
ADDC
A,#0
MOV
23H,A
;
存进位
SJMP
$$
2.16
MOV
A,R0
MOV
B,A
MOV
A,20H
ANL
A,#0FCH
SJMP
$$
MOV
R1,A
;R1=4A
MOV
A,B
ADDC
A,B
;
进位×
2
MOV
B,A
;
存积高位
MOV
A,R1
;
存积低位
SJMP
$$
3
JZ
ZE
MOV
R1,#0FFH
SJMP
$$
ZE:
MOV
R1,#0
SJMP
$$
2.17
MOV
A,50H
MOV
B,51H
MUL
AB
MOV
53H,B
MOV
52H,A
SJMP
$$
2.18
MOV
R7,#0AH
WOP:
XRL
P1,#03H
DJNZ
R7,WOP
SJMP
$$
2.19
单片机的移位指令只对
A,
且只有循环移位指令
,
为了使本单元的最高位移
进下一单元的最低位
,
必须用大循环移位指令移位
4
次。
ORG 0
MOV A,22H
CLR C
RLC
A
MOV A,20H
MOV 22H,A
RLC A
MOV A,#0
MOV 20H,A
RLC A
MOV A,21H
MOV 23H,A
RLC A
SJMP
$$
MOV 21H,A
第
3
章、<
/p>
MSC-51
单片机汇编语言程序设计
3.1
因为是多个单元操作
,
为方便修改地址使用间址操作。片外地址用
D
PTR
指示
,
只能用
< br>MOVX
指令取数到
A,
片内地
址用
R0
或
R1
指示
,
只能用
MOV
指令操作
,
因此循环操作外部数据存贮器
→
A
→
内部部数据存贮器。
ORG
0000H
INC
DPTR
MOV
DPTR,#1000H
INC
R0
MOV
R0,#20H
CJNE
R0,#71H,LOOP
LOOP:
M
OVX A,@DPTR
SJMP
$$
MOV @R0,A
3.2
要注意两高字节相加应加低字节相
加时产生的进位
,
同时要考虑最高位的进
位。
ORG
0
MOV
51H,A
MOV
A,R0
MOV
A,#0
ADD
A,R6
ADDC
A,ACC
MOV
50H,A
MOV
52H,A
MOV
A,R7
SJMP $$
ADDC
A,R1
4
3.3
A
中放小于
14H(20)
的数
,
平方表的一个数据占
2
个字节
,
可用
BCD
码或二进制
p>
数存放
.(
如
A<
/p>
中放的是
BCD
码
,
则要先化成二进制数再查表。
)
ORG
0
INC
A
MOV
DPTR,#TAB
MOVC
A,@A+DPTR
ADD
MOV
R6,A
A,ACC
;A*2
SJMP
$$
PUSH
ACC
TAB:
DB
00,00,00,01,00,04,
MOVC A,@A+DPTR
00,09,00,16H,
……
MOV
R7,A
DB
………
04H,00
POP
ACC
3.4
先用异或指令判两数是否同号
,
在同号中判大小
,
异号中正数为大<
/p>
.
ORG
0
BG:
MOV
22H,21H
MOV
A,20H
SJMP
$$
XRL
A,21H
CMP: MOV
A,20H
ANL
A,#80H
CJNE
A,21H,GR
JZ
CMP
GR:
JNC
AG
JB
20H.7,BG
MOV
22H,21H
AG: MOV
22H,20H
SJMP
$$
SJMP
$$
3.5
fosc=6MHZ
机器周期数
DELAY:
MOV
R1,#0F8H
1
LOOP:
MOV
R3,#0FAH
1
DJNZ
R3,$$
2
DJNZ
R1,LOOP
2
RET
2
(1+(1+2*0xFA+2)*0xF8+2)*12/6MHz
=
(1+(1+2*250+2)*248+2)*2us
=
249.494ms
3.6 <
/p>
将待转换的数分离出高半字节并移到低
4
位
加
30H;
再将待转换的数分离出低
半字节并
30H,
< br>安排好源地址和转换后数的地址指针
,
置好循环次数。<
/p>
ORG
0000H
MOV
A,@R0
MOV
R7,#05H
ANL
A, #0FH
MOV
R0,#20H
ADD
A,#30H
MOV
R1,#25H
MOV
@R1,A
NET: MOV
A,@R0
INC
R0
ANL
A,#0F0H
INC
R1
SWAP
A
DJNZ
R7,NE
ADD
A,#30H
SJMP
$$
MOV
@R1,A
END
INC
R1
3.7
片内
RAM
间址寄存器只能有
R0
和
R1
两个
,
而正数、负数和零共需
3
个寄存器
p>
指示地址
,
这时可用堆栈指针指示第三个地
址
,POP
和
PUSH
在指令可自动修改地址。
R0
指正数存放地址和
R1
指负数存放地址
,SP
指源数据存放的末地址
,POP
指令取
源数据
,
每取一个数地址减<
/p>
1
。
5
ORG
0000H
MOV
R7,#10H
MOV
A,#0
MOV
@R0,A
MOV
R4,A
INC
R0
MOV
R5,A
AJMP
DJ
MOV
R6,A
NE:
INC
R5
MOV
R0,#40H
MOV
@R1,A
MOV
R1,#50H
INC
R1
MOV
SP,#3FH
AJMP
DJ
NEXT:
POP
ACC
ZER0:
INC
R6
JZ
ZER0
DJ:
DJNZ
R7,NEXT
JB
ACC.7,NE
SJMP
$$
INC
R4
END
3.8
可直接用
P
标志判断
(JB
P ,ret)
ORG
0000H
MOV
A,40H
JB
P,EN
;
p>
奇数个
1
转移
ORL A,#80H
;
偶数个
1
最高位加
“1”
EN:
SJMP
$$
3.9
取补不同于求补码
,
求补码应区别正、负数分别处理
,
而取补不分正、负
,
因正、
负数均有相对于模的补数。
用取反加
1
求补也可用模
(00H)
减该数的方法求补。
ORG
0000H
MOV
R7,#03H
A
B:
I
NC
R0
MOV
R0,#DAT A
MOV
A,@R0
MOV
A,@R0
CPL
A
CPL
A
ADDC
A,#0
ADD
A,#01
DJNZ
R7,AB
MOV
@R0,A
SJMP
$$
3.10
16
个单字节累加应用
ADD
指令而不能用
ADDC
指令
,
和的低位存
A,
当和超过
一个字节
,
和的高字节存于
B,
并要加进低位相
加时产生的进位
,16
个单字节加完
后
,
采用右移
4
次进行除十六求平均值的运算
,
商在
B
UF2
单元
,
余数在
< br>BUF2-1
单元。
ORG 0000H
DJNZ R7,NEXT
MOV
R7,#0FH
;
以上完成求和
MOV
R0,#BUF1
MOV
B,#0
MOV
R6,#04H
MOV
A,@R0
MOV
BUF2,A
MOV
R2,A
MOV
BUF2-1,#0
NEXT:
MOV
A,R2
NEX:
CLR
C
I
NC
R0
MOV
A,B
A
DD
A,@R0
RRC
A
M
OV
R2,A
MOV
B,A
M
OV
A,B
MOV
A,BUF2
A
DDC
A,#0
RRC
A
MOV
B,A
MOV
BUF2,A
6
MOV
A,BUF2-1
SJMP
$$
RRC
A
;
以上完成除十六运算
MOV
BUF2-1,A
DJNZ
R6,NEX
3.11
将
20H
< br>单元的内容分解为高
4
位和低
4
位
,
根据是否大于
9
分别作加
37H
和
30H
处理。
ORG
0000H
MOV
21H,A
MOV
A,20H
SJMP
$$
ANL
A,#0F0H
ASCII:
CJNE
A,#0AH,NE
SWAP
A
NE:
JC
A30
ACALL
ASCII
ADD
A,#37H
MOV
22H,A
RET
MOV
A,20H
A30:
ADD
A,30H
ANL
A,#0FH
RET
ACALL
ASCII
3.12
要注意
,
位的逻辑运算其中一个操作数必须在
C
。
ORG
0000H
CPL
C
MOV
C,20H
ANL
C,53H
ANL
C,2FH
MOV
P1.0,C
CPL
C
SJMP
$$
ORL
C,/2FH
END
3.13
ORG
0000H
MOV
C,ACC.3
ANL
C,P1.4
ANL
C,/ACC.5
MOV
20H,C
MOV
C,B.4
CPL
C
ANL
C,/P1.5
ORL
C,20H
MOV
P1.2,C
SJMP
$$
END
7
3.14
设一字节乘数存放在
R1,
三字节的被乘数存放在
data
开始的
内部
RAM
单元
,
且低字节存放在低位地址单元
,R0
作为被乘数和积的地址
指针
,
用
MUL
指令
完成一字节乘一字节
,
每一次部
分积的低位加上一次部分积的高位
,
其和的进
< br>位加在本次部分积的高位上
,
并暂存
,
三字节乘一字节共需这样三次乘、加、
存操作
,
以
R7
作循环三次的计
数寄存器。
ORG
0000H
MOV
R7,#03H
MOV
A,#0
MOV
R0,#data
ADDC
A,B
MOV
R2,#0
MOV
R2,A
NEXT:
MOV
A,@R0
INC
R0
MOV
B,R1
DJNZ
R7,NEXT
MUL
AB
MOV
@R0,B
ADD
A,R2
SJMP
$$
MOV
@R0,A
END
第
4
章、并
行接口
P0-P3
和单片机的中断系统
4.1
~
4.3
参考教材
4
.1
节
4.4
用
P1.7
监测按键开关
,
P1.0
引脚输出正脉冲
,
< br>正脉冲的产生只需要将
P1.0
置
零、置
1
、延时、再置零即可。
P1
.0
接一示波器可观察波形。如果再接一发光二
极管
,
可观察到发光二极管的闪烁。电
路设计可参考图
4.4
汇编语言程序
ORG
0000H
ABC
:
CLR
P1.0
SETB
P1.7
JB
P1.7,$$
;
未按键等待
J
NB
P1.7,$$
;
键未弹
起等
待
SETB
P1.0
MOV
R2,#0
DAY:
NOP
NOP
DJNZ
R2,DAY
图
4.4
SJMP
ABC
4.5
电路见图
4.5
,
< br>初始值送
0FH
到
P1,
p>
再和
0FFH
异或从
P1
口输出
,
或使用
SWAP A
指令
,
然后从<
/p>
P1
口输出
,
循
环运行
,
要注意输出后要延时。
汇编语言程序
ORG 0000H
MOV
A
,
#0FH
ABC
:
MOV P1
,
A
ACALL D05
SWAP A
8
SJMP ABC
D05
:
MOV
R6
,
250
DY
:
M
OV
R7
,
250
DAY: NOP
图
4.5
NOP
DJNZ R7,DAY
DJNZ R6,DY
RET
END
4.6
如使用共阴极数码管
,
阴极接地
,
阳极
a~
g
分别接
P0
~
P3
的某个口的
7
位
,
将
0
~
F
的段码列成表
,
表的内容顺次从
该口输出。如数码管接
P3
口。
汇编语言程序
ORG 0000H
NOP
MOV
DPTR
,
#TAB
DJNZ R7,DAY
AGAIN:
MOV
R0
,
#0
INC R0
NEXT: MOV
A
,
R0
CJNE R0,#10H,NEXT
MOVC
A
,
@A+DPTR
SJMP
AGAIN
MOV P3,A
TAB:
DB
3FH,06H…
;
段码
MOV R7,#0
表
(
略
)
DAY:
NOP
END
4
.7
电路设计见图
4.7
,
编程如下
:
ORG
0000H
MOV
A
,
#08H
MOV
DPTR
,
#TAB
MOVC
A
,
@A+DPTR
MOV
P1,A
MOV
R2,#08H
AGAIN:
MOV
A,#01
NEXT:
MOV
P3,A
ACALL
DAY
RL
A
CJNE
A,#10H,NEXT
DJNZ
R2,AGAIN
SJMP
$$
TAB:
DB
3FH,06H·
·
·
图
4.7
END
4.8 P1
口的八根线接行
线
,
输出行扫描信
号
< br>,
P3
口的八根线接列线
,<
/p>
输入回馈信
号
。
9
见图
4.8
。
4.9
~
4.12
参见
4.2
节
4.13
电路设计见图
4.13
汇编语言程序
ORG 0000H
AJMP
MAIN
ORG
0003H
RL
A
;
中断服务
MOV
P1,A
RETI
图
4.8
MAIN:
MOV
A,#0FEH
MOV
P1,A
;
第一灯亮
SETB
EA
SETB
EX0
SETB
IT0
SJMP
$$
汇编语言中只有一个中断源
,
不存在占用别
的中断源向量地址问题
,
程序顺序排下
,
应
注意程序的执行过程。
C
语言无循环移位指
令移位后
,
后面补零
,
因此和
01
相或。
4.14
略
4.15
图
4.13
ORG
0000H
MAIN:
SETB
EA
AJMP
MAIN
SETB
EX0
ORG
0003H
;
中断服务
SETB
IT0
XRL
P1,#0FFH
MOV P1,#0FFH
DJNZ
R0,NE
MOV
R0,#0AH
CLR
EA
SJMP
$$
;
等待中断
NE: RETI
ORG
0030H
因一亮一灭为一次
p>
,
所以共十次。
4.16
两个数码管阳极经驱动器接
P1
口
,
阴极分别接
P3.0
、
P3.1
。
aa EQU
08H
;
存储高四位的段
CLR
A
码
MOVC
A,@A+DPTR
bb EQU 09H
;
存
储
第
四
位
MOV
aa,A
的段码
MOV
bb,A
i EQU 0AH
;
存储计数值
;a=b=Tab[0]
Tab:
DB
3FH,06H
……
;
段码
CLR
P3.0
表略
CLR
P3.1
ORG
0000H
SETB
EA
AJMP
MAIN
SETB
EX0
ORG
0013H
SETB
IT0
;
开中断
AJMP
INTR
LOOP:
SETB
P3.0
MAIN:
MOV
DPTR,#Tab
CLR
P3.1
10
MOV
P1,bb
;
显
示
低
MOVC
A,@A+DPTR
位
MOV
bb,A
;
查表
b=Tab[i
ACALL
Delay
延时
的低位
]
CLR
P3.0
MOV
A,i
SETB
P3.1
ANL
A,#0F0H
MOV
P1,aa
;
显
示
p>
高
SWAP
A
;
取<
/p>
i
的高位
位
MOVC
A,@A+DPTR
ACALL
Delay
;
延时
MOV
aa,A
;
查表
a=Tab[i
的高<
/p>
SJMP
LOOP
位
]
INTR:
CLR
EX0
SETB
EX0
INC
i
;i
加一
RETI
MOV
A,i
Delay:
;
略
ANL
A,#0FH
;
< br>取
i
的低
END
位
MOV
DPTR,#Tab
4.17
提示
:
将
X
1
p>
至
X
3
分别接至一
个三输入或非门的三个输入端,同时还分别
接至单片机的三个
I
O
口,或非门的输出端接至单片机的外部中断引脚。中断服
务程
序中检查三个
IO
口的值,便可知道具体的故障源。程序略。<
/p>
第五章、
单片机的定时
/
计数器与串行接口
5.1
~
5.3
请参考教材
5.4
方式
0:
16.38ms
方式
1:
131ms
方式
2:
512μs
5.5
使用方式
2
计数初值
C=100H-0AH=F6H
查询方式
:
ORG
0000H
ABC:
JNB
TF0,$$
MOV
TMOD,#06H
CLR
TF0
MOV
TH0,#0F6H
CPL
P1.0
MOV
TL0,#0F6H
SJMP
ABC
SETB
TR0
中断方式
:
ORG
0000H
MOV
TH0, #0F6H
AJMP
MAIN
SETB
EA
ORG
0000BH
SETB
ET0
CPL
P1.0
SETB
TR0
RETI
SJMP
$$
;
等待中断
MAIN: MOV
TMOD,#06H
5.6
10
00HZ
的周期为
1ms,
即要求每<
/p>
500μsP
1.0
变反一次
,
使用方式
T1
方式
p>
1,MC=12
/
fosc=1
μs
,
p>
C=2
16
-500
μs
/1
μs
=
FE0CH,
除
TMOD=10H
,<
/p>
TH0=FEH
,
TL0=0CH
外
,
程序与
5.5
题相同
,
注意
每次要重置
TH0
和
TL0
5.7
f=6MHz
MC=2μs
方式
2
的最大定时为
512μs
合乎题目的要求。
50μs
时,
计数初值为
C1=256-25=E7H
,<
/p>
350μs
时计数初值为
C2=256-
175=51H
汇编语言程序
11
-
-
-
-
-
-
-
-
-
上一篇:换填垫层法定义
下一篇:【最新】房产中介股东合作协议书