1、第一章习题2.根据程序存储器的差别,单片机可以分为哪几种类型?答:MCS-51 系列单片机按片内不同程序存储器的配置来分,可以分为以下 3 种类型:片内带 Mask ROM(掩膜 ROM)型:8051、80C51、8052、80C52。此类芯片是由半导体厂家在芯片生产过程中,将用户的应用程序代码通过掩膜工艺制作到 ROM 中。其应用程序只能委托半导体厂家“写入” ,一旦写入后不能修改。此类单片机适合大批量使用。片内带 EPROM 型: 8751、87C51 、8752。此类芯片带有透明窗口,可通过紫外线擦除存储器中的程序代码,应用程序可通过专门的编程器写入到单片机中,需要更改时可擦除重新写入。
2、此类单片机价格较贵,不宜于大批量使用。片内无 ROM(ROMLess)型:8031、80C31、8032。此类芯片的片内没有程序存储器,使用时必须在外部并行扩展程序存储器存储芯片。此类单片机由于必须在外部并行扩展程序存储器存储芯片,造成系统电路复杂,目前较少使用。3.单片机的主要特点是什么?它适宜构成通用微机系统还是专用微机系统?为什么?答:单片机是一种集成电路芯片,是采用超大规模集成电路技术把具有数据处理能力的中央处理器 CPU、随机存储器 RAM、只读存储器 ROM、多种I/O 口和 中断系统、定时器/计时器等功能(可能还包括显示驱动电路、脉宽调制电路、模拟多路转换器、 A/D 转换器等电
3、路)集成到一块硅片上构成的一个小而完善的计算机系统。其主要特点如下:1、价格便宜。10 元以内计算机。2、功能不大。只能专用在适用的领域。但在适用的领域中,性价比却是最佳。3、可靠性高,抗干扰能力强。4、功耗比较低。对电源要求低。适用面广。5、外围扩展能力强。可以应用到不同的控制系统中。根据其特点可知,单片机功能不大,适宜构成专用微机系统。4.研制微机应用系统时,应如何选择单片机的型号?答:在单片机应用研究系统开发中,单片机是整个设计的核心。设计者需要为单片机安排合适的外部器件,同时还需要设计整个控制软件,因此选择合适的单片机型号很重要。目前,市场上的单片机种类繁多,在进行正式的单片机应用研究
4、系统开发之前,需要根据不同单片机的特性,从中作出合理的选择。所以在单片机选型时,主要需要注意以下几点:1.仔细调查市场,尽量选用主流的、货源充足的单片机型号,这些器件使用比较广泛,有许多设计资料供学习或参考。2.尽量选择所需硬件集成在单片机内部的型号,例如ADC、 DAC、 I2C、SPI 和 USB 等。这样便于整个控制系统的软件管理,减少外部硬件的投入,缩小整体电路板的面积,从而减少总体投资等。3.对于手持设备,移动设备或者其他需要低功耗的设备,尽量选择低电压、低功耗的单片机型号,这样可以减少能量的消耗,延长设备的使用寿命。4.在资金等条件允许的情况下,尽量选择功能丰富,扩展能力强的单片机
5、,这样便于以后的功能升级和扩展。5.对于体积有限制的产品,尽量选择贴片封装的单片机型号,这样可以减少电路板面积,从而降低硬件成本,同时也有助于电磁兼容设计。第二章1、分别写出一个 MCS-51 中 ROM、EPROM 、无 ROM 型单片机的型号和内部资源。其中哪个产品内部具有固化的软件?该软件能否被所有用户所使用?怎样使用该种产品?答:片内带 Mask ROM(掩膜 ROM)型:8051、80C51 、8052、80C52。此类芯片是由半导体厂家在芯片生产过程中,将用户的应用程序代码通过掩膜工艺制作到 ROM 中。其应用程序只能委托半导体厂家“写入” ,一旦写入后不能修改。 片内带 EPRO
6、M 型:8751、87C51 、8752。此类芯片带有透明窗口,可通过紫外线擦除存储器中的程序代码,应用程序可通过专门的编程器写入到单片机中,需要更改时可擦除重新写入。片内无 ROM(ROMLess)型:8031、80C31、8032。此类芯片的片内没有程序存储器,使用时必须在外部并行扩展程序存储器存储芯片。MCS-51系 列 单 片 机 分 类 表子片片 片 寻I/O中无 ROM EPROM 计 并 串518031(80C320)8051 8751 4 128 264 216 48 1 580C31 80C51 87C51 4 128 264 216 48 1 5528032 8052 87
7、52 8 256 264 316 48 1 680C32 80C52 87C52 8 256 264 316 48 1 6其中 8051、80C51、8052、80C52 等产品具有固化软件,该软件不能被所有用户所使用,应用程序只能委托半导体厂家“写入” ,3.什么是堆栈?8032 的堆栈区可以设在什么地方?一般应设在什么区域?如何实现?试举例说明。答:堆栈是在片内 RAM 中专门开辟出来的一个区域,数据的存取是以 “后进先出“ 的结构方式处理的。实质上,堆栈就是一个按照“ 后进先出“原则组织的一段内存区域。8032 的堆栈区原则上可以设在内部 RAM 中的 00H-FFH 的任意区域内,一般
8、应设在 30H-7FH 的范围内。通过赋值的方式实现,如:MOV SP,#60H。4.8031 的内部 RAM 中,哪些可以作为数据缓冲区?在 8031 内部 RAM 中 工作寄存器区 00H1FH 和位寻址区 20H2FH 可以作为数据缓冲区。6.MCS-51 单片机构成系统时,程序存储器的容量最大是多少?答:MCS-51 单片机构成系统时,程序存储器的容量最大是 64KB。7.当单片机系统的程序存储器的容量为 8KB 时,程序存储器的开始地址为多少?答:单片机内部无 ROM 时, (EA/=0 时,只访问外部 ROM)ROM 为外部ROM,开始地址为 0000H-1FFFH,(8KB=2
9、13=8192D=2000H,故,地址为 2000H-1=1FFFH。)单片机内部有 ROM,一般为 4KB,地址范围为 0000H-0FFFH,外部 ROM 的开始地址为 1000H-1FFFH。 (EA/=1 时)9.当单片机系统外部数据存储器的容量为 8KB 时,数据存储器的开始地址一定要是 0000H 吗?答:不一定,只有是间隔 1FFFH 个字节,都可以.第三章1. 指出下列指令中划线操作数的寻址方式和指令的操作功能 MOV A, #78H;立即寻址,将立即数送入累加器 AMOV A, 78H; 直接寻址,将内部 RAM 78H 单元内容送累加器 A MOV A, R6; 寄存器寻址
10、,将 R6 内容送累加器 AINC R0; 寄存器间接寻址,将指针 R0 指向的内部 RAM 单元内容加 1 PUSH ACC; 寄存器寻址,将累加器 A 的内容入栈 RL A; 寄存器寻址,将累加器 A 的内容左移 1 位 CPL 30H; 位寻址,将位变量 30H 的内容取反 SJMP $; 相对寻址,死循环指令 MOVC A, A+PC;基寄存器加变址寄存器间接寻址,程序存储器 PC 和累加器 A 中内容相加,送到累加器 A 2. 指出下列指令中哪些是非法的? DEC DPTR DEC DPLMOV A, R2 MOV A, R1MOV R1, R0 MOV A, R0 MOV P1.1
11、, 30H MOV P1.1, C 或者 MOV C, 30H MOV #30H, A MOV A, #30H MOV OV, 30H MOV PSW.7,CMOV A, A+DPTR MOVC A, A+DPTRRRC 30H RRC A 所有的移位指令均是对累积器 A 进行的。RL B RL AXRL C, 30H 错,因为位操作指令中,没有位的异或运算3. 如何将 1 个立即数 30H 送入内部 RAM 90H 单元?如何将立即数送特殊功能寄存器 P1? (1) MOV R0, #90H MOV R0, #30H 能不能直接 MOV 90H, #30H?不能,因为内部 RAM的高 128
12、 字节只能用寄存器间接寻址。(2) MOV P1, #30H 4. 执行下列一段程序后,试分析有关单元内容。 MOV PSW, #0; PSW=00HMOV R0, #30H; (R0)=30HMOV 30H, #40H (30H)=40HMOV 40H, #50 (40H)=50HMOV A, R0 (A)=40HADDC A, #0CEH (A)=40H+0CEH+0=0EH PSW=10000101B=85HINC R0 (R0)=31H执行结果:(R0)=31H, (30H)=40H, (40H)=50, (A)=0EH, (PSW)=85H 这里特别注意 OV 的值。在带符号数的加减
13、运算中,OV=1 表示加减运算超出了累积器 A 所能表示的有符号数范围(-128-+127) ,即产生了溢出,因此运算结果是错误的;反之,OV=0 表示运算结果正确,即无溢出产生。OV=CY 和CY1 的异或。其中 CY1 为第六位向第七位是否有进位或借位,有,为CY1=1,没有,CY1=0。执行加法 ADD 时,当位 6 向位 7 进位,而位 7 不向 C 进位时,OV=1。或者位6 不向位 7 进位,而位 7 向 C 进位时,同样 OV=1。5. 试编写一段程序,内部 RAM 40H、41H 单元内容传送到外部 RAM 2000H、2001H 单元中。 MOV DPTR, #2000H M
14、OV R0, #40H MOV A, R0 MOVX DPTR, A INC R0 INC DPTR MOV A, R0 MOVX DPTR, A 6. 试编写一段程序,根据累加器 A 的内容,到程序存储器 1000H 起始的表格中取一双字节数,送内部 RAM 50H、51H 单元。 MOV DPTR, #1000H PUSH ACC MOVC A, A+DPTR MOV 50H, A POP ACCINC DPTR MOVC A, A+DPTR MOV 51H, A 7. 试编写一段程序,进行两个 16 位数的相减运算: 6483H-56E2H。结果高 8位存在内部RAM 40H,低 8 位
15、存 41H。 CLR C MOV A, #83H SUBB A, #0E2H MOV 41H, A MOV A, #64H SUBB A, #56H MOV 40H, A 8. 试编写一段程序,将 30H、31H 单元中存放的 BCD 数,压缩成一个字节(原 30H 单元内容为高位) ,并放入 30H 单元。 MOV A, 30H SWAP A ORL A, 31H 9. 试编写一段程序,将 30H32H 单元中的压缩 BCD 拆成 6 个单字节 BCD 数,并放入33H38H 单元。 MOV SP, #60H MOV A, 30H MOV R0, #33H ACALL H2ASCMOV A,
16、 31H ACALL H2ASC MOV A, 32H ACALL H2ASC SJMP $ H2ASC: MOV B, AANL A, #0FHMOV R0, A INC R0 MOV A, B SWAP A ANL A, #0FH MOV R0, A INC R0 RET 10. 设晶振频率为 6MHz,试编写一个延时 1ms 的子程序,并利用该子程序,编写一段主程序,在 P1.0 引脚上输出高电平宽 2ms、低电平宽 1ms 的方波信号。MOV SP, #60H LOOP: SETB P1.0ACALL DELAYACALL DELAYCLR P1.0ACALL DELAY SJMP L
17、OOP DELAY: MOV R0, #248; 1T DJNZ R0, $; 2TNOP; 1T RET 2T 延时计算:1T+248*2T+1T+2T=500T=1ms 第四章5.晶振为 12MHz,用 T0 产生 1ms 的定时,可以选择哪几种方式?分别写出定时器的方式字和计数初值。如需要 1s 的定时,应如何实现?答:由于定时器工作在方式 2 和方式 3 下时的最大定时时间只有 0.256ms,因此要想获得 1ms 的定时时间,定时器必须工作在方式 0 或方式 1。机器周期为 T 计数 =121/1210-6s=1s若采用方式 0,定时器的方式字 TMOD 为:00H,根据公式可得定时
18、器的计数初值为:TC= MT/ T 计数 = 213 1*10 3/1=7192=1C18H即:TH0 应装0E0H;TL0 应装#18H(高三位为 0)若采用方式 1,定时器的方式字 TMOD 为:01H,根据公式可得定时器的计数初值为:TC= MT/ T 计数 = 216 1*10 3/1=64536=FC18H即:TH0 应装0FCH ;TL0 应装#18H如需要 1s 的定时,可以采用循环定时,增加循环次数。第五章1.若晶振为 6MHz,试编写一个 2ms 延时子程序。DELAY: MOV R0, #498; 1T DJNZ R0, $; 2TNOP; 1T RET 2T 延时计算:1
19、T+498*2T+1T+2T=1000T=2ms 6. 试设计一个 n 字节的无符号十进制数加法子程序,其功能为将(R0)和(R1)指出的内部 RAM 中两个 n 字节压缩 BCD 码无符号十进制数相加,结果存放于被加数单元中。子程序入口时,R0,R1 分别指向被加数和加数的低位字节,字节数n 存于 R2,出口时 R0 指向和的最高位字节,CY 为进位位。 LEN EQU 30 ORG 0000H AJMP MAIN ORG 0030H MAIN: MOV SP. #60H MOV R2, #LEN ACALL ADD_NBYTE SJMP $ ADD_NBYTE: CLR C LOOP: M
20、OV A, R0 ADDC A, R1 DA A MOV R0, A INC R0 INC R1 DJNZ R2, LOOP RET END 11. 试设计一个子程序,其功能为将(R0)指出的内部 RAM 中 6 个单字节正整数按从小到大的次序重新排列。 S_2_L: MOV R4, #5 CLR F0PUSH 00H ;R0 入栈POP 01H ;出栈赋给 R1INC R1 LOOP0: MOV A, R4 MOV R5, A LOOP1: MOV A, R0MOV B, AMOV A, R1 CJNE A, B, NEXTSJMP NOCH NEXT: JNC NOCHSETB F0MOV R0, AXCH A, BMOV R1, A NOCH: INC R0INC R1DJNZ R5, LOOP1 JNB F0, HALT DJNZ R4, LOOP0