1、完整版单片机答案汇编3-3 访问外部数据存储器和程序存储器可以用哪些指令来实现?举例说明。 储器可以用以下指令实现:解:MOVX a, RiMOVX Ri, A ;MOVX A, DPTRMOVX DPTR, A答:访问外部数据存;(Ri) f 寄存器Ri指向的片外RAM地址中的内容送到累加器 A中At (Ri),累加器中内容送到寄存器 Ri指向的片外RAM地址中;(DPTR) fA,数据指针指向的片外 ram地址中的内容送到累加器 a中 ; Af(DPTR) ,累加器中内容送到数据指针指向的片外 RAM 地 址中访问程序存储器可以用以下指令实现:Move a, A+DPTR ; (A+DPT
2、R) fA ,表格地址单元中的内容送到累加器 A中Move a, A+ pc ; PC+1f PC, (A+ PC) fA,表格地址单元中的内容送到累加器 3-4试用下列3种寻址方式编程,将立即数 0FH送入内部ram的30H单元中。 (2) 寄存器寻址方式; (3) 寄存器间接寻址方式答(1)立即寻址方式:(2)寄存器寻址方式:A中立即寻址方式;(3)3-7MOV 30H, #0FHMOV R5, #0FHMOV 30H, R5MOV R1, #0FH(1)答:寄存器间接寻址方式:写出实现下列要求的指令或程序片段。(2)(3)(4)(5)(6)( 1)MOV A, R0 MOV R1, A2
3、)MOV R1, 20H3)MOV A, 20HANL A, #77H4)MOV DPTR, #1000HMOVX A, DPTRMOV 60H, A5)MOV DPTR, #1000H MOVX A, DPTR MOV R2, A ANL A, #0FH内部 RAM 内部 RAM 外部RAM 外部 RAM的20H单元内容传送到寄存器的20H单元的D7和D3位清零,的1000H单元内容传送到内部 的1000H单元内容传送到寄存器 R2 ;将R0的内容传送到R1 ;R1 ;其它位保持不变;RAM的60H单元中;清除累加器高 4位。6)试编写一段程序, 将内部数据存储器答: MOV A, 30HM
4、OV DPTR, #1000HMOV DPTR, AMOV A, 31HMOV DPTR, #1000HMOV DPTR, A3-9 试编写一段程序,将外部数据存储器 答:3-8单元中。30H、3lH 单元内容传送到外部数据存储器40H单元中的内容传送到 OIOOH单元中。1000H 、1001H3-1O答:MOV DPTR, #0040HMOV A, DPTRMOV 0100H, A 试编写一段程序,将R3中的数乘4MOV A, R3MOV 23H, #02H用移位指令)。L0: DJNZ 23H, L1L1: RL ASJMP L03-11试编写一段程序,将R2中的各位倒序排列后送入 R3
5、中。 答: MOV A, R2MOV 23H, #08HL0: DJNZ 23H, L1L1: RL ASJMP L0 MOV R3, A3-MOV A, P1ORL A, #F8HMOV P1, A编写程序,将片内 30H39H 单元中的内容送到以 2000H 为首的外部存储器。 ORG 0000H12试编写一段程序,将P1 口的高5位置位,低3位不变。 答:4-4答:START: MOV R0, #30HMOV DPTR, #2000HMOV R1, #10CLR ALOOP: MOV A, R0MOVX DPTR, ADEC R1DJNZ R1, LOOPEND4-8次采样值依次放在 2
6、0H27H 的连续单元5 编写程序,采用算术平均值滤波法求采样平均值,设 中,结果保留在 A 中。答: FILT: CLR AMOV R2, AMOV R3, AMOV R0, #20HMOV R7, #08H;初始化FILT1: MOV A, R0 ADD A, R3MOV R3, ACLR AADDC A, R2MOV R2, AINC R0 DJNZ R7, FILT1;累加采样值到R3,累加进位到R2=00000xxxBFILT2: SWAP ARL A ;R2/8 ,节省一个指令周期XCH A, R3SWAP ARL A ;R3/8 ,节省一个指令周期 ADD A, #80H ; 四
7、舍五入 ANL A, #1FH ; 屏蔽移位进入的前三位 ADDC A, R3 ; 结果相加 END; 取平均值4-6编写程序,将存放在内部RAM起始地址为20H和30H的两个3字节无符号相减,结果存放在内部 RAM单元70H、71H、72H中(低位对应低字节)。答: ORG 0000HSTART: MOV R0, #20HMOV R1, #30HMOV R2, #03HCLR CS0: LCALL XUMOV 70H, ALCALL XUMOV 70H, ALCALL XUMOV 70H, AS1: MOV A, R0SUBB A, R1INC R0INC R1RETEND4-7编写程序,实
8、现两个双字节无符号数的乘法运算,乘数存放在 R2和R3中(R2存放高字节,R3存放低字节,以下类同),被乘数存放在 R6和R7中,积存放在R4、R5、R6和R7中。答: ORG 0000HDMUL: MOV A, R3MOV B, R7MUL ABMOV R0, AMOV R1, B;低8位*低8位MOV A, R2MOV B, R7MUL ABADD A, R1MOV R1, AMOV A, BADDC A, #00HMOV R5, A;高8位*低8位MOV A, R3MOV B, R6MUL ABADD A, R1MOV R1, AMOV A, R5ADDC A, BMOV R5, AMO
9、V A, #00HADDC A, #00HMOV R4, A;低8位*高8位MOV A, R3MOV B, R6MUL ABADD A, R5MOV R5, AMOV A, R4ADDC A, BMOV R4, A;高 8位*高8位MOV A, R0MOV R7, AMOV A, R1MOV R6, A ;R0、R1 给R7、R6END4-8假设在RO指向的片内RAM区,存有20个16进制数的ASCII字串。将ASCII码转换为16进制数, 然后两两合成一个字节,从低地址单元到高地址单元依次组合。答: ORG 0000HSTART: MOV R7, #20S0: MOV A, R0MOV R1
10、, A ;R1 为中间量MOV A, R0CLR CSUBB A, #30HMOV R1, AJC S01MOV A, R0SUBB A, #07HMOV R1, AS01: INC R0MOV A, R0CLR CSUBB A, #30HSWAP AORL A, R1MOV R1, AJC S02MOV A, R0SUBB A, #07HSWAP AOR A, R1MOV R1, AS02: INC R0DJNZ R7, S0END4-9 结合例 4-24和图 4-5编写线性标度变换程序。答: 将256近似 255, 256比255做浮点运算简单很多PUSH ACCPUSH PSWMOV A
11、, #AmMOV 20H, #A0CLR CSUBB A, 20H ;将256近似255,则A为小数点后的位MOV 21H, #NxMOV B, 21HMUL AB ;B为整数位,A为小数点后的位ADD A, #80H ; 四舍五入MOV A, BADDC A, #A0MOV 38H, APOP PSWPUSH ACCRET5-1000H 、 1001H4试编写一段程序,将内部数据存储器 30H、3IH单元内容传送到外部数据存储器单元中去。答 : #include #include void main(void) unsigned int temp; temp = DWORD0x0030; X
12、WORD0x1000 = temp; while(1);5-5试编写一段程序,将外部数据存储器 40H单元中的内容传送到50H单元。答:方法一:#include #include void main(void)XBYTE0x0050 = XBYTE0x0040; while(1); 方法二:#include #include void main(void) unsigned char xdata *xp;unsigned char data temp;xp = 0x0040;temp = *xp;xp = 0x0050;*xp =temp; while(1);5-6试编写一段程序,将R3中的数
13、乘以4。答: #include void main(void) unsigned int data *a; #pragma asmMOV 30H, R3#pragma endasm a = 0x30;*a = *a*4;while(1);5-7试编写一段程序,将R2中的各位倒序排列后送入 R3中。答:考虑C中没有循环移位,对于这种很低级的运算,采用嵌入汇编的方式完成。 #include void main(void)#pragma asmMOV R7, #08HMOV R3, #00HDEL: CLR CYMOV A, R2RLC AMOV R2, AMOV A, R3RRC AMOV R3,
14、 ADJNZ R7, DEL#pragma endasm while(1);5-8试编写一段程序,将P1 口的高5位置位,低3位不变。答: #include void main(void)P1 |= 0xf8; while(1);5-9 设 8次采样值依次存放在 20H27H 的连续单元中, 采用算术平均值滤波法求采样平均值, 结果保 留在30H单元中。试编写程序。答: #pragma small#include void main(void)unsigned char *dp = 0x20,i;float temp = 0;for(i=0;i8;i+)temp += *dp;dp+;temp
15、 /= 8;dp = 0x30;*dp = temp;while(1);5-10从20H单元开始有一无符号数据块,其长度在 20H单元中。编写程序找出数据块中最小值,并存入21H单元。答: #pragma small#include void main(void)unsigned char *dp, num, min, i;dp = 0x20;num = *dp;dp+;for(i=1;i*dp)min = *dp;dp = 0x21;*dp = min;while(1);6-1、2、3,当某一中断源变低电平时便要求 CPU 处理,它们的优先处处理程序的入口地址分别为 2000H 、 2100
16、H 、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上。汇编语言程序代码如下: ORG OOOOH ;复位入口地址AJMP MAIN ; 转主程序ORG OOO3H AJMP INT1ORG O1OOHMAIN: MOV TMOD
17、, #6OH ;T1 方式2MOV TH1, #OFFHMOV TL1, #OFFH ; 置初值SETB TR1 ;启动计数器 T1 SETB EA ;CPU 中断开放SETB ET1 ;允许T1中断SETB IT0 ;允许外中断0产生中断SETB IT1SETB PX0 ; 外中断 0为高级中断SETB PX1SETB PT1SETB IT0 ; 外中断 0为跳沿触发方式SETB IT1LOOP1: SJMP LOOP1 ;等待中断 ;中断服务程序ORG 1000H INT1: PUSH PSW ; 保护现场PUSH ACC1有请求2有请求3有请求JB P1.0,IR1 ;P 1.0高,外中
18、断JB P1.1, IR2 ;P 1.1 高,外中断JB P1.2, IR3 ;P 1.2高,外中断 INTIR: POP ACC ; 恢复现场POP PSWRETI ; 中断返回ORG 2000HIR1: 外;中断1的中断处理程序AJMP INTIR ORG 2100H IR2: 外;中断2的中断处理程序AJMP INTIRORG 2200HIR3: 外;中断3的中断处理程序AJMP INTIR END7-5采用定时/计数器TO对外部脉冲进行计数, 每计数100个脉冲后,TO转为定时工作方式。 定时1ms后,又转为计数方式,如此循环不止。假定 MCS-51 单片机的晶体振荡器频率为 6MHz
19、 ,请使用方式1 实现,要求编写出程序。答: ORG 0000H START: CLR TR0MOV TMOD, #05HMOV TH0, #0FFHMOV TL0, #9CH;计数器初始化S0: JBC TF0, NEXTSJMP S0NEXT: CLR TR0MOV TMOD, #01HMOV TH0, #0F8HMOV TL0, #30H ;定时器初始化 SETB TR0S1: JBC TF0, STARTSJMP S1END7-7编写程序,要求使用 TO,采用方式2定时,在P1.0输出周期为400 11,占空比为10:1的矩形脉冲。 答:本题采用晶体振荡器频率为 12MHz,使用定时器
20、配合计数器,设计成一个 401定时将P1.0置0和一个4001定时将P 1.0置 1。ORG 0000H ;中断入口地址AJMP STARTORG 000BH ; 定时器 0的中断向量地址AJMP TIME0ORG 0030HSTART: MOV SP, #5FHMOV 30H, #00H ; 软件计数器清零MOV TMOD, #02H ;T0 工作在方式 1MOV TH0, #216MOV TL0, #216SETB EASETB ET0SETB TR0;任意程序段TIME0: PUSH ACC ; 中断处理子程序PUSH PSWCLR P1.0INC 30HMOV A, 30HCJNE A
21、, #10, T0_4SETB P1.0MOV 30H, #00HT0_4: POP PSWPOP ACCRETIEND7-9利用定时/计数器T0产生定时时钟,由P1 口控制8个指示灯。编一个程序,使 8个指示灯依次一个一 个闪动,闪动频率为 20次/秒( 8个灯依次亮一遍为一个周期)。答:本题采用晶体振荡器频率为 12MHz,每个灯的闪烁周期是:50ms,采用工作方式1。ORG 0000HAJMP STARTORG 000BHAJMP TIME0ORG 0030HSTART: MOV SP, #5FHMOV R7, #0FEHMOV TMOD, #01H ;T0 在工作方式 1MOV TH0
22、, #3CHMOV TL0, #0B0HSETB EASETB ET0SETB TR0S0: AJMP S0 ;此处放任意程序段TIME0: PUSH ACCPUSH PSWMOV P1, R7MOV A, R7RL AMOV R7, AMOV TH0, #3CHMOV TL0, #0B0H POP PSWPOP ACCRETIEND7-11编写一段程序,功能要求为:当P1.0引脚的电平正跳变时, 对P1.1的输入脉冲进行计数; 当P1.2引脚的电平负跳变时,停止计数,并将计数值写入 R0、R1 (高位存R1,低位存R0 )。答:将P1.1的输入脉冲接入TO,即使用TO计数器完成对P1.1 口
23、的脉冲计数。R2中记TO计满数的次数。 程序代码如下:ORG OOOOHLJMP MAINORG OOOBHLJMP ITOMAIN: JNB P1.O, MAINMOV TMOD, #05H ;定时/计数器TO为计数方式1SETB TR0 ;启动TO,开始计数SETB ETO ;允许TO中断SETB EA ; CPU开中断WAIT: JB P1.2, WAITCLR EACLR TROMOV R1, THOMOV RO, TLO AJMP $ ITO: INC R2RETI7-18为什么定时/计数器T1用做串行口波特率发生器时, 应采用方式2?若已知时钟频率、 通信波特率,如何计算其初值?答
24、:因为方式2是有自动重装载计数值的功能, 从而可以产生精确的波特率。 串行工作方式0和方式2波特率是固定的,所以不用设初值;串行工作方式 1和方式 3时:SMOD波特率:BR = (2 xrd)/32溢出一次的时间: 1/Td = (256-TH1)*12/ fosc溢出率:Td = fosc/12 (256-TH1)初值: TH1 = 256- f /(12* T)osc d7-19若晶体振荡器为11.059MHz,串行口工作于方式1 ,波特率为4800b/s,写出用T1作为波特率发 生器的方式控制字和计数初值。答: MOV TMOD, #2OHMOV TH1, #OFAHMOV TL1,
25、#0FAHSETB TR1MOV SCON, #50H7-20 利用单片机串行口扩展 24个发光二极管和 8个按键,要求画出电路图并编写程序使 24个发光二1s)。极管按照不同的顺序发光(发光的时间间隔为 答: ORG 1000HSTART: MOV SCON, #00H ; 串行口工作方式 0MOV R0, #00HMOV R7, #03HMOV R6, #24HCLR P1.0 ; 关闭并行输出LOOP: MOV A, R0MOV DPTR, #TAB ; 查表取数,送出MOVC A, A+DPTRMOV SBUF, AOUT0: JNB TI, OUT0INC R0CLR TIDJNZ
26、R7, LOOPSETB P1.0 ;开启并行输出ACALL DELAYDJNZ R6, STARTAJMP LOOPDELAY: MOV R2, #250D1: MOV R3, #100D2: MOV R4, #20D3: DJNZ R4, D3DJNZ R3, D2DJNZ R2, D1RETTAB: DB 00000000B, 00000000B, 00000001B, 00000000BDB 00000000B, 00000010B, 00000000B, 00000000BDB 00000100B, 00000000B, 00000000B, 00001000BDB 00000000
27、B, 00000000B, 00010000B, 00000000BDB 00000000B, 00100000B, 00000000B, 00000000BDB 01000000B, 00000000B, 00000000B, 10000000BDB 00000000B, 00000001B, 00000000B, 00000000BDB 00000010B, 00000000B, 00000000B, 00000100BDB 00000000B, 00000000B, 00001000B, 00000000BDB 00000000B, 00010000B, 00000000B, 00000
28、000BDB 00100000B, 00000000B, 00000000B, 01000000BDB 00000000B, 00000000B, 10000000B, 00000000BDB 00000001B, 00000000B, 00000000B, 00000010BDB 00000000B, 00000000B, 00000100B, 00000000BDB 00000000B, 00001000B, 00000000B, 00000000BDB 00010000B, 00000000B, 00000000B, 00100000BDB 00000000B, 00000000B, 0
29、1000000B, 00000000BDB 00000000B, 10000000B, 00000000B, 00000000BEND11-4试设计一个顺序开关灯控制器, 要求当按钮K第一次按下时,灯A立刻亮,灯B在延时11秒钟后 亮,在灯B亮后15秒,灯C亮;当按钮K第2次按下时,灯C立刻灭,延时17秒后灯B灭,灯B灭后12 秒,灯A灭。#include#define uint unsigned intunsigned char sum=0;灯*/ 灯*/ 灯*/void delay(char);sbit asight=PIP; /*Asbit bsight=PIX; /*Bsbit csight=卩1人2; /*C void key
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1