1、1 习题一 1.什么是单片机?单片机全称单片微型计算机。它是把计算机中的微处理器、只读存储器(ROM)、随机访问存储器(RAM)、I/O 接口、串行接口、中断系统、定时/计数器等基本功能部件微型化并集成到一块芯片上构成的小而完善的计算机。2.单片机的主要用途是什么?单片机有体积小、功耗低、面向控制、抗干扰能力强、性价比高等优点,被广泛应用于家用电器、办公自动化、工业控制、智能仪器仪表与集成智能传感器、汽车电子与航空航天电子系统等各种控制系统中。习题二 2-1.STC12C5A60S2单片机的内部集成了哪些功能部件?各个功能部件的具体功能是什么?在 STC12C5A60S2 单片机内部,其基本结
2、构主要有中央处理器 CPU、程序存储器、数据存储器、定时/计数器、UART 串行口、I/O 接口、高速 A/D 转换、同步串行外围接口、PCA、看门狗 WDT 及片内 RC 振荡器和外部晶体震荡电路等模块组成。各部件功能:中央处理器 CPU:负责运算控制和调度,使整个系统协调工作。程序存储器:用于存放用户程序、数据和表格等信息。数据存储器:用于存放单片机运行过程中的运算数据及运算地址等。定时/计数器:常用定时器时钟来实现定时检测、定时控制;还可以用定时器产生毫秒宽的脉冲,来驱动步进电机一类的电器机械。计数器主要用于外部事件的计数。看门狗 WDT:在单片机出现运行紊乱时,可以使单片机重新启动,恢
3、复正常运行。I/O 接口:单片机通过 I/O 引脚进行输入,输出操作。振荡器:产生单片机运行所需要的时钟信号。2-2.封装模式为 LQFP-48、PDIP-40 的 STC12C5A60S2单片机的I/O 引脚各有多少?P0、P2 口各有什么功能?封装模式为 LQFP-48 的 STC12C5A60S2 单片机有 48 个引脚,44 个 I/O 引脚。封装模式为 PDIP-40 的 STC12C5A60S2 单片机有 40 个引脚,36 个 I/O 引脚。P0 口和 P2 口都可以作为通用的 I/O 口使用;当单片机访问外部扩展电路或设备时,P0 口可以作为地址总线的低 8 位及数据总线接口,
4、地址/数据分时复用,P2 口作为地址总线的高 8 位。2 2-3.简述 PSW寄存器各位的作用。若寄存器 A 中的内容为 63H,P标志位为何值?CY:进位或借位标志位,简称 C。在执行 8 位的加、减法指令时,用于记录最高位的进位或借位。有进位或借位时则置位,否则清零。AC:辅助进位标志位,在执行加减法时,若 D3 向 D4 有进位或借位时,AC置位,否则 AC 清零。OV:溢出标志位。在执行加减法运算时,若运算的结果超出 8 位有符号数表示的范围-128-+127,表示溢出,OV 置 1,否则 OV 清零。P:奇偶校验标志位。用于记录 A 寄存器中的 1 的个数的奇偶性。若 A 寄存器中
5、1 的个数为奇数,则 P 置位,为偶数则清零。RS1、RS0:寄存器组选择位,用来选择当前的工作寄存器组。F0、F1:用户标志位。若寄存器 A 中的内容为 63H(01100011B),A 中“1”的个数为 4,所以 P0。2-4.STC12C5A60S2单片机内部有哪几类存储器?中断服务程序的入口地址分布在哪个区域?STC12C5A60S2 单片机内部有程序存储器、数据存储器 RAM、特殊功能寄存器、扩展 RAM。中断服务程序的入口地址位于程序存储器的首部。2-5.STC 系列单片机系统复位后,程序存储器指针 PC 的值是多少?当单片机正在执行某一条指令时,PC 指向哪里?STC 系列单片机
6、系统复位后,程序存储器指针 PC 的值是 0000H。当单片机正在执行某一条指令时,PC 指向下一条指令的地址。2-6.片内 RAM中,数据存储器的低 128 字节、高 128 字节和特殊功能寄存器可以使用什么寻址方式?哪些单元可作为工作寄存器区,那些单元可以位寻址?访问低 128 字节 RAM 时,既能采用寄存器直接寻址,又可寄存器间接寻址。访问高 128 字节 RAM 时,只能采用寄存器间接寻址,但可以作为堆栈区。访问特殊功能寄存器,只能直接寻址。00H-1FH 为工作寄存器组区;片内 RAM 中 20H-2FH 单元为位寻址区。2-7.在片内 RAM中,位地址为 30H 的位属于字节地址
7、为多少的单元?字节地址为 26H。3 2-8.STC 系列单片机复位后,使用了哪一工作寄存器组?当 CPU 使用的工作寄存器组为 2 组时,R2 对应的 RAM地址是多少?STC 系列单片机复位后,所使用的工作寄存器组为 0 组;当 CPU 使用的工作寄存器组为 2 组时,R2 对应的 RAM 地址是 12H。2-9.什么是堆栈?简述 STC12C5A60S2单片机的堆栈处理过程。堆栈是在 RAM 中开辟的一片数据缓冲区,常用于保护 CPU 现场及临时数据,其操作遵循先进后出、后进先出的原则。STC12C5A60S2 单片机的堆栈处理过程:数据入栈时,SP 指针内容先自动加1,然后再将数据推入
8、到 SP 指针指向的单元;出栈时,先将 SP 指针所指向单元的数据弹出,然后 SP 指针的内容自动减 1.2-10.以下关于数据指针 DPTR和程序指针 PC 的概述是否正确?(1)DPTR 是可以访问的,而 PC 不能访问;(2)它们都是 16 位的寄存器;(3)它们都具有临时存储数据的功能;(4)DPTR 可以分成 2 个 8 位的寄存器使用,而 PC 不能。2-11.单片机与外部存储器连接时,P0 口用作地址/数据复用,需要添加什么芯片才能锁存 8 位地址信息?单片机与外部存储器连接时,P0 口用作地址/数据复用,需要添加地址锁存器,如 74LS373。2-12.如何设置 STC12C5
9、A60S2单片机 I/O 口工作模式?若设置P1.7 为强推挽输出,P1.6 为开漏,P1.5 为弱上拉,P1.4,P1.3,P1.2,P1.1,和 P1.0 为高阻输入,应如何设置相关寄存器?STC12C5A60S2 单片机上电复位后所有引脚都默认为准双向(弱上拉)方式。根据具体应用可由软件配置成:准双向、强推挽、仅为输入或开漏输出 4种工作方式。Px(x=0,1,2,3,4,5)口引脚的工作方式由特殊功能寄存器PxM1 和 PxM0 相应位的配置决定 I/O 口工作模式设定 PxM17:0 PxM07:0 I/O 口模式 0 0 准双向口(传统 8051I/O 口模式),灌电流可达 20m
10、A,拉电流为 230uA 0 1 强推挽输出,输入输出电流都能可达20mA。1 0 仅为输入(高阻)1 1 开漏,内部上拉电阻断开 若设置 P1.7 为强推挽输出,P1.6 为开漏,P1.5 为弱上拉(准双向),4 P1.4,P1.3,P1.2,P1.1,和 P1.0 为高阻输入,可通过以下的两条指令来完成:MOV P1M1,#01011111B;MOV P1M0,#11000000B;2-13.I/O口作为输入引脚,应工作在何种方式?读外部引脚状态时,为何要先向相应引脚对应的锁存器写入“1”?I/O 口作为输入引脚,应工作在准双向或仅为输入状态;在准双向口配置情况下,先输出高电平,使 d 管
11、截止,才可读到正确的外部输入状态。2-14.STC12C5A60S2单片机复位方式有哪些?复位后单片机的初始状态如何?STC12C5A60S2 单片机复位方式有上电复位、看门狗复位、外部低压检测复位、软件复位。复位后,单片机从用户程序区 0000H 处开始正常工作;堆栈指针 SP 指向07H,P0P3 为 FFH。习题三 31 使用 Proteus 对电路进行仿真,有哪些步骤?使用 Proteus 进行单片机系统设计、仿真主要有七个步骤,依次是新建设计文件,选取元件并加入列表区,将元件摆放到图形编辑窗口,放置电源、地线、布线、加载目标程序代码,运行仿真。32 在 Keil中,源程序文件从编辑到
12、生成*.hex文件,经过哪些过程?在 Keil 中,源程序文件从编辑到生成*.hex 文件要经过建立工程,建立源程序文件,建立文件和程序的连接,工作环境和参数的设置,再进行编译、连接可以生成目标文件。33 在 Keil中,如何对源程序文件进行软件模拟调试?Keil 软件中有一个仿真 CPU 用来模拟程序的执行,可以在没有硬件和仿真器的情况下进行程序的调试,这就是软件模拟调试的方法。对源文件进行软件模拟调试,首先要启动调试。对工程编译、连接成功以后,使用菜单“Debug”“Start/StopDebug Session”进入调试状态,按“Ctrl+F5”组合键或者使用按钮也能进入调试状态。这时,
13、源程序窗口的左侧出现一个黄色箭头,指向 main()函数的第一行,该箭头总是指向即将要运行的语句行。退出调试状态和启动调试状态方法一致。调试过程中使用最多的是“Debug”菜单,而该菜单上的大部分命令可以在5 “debug”工具栏中找到对应的快捷按钮。常用按钮有:运行,单步,过程单步,单步跳出,执行到当前,反汇编窗口,观察窗口,存储器窗口。其中单步调试方式特别常用。单步执行后,可以通过各个窗口观察执行结果,从而判断该条语句是否出现问题。如果程序较长,可以采用下面的方法来调试。首先,在合适的位置设置断点,方法为:在某一行上右击,弹出的快捷菜单中选择“Insert/Remove Breakpoin
14、t”。设置成功后,该行的前面会有红色方块指示。这时如果单击“运行”按钮,程序运行到断点处会自动停止。删除断点也需使用同样的方法。如果程序的运行要依赖于外围接口,例如并行口、串行口、中断、定时/计数器等,Keil 的“Peripherals”菜单中提供了一些选项,通过这些选项打开对应外围接口的对话选框,可以观察外围接口的状态,或者更改外围接口的运行情况。习题四 41 51 内核单片机有哪几种寻址方式?片内 RAM低 128 字节及高 128 字节分别支持哪些寻址方式?片内扩展 RAM、片外 RAM及特殊功能寄存器分别支持哪些寻址方式?51 内核单片机的寻址方式有:立即(数)寻址、寄存器寻址、直接
15、寻址、寄存器间接寻址、变址寻址、相对寻址、位寻址。片内 RAM 低 128 字节支持直接寻址、寄存器间接寻址。片内 RAM 高 128 字节支持寄存器间接寻址。片内扩展 RAM 及片外 RAM 支持间接寻址。特殊功能寄存器支持直接寻址。42 区分下列指令有什么不同?(1)MOV A,#22H 和 MOV A,22H MOV A,#22H;将立即数 22H 送入 A 寄存器中,第二操作数为立即寻址。MOV A,22H;把片内 RAM 字节地址为 22H 单元的内容送入 A 寄存器中,第二操作数为直接寻址。(2)MOV A,R1 和 MOV A,R1 MOV A,R1;把 R1 的内容送入 A 寄
16、存器中,第二操作数为寄存器寻址。MOV A,R1;将寄存器 R0 的内容作为 RAM 某单元的地址,将该单元的内容传送给 A 寄存器,第二操作数为寄存器间接寻址。(3)MOV A,R1 和 MOVX A,R1 MOV A,R1;将寄存器 R1 的内容作为片内 RAM 某单元的地址,将该单元的内容传送给 A 寄存器 MOVX A,R1;将寄存器 R1 的内容作为片内扩展或外部 RAM 某单元的地址,将该单元的内容传送给 A 寄存器 两者的区别是:MOV 访问的是内部 RAM,MOVX 访问的是片内扩展或外部 RAM。(4)MOVX A,R1 和 MOVX A,DPTR 主要的区别在于对外输出地址
17、的方式上。6 如果是访问片外扩展 RAM,MOVX A,R1 只是占用 P0 口,输出 R1 中的 8 位地址。而 MOVX A,DPTR 要占用 P0、P2 口,输出 DPTR 中的 16 位地址。(5)MOVC A,A+DPTR 和 MOVX A,DPTR MOVC A,A+DPTR;功能是 A 寄存器的内容作为无符号数和 DPTR 内容相加后得到一个 16 位的地址,将程序存储器中该地址的内容传送给 A。MOVX A,DPTR;以 DPTR 寄存器的值作为片内扩展 RAM 或者片外 RAM 的地址,将该地址单元的内容送入 A。两者的区别是 MOVC 访问的是整个 ROM 的 64KB 空
18、间;MOVX 访问的是整个片内扩展 RAM 或片外扩展 RAM。43 写出完成下列各项任务的指令。(1)片内 RAM 30H 单元的内容送到片内 RAM 50H 单元中。MOV 50H,30H(2)片内 RAM 40H 单元的内容送到片内扩展 RAM 50H 单元中。ANL AUXR,#11111101B MOV A,40H MOV DPTR,#50H MOVX DPTR,A(3)片内 RAM 50H 单元的内容送到片外 RAM 2000H 单元中。ORL AUXR,#00000010B MOV A,50H MOV DPTR,#2000H MOVX DPTR,A(4)片外 RAM 2000H
19、单元的内容送到片外 RAM 4000H 单元中。ORL AUXR,#00000010B MOV DPTR,#2000H MOVX A,DPTR MOV DPTR,#4000H MOVX DPTR,A(5)ROM 1000H 单元的内容送到片外 RAM 8000H 单元中。MOV DPTR,#1000H MOV A,#0 MOVC A,A+DPTR MOV DPTR,#8000H ORL AUXR,#00000010B MOVX DPTR,A(6)将程序状态字寄存器 PSW 内容传送到片内扩展 RAM 0D0H 单元中。ANL AUXR,#11111101B MOV A,PSW MOV DPTR
20、,#0D0H MOVX DPTR,A(7)将片内 RAM 01HFFH 单元内容清零。7 ANL PSW,#11100111B MOV R0,#0FFH MOV A,#0 LOOP:MOV R0,A DJNZ R0,LOOP(8)使片内 RAM 20H 单元的 b7、b6 位清零,b5、b4 位置 1,b3、b2 位取反,其余各位保持不变。ANL 20H,#00111111B ORL 20H,#00110000B XRL 20H,#00001100B 44 下列各条伪指令前的标号各代表的地址是多少?ORG 0100H TABLE:DS 4 ;TABLE 代表的的地址是 0100H WORD:D
21、B 15,0FFH,30 ;WORD 代表的地址是 0104H BIN EQU 0200H TAB1:DW 07H ;TAB1 代表的地址是 0107H 45 假设程序头文件中含有如下变量定义伪指令 DBUF DATA 40H BDATA DATA 60H(1)请指出如下指令中源操作数的寻址方式。MOV R0,#DBUF ;立即(数)寻址 MOV R0,DBUF ;直接寻址(2)执行如下程序段后,片内 RAM 40H4FH 单元的内容是什么?60H 单元的内容又是什么?MOV BDATA,#10H MOV R0,#DBUF CLR A LOOP:MOV R0,A INC A INC R0 DJ
22、NZ BDATA,LOOP 执行以上程序段后,片内 RAM 40H4FH 单元的内容是:0-0FH;60H 单元的内容为 0。46 编写一个延时 10ms的子程序。选择 STC12C5A60S2 单片机,系统时钟频率为 12MHz,程序如下:DELAY_10ms:MOV R7,#120 ;2T DL:MOV R6,#250 ;2T DJNZ R6,$;4T DJNR R7,DL ;4T RET ;4T 8 47 编程实现的逻辑运算。MOV C,P1.1 ORL C,P1.2 CPL C MOV PSW.5,C MOV C,P1.4 ANL C,/P1.3 ORL C,PSW.5 MOV P1.
23、0,C 48 将存放在片内 RAM 51H、52H 和片外 RAM 2000H、2001H的四位 BCD 码相加,结果存放在片内 RAM 50H、51H、52H 单元中(假设低位字节存放在高地址中,高位字节存放在低地址中)。ORL AUXR,00000010B MOV DPTR,#2001H MOVX A,DPTR ADD A,52H DA A MOV 52H,A MOV DPTR,#2000H MOVX A,DPTR ADDC A,51H DA A MOV 51H,A MOV A,#00H ADDC A,#00H MOV 50H,A 49 编程实现将片内扩展 RAM 0200H0220H单元
24、的内容,全部移到片内 RAM 30H单元开始的位置,并将原位置清零。MOV R0,#30H MOV DPTR,#0200H MOV R1,#21H ANL AUXR,#11111101B LOOP:MOVX A,DPTR MOV R0,A MOV A,#0 MOVX DPTR,A INC R0 INC DPTR 9 DJNZ R1,LOOP 410 将存放在 R3、R2 中的三位压缩 BCD 码转换为二进制形式。W_BCD_BI:LCALL B_BCD_BI;调用将 R2 中单字节 BCD 码转换为二进制数的子程序,;转换的结果存放于 A 寄存器中 MOV R4,A ;把转换结果暂时保存到 R
25、4 MOV A,R3 ;取 BCD 码的高 1 位 MOV B,#100 MUL AB ;计算(a3*10+a2)*100 ADD A,R4 ;加低 2 位转换结果 MOV R2,A ;保存转换结果的低 8 位 MOV A,B ;取(a3*10+a2)*100 的高 8 位 ADDC A,#0 ;加进位位 MOV R3,A ;保存转换结果的高 8 位.B_BCD_BI:MOV A,R2 ;取 BCD 码 ANL A,#0F0H ;保留高 4 位(即十位)SWAP A MOV B,#10 MUL AB ;十位*10,最大为 90(即 5AH),因此高 8 位为 0 MOV B,A ;乘积暂存到
26、B 寄存器 MOV A,R2 ;取 BCD 码 ANL A,#0FH ;保留个位 ADD A,B ;个位加“十位*10”,结果在 A 寄存器中 RET 411 编写程序完成运算 R0R1R2R3,乘积存 R4、R5、R6 和R7 中。MUL:CLR A MOV R4,A MOV R5,A MOV R6,A MOV R7,A MUL1:MOV A,R1 MOV B,R3 MUL AB MOV R7,A MOV R6,B MUL2:10 MOV A,R0 MOV B,R3 MUL AB ADD A,R6 MOV R6,A CLR A ADDC A,B MOV R5,A MUL3:MOV A,R1
27、MOV B,R2 MUL AB ADD A,R6 MOV R6,A MOV A,R5 ADDC A,B MOV R5,A CLR A ADDC A,0 MOV R4,A MUL4:MOV A,R0 MOV B,R2 MUL AB ADD A,R5 MOV R5,A MOV A,R4 ADDC A,B MOV R4,A RET 习题五 51 在 C51 语言中支持哪些数据类型?C51 特有的数据类型有哪些?在 C51 语言中支持的数据类型有:char(字符型)、int(整型)、long(长整形)、float(浮点型)、特殊功能寄存器类型和位类型。C51 特有的数据类型有:特殊功能寄存器类型和位类
28、型。11 52 C51 中的存储器类型有几种,它们分别表示的存储器区域是什么?C51 中的存储器类型有:data、bdata、idata、pdata、xdata、code 存储器类型 与硬件存储器空间的对应关系 data 直接寻址的片内 RAM 低 128B,访问速度快 bdata 片内 RAM 可位寻址区(20H-2FH),允许字节和位混合访问 idata 用 Ri 间接寻址的片内 RAM 全部地址空间 pdata 用 Ri 间接访问的片内扩展 RAM 或片外扩展 RAM 低 256B xdata 用 DPTR 间接访问的片内扩展 RAM 或片外扩展 RAM(64K)code 程序存储器 R
29、OM 空间(64KB)53 在 C51 中,bit位与 sbit位有什么区别?两种位变量的区别在于,用 bit 定义的位变量,其地址由 C51 编译时予以安排,而用 sbit 定义位变量时必须同时定义其位地址,在 C51 编译器编译时,其位地址不可变化。54 在 C51 中,中断函数与一般函数有什么不同?(1)中断函数不能进行参数传递(2)中断函数没有返回值(3)在任何情况下都不能直接调用中断函数(4)如果在中断函数中调用了其他函数,则被调用函数使用的工作寄存器必须与中断函数相同。否则会产生不正确的结果。(5)在中断函数中调用其他函数,被调函数最好设置为可重入的,因为中断是随机的,有可能中断函
30、数所调用的函数出现嵌套调用。(6)C51 编译器对中断函数编译时会自动在程序开始和结束处加上相应的内容。(7)中断函数最好写在文件的尾部,并且禁止使用 extern 存储类型说明。55 请分别定义下列变量:(1)片内 RAM 中无符号字符型变量 x;unsigned char idata x;(2)片内 RAM 中位寻址区无符号字符型变量 y,将 y.0y.2 再分别定义为位变量 key_in、key_up、key_down;片内 RAM 中位寻址区无符号字符型变量 y:unsigned char bdata y;定义 y.0y.2 为位变量 key_in、key_up、key_down:sb
31、it key_in=y0;sbit key_up=y1;sbit key_down=y2;(3)片外 RAM 中整型变量 x,并指定变量 x 的绝对地址为 4000H;#define x XWORD0X2000 或:xdata int x _at_ 0 x4000;(4)特殊功能寄存器变量 PCON;12 sfr PCON=0X87 56 用 C51 语言写出整型变量 a 左移 4 位的语句。int a;a=a4;57 用 C51 语言编程实现,片内扩展 RAM的 000EH单元和000FH单元的内容交换。#include#include void swap()char data c,d;AU
32、XR&=0 xFD;c=XBYTE0 x000E;d=XBYTE0 x000F;XBYTE0 x000E=d;XBYTE0 x000F=c;58 已知 x=375,y=589,用 C51 语言编写程序,计算 z=x+y 的结果。int add()int x,y,z;x=375;y=589;z=x+y;return z;59 试用 C51 语言编写程序实现将片内 RAM 21H单元存放的两位BCD 码数转换为十六进制数存入 30H 单元。data unsigned char y1 _at_ 0 x21;data unsigned char y2 _at_ 0 x30;void trans()un
33、signed char temp;temp=y1;y1=(y1&0 xf0)4;y2=y1*10+(temp&0 x0f);13 510 试用 C51 语言编写程序实现将片内 RAM 30H、31H 单元存放的 2 字节十六进制数转换为十进制数存于 21H 为首的单元中。(设低地址存放高位字节)#include#include#define uint unsigned int#define uchar unsigned char uchar digit_h _at_ 0 x30;uchar digit_l _at_ 0 x31;uchar *p;int buf;void H_D()buf=di
34、git_h*256;buf=buf+digit_l;for(p=0 x25;p=0 x21;P-)*p=buf%10;buf=buf/10;511 试用 C51 语言编写程序实现将 09,AF 十六进制数转换成相应的 ASCII 码。#include void H_A(unsigned char X)if(X=9)X=X+0 x30;else X=X+0 x37;return X 512 参见图 53,通过单片机的并行口 P1,控制 8 路 LED 灯轮流且循环点亮。引脚为 0 时灯亮,为 1 时灯熄灭。#include 14#incldue unsigned char i=0 x7f;voi
35、d main()while(1)P1=i;delay();i=_cror_(i,1);void delay()unsigned char l,m,n;for(l=0;l254;l+)for(m=0;m254;m+)for(n=0;n254;n+);习题 6 61 如何在 C51 程序中嵌入汇编?第一步:通过预编译命令“#pragma asm”和“#pragma endasm”在 C 语言代码中插入汇编语言代码。第二步:在 KeilC51 环境下,在 Project 窗口中包含汇编代码的 C 文件上单击右键,在弹出的快捷菜单中选择“Options for”命令,再次点击选中右边的“Generat
36、e Assembler SRC File”和“Assembler SRC file”复选框,使检查框由灰色变成黑色状态。第三步:根据选择的编译模式,把相应的库文件(如 Small模式时,是KeilC51LibC51S.Lib)加入到工程中,该文件必须作为工程的最后文件。库文件与编译模式的关系如下:C51S.LIB_ 没有浮点运算的 Small 模式 C51C.LIB_ 没有浮点运算的 Compact 模式 C51L.LIB_ 没有浮点运算的 Large 模式 C51FPS.LIB_ 带浮点运算的 Small 模式 C51FPC.LIB_ 带浮点运算的 Compact 模式 C51FPL.LIB
37、_ 带浮点运算的 Large 模式 第四步:编译,生成目标代码。62 简述在 C51 中调用汇编程序的实现方法。在 C51 中调用汇编程序,要把用 C 语言编写的程序保存为扩展名为.C 的 C语言文件,把用汇编语言编写的程序保存为扩展名为.asm、.SRC 或者.A51 的汇编语言文件,然后把这些文件导入到同一个工程下进行编译连接。15 在 C 语言中调用汇编程序时,对被调用函数(汇编语言函数)要在主调函数(C 语言函数)所在文件中作出声明,并且对汇编语言程序有一下要求:(1)要使用 SEGMENT 伪指令定义可再定位的 CODE 段。(2)要根据不同的情况对函数名进行转换,见表 6-1。(3
38、)要使用 PUBLIC 伪指令将被调用函数说明为外部可用函数。(4)若有参数传递,按照表 6-3 所列的规则使用参数。(5)若有返回值,按照表 6-4 所列规则存入寄存器。习题 7 71 什么是中断?CPU 为什么要采用中断结构?中断是指 CPU 正在执行某程序时,外部或者内部发生了随机的事件,请求CPU 迅速去处理,CPU 暂时停止现行的程序的执行,而自动转去执行预先安排好的处理该事件的服务子程序。处理完成后返回到断点处继续执行。中断结构使 CPU 具有随机应变的能力,提高了 CPU 效率,增强了实时性。72 STC12C5A60S2单片机有哪几个中断源?单片机响应各中断后,应如何清除相应中
39、断标志位?其中断服务程序的入口地址各是多少?STC12C5A60S2 单片机有 10 个中断源:外部中断 0(INT0)、定时/计数器T0、外部中断 1(INT1)、定时计数器 T1、串行口 1(UART1)、A/D 转换、串行口 2(UART2)、低压检测(LVD)中断、PCA 中断和 SPI 中断。单片机响应各中断后,相应中断标志位的清除:IE0、IE1:外部中断 0、外部中断 1 设置为下降沿触发方式时,CPU 响应该中断时由硬件自动将 IE0、IE1 位清 0,如果设置为低电平触发方式,必须在程序中通过指令清 0。TF0、TF1 中断响应后由内部硬件电路自动清 0。其余各中断标志位都要
40、通过用户程序清 0。中断服务程序的入口地址:INT0:0003H T0:000BH INT1:0013H T1:001BH UART1:0023H ADC:002BH LVD:0033H PCA:003BH UATR2:0043H SPI:004BH 73 STC12C5A60S2单片机的中断系统中有几个优先级?如何设定?当中断优先级相同时,其自然优先权顺序是怎样的?STC12C5A60S2 单片机的中断系统中有 4 个优先级。STC 系列单片机中,设置特殊功能寄存器 IP、IP2、IPH、IP2H 可以实现 4个中断优先级选择。当中断优先级相同时,如果其中的几个中断源同时产生中断请求,中断源
41、响应中断的次序取决于内部的查询次序。各中断源中断优先查询次序由高到低依次是:INT0、T0、INT1、T1、UART1、ADC、LVD、PCA、UATR2、SPI 16 74 简述 STC12C5A60S2单片机的中断嵌套原则。1.在运行低优先级中断源的中断服务程序中,能被高优先级的中断源中断,反之不能。2.任何中断,一旦得到 CPU 响应,就不会被同一中断优先级别的中断源中断。75 中断响应过程中,为什么要保护现场?如何保护?因为中断服务程序会用到一些寄存器和存储器,如果不保护现场,这些寄存器和存储器中的数据就会覆盖,当中断返回继续运行原来的程序时,就会得到错误的结果。所以通常要保护现场。保
42、护现场的方法是把中断程序中用到的寄存器、存储器等要保护的内容压入到堆栈。76 STC 系列单片机中如何选择和设置外部中断的边沿触发和电平触发方式?TCON 寄存器中的 IT0/TCON.0 和 IT1/TCON.2 决定了外部中断 0 和 1 是下降沿触发还是低电平触发。当 ITx=1(x=0,1),系统在 INTx(x=0,1)引脚检测到下降沿后产生外部中断。当 ITx=0(x=0,1),系统在 INTx(x=0,1)引脚检测到低电平后产生外部中断。77 在 STC12C5A60S2单片机中,假设系统的时钟频率为12MHz,利用定时/计数器 T0,分别用汇编语言和 C51 编程实现在P1.0
43、 引脚输出周期为 2s 的方波。用寄存器 R2 作为定时器 T0 中断次数计数器。分析:要产生周期 2s的方波,需定时 1s。选择 12T 模式,T0 x12=0,f=12MHz,机器周期 T=us112*M121,T0 工作在方式 1,最大定时时间为msT536.65*216,所以一个定时器完成不了定时 1s的任务。可以利用 R2 计数 20 次,每次定时 50ms,则ms50us1*C-216)(,计数初值 C=15536=3CB0H,(1)汇编程序:ORG 0000H LJMP MAIN ORG 000BH ;T0 的中断向量入口地址 LJMP T0_INT 17 ORG 0100H M
44、AIN:MOV SP,#0BFH;初始化堆栈指针 MOV TMOD,#01H;T0 工作在方式 1 MOV TL0,#0B0H ;给 T0 写入初值 MOV TH0,#03CH MOV R2,#20 ;利用寄存器 R2 计数 20 次 SETB EA ;开放总中断 SETB ET0 ;T0 溢出中断允许 SETB TR0 ;启动 T0 开始工作 SJMP$T0_INT:MOV TL0,#0B0H;重新赋初值 MOV TH0,#03CH DJNZ R2,NEXT CPL P1.0 MOV R2,#20 ;重新赋给 R2 值 20 NEXT:RETI END(1)C51 程序:#include/s
45、bit P1_0=P10;unsigned char i=0;void main()TMOD=0 x01;/T0 工作在方式 1 TL0=0 xB0;/给 T0 装入初值 TH0=0 x3C;EA=1;/开放总中断 ET0=1;/T0溢出中断允许 TR0=1;/启动 T0 开始工作 while(1);void T0_INT()interrupt 1 /T0中断服务程序 TH0=0 x3C;TL0=0 xB0;/重新置入初值 i+;if(i=20)P1_0=P1_0;i=0;18 78 由 P1 口驱动 8 个指示灯,利用定时/计数器 T1 的定时功能分别用汇编语言和 C51 编程实现 8 个指
46、示灯依次循环点亮(输出高电平),点亮间隔为 1s,反复循环。分析:仿照上题,T1 需定时 50ms,R7 计数 20 次,达到定时 1s的目的,每隔 1s,循环一次,实现轮流点亮。(1)汇编程序 ORG 0000H LJMP MAIN ORG 001BH ;T1 的中断向量入口地址 LJMP T1_INT ORG 0100H MAIN:MOV SP,#0BFH;初始化堆栈指针 MOV TMOD,#10H;T1 工作在方式 1 MOV TL1,#0B0H ;给 T1 写入初值 MOV TH1,#03CH MOV R7,#20 ;利用寄存器 R7 计数 20 次 MOV A,#01H SETB E
47、A ;开放总中断 SETB ET1 ;T1 溢出中断允许 SETB TR1 ;启动 T1 开始工作 SJMP$T1_INT:MOV TL1,#0B0H;重新赋初值 MOV TH1,#03CH DJNZ R7,NEXT ;R7减 1 不为 0,说明中断次数未到 20 次,跳转到 NEXT;处返回 MOV P1,A;RL A ;为下一次做准备 MOV R7,#20 ;重新赋给 R7 值 50 NEXT:RETI END(2)C51 程序:#include unsigned char i=0;unsigned char j;void main()TMOD=0 x10;/T1 工作在方式 1 TL1=
48、0 xB0;/给 T1 装入初值 TH1=0 x3C;j=0 x01;EA=1;/开放总中断 19 ET1=1;/T1溢出中断允许 TR1=1;/启动 T1 开始工作 while(1);void T1_INT()interrupt 3/T1中断服务程序 TH1=0 x3C;TL1=0 xB0;/重新置入初值 i+;if(i=20)P1=j;/已定时中断 20 次 i=0;j=_crol_(j,1);79 假设 STC12C5A60S2单片机的系统时钟频率为 12MHz,利用定时/计数器 T1 在方式 1 下的功能,分别用汇编语言和 C51 编程实现测量 P3.3(1INT)引脚上的正脉冲的宽度
49、(单位 s)。汇编程序:;计时数据存放到 60H(高位字节)、61H、62H 单元。ORG 0 LJMP START ORG 001BH LJMP T1_INT START:MOV TMOD,#90H MOV TL1,#00H MOV TH1,#00H MOV R0,#60H MOV A,#0 SETB EA;SETB ET1;JB P3.3,$SETB TR1 JNB P3.3,$JB P3.3,$CLR TR1 MOV R0,A INC R0 MOV R0,TH1 INC R0 20 MOV R0,TL1 SJMP$T1_INT:INC A RETI END C51 语言:#include
50、#include/声明本征函数库#define uchar unsigned char sbit P3_3=P33;uchar nvar0=0,nvar1,nvar2;/存放计时数据 void main()TMOD=0 x90;TH1=0 x00;TL1=0 x00;EA=1;ET1=1;while(P3_3=1);/等待 P3.3 变低 TR1=1;/P3_3 为低电平时,启动 T1 工作 while(P3_3=0);/等待 P3.3 变高 while(P3_3=1);/等待 P3.3 再变低 TR1=0;/T1 停止计数 nvar1=TH0;nvar2=TL0;while(1);void
©2010-2024 宁波自信网络信息技术有限公司 版权所有
客服电话:4008-655-100 投诉/维权电话:4009-655-100