《单片机课后题答案.doc》由会员分享,可在线阅读,更多相关《单片机课后题答案.doc(13页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、精品文档,仅供学习与交流,如有侵权请联系网站删除第三章习题解答 4在8051片内RAM中,已知(30H)38H,(38H)40H,(40H)48H,(48H)=90H,试分析下段程序中各条指令的作用,说出按顺序执行完指令后的结果: MOV A40H ;(A)=48H MOV R1,A ;(R1)=48H MOV P1,#0FOH ;(P1)=F0H M0V R1,30H ;(48H)=38H MOV DPTR,#1234H ;(DPTR)=1234HMOV 40H,38H ;(40H)=40HMOV R1,30H ;(R1)= 38HMOV 90H,R1 ;(90H)= 38H ,P1的地址为
2、90HMOV 48H,#30H ;(48H)= 30HMOV A,R1 ; (A)= 40HMOV P2,P1 ; (P2)= 38H F0H错误8试编程将片外数据存储器80H单元的内容送到片内RAM的2BH单元。MOV DPTR, #0080H 或:MOV R0, #80HMOVX A, DPTR MOV P2,#00HMOV 2BH, A MOVX A, R0 MOV 2BH, A10试编程将片内RAM20H单元中的两个BCD数拆开,并变成相应的ASCII码存入片内RAM 21H和22H单元。MOV A, 20H ;20H的内容不变ANL A,#0F0HSWAP A ;4次移位 RR A
3、也可以ADD A,#30HMOV 21H, AMOV A, 20HANL A,#0FHADD A,#30HMOV 22H, A12试分析以下两段程序中各条指令的作用,程序执行完后转向何处?(1) MOV P1,#0CAH ;(P1)= 11001010 MOV A,#56H ;(A)= 01010110 JB P1.2,L1 JNB ACC.3,L2 ;转向L2L1: L2: (2)MOV A,#43H ;(A)=01000011 JBC ACC.2,L2 JBC ACC.6,L2 ;转向L2L1:L2: 18分析下列程序执行后,(SP)的值。 MOV SP,#2FH MOV DPTR,#20
4、00H MOV R7,#50HNEXT:MOVX A,DPTR PUSH A DJNZ R7,NEXT ;(SP)=2FH+50H 2F+2*50错误19试编写程序,查找在3050H单元中是否有66H这个数据,若有将F0置1,否则将F0清0。MOV R0,#30HCLR F0 ;MOV A,#66HL0:CJNE R0,#66H, L1 ;SUBB A,R0 错,因为A已发生变化,不能循环SETB F0 ;JNZ L1SJMP STP ;MOV A,R0 正确L1: INC R0 ; XRL A,#66HCJNE R0,#51H, L0 ; JNZ L1STP: 第四章习题解答 4已知从内部R
5、AM BLOCK单元开始存有一组无符号数,其长度存于LEN单元。试编制程序,将它们按从小到大的顺序排列之后仍存放在原存储区域内。例4-15 将给定数据块中的数据排序 设:N个数据依次存放在内部RAM LIST地址开始的存储区域中,将N个数比较大小之后,使它们按从小到大(或从大到小)的次序排列,仍存放在原存储区域中。 排序是在程序设计中经常使用的一种编程方法。排序的方法有多种,本例采用了较常用的“冒泡”排序法。 冒泡排序的基本思路是:从前向后依次将相邻两个单元中的数据进行比较,即第一个数与第二个数比较,第二个数与第三个数比较,如两数比较的大小次序符合排序顺序,则不改变它们的存放顺序,否则交换两数
6、位置,使其符合排序要求。由于每次冒泡后只是从前向后排定一个大数(对于升序排列),所以在整个排序过程中,执行的内容包含两层:第一层为每一轮内的两两比较,第二层为每当一轮比较之后重新组织下一轮的比较,因此宜采用二重循环结构。源程序如下:ORG 8000H MOV R7,#N-1 ;置外循环计数 MOV R7,LEN DEC R7NEXT:MOV A,R7 ;置内循环计数MOV R5,AMOV R0,#LIST ;置数据指针 LIST改为BLOCKMOV Rl,#0 ;清交换标志COMP:MOV A,R0 ;取数据Xi,i=on-1 MOV R3,A ;暂存Xi INC R0 ;修改指针 CLR C
7、 ;清进位标志CYSUBB A,R0 ;Xi与Xi+1比较JC LESS ;XiXi+1,不交换MOV A,R3 ;XiXi+1,交换XCH A,R0DEC R0MOV R0,AINC R0 ;恢复数据指针MOV R1,#1 ;置交换标志LESS:DJNZ R5,COMP ;内循环未完,继续DJNZ R7,LOOP ;外循环未完,查交换标志 SJMP STOPLOOP:CJNE R1,#0,NEXT ;有交换;继续STOP:END程序中R7为外循环计数器,R5为内循环计数器,R0为数据指针,R1为交换标志,R3为暂存寄存器。对于n个数据的排序,外循环次数需n-1次。内循环次数随着外循环执行次数
8、按递减1规律变化,即第一次内循环次数为n-1,第二次内循环次数n-2,依此类推。为了提高排序速度,程序中还设置了数据交换标志R1,当两数比较发生过交换,使其置1,否则清零。在排序过程中,若两数比较没有发生过交换,说明数据顺序已排列就绪,可提前结束循环。7编程实现将内部RAM中以50H开始的10个字节的压缩BCD数转换成十六进制数,存放在以60H开始的单元中。MOV R7,#10 ;循环10次MOV R1,#60H ;结果存放地址MOV R0,#50HLP: MOV A,R0ANL A,#0F0H ;取高4位SWAP AMOV R1,AINC R1MOV A,R0ANL A,#0FH ;取低4位
9、MOV R1,AINC R0INC R1DJNZ R7,LPRET8若晶振频率为6MHz,则下面一段延时子程序可延时多长时间? DELAY:MOV R7,#248 ;1T NOP ;1T DJNZ R7, ;2T RET ;2T解:T=1/6M*12=2um(4+248*2)T = 1ms若把$改为DELAY,则延时时间为:(4*248+2)T = 1.988ms15求函数Y=X!(X=0,1,2,7。Y用4位BCD码表示)。方法一:查表法;X放在R3中,结果Y存放在R6、R7中(高2位在R6,低2位在R7)MOV A, R3RL AMOV DPTR,#DATAMOVC A,A+DPTRMOV
10、 R6,AINC DPTRMOVC A,A+DPTRMOV R7,ADATA:DB 00H,01HDB 00H,02HDB 00H,06HDB 00H,24HDB 01H,20HDB 07H,20HDB 50H,40H方法二:;MUL AB 命令限制了乘数和被乘数的范围,但是结果是216(64K),低位放入A,高位放入B ; 这里这样来处理: 5!=120,所以5之前的都一个算法,如果大于5, 从两边同时乘。例如7!=5!*(6*7);X放在R3中,结果放在R6R7中,高位在R6 ORG 0050H MOV A,R3; 判断X的范围 JNZ L1; MOV R7, #00H ; X等于0,直接
11、输出0 L1: CLR CSUBB A,#01H;JNZ L2 ; 小于5的时候可以直接用循环做, 跳到LESS5 MOV R7,#01H; X等于1,直接输出1 L2: MOV A, R3CLR CSUBB A,#06HJNC L4 ; 大于5的时候用120 再乘上6,7 MOV A, R3 ; 小于等于5的时候算X! DEC R3L3: MOV B, R3 MUL AB; DJNZ R3, L3 MOV R7, A ;(25)的阶乘放入R7 ACALL CONVERT ; 转换为BCD码 L4: JNZ L5 ; X=7,转L5 MOV A, #120 ;X=6,X!=120*6 MOV
12、B,R3MUL AB ;L6: MOV R5,B;保存结果 MOV R7,AACALL CONVERT END; L5: MOV A, R3 ; 算6*7 DEC R3 MOV B, R3 MUL AB; MOV B,#120MUL ABSJMP L6;下面是转化为BCD码CONVERT:MOV A,R7 ;转换低位 MOV B,#64H ;B内放100 DIV AB MOV R6,A ;这里是百位 MOV A,B MOV B,#0AH DIV AB ; A里是十位 余数在B中,就是个位 RL A ;十位左移四位,把个位和十位的BCD码放到一个寄存器里面 RL A RL A RL A ADD
13、A,B MOV R7,A ; R7里面为个位和十位HCCCC: MOV A,R5 ;R5中为高位十六进制数 JZ STOOOP ;如果没有高位就直接结束 MOV A,R7 ;不为0,就加高位数字个256 ADD A,#56H DA A ;调整,如果有进位的话C会置1 MOV R7,A MOV A,R6 ADDC A,#02H ;这里带进位加 DA A ; 再调整 MOV R6, A DJNZ R5,HCCCC ;循环到高位数字为零STOOOP: RET第6章习题6解答试用中断计数设计一个秒闪电路,其功能是控制发光二极管闪亮,其闪烁频率为50Hz。设fosc=6MHz。解:P1.080C51闪烁
14、周期T=1/50秒=20ms,采用T0定时中断10ms将P1.0取反一次。T0采用方式1定时,初值X=65536-6*10000/12=60536=EC78H程序:ORG 0000H LJMP START ORG 000BH LJMP PROT0 ORG 1000HSTART:MOV TMOD #01H ;T0方式1,定时MOV TH0, #0ECHMOV TL0, #78HMOV IE, #82H ; SETB EASETB ET0SETB TR0SJMP $ ORG 2000HPROT0: MOV TH0, #0ECH MOV TL0, #78HCPL P1.0RETI第7章习题解答串口作
15、业:1、设计一个80C51单片机的双机通信系统,并编写程序将甲机片外RAM8000H-9000H的数据块,通过串行口传送到乙机片外RAM3000H-4000H单元中去解:设fosc=11.0592MHZ,波特率为2400波特。串口采用方式1,T1作波特率发生器, 采用模式2,取SMOD=0,则T1计数初值为:X=256-11.059210620/3842400=244=F4H程序如下: ;甲机发送程序 MOV TMOD,#20H ;T1模式2 MOV TL1,#0F4H ;T1计数初值 MOV TH1,#0F4H SETB TR1 ;启动T1 MOV SCON,#40H ;串口方式1MOV P
16、CON,#00H ;SMOD=0,波特率不增倍MOV DPTR,#8000HLOOP: MOVX A,DPTR ; 取发送的数据MOV SBUF, A ;发送数据 JNB TI,$ CLR TI INC DPTR MOV A,DPH CJNE A, #90H,LOOP ;MOV A,DPL CJNE A,#01H,LOOP SJMP $;乙机接受程序 MOV TMOD,#20H MOV TL1,#0F4H MOV TH1,0F4H SETB TR1 MOV SCON, #50H MOV PCON, #00H ;LOOP: JNB RI,$ CLR RI MOV A, SBUFMOV DPTR,
17、#3000H ;接收数据存储地址 MOVX DPTR, A INC DPTR MOV A,DPH CJNE A,#40H,LOOP ;MOV A,DPL CJNE A,#01H,LOOP SJMP $ 2、利用80c51串行口设计4位静态7段显示器,画出电路并编写程序,要求4位显示器上每隔1s交替地显示“0123”和“4567” 图中P3.2改为P1.0,或将164的CLR端接地。解1:算法:采用串行口方式0。用定时器0定时50ms,循环20次,实现1s的定时,设晶振为12MHZ。设立显示两组数据的标志。 ORG 0600HDISP: MOV R7,#4 ; 设置显示位数 MOV SCON,#
18、00H ; 设串行口方式0 CLR(SETB) 60H ;设置一个位来判断显示哪组数据 LL: MOV R2,#00H ; 地址偏移量JB 60H, DTAB1 MOV DPTR, #TAB SJMP DISP0DTAB1: MOV DPTR,#TABLEDISP0: MOV A, R2 MOVC A,A+DPTR ; MOV SBUF,A ; 启动串行口发送数据 JNB TI,$ ; 等待一帧发送结束 CLR TI ; 清串行口中断标志 INC R2 ; 指向下一个数据 DJNZ R7,DISP0 ; CPL 60H;交换显示标志位取反DELAY: MOV 50H,#20H ;定时1S循环计
19、数 MOV TMOD,#01H MOV TL0,#0B0H;计数初值 MOV TH0,#3CH SETB TR0 ; 启动定时器0L2: JBC TF0,L1 ; 查询计数溢出否 SJMP L2 ; 无条件转移L1: MOV TL0,#0B0H MOV TH0,#3CH DJNZ 50H,L2 SJMP LLTAB: DB 0C0H,0F9H,0A4H,0B0H TABLE: DB 99H,92H,82H,0F8H END解2:ORG 2000HCLRP1.0;清显示SETBP1.0MOVSCON,#00H;设串口方式0AA:MOVR1,#04H;显示位数MOVR2,#00H;地址偏移量BB:
20、MOVA,R2;取显示段码ADDA,#03HMOVCA,A+PCAJMPCCDBC0H,F9H,A4H,B0H;0,1,2,3的段码CC:MOVSBUF,A;启动串口发送JNBTI,$CLRTIINCR2;修改地址偏移量DJNZR1,BB;一屏显示未完,继续ACALLDELAY;调延时1s子程序MOVR1,#04H;下一帧显示MOVR2,#00HDD:MOVA,R2ADDA,#03HMOVCA,A+PCAJMPEEDB99H,92H,82H,F8H;4,5,6,7的段码EE:MOVSBUF,A;启动串口发送JNBTI,$CLRTIINCR2;修改地址偏移量DJNZR1,DD;一屏显示未完,继续
21、ACALLDELAY;调延时1s子程序AJMPAA;循环八章EOC接P1.0MOV R6,#06H ;从IN0IN5依次采集的通道个数MOV R7,#100 ; 每通道采样次数MOV R4,#30H ;存放转换数据的地址R4,R5MOV R5,#00HMOV R2,#7FH ;IN0通道地址R2,R3MOV R3,#0F8HLOOP: MOV DPH,R2 MOV DPL,R3 MOVX DPTR,A ;启动A/D转换NOPL0:JNB P1.0, L0 ;等待转换MOVX A,DPTR ;转换结果送(R1)所指单元MOV DPH,R4 ;取存储地址MOV DPL,R5MOVX DPTR,A
22、;保存数据INC DPTR ;修改存储地址MOV R4,DPH ;保存A/D转换结果的存放地址MOV R5,DPL DJNZ R7,LOOP ;若100个数据未采集完毕,继续顺序A/D转换。INC R3 ;通道地址加1DJNZ R6,LOOP ;若6个通道未采集完毕,继续顺序A/D转换。SJMP DELAY: MOV R6,#0AH ;延时100uSDLAY1: NOPNOPNOPDJNZ R6,DLAY1RET复习第二章基本结构与工作原理1、单片机的组成、结构2、PC、DPTR、PSW、SP堆栈3、指令时序:P21图2-10振荡周期、机器周期、指令周期之间的关系ALE周期=1/2机器周期,f
23、=1/6fosc,用MOVX访问片外RAM时缺失。4、存储器结构5、复位电路第三章 指令系统1、符号2、寻址方式、寻址空间3、指令:传送指令、算术运算指令、逻辑运算指令、控制转移指令、布尔操作指令1)注意操作数:CJNE DPL,#01H,LOOP ;其中DPL应先送到A MOV R0,R1;Rn之间不能直接传递数据,要通过A或direct传2)转移、调用指令中rel、addr11、addr16均得写为具体标号,指令执行过程第五章程序设计程序结构:顺序、分支、选择、循环运算程序、查表程序、中断服务程序RETI、子程序RET第四章功能单元1、I/O口:P65表4-1。注意准双向口的使用2、定时/计数器:各种方式,计算溢出率、计数初值3、串口:1)各种方式用法,波特率发生器T1,TI、RI软件清除2)串行扩展输入口、输出口3)双机通信4)多机通信5)地址/数据、奇偶校验4、中断:5个中断,2级优先级,中断入口、扩展;初始化程序、中断服务程序。第六章系统扩展1、三总线结构2、并行扩展:EPROM、EEPROM、RAM的扩展电路、地址线3、串行扩展:SPI、I2C了解第七章外围接口键盘,LED显示器:静态(有锁存)、动态DAC0832,ADC0809 第八章应用系统最小系统:89C51+复位电路+晶振最小应用系统:最小系统+键盘+显示+RAM+ADC+DA【精品文档】第 1 页
限制150内