完整版单片机答案汇编Word格式.docx
《完整版单片机答案汇编Word格式.docx》由会员分享,可在线阅读,更多相关《完整版单片机答案汇编Word格式.docx(24页珍藏版)》请在冰点文库上搜索。
其它位保持不变;
RAM的60H单元中;
清除累加器高4位。
6)
试编写一段程序,将内部数据存储器
MOVA,30H
MOVDPTR,#1000H
MOV@DPTR,A
MOVA,31H
3-9试编写一段程序,将外部数据存储器答:
3-8
单元中。
30H、3lH单元内容传送到外部数据存储器
40H单元中的内容传送到OIOOH单元中。
1000H、1001H
3-1O
MOVDPTR,#0040H
MOVA,@DPTR
MOV0100H,A试编写一段程序,将R3中的数乘4
MOVA,R3
MOV23H,#02H
用移位指令)。
L0:
DJNZ23H,L1
L1:
RLA
SJMPL0
3-11试编写一段程序,将R2中的各位倒序排列后送入R3中。
答:
MOVA,R2
MOV23H,#08H
SJMPL0MOVR3,A
3-
MOVA,P1
ORLA,#F8H
MOVP1,A
编写程序,将片内30H~39H单元中的内容送到以2000H为首的外部存储器。
ORG0000H
12试编写一段程序,将P1口的高5位置位,低3位不变。
4-4
START:
MOVR0,#30H
MOVDPTR,#2000H
MOVR1,#10
CLRA
LOOP:
MOVA,@R0
DECR1
DJNZR1,LOOP
END
4-
8次采样值依次放在20H~27H的连续单元
5编写程序,采用算术平均值滤波法求采样平均值,设中,结果保留在A中。
FILT:
CLRA
MOVR2,A
MOVR3,A
MOVR0,#20H
MOVR7,#08H
初始化
FILT1:
MOVA,@R0ADDA,R3
ADDCA,R2
INCR0DJNZR7,FILT1
;
累加采样值到R3,累加进位到R2=00000xxxB
FILT2:
SWAPA
RLA;
R2/8,节省一个指令周期
XCHA,R3
SWAPA
R3/8,节省一个指令周期ADDA,#80H;
四舍五入ANLA,#1FH;
屏蔽移位进入的前三位ADDCA,R3;
结果相加END
取平均值
4-6编写程序,将存放在内部RAM起始地址为20H和30H的两个3字节无符号相减,结果存放在内部RAM单元70H、71H、72H中(低位对应低字节)。
MOVR0,#20H
MOVR1,#30H
MOVR2,#03H
CLRC
S0:
LCALLXU
MOV70H,A
LCALLXU
S1:
SUBBA,@R1
INCR0
INCR1
RET
4-7编写程序,实现两个双字节无符号数的乘法运算,乘数存放在R2和R3中(R2存放高字节,R3
存放低字节,以下类同),被乘数存放在R6和R7中,积存放在R4、R5、R6和R7中。
DMUL:
MOVA,R3
MOVB,R7
MULAB
MOVR0,A
MOVR1,B
低8位*低8位
MOVA,R2
ADDA,R1
MOVR1,A
MOVA,B
ADDCA,#00H
MOVR5,A
高8位*低8位
MOVB,R6
MOVA,R5
ADDCA,B
MOVA,#00H
MOVR4,A
低8位*高8位
ADDA,R5
MOVA,R4
高8位*高8位
MOVA,R0
MOVR7,A
MOVA,R1
MOVR6,A;
R0、R1给R7、R6
4-8假设在RO指向的片内RAM区,存有20个16进制数的ASCII字串。
将ASCII码转换为16进制数,然后两两合成一个字节,从低地址单元到高地址单元依次组合。
MOVR7,#20
MOVA,R0
MOVR1,A;
R1为中间量
MOVA,@R0
SUBBA,#30H
MOV@R1,A
JCS01
SUBBA,#07H
S01:
INCR0
ORLA,@R1
JCS02
ORA,@R1
S02:
DJNZR7,S0
4-9结合例4-24和图4-5编写线性标度变换程序。
将256近似255,256比255做浮点运算简单很多
PUSHACC
PUSHPSW
MOVA,#Am
MOV20H,#A0
SUBBA,20H;
将256近似255,则A为小数点后的位
MOV21H,#Nx
MOVB,21H
MULAB;
B为整数位,A为小数点后的位
ADDA,#80H;
四舍五入
ADDCA,#A0
MOV38H,A
POPPSW
5-
1000H、1001H
4试编写一段程序,将内部数据存储器30H、3IH单元内容传送到外部数据存储器
单元中去。
答:
#include<
reg52.h>
absacc.h>
voidmain(void){unsignedinttemp;
temp=DWORD[0x0030];
XWORD[0x1000]=temp;
while
(1);
}
5-5试编写一段程序,将外部数据存储器40H单元中的内容传送到50H单元。
方法一:
#include<
voidmain(void)
{
XBYTE[0x0050]=XBYTE[0x0040];
}方法二:
voidmain(void)
{unsignedcharxdata*xp;
unsignedchardatatemp;
xp=0x0040;
temp=*xp;
xp=0x0050;
*xp=temp;
5-6试编写一段程序,将R3中的数乘以4。
voidmain(void){unsignedintdata*a;
#pragmaasm
MOV30H,R3
#pragmaendasma=0x30;
*a=*a*4;
while
(1);
5-7试编写一段程序,将R2中的各位倒序排列后送入R3中。
考虑C中没有循环移位,对于这种很低级的运算,采用嵌入汇编的方式完成。
#pragmaasm
MOVR3,#00H
DEL:
CLRCY
RLCA
RRCA
DJNZR7,DEL
#pragmaendasmwhile
(1);
5-8试编写一段程序,将P1口的高5位置位,低3位不变。
P1|=0xf8;
5-9设8次采样值依次存放在20H~27H的连续单元中,采用算术平均值滤波法求采样平均值,结果保留在30H单元中。
试编写程序。
#pragmasmall
unsignedchar*dp=0x20,i;
floattemp=0;
for(i=0;
i<
8;
i++)
temp+=*dp;
dp++;
temp/=8;
dp=0x30;
*dp=temp;
5-10从20H单元开始有一无符号数据块,其长度在20H单元中。
编写程序找出数据块中最小值,并
存入21H单元。
unsignedchar*dp,num,min,i;
dp=0x20;
num=*dp;
for(i=1;
num;
{min=*dp;
if(min>
*dp)
min=*dp;
dp=0x21;
*dp=min;
6-
1、2、3,当某一中断源变低电平时便要求CPU处理,它们的优先处
处理程序的入口地址分别为2000H、2100H、2200H。
试编写主程序及
入口即可)。
可利用MCS-51的2个外中断源INTO和INTI,再将定时/计数器T1作为
10某系统有三个外部中断源
理次序由高到低为3、2、1,中断服务程序(转至相应的答:
对系统的三个外中断源,扩展的外部中断使用,INTO接外中断源3,INTI接外中断源2,定时/计数器T1接外中断源1,3个中
断源设置为同级中断,外中断源1、2、3依次接到P1.0、P1.1、P1.2上。
汇编语言程序代码如下:
ORGOOOOH;
复位入口地址
AJMPMAIN;
转主程序
ORGOOO3HAJMPINT1
ORGO1OOH
MAIN:
MOVTMOD,#6OH;
T1方式2
MOVTH1,#OFFH
MOVTL1,#OFFH;
置初值
SETBTR1;
启动计数器T1SETBEA;
CPU中断开放
SETBET1;
允许T1中断
SETBIT0;
允许外中断0产生中断
SETBIT1
SETBPX0;
外中断0为高级中断
SETBPX1
SETBPT1
外中断0为跳沿触发方式
LOOP1:
SJMPLOOP1;
等待中断;
中断服务程序
ORG1000HINT1:
PUSHPSW;
保护现场
1有请求
2有请求
3有请求
JBP1.0,IR1;
P1.0高,外中断
JBP1.1,IR2;
P1.1高,外中断
JBP1.2,IR3;
P1.2高,外中断INTIR:
POPACC;
恢复现场
RETI;
中断返回
ORG2000H
IR1:
……外;
中断1的中断处理程序
AJMPINTIRORG2100HIR2:
中断2的中断处理程序
AJMPINTIR
ORG2200H
IR3:
中断3的中断处理程序
AJMPINTIREND
7-5采用定时/计数器TO对外部脉冲进行计数,每计数100个脉冲后,TO转为定时工作方式。
定时1ms
后,又转为计数方式,如此循环不止。
假定MCS-51单片机的晶体振荡器频率为6MHz,请使用方式
1实现,要求编写出程序。
ORG0000HSTART:
CLRTR0
MOVTMOD,#05H
MOVTH0,#0FFH
MOVTL0,#9CH
计数器初始化
JBCTF0,NEXT
SJMPS0
NEXT:
MOVTMOD,#01H
MOVTH0,#0F8H
MOVTL0,#30H;
定时器初始化SETBTR0
JBCTF0,START
SJMPS1
7-7编写程序,要求使用TO,采用方式2定时,在P1.0输出周期为40011,占空比为10:
1的矩形脉冲。
本题采用晶体振荡器频率为12MHz,使用定时器配合计数器,设计成一个401定时将P1.0置0
和一个4001定时将P1.0置1。
ORG0000H;
中断入口地址
AJMPSTART
ORG000BH;
定时器0的中断向量地址
AJMPTIME0
ORG0030H
MOVSP,#5FH
MOV30H,#00H;
软件计数器清零
MOVTMOD,#02H;
T0工作在方式1
MOVTH0,#216
MOVTL0,#216
SETBEA
SETBET0
SETBTR0
任意程序段
TIME0:
PUSHACC;
中断处理子程序
CLRP1.0
INC30H
MOVA,30H
CJNEA,#10,T0_4
SETBP1.0
MOV30H,#00H
T0_4:
POPPSW
POPACC
RETI
7-9利用定时/计数器T0产生定时时钟,由P1口控制8个指示灯。
编一个程序,使8个指示灯依次一个一个闪动,闪动频率为20次/秒(8个灯依次亮一遍为一个周期)。
本题采用晶体振荡器频率为12MHz,每个灯的闪烁周期是:
50ms,采用工作方式1。
ORG0000H
ORG000BH
MOVR7,#0FEH
MOVTMOD,#01H;
T0在工作方式1
MOVTH0,#3CH
MOVTL0,#0B0H
AJMPS0;
此处放任意程序段
PUSHACC
MOVP1,R7
MOVA,R7
RLA
MOVTL0,#0B0HPOPPSW
7-11编写一段程序,功能要求为:
当P1.0引脚的电平正跳变时,对P1.1的输入脉冲进行计数;
当P1.2
引脚的电平负跳变时,停止计数,并将计数值写入R0、R1(高位存R1,低位存R0)。
将P1.1的输入脉冲接入TO,即使用TO计数器完成对P1.1口的脉冲计数。
R2中记TO计满数的次数。
程序代码如下:
ORGOOOOH
LJMPMAIN
ORGOOOBH
LJMPITO
JNBP1.O,MAIN
MOVTMOD,#05H;
定时/计数器TO为计数方式1
SETBTR0;
启动TO,开始计数
SETBETO;
允许TO中断
SETBEA;
CPU开中断
WAIT:
JBP1.2,WAIT
CLREA
CLRTRO
MOVR1,THO
MOVRO,TLOAJMP$ITO:
INCR2
7-18为什么定时/计数器T1用做串行口波特率发生器时,应采用方式2?
若已知时钟频率、通信波特
率,如何计算其初值?
因为方式2是有自动重装载计数值的功能,从而可以产生精确的波特率。
串行工作方式0和方式2
波特率是固定的,所以不用设初值;
串行工作方式1和方式3时:
SMOD
波特率:
BR=(2xrd)/32
溢出一次的时间:
1/Td=(256-TH1)*12/fosc
溢出率:
Td=fosc/[12(256-TH1)]
初值:
TH1=256-f/(12*T)
oscd
7-19若晶体振荡器为11.059MHz,串行口工作于方式1,波特率为4800b/s,写出用T1作为波特率发生器的方式控制字和计数初值。
MOVTMOD,#2OH
MOVTH1,#OFAH
MOVTL1,#0FAH
SETBTR1
MOVSCON,#50H
7-20利用单片机串行口扩展24个发光二极管和8个按键,要求画出电路图并编写程序使24个发光二
1s)。
极管按照不同的顺序发光(发光的时间间隔为答:
ORG1000H
MOVSCON,#00H;
串行口工作方式0
MOVR0,#00H
MOVR7,#03H
MOVR6,#24H
CLRP1.0;
关闭并行输出
MOVDPTR,#TAB;
查表取数,送出
MOVCA,@A+DPTR
MOVSBUF,A
OUT0:
JNBTI,OUT0
CLRTI
DJNZR7,LOOP
SETBP1.0;
开启并行输出
ACALLDELAY
DJNZR6,START
AJMPLOOP
DELAY:
MOVR2,#250
D1:
MOVR3,#100
D2:
MOVR4,#20
D3:
DJNZR4,D3
DJNZR3,D2
DJNZR2,D1
TAB:
DB00000000B,00000000B,00000001B,00000000B
DB00000000B,00000010B,00000000B,00000000B
DB00000100B,00000000B,00000000B,00001000B
DB00000000B,00000000B,00010000B,00000000B
DB00000000B,00100000B,00000000B,00000000B
DB01000000B,00000000B,00000000B,10000000B
DB00000000B,00000001B,00000000B,00000000B
DB00000010B,00000000B,00000000B,00000100B
DB00000000B,00000000B,00001000B,00000000B
DB00000000B,00010000B,00000000B,00000000B
DB00100000B,00000000B,00000000B,01000000B
DB00000000B,00000000B,10000000B,00000000B
DB00000001B,00000000B,00000000B,00000010B
DB00000000B,00000000B,00000100B,00000000B
DB00000000B,00001000B,00000000B,00000000B
DB00010000B,00000000B,00000000B,00100000B
DB00000000B,00000000B,01000000B,00000000B
DB00000000B,10000000B,00000000B,00000000B
11-4试设计一个顺序开关灯控制器,要求当按钮K第一次按下时,灯A立刻亮,灯B在延时11秒钟后亮,在灯B亮后15秒,灯C亮;
当按钮K第2次按下时,灯C立刻灭,延时17秒后灯B灭,灯B灭后12秒,灯A灭。
#include<
#defineuintunsignedint
unsignedcharsum=0;
灯*/灯*/灯*/
voiddelay(char);
sbitasight=PIP;
/*A
sbitbsight=PIX;
/*B
sbitcsight=卩1人2;
/*Cvoidkey