第一章1.5129=10000001B=81H;253=11111101B = FDH;21.125=10101.001B=15.2H18.6=10010.1001,1001,1001……B=12.999……H (无限循环小数,根据精度确定需要的位数)1.12由题得三者均为正数,所以原码、反码、补码相同,故x1= x2= x3=0101,0111B=57H=871.13 该题与上题不同在均是负数,故原码、反码、补码相同的情况下,原数并不相同。
第二章2.6最后一问:如果CPU使用两组寄存器,一般使用第0与第1组,那么剩下的寄存器组对应的地址单元可作一般缓冲用,第0与第1组已用掉地址:00H—0FH, 故而堆栈SP的初值可设定在0FH或以上。
第三章3.6 (1) A=57H, Cy=1(在符号位产生进位, 进位标志位Cy=1),进位的1是丢掉,累加器只能存8位信息。
有同学写成A=157H, Cy=0.(2) A=3BH, Cy=03.8 SP=2FH, DPH=01H, DPL=23H, A=20H注意SP在每次的POP减一,故最终SP=2FH.(30H单元的前一单元不是29H)3.9 堆栈(0AH)=34H, (0BH)=12H, SP=0BH有的同学仅写DPTR的内容,是不够的,这里是将DPTR的内容压入栈中,但DPTR本身不代表堆栈。
3.24 Loop循环完成的是24位的加法,每步将带进位位Cy相加,同时影响进位位。
故经过loop循环后R0指向22H单元,结果送原R0指向的地址单元。
原来:(22H)=A0H (27H)=76H(21H)=90H (26H)=6FH(20H)=80H (25H)=A0HLoop循环:(22H)=17H Cy=1(21H)=00H Cy=1(20H)=20H Cy=1之后,R0=23H, R1=28H。
因Cy=1, 故(23H)=01H。
所有地址单元只可存八位数,不可(21H)=160H.3.25A=10001100=8CH,执行乘以10的功能,因为A*2+A*2*2*2=A*10有的同学没有写出是乘以10的功能。
3.26实现的如下逻辑运算[(P1.0∨P1.1)∧P1.2]∧(P1.3∨P1.4),其中以用户标志位F0来存储[(P1.0∨P1.1)∧P1.2]的结果。
第四章4.5略有的同学有这样的指令:MOV R0, #2100H. R0只能存八位,故只能指向低位的地址区。
有的同学逻辑搞反,不为零应该继续循环,故:DJNZ R2, LOOP就可以了,不需要太复杂。
还有的同学传送方向搞反了,程序写成:MOVX A, @DPTRMOV @R0, A计数器初始值应该为21H.补充习题,有的同学忘做,可以简单回答:LJMP与LCALL的主要区别是未发生保护现场、恢复现场操作。
4.8 采用一种子程序的形式实现:ORG 1000HMOV DPTR, #3001HMOVX A, @DPTRMOV B, A ; 也可用其它内部存储单元临时存放3001H的内容。
MOV DPTR, #3000HMOVX A, @DPTRACALL SQRSUMCJNE A, #10, EXE1SJMP SA VEDATAEXE1: JC ADD10SUBB A, #10SJMP SA VEDATAADD 10: ADD A, #10SA VEDA TA: MOV DPTR, #3002HMOVX @DPTR, ADONE: SJMP DONESQRSUM: ADD A, B ;该子程序以寄存器A与B传送参数值MOV B, AMUL ABRETEND该程序没有考虑若a+b>255,以及(a+b)2>255的情况下,实际的角度应该就这两方面进行放弃操作。
但本题未说明出现这种情况如何情况,为简化程序中未写入这些情况的处理。
4.9 循环加判断实现ORG 1000HMOV DPTR, #1000HMOV R2, #99 ;本程序循环的地址指针已经从1001H单元开始,故循环次数减1MOVX A, @DPTRMOV 30H, A ;将当前值存入临时的30H单元LOOP: INC DPTRMOVX A, @DPTRSUBB A, 30HJB ACC.7, NEXTADD A, 30H ;恢复A中的值,因为最新的值刚才进行了减操作。
MOV 30H, ANEXT: DJNZ R2, LOOPMOV A, 30HMOV DPTR, #1100HMOVX @DPTR, AEND4.10 ORG 1000HMOV DPTR, #2100HMOV R3, #100 ;总计数器MOV R0, #00 ;0计数器MOV R1, #00 ; 正数计数器MOV R2, #00 ; 负数计数器LOOP: MOVX A, @DPTRJZ COUNT0 ;以下是两次分支程序实现多分支程序JB ACC.7, CTNEG ;转入负数统计程序段CTPOS: INC R1SJMP DONECTNEG: INC R2SJMP DONECOUNT0: INC R0DONE: INC DPTRDJNZ R3, LOOPEND该程序与4.2.7有些类似。
4.12LOOP:MOV R0,#30HMOV R7,#100 ;LOOP1:MOV A,@R0 ;JZ LOOP2JNB ACC.7, LOOP2CPL AADD A,#81HMOV @R0,A ;LOOP2:INC R0DJNZ R7,LOOP1RET ;4.20晶振为6MHz,得每个机器周期为12*1/6μs=2μs, 可以先行计算对于100ms,需要循环50,000个机器周期;对于1s, 需要500,000个机器周期;考虑DJNZ为2个机器周期,故循环次数比刚才的数字减半。
对于100ms为简单,以25,000个DJNZ实现,可以250*100故,程序为由程序:ORG 1000HMOV R2, #250DELAY2: MOV R3, #100DELAY1: DJNZ R3, DELAY1 ; 这句将循环25,000次,执行时间最长。
DJNZ R2, DELAY2该程序执行时间:1+250*(1+100*2+2)=50751个机器周期=101.502ms,[算对].精确的计算,可以将R3的值设为x,求解。
1+250*(1+x*2+2)=50000,故x=98.5,取x=99 程序执行时间:50251个机器周期=100.502ms.对于1s, 由于需要500,000个机器周期,以250,000个DJNZ实现已不方便。
因为两个八位数相乘,最大255*255。
故需要NOP指令加长内循环的时间。
ORG 1000HMOV R2, #250DELAY2: MOV R3, #DIMSDELAY1: NOPNOPNOPNOPNOPNOPDJNZ R3, DELAY1 ; 这句将循环62,500次,执行时间最长。
DJNZ R2, DELAY2简便计算:250*8*DIMS=500,000, 故DIMS=250该程序执行时间:1+250*(1+250*8+2)=500751个机器周期=1001.502ms,[算对].第五章5.7 2761(1)……. 0000H—1FFFH2761(2)……. 2000H—3FFFH2761(3)……. 4000H—5FFFH2761(4)……. 6000H—7FFFH6264(1)……. 8000H—9FFFH6264(2)……. A000H—BFFFH自测题5.32. 2764(a) C000H—DFFFH2764(b) A000H—BFFFH62646000H--7FFFH第六章习题略第七章7.3已知8255A的口地址为7FF0~7FF3H,阅读下述程序,回答问题:执行1~3条指令后,要求A,B,C三个端口各干什么?答:通过向控制寄存器送82H的数值,可知,A口将工作于方式0,输出状态;C口上半部将工作于方式0,输出状态;B口将工作方式0,输入状态;C口下半部将工作于方式0,输出状态。
已A口=FFH,B口=78H,C口=7FH,(30H)=32H,执行4~9条指令后,A口、B口、C口,(30H)中的值发生了什么变化ORG 8000H1 MOV DPTR, #7FF3H2 MOV A, #82H3 MOV @DPTR, A4 MOV DPTR, #7FF1H5 MOVX A, @DPTR6 MOV 30H, A7 MOV DPTR, #7FF0H8 MOV A, #79H9 MOVX @DPTR, A答:执行第4-5条指令,将从B口输入数据至累积器A,执行第6条指令,(30H)=78H;执行第7-9条指令,将79H数值从A口输出,因此A口=79H,B口=78H,C口=7FH,(30H)=78H第八章自测题8.3(1) 定时器0工作于方式1(2) 机器周期1μs, 初始值x=0DD0H=3536, 定时时间65536-3536=62000个机器周期,即62ms 。
(3) 由于定时器/计数器溢出后,其中的值已变为0,不再是所需初始值,而方式1不具有自动装载初值的功能,若不重新赋值,必然达不到预期的定时效果,故需重置初值。
补充题设单片机时钟为12MHz ,利用定时器T1, 使P1.0引脚输出2.0ms 的矩形波,要求占空比为1:2,试编写程序,要求中断方式,请问采用方式2可以吗?为什么?建议采用方式0。
解:根据输出波的要求,可知可采用高低电平分别为1ms 便能满足。
欲满足定时1ms ,初始值6133121028192110719200011100000110001212osc f X t -⨯=-=-⨯⨯== 从最高位13位开始往后取高位八位,即看成:0001110000011000所以TH1=11100000=E0H, TL1=18H.若采用方式2最大计数量为256,而定时时间需要的计数量为1000,所以一般情况下不可行。
主程序:ORG 0000HAJMP MAINORG 001BHAJMP TINTMAIN: MOV TMOD, #00HMOV TH1, #0E0HMOV TL1, #18HSETB EASETB ET1SETB TR1SJMP $中断程序:TINT: MOV TH1, #E0HMOV TL1, #18HCPL P1.0RETI第九章串行通信补充习题:已知单片机晶振fosc=6MHz。
请编制串行通信数据接收程序,将接收的16个字节的数据送入片内50~5FH单元中。
串行接口设定为工作方式3,要求波特率1200 b/s。
(采用中断方式实现)解:由晶振fosc=6MHz,得机器周期2μs,波特率=2fosc12003212(256)SMODx=-,得计数初始值x=256-13=243=F3HORG 0000HAJMP MAINORG 0023HAJMP SINTMAIN: MOV TMOD, #20H ;定时器1工作于方式2MOV TH1, #0F3HMOV TL1, #0F3HMOV SCON, #0D0H ;串行口工作于方式3,置接收REN有效MOV PCON, #00H ; 设培增位SMOD为0MOV R0, #50H ;存放的目的地址MOV R7, #10H ;存放数据的数量SETB EASETB ES1 ;置串行中断有效SETB TR1 ;启动定时器,产生波特率,方式2自动装载初值,故不需要中断子程序重新装载SJMP $中断程序:SINT: CLR RIMOV A, SBUF ;将接收的数据送入累加器AJB PSW.0, ONEE ;LOOP1JB RB8, ERROR ;PSW.0与RB8不一致,转出错处理程序SJMP RIGHTONEE : JNB RB8, ERROR ;另一种不致,转出错处理RIGHT: MOV @R0, AINC R0DJNZ R7, CONTINCLR ESSJMP CONTINERROR: …………CONTIN: RETI第十章D/A和A/D转换10.12,去掉其中“采样周期为1s”,为避免调用延时子程序。