单片机教程之第5章 作业
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
解:首先理解压缩BCD码的含义,比如54H表示十进制54, 转换成ASCII码则分别为35H和34H,放到相邻的两个单元中。 假设200H中存放54H,则最后要将34H放到205H,35H放到 206H。
程序分两步,先将压缩BCD码转换为ASCII码存放在片内30H 开始的单元;然后在将片内30H开始的10个数据送到片外205H开 始的单元。
22.求一个16位二进制数的补码,设此16位二进制数放在R1、R0 中,求补后存入R3、R2中。 解:首先理解16位二进制数补码的含义,如果最高位是0,则 补码是其本身;如果最高位是1,则符号位不变,其余数取反 再加1,还要考虑后8位加1后可能向高8位进位的情况。 MAIN: MOV A,R1 JNB ACC.7,RET1;最高位是0则直接将数送到R3、R2 MOV A , R0;取出低位 CPL A;低位字节取反 ADD A,#1;加1 ;将补码送到R3、R2 MOV R0,A;送回到R0 RET1:MOV A,R1 MOV A,R1;取出高位 MOV R3,A CPL A;高位字节取反 MOV A,R0 ADDC A,#0;加低位的进位Cy MOV R2,A SETB ACC.7;设置最高位 SJMP $ MOV R1,A;送到R1
正解: ORG 0000H MOV R2,#03H;除以8 LJMP MAIN ;相当于右移3位 ORG 0100H LP3: MOV A,R3;高位 MAIN:MOV R3,#00H;和的高位 RRC A;带Cy右移 MOV R4,#00H;和的低位 MOV R3,A;保存高位 MOV R2,#08H;8个数 MOV A,R4;低位 MOV R0,#50H;起始地址 RRC A;带Cy右移 LP2: MOV A,@R0;取出新值 ;R3的最后位会移过来 ADD A,R4;和上次结果加 MOV R4,A;保存低位 JNC LP1;如果没进位继续 DJNZ R2,LP3;结束否 INC R3;如果有进位高位加1 MOV 5AH,R4;保存 SJMP $ LP1: MOV R4,A;保存结果第位 END DJNZ R2,LP2;看是否结束
7.请将片外数据存储器地址为 1000H~1030H的数据块,全部 搬迁到片内30H~60H中,并将 原数据块区域全部清零。
MAIN:MOV DPTR,#1000H;片外RAM首地址 MOV R0,#30H;片内RAM首地址 MOV R2,#31H;数据个数 LP: MOVX A,@DPTR;读取片外RAM MOV @R0,A;向片内RAM写数据 CLR A MOVX @DPTR,A;向外RAM写0 INC DPTR;下一个 INC R0 DJNZ R2,LP;判断是否结束 SJMP $
18.在片内30H和31H单元各有一个小于10的数,试编程求这2个数 的平方和,调用子程序的方法实现,结果存在40H单元。 解: (例5-19) ORG 0000H LJMP MAIN ORG 0100H MAIN:MOV SP,#60H;设置栈底地址 MOV A,30H;取数据1到A LCALL SUB1;调用子程序 MOV R2,A;保存第一个数的平方到R2 MOV A,31H;取数据2到A LCALL SUB1;调用子程序 ADD A,R2;将结果和上一个数的平方相加 SJMP $ SUB1:MOV B,A MUL AB;相乘相当于取平方,结果在A中 RET END
22.将累加器A中00H~FFH范围的二进制数转换为BCD码。 (参照课本例5-22)
BCD : MOV B,#100 DIV AB;A÷B结果整数再A中,余数在B中 MOV R0,A;百位放在R0中 MOV A,#10 XCH A,B;A B中数据相互交换,A中为余数 DIV AB;除以100后的余数再除以10 MOV R1, A; 保存十位数 MOV R2, B;保存个位数 RET
问题: 1.子程序要加名称 2.查找到后要返回 3.没找到要将两个单元 放入特定数据。 4.数据表放在ROM中
答案2: MOV DPTR,#0FFFH MOV R0,#65H LCALL SCAN MOV R1,DPH MOV R2,DPL MOV DPTR,#10A0H MOV A,R1 MOVX @DPTR,A INC DPTR MOV A,R2 MOVX @DPTR,A SJMP $
2. 编写计算下列算式的程序。 (3)1234H+8347H 解:计算结果高位放在30H和低位放在31H单元中。 ORG 0000H LJMP MAIN ORG 0100H MAIN:MOV A,#34H ADD A,#47H;低位相加不考虑进位位 MOV 31H,A MOV A,#12H ADDC A,#83H;高位相加考虑低位的进位 MOV 30H,A SJMP $ END
MAIN:MOV DPTR,#200H MOV R0,#30H;30H开始存放转换后的ASCII码 MOV R2,#5;5个压缩BCD码 LP: MOVX A,@DPTR MOV @R0,#0;要存的位置清零 XCHD A,@R0;低4位到30H单元 MOV B,@R0;该单元值送B ORL B,#30H;变成ASCII码,放到B中 MOV @R0,B;存到R0指向的单元中 INC R0;指向下个单元 SWAP A;高4位换到低4位 ORL A,#30H;编程ASCII码 MOV @R0,A;存到下个单元 INC DPTR;指向下一个压缩BCD码 INC R0;指向下一个要存的位置 DJNZ R2,LP;没取完则取下一个BCD码
8.试编写一个子程序,使间址寻址寄存器R1指向 的2个片外RAM连续单元中高4位二进制数合并为1 字节装入累加器A中。已知R1指向低地址,并要求 该单元高4位放在A的高4位中。 MAIN:MOVX A,@R1;取出R1指向地址数据 ANL A,#0F0H MOV B,A;高4位作为结果高4位存到B中 INC R1;指向下一地址 MOVX A,@R1;取出R1指向地址数据 ANL A,#0F0H SWAP A;高四位换到低4位 ORL A,B;与原B中数相或合成1个字节 SJMP $
10.编写一个查表程序,从首地址位1000H,长度位100的数据块 中找出ASCII码A,将其地址送到10A0H和10A1H单元中。 答案1: MOV DPTR,#1000H MOV R2,#100 GO_ON:MOVX A,@DPTR CJNE A,#’A’,IFEND MOV A,DPH MOV B,DPL MOV DPTR,#10A0H MOVX @DPTR,A INC DPTR XCH A,B MOVX @DPTR,A IFEND:INC DPTR DJNZ R2,GO_ON RET
3.编程计算片内RAM区50H~57H单元中数的算术平均值,结果 存放在5AH中。 错误的解: MOV R0,#50H MOV R1,#8 MOV A,#0 LP:ADD A,@R0 INC R0 DJNZ R1,LP MOV B,#8 DIV AB MOV 5AH,A 没有考虑8各单元的和超出一个字节能表示的最大数的情况。
试编写一个子程序使间址寻址寄存器r1指向的2个片外ram连续单元中高4位二进制数合并为1字节装入累加器a中
1.编程将片内40H~60H单元的内容送到以3000H为首的存储区中。 ORG 0000H LJMP MAIN ORG 0100H MAIN: MOV DPTR,#3000H;片外RAM首地址 MOV R0,#40H;片内RAM首地址 MOV R2,#21H;数据个数 LOOP: MOV A,@R0;读数据 MOVX @DPTR,A;向片外写数据 INC DPTR;指向下一个地址 INC R0 DJNZ R2,LOOP;看是否完成 SJMP $ END
;将片内30H开始的10个单元数据送到片外205H开始的RAM. MOV DPTR,#205H;指向205H MOV R2,#10;十个ASCII码 MOV R0,#30H;从30H开始取数 LP1: MOV A,@R0;取出ASCII码 MOVX @DPTR,A;放到片外 INC R0;指向下一个源数 INC DPTR;指向下一个目的地址 DJNZ R2,LP1;没取完继续 SJMP $ END
MAIN:MOV R1,#0 学生的答案 MOV R2,#0 CLR C CHAN:SUBB A,#64H;与100相减 JC CHAN1;不够减则看十位 INC R1;存放百位 SJMP CHAN;继续减100 CHAN1:ADD A,#64H;恢复数据 CHAN2:SUBB A,#0AH;与10相减 JC CHAN3;不够减结束 INC R2;存放十位 SJMP CHAN2;继续减10 CHAN3:ADD A,#0AH;恢复数据 MOV 2AH,R1;保存百位 MOV 2BH,R2;保存十位 MOV 2CH,A;保存个位 SJMP $
SAVE:MOV A,R4 MOV DPTR,#10A0H MOVX @DPTR,A;送出高位 MOV A,R5 INC DPTR MOVX @DPTR,A;送出低位 RET 如果找到了,两单元放目标数 地址,没找到两单元清零。
11.设在200H~204H单元பைடு நூலகம்,存放有5个压缩BCD码,试编程 将他们转换成ASCII码,并存放到以205H为首地址的存储区中。 (数据在片外RAM中)
4.编写计算下式的程序, MAIN:MOV DPTR,#3002H;b地址 设乘积与平方结果均小 MOVX A,@DPTR;取出b 于255。a和b的的值分 MOV B,A 别存放在片外3001H和 DEC DPL;指向a地址3001H 3002H中,结果放在 MOVX A,@DPTR;取出a 3000H中。 CJNE A,B,NOTEQU;判断 a=b时,Y=25 MOV A,#25;相等 a<b时,Y=a×b SJMP RET1 a>b时,Y=a÷b NOTEQU:JNC DAYU;a>b跳 MUL AB;a<b乘 SJMP RET1 DAYU:DIV AB;a>b除 RET1:MOV DPTR,#3000H MOVX @DPTR,A;保存Y 标号不要与关键字相同 SJMP $
SCAN:CLR A INC DPTR MOVC A,@A+DPTR DJNZ R0,TH1 SJMP FH TH1: CJNE A,#41H,SCAN FH: RET 问题:TH1不能做标号 应为DEC R2 如果没找到两单元中 放的是表最后一个地址。
参考答案: CX:MOV R4,#0 MOV R5,#0 MOV DPTR,#1000H MOV R2,#100 LP:CLR A MOVC A,@A+DPTR CJNE A,#"A",NEXT MOV R4,DPH;保存高位 MOV R5,DPL;保存低位 SJMP SAVE NEXT:INC DPTR DJNZ R2,LP
24.把A中的压缩BCD码转换成二进制数。 解:先理解题意,如果A中压缩BCD码是55H,它表示55,变成 二进制数应该是37H。应该是十位(高4位)乘10与个位相加。 MAIN:MOV 30H,A ANL 30H,#0FH;30H中保存了低位(个位) ANL A,#0F0H;只剩高位(十位) SWAP A;变到低位 MOV B,#10 MUL AB;十位乘10结果放在A中 ADD A,30H;高位乘10与低位相加 SJMP $