单片机原理与应用-基于汇编、C51及混合编程1-11章习题解答_第1页
单片机原理与应用-基于汇编、C51及混合编程1-11章习题解答_第2页
单片机原理与应用-基于汇编、C51及混合编程1-11章习题解答_第3页
单片机原理与应用-基于汇编、C51及混合编程1-11章习题解答_第4页
单片机原理与应用-基于汇编、C51及混合编程1-11章习题解答_第5页
已阅读5页,还剩58页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

63习题一1.什么是单片机?单片机全称单片微型计算机。它是把计算机中的微处理器、只读存储器(ROM)、随机访问存储器(RAM)、I/O接口、串行接口、中断系统、定时/计数器等基本功能部件微型化并集成到一块芯片上构成的小而完善的计算机。2.单片机的主要用途是什么?单片机有体积小、功耗低、面向控制、抗干扰能力强、性价比高等优点,被广泛应用于家用电器、办公自动化、工业控制、智能仪器仪表与集成智能传感器、汽车电子与航空航天电子系统等各种控制系统中。习题二2-1.STC12C5A60S2单片机的内部集成了哪些功能部件?各个功能部件的具体功能是什么?在STC12C5A60S2单片机内部,其基本结构主要有中央处理器CPU、程序存储器、数据存储器、定时/计数器、UART串行口、I/O接口、高速A/D转换、同步串行外围接口、PCA、看门狗WDT及片内RC振荡器和外部晶体震荡电路等模块组成。各部件功能:中央处理器CPU:负责运算控制和调度,使整个系统协调工作。程序存储器:用于存放用户程序、数据和表格等信息。数据存储器:用于存放单片机运行过程中的运算数据及运算地址等。定时/计数器:常用定时器时钟来实现定时检测、定时控制;还可以用定时器产生毫秒宽的脉冲,来驱动步进电机一类的电器机械。计数器主要用于外部事件的计数。看门狗WDT:在单片机出现运行紊乱时,可以使单片机重新启动,恢复正常运行。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位及数据总线接口,地址/数据分时复用,P2口作为地址总线的高8位。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寄存器中1的个数为奇数,则P置位,为偶数则清零。RS1、RS0:寄存器组选择位,用来选择当前的工作寄存器组。F0、F1:用户标志位。若寄存器A中的内容为63H(01100011B),A中“1”的个数为4,所以P=0。2-4.STC12C5A60S2单片机内部有哪几类存储器?中断服务程序的入口地址分布在哪个区域?STC12C5A60S2单片机内部有程序存储器、数据存储器RAM、特殊功能寄存器、扩展RAM。中断服务程序的入口地址位于程序存储器的首部。2-5.STC系列单片机系统复位后,程序存储器指针PC的值是多少?当单片机正在执行某一条指令时,PC指向哪里?STC系列单片机系统复位后,程序存储器指针PC的值是0000H。当单片机正在执行某一条指令时,PC指向下一条指令的地址。2-6.片内RAM中,数据存储器的低128字节、高128字节和特殊功能寄存器可以使用什么寻址方式?哪些单元可作为工作寄存器区,那些单元可以位寻址?访问低128字节RAM时,既能采用寄存器直接寻址,又可寄存器间接寻址。访问高128字节RAM时,只能采用寄存器间接寻址,但可以作为堆栈区。访问特殊功能寄存器,只能直接寻址。00H-1FH为工作寄存器组区;片内RAM中20H-2FH单元为位寻址区。2-7.在片内RAM中,位地址为30H的位属于字节地址为多少的单元?字节地址为26H。2-8.STC系列单片机复位后,使用了哪一工作寄存器组?当CPU使用的工作寄存器组为2组时,R2对应的RAM地址是多少?STC系列单片机复位后,所使用的工作寄存器组为0组;当CPU使用的工作寄存器组为2组时,R2对应的RAM地址是12H。2-9.什么是堆栈?简述STC12C5A60S2单片机的堆栈处理过程。堆栈是在RAM中开辟的一片数据缓冲区,常用于保护CPU现场及临时数据,其操作遵循先进后出、后进先出的原则。STC12C5A60S2单片机的堆栈处理过程:数据入栈时,SP指针内容先自动加1,然后再将数据推入到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.如何设置STC12C5A60S2单片机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口工作模式设定PxM1[7:0]PxM0[7:0]I/O口模式00准双向口(传统8051I/O口模式),灌电流可达20mA,拉电流为230uA01强推挽输出,输入输出电流都能可达20mA。10仅为输入(高阻)11开漏,内部上拉电阻断开若设置P1.7为强推挽输出,P1.6为开漏,P1.5为弱上拉(准双向),P1.4,P1.3,P1.2,P1.1,和P1.0为高阻输入,可通过以下的两条指令来完成:MOVP1M1,#01011111B;MOVP1M0,#11000000B;2-13.I/O口作为输入引脚,应工作在何种方式?读外部引脚状态时,为何要先向相应引脚对应的锁存器写入“1”?I/O口作为输入引脚,应工作在准双向或仅为输入状态;在准双向口配置情况下,先输出高电平,使d管截止,才可读到正确的外部输入状态。2-14.STC12C5A60S2单片机复位方式有哪些?复位后单片机的初始状态如何?STC12C5A60S2单片机复位方式有上电复位、看门狗复位、外部低压检测复位、软件复位。复位后,单片机从用户程序区0000H处开始正常工作;堆栈指针SP指向07H,P0~P3为FFH。习题三3-1使用Proteus对电路进行仿真,有哪些步骤?使用Proteus进行单片机系统设计、仿真主要有七个步骤,依次是新建设计文件,选取元件并加入列表区,将元件摆放到图形编辑窗口,放置电源、地线、布线、加载目标程序代码,运行仿真。3-2在Keil中,源程序文件从编辑到生成*.hex文件,经过哪些过程?在Keil中,源程序文件从编辑到生成*.hex文件要经过建立工程,建立源程序文件,建立文件和程序的连接,工作环境和参数的设置,再进行编译、连接可以生成目标文件。3-3在Keil中,如何对源程序文件进行软件模拟调试?Keil软件中有一个仿真CPU用来模拟程序的执行,可以在没有硬件和仿真器的情况下进行程序的调试,这就是软件模拟调试的方法。对源文件进行软件模拟调试,首先要启动调试。对工程编译、连接成功以后,使用菜单“Debug”—>“Start/StopDebugSession”进入调试状态,按“Ctrl+F5”组合键或者使用按钮也能进入调试状态。这时,源程序窗口的左侧出现一个黄色箭头,指向main()函数的第一行,该箭头总是指向即将要运行的语句行。退出调试状态和启动调试状态方法一致。调试过程中使用最多的是“Debug”菜单,而该菜单上的大部分命令可以在“debug”工具栏中找到对应的快捷按钮。常用按钮有:运行,单步,过程单步,单步跳出,执行到当前,反汇编窗口,观察窗口,存储器窗口。其中单步调试方式特别常用。单步执行后,可以通过各个窗口观察执行结果,从而判断该条语句是否出现问题。如果程序较长,可以采用下面的方法来调试。首先,在合适的位置设置断点,方法为:在某一行上右击,弹出的快捷菜单中选择“Insert/RemoveBreakpoint”。设置成功后,该行的前面会有红色方块指示。这时如果单击“运行”按钮,程序运行到断点处会自动停止。删除断点也需使用同样的方法。如果程序的运行要依赖于外围接口,例如并行口、串行口、中断、定时/计数器等,Keil的“Peripherals”菜单中提供了一些选项,通过这些选项打开对应外围接口的对话选框,可以观察外围接口的状态,或者更改外围接口的运行情况。习题四4-151内核单片机有哪几种寻址方式?片内RAM低128字节及高128字节分别支持哪些寻址方式?片内扩展RAM、片外RAM及特殊功能寄存器分别支持哪些寻址方式?51内核单片机的寻址方式有:立即(数)寻址、寄存器寻址、直接寻址、寄存器间接寻址、变址寻址、相对寻址、位寻址。片内RAM低128字节支持直接寻址、寄存器间接寻址。片内RAM高128字节支持寄存器间接寻址。片内扩展RAM及片外RAM支持间接寻址。特殊功能寄存器支持直接寻址。4-2区分下列指令有什么不同?MOVA,#22H和MOVA,22HMOVA,#22H;将立即数22H送入A寄存器中,第二操作数为立即寻址。MOVA,22H;把片内RAM字节地址为22H单元的内容送入A寄存器中,第二操作数为直接寻址。MOVA,R1和MOVA,@R1MOVA,R1;把R1的内容送入A寄存器中,第二操作数为寄存器寻址。MOVA,@R1;将寄存器R0的内容作为RAM某单元的地址,将该单元的内容传送给A寄存器,第二操作数为寄存器间接寻址。MOVA,@R1和MOVXA,@R1MOVA,@R1;将寄存器R1的内容作为片内RAM某单元的地址,将该单元的内容传送给A寄存器MOVXA,@R1;将寄存器R1的内容作为片内扩展或外部RAM某单元的地址,将该单元的内容传送给A寄存器两者的区别是:MOV访问的是内部RAM,MOVX访问的是片内扩展或外部RAM。MOVXA,@R1和MOVXA,@DPTR主要的区别在于对外输出地址的方式上。如果是访问片外扩展RAM,MOVXA,@R1只是占用P0口,输出R1中的8位地址。而MOVXA,@DPTR要占用P0、P2口,输出DPTR中的16位地址。MOVCA,@A+DPTR和MOVXA,@DPTRMOVCA,@A+DPTR;功能是A寄存器的内容作为无符号数和DPTR内容相加后得到一个16位的地址,将程序存储器中该地址的内容传送给A。MOVXA,@DPTR;以DPTR寄存器的值作为片内扩展RAM或者片外RAM的地址,将该地址单元的内容送入A。两者的区别是MOVC访问的是整个ROM的64KB空间;MOVX访问的是整个片内扩展RAM或片外扩展RAM。4-3写出完成下列各项任务的指令。片内RAM30H单元的内容送到片内RAM50H单元中。MOV50H,30H片内RAM40H单元的内容送到片内扩展RAM50H单元中。ANLAUXR,#11111101BMOVA,40HMOVDPTR,#50HMOVX@DPTR,A片内RAM50H单元的内容送到片外RAM2000H单元中。ORLAUXR,#00000010BMOVA,50HMOVDPTR,#2000HMOVX@DPTR,A片外RAM2000H单元的内容送到片外RAM4000H单元中。ORLAUXR,#00000010BMOVDPTR,#2000HMOVXA,@DPTRMOVDPTR,#4000HMOVX@DPTR,AROM1000H单元的内容送到片外RAM8000H单元中。MOVDPTR,#1000HMOVA,#0MOVCA,@A+DPTRMOVDPTR,#8000HORLAUXR,#00000010BMOVX@DPTR,A将程序状态字寄存器PSW内容传送到片内扩展RAM0D0H单元中。ANLAUXR,#11111101BMOVA,PSWMOVDPTR,#0D0HMOVX@DPTR,A将片内RAM01H~FFH单元内容清零。ANLPSW,#11100111BMOVR0,#0FFHMOVA,#0LOOP:MOV@R0,ADJNZR0,LOOP使片内RAM20H单元的b7、b6位清零,b5、b4位置1,b3、b2位取反,其余各位保持不变。ANL20H,#00111111BORL20H,#00110000BXRL20H,#00001100B4-4下列各条伪指令前的标号各代表的地址是多少? ORG0100H TABLE:DS4;TABLE代表的的地址是0100H WORD:DB15,0FFH,30;WORD代表的地址是0104H BIN EQU0200H TAB1: DW07H;TAB1代表的地址是0107H4-5假设程序头文件中含有如下变量定义伪指令 DBUF DATA 40H BDATADATA 60H(1)请指出如下指令中源操作数的寻址方式。 MOVR0,#DBUF;立即(数)寻址 MOVR0,DBUF;直接寻址(2)执行如下程序段后,片内RAM40H~4FH单元的内容是什么?60H单元的内容又是什么? MOV BDATA,#10H MOV R0,#DBUF CLR ALOOP:MOV @R0,A INC A INC R0 DJNZ BDATA,LOOP执行以上程序段后,片内RAM40H~4FH单元的内容是:0-0FH;60H单元的内容为0。4-6编写一个延时10ms的子程序。选择STC12C5A60S2单片机,系统时钟频率为12MHz,程序如下:DELAY_10ms:MOVR7,#120;2TDL:MOVR6,#250;2TDJNZR6,$;4TDJNRR7,DL;4TRET;4T4-7编程实现的逻辑运算。MOVC,P1.1ORLC,P1.2CPLCMOVPSW.5,CMOVC,P1.4ANLC,/P1.3ORLC,PSW.5MOVP1.0,C4-8将存放在片内RAM51H、52H和片外RAM2000H、2001H的四位BCD码相加,结果存放在片内RAM50H、51H、52H单元中(假设低位字节存放在高地址中,高位字节存放在低地址中)。 ORLAUXR,00000010BMOVDPTR,#2001HMOVXA,@DPTRADDA,52HDAAMOV52H,AMOVDPTR,#2000HMOVXA,@DPTRADDCA,51HDAAMOV51H,AMOVA,#00HADDCA,#00HMOV50H,A4-9编程实现将片内扩展RAM0200H~0220H单元的内容,全部移到片内RAM30H单元开始的位置,并将原位置清零。MOV

R0,#30H

MOV

DPTR,#0200H

MOV

R1,#21H ANLAUXR,#11111101BLOOP:MOVX

A,@DPTRMOV

@R0,AMOV

A,#0MOVX@DPTR,AINC

R0INC

DPTRDJNZ

R1,LOOP4-10将存放在R3、R2中的三位压缩BCD码转换为二进制形式。W_BCD_BI: LCALLB_BCD_BI;调用将R2中单字节BCD码转换为二进制数的子程序,;转换的结果存放于A寄存器中 MOVR4,A;把转换结果暂时保存到R4 MOVA,R3;取BCD码的高1位 MOVB,#100 MULAB;计算(a3*10+a2)*100 ADDA,R4;加低2位转换结果 MOVR2,A;保存转换结果的低8位 MOVA,B;取(a3*10+a2)*100的高8位 ADDCA,#0;加进位位 MOVR3,A;保存转换结果的高8位......B_BCD_BI: MOVA,R2;取BCD码 ANLA,#0F0H;保留高4位(即十位) SWAPA MOVB,#10 MULAB;十位*10,最大为90(即5AH),因此高8位为0 MOVB,A;乘积暂存到B寄存器 MOVA,R2;取BCD码 ANLA,#0FH;保留个位 ADDA,B;个位加“十位*10”,结果在A寄存器中RET4-11编写程序完成运算R0R1×R2R3,乘积存R4、R5、R6和R7中。MUL:CLR A MOV R4, A MOV R5, A MOV R6, A MOV R7, AMUL1: MOV A, R1 MOV B, R3 MUL AB MOV R7, A MOV R6, BMUL2: MOV A, R0 MOV B, R3 MUL AB ADD A, R6 MOV R6, A CLR A ADDC A, B MOV R5, AMUL3: MOV A, R1 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, AMUL4: MOV A, R0 MOV B, R2 MUL AB ADD A, R5 MOV R5, A MOV A, R4 ADDC A, B MOV R4, A RET习题五5-1在C51语言中支持哪些数据类型?C51特有的数据类型有哪些?在C51语言中支持的数据类型有:char(字符型)、int(整型)、long(长整形)、float(浮点型)、特殊功能寄存器类型和位类型。C51特有的数据类型有:特殊功能寄存器类型和位类型。5-2C51中的存储器类型有几种,它们分别表示的存储器区域是什么?C51中的存储器类型有:data、bdata、idata、pdata、xdata、code存储器类型与硬件存储器空间的对应关系data直接寻址的片内RAM低128B,访问速度快bdata片内RAM可位寻址区(20H-2FH),允许字节和位混合访问idata用Ri间接寻址的片内RAM全部地址空间pdata用Ri间接访问的片内扩展RAM或片外扩展RAM低256Bxdata用DPTR间接访问的片内扩展RAM或片外扩展RAM(64K)code程序存储器ROM空间(64KB)5-3在C51中,bit位与sbit位有什么区别?两种位变量的区别在于,用bit定义的位变量,其地址由C51编译时予以安排,而用sbit定义位变量时必须同时定义其位地址,在C51编译器编译时,其位地址不可变化。5-4在C51中,中断函数与一般函数有什么不同?中断函数不能进行参数传递中断函数没有返回值在任何情况下都不能直接调用中断函数如果在中断函数中调用了其他函数,则被调用函数使用的工作寄存器必须与中断函数相同。否则会产生不正确的结果。在中断函数中调用其他函数,被调函数最好设置为可重入的,因为中断是随机的,有可能中断函数所调用的函数出现嵌套调用。C51编译器对中断函数编译时会自动在程序开始和结束处加上相应的内容。中断函数最好写在文件的尾部,并且禁止使用extern存储类型说明。5-5请分别定义下列变量:(1)片内RAM中无符号字符型变量x;unsignedcharidatax;(2)片内RAM中位寻址区无符号字符型变量y,将y.0-y.2再分别定义为位变量key_in、key_up、key_down;片内RAM中位寻址区无符号字符型变量y:unsignedcharbdatay;定义y.0-y.2为位变量key_in、key_up、key_down:sbitkey_in=y^0;sbitkey_up=y^1;sbitkey_down=y^2;(3)片外RAM中整型变量x,并指定变量x的绝对地址为4000H;#definexXWORD[0X2000]或:xdataintx_at_0x4000;(4)特殊功能寄存器变量PCON;sfrPCON=0X875-6用C51语言写出整型变量a左移4位的语句。inta;a=a<<4;5-7用C51语言编程实现,片内扩展RAM的000EH单元和000FH单元的内容交换。#include<STC12C5A.h>#include<absacc.h>voidswap(){chardatac,d;AUXR&=0xFD;c=XBYTE[0x000E];d=XBYTE[0x000F];XBYTE[0x000E]=d;XBYTE[0x000F]=c;}5-8已知x=375,y=589,用C51语言编写程序,计算z=x+y的结果。intadd(){intx,y,z;x=375;y=589;z=x+y;returnz;}5-9试用C51语言编写程序实现将片内RAM21H单元存放的两位BCD码数转换为十六进制数存入30H单元。dataunsignedchary1_at_0x21;dataunsignedchary2_at_0x30;voidtrans(){ unsignedchartemp; temp=y1;y1=(y1&0xf0)>>4; y2=y1*10+(temp&0x0f);}5-10试用C51语言编写程序实现将片内RAM30H、31H单元存放的2字节十六进制数转换为十进制数存于21H为首的单元中。(设低地址存放高位字节)#include<STC12C5A.h>#include<absacc.h>#defineuintunsignedint#defineucharunsignedcharuchardigit_h_at_0x30;uchardigit_l_at_0x31;uchar*p;intbuf;voidH_D(){buf=digit_h*256;buf=buf+digit_l;for(p=0x25;p>=0x21;P--){*p=buf%10;buf=buf/10;}}5-11试用C51语言编写程序实现将0-9,A-F十六进制数转换成相应的ASCII码。#include<STC12C5A.h>voidH_A(unsignedcharX){ if(X<=9)X=X+0x30;elseX=X+0x37;returnX}5-12参见图5-3,通过单片机的并行口P1,控制8路LED灯轮流且循环点亮。引脚为0时灯亮,为1时灯熄灭。#include<STC12C5A.h>#incldue<intrins.h>unsignedchari=0x7f;voidmain(){while(1){P1=i;delay();i=_cror_(i,1);}}voiddelay(){unsignedcharl,m,n;for(l=0;l<254;l++)for(m=0;m<254;m++)for(n=0;n<254;n++);}习题66-1如何在C51程序中嵌入汇编?第一步:通过预编译命令“#pragmaasm”和“#pragmaendasm”在C语言代码中插入汇编语言代码。第二步:在KeilC51环境下,在Project窗口中包含汇编代码的C文件上单击右键,在弹出的快捷菜单中选择“Optionsfor…”命令,再次点击选中右边的“GenerateAssemblerSRCFile”和“AssemblerSRCfile”复选框,使检查框由灰色变成黑色状态。第三步:根据选择的编译模式,把相应的库文件(如Small模式时,是Keil\C51\Lib\C51S.Lib)加入到工程中,该文件必须作为工程的最后文件。 库文件与编译模式的关系如下: C51S.LIB_没有浮点运算的Small模式 C51C.LIB_没有浮点运算的Compact模式 C51L.LIB_没有浮点运算的Large模式 C51FPS.LIB_带浮点运算的Small模式 C51FPC.LIB_带浮点运算的Compact模式 C51FPL.LIB_带浮点运算的Large模式第四步:编译,生成目标代码。6-2简述在C51中调用汇编程序的实现方法。在C51中调用汇编程序,要把用C语言编写的程序保存为扩展名为.C的C语言文件,把用汇编语言编写的程序保存为扩展名为.asm、.SRC或者.A51的汇编语言文件,然后把这些文件导入到同一个工程下进行编译连接。在C语言中调用汇编程序时,对被调用函数(汇编语言函数)要在主调函数(C语言函数)所在文件中作出声明,并且对汇编语言程序有一下要求:要使用SEGMENT伪指令定义可再定位的CODE段。要根据不同的情况对函数名进行转换,见表6-1。要使用PUBLIC伪指令将被调用函数说明为外部可用函数。若有参数传递,按照表6-3所列的规则使用参数。若有返回值,按照表6-4所列规则存入寄存器。习题77-1什么是中断?CPU为什么要采用中断结构?中断是指CPU正在执行某程序时,外部或者内部发生了随机的事件,请求CPU迅速去处理,CPU暂时停止现行的程序的执行,而自动转去执行预先安排好的处理该事件的服务子程序。处理完成后返回到断点处继续执行。中断结构使CPU具有随机应变的能力,提高了CPU效率,增强了实时性。7-2STC12C5A60S2单片机有哪几个中断源?单片机响应各中断后,应如何清除相应中断标志位?其中断服务程序的入口地址各是多少?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。其余各中断标志位都要通过用户程序清0。中断服务程序的入口地址:INT0:0003HT0:000BHINT1:0013HT1:001BHUART1:0023HADC:002BHLVD:0033HPCA:003BHUATR2:0043HSPI:004BH7-3STC12C5A60S2单片机的中断系统中有几个优先级?如何设定?当中断优先级相同时,其自然优先权顺序是怎样的?STC12C5A60S2单片机的中断系统中有4个优先级。STC系列单片机中,设置特殊功能寄存器IP、IP2、IPH、IP2H可以实现4个中断优先级选择。当中断优先级相同时,如果其中的几个中断源同时产生中断请求,中断源响应中断的次序取决于内部的查询次序。各中断源中断优先查询次序由高到低依次是:INT0、T0、INT1、T1、UART1、ADC、LVD、PCA、UATR2、SPI7-4简述STC12C5A60S2单片机的中断嵌套原则。在运行低优先级中断源的中断服务程序中,能被高优先级的中断源中断,反之不能。任何中断,一旦得到CPU响应,就不会被同一中断优先级别的中断源中断。7-5中断响应过程中,为什么要保护现场?如何保护?因为中断服务程序会用到一些寄存器和存储器,如果不保护现场,这些寄存器和存储器中的数据就会覆盖,当中断返回继续运行原来的程序时,就会得到错误的结果。所以通常要保护现场。保护现场的方法是把中断程序中用到的寄存器、存储器等要保护的内容压入到堆栈。7-6STC系列单片机中如何选择和设置外部中断的边沿触发和电平触发方式?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)引脚检测到低电平后产生外部中断。7-7在STC12C5A60S2单片机中,假设系统的时钟频率为12MHz,利用定时/计数器T0,分别用汇编语言和C51编程实现在P1.0引脚输出周期为2s的方波。用寄存器R2作为定时器T0中断次数计数器。分析:要产生周期2s的方波,需定时1s。选择12T模式,T0x12=0,f=12MHz,机器周期T=,T0工作在方式1,最大定时时间为,所以一个定时器完成不了定时1s的任务。可以利用R2计数20次,每次定时50ms,则,计数初值C=15536=3CB0H,(1)汇编程序:ORG0000HLJMPMAINORG000BH;T0的中断向量入口地址LJMPT0_INTORG0100HMAIN:MOVSP,#0BFH;初始化堆栈指针MOVTMOD,#01H;T0工作在方式1MOVTL0,#0B0H;给T0写入初值MOVTH0,#03CHMOVR2,#20;利用寄存器R2计数20次SETBEA;开放总中断SETBET0;T0溢出中断允许SETBTR0;启动T0开始工作SJMP$T0_INT:MOVTL0,#0B0H;重新赋初值MOVTH0,#03CHDJNZR2,NEXTCPLP1.0MOVR2,#20;重新赋给R2值20NEXT:RETIENDC51程序:#include<STC12C5A.h>/sbitP1_0=P1^0;unsignedchari=0;voidmain(){TMOD=0x01;//T0工作在方式1TL0=0xB0;//给T0装入初值TH0=0x3C;EA=1;//开放总中断ET0=1;//T0溢出中断允许TR0=1;//启动T0开始工作while(1);}voidT0_INT()interrupt1 //T0中断服务程序{ TH0=0x3C; TL0=0xB0;//重新置入初值 i++; if(i==20) { P1_0=~P1_0; i=0;}}7-8由P1口驱动8个指示灯,利用定时/计数器T1的定时功能分别用汇编语言和C51编程实现8个指示灯依次循环点亮(输出高电平),点亮间隔为1s,反复循环。分析:仿照上题,T1需定时50ms,R7计数20次,达到定时1s的目的,每隔1s,循环一次,实现轮流点亮。(1)汇编程序ORG0000HLJMPMAINORG001BH;T1的中断向量入口地址LJMPT1_INTORG0100HMAIN:MOVSP,#0BFH;初始化堆栈指针MOVTMOD,#10H;T1工作在方式1MOVTL1,#0B0H;给T1写入初值MOVTH1,#03CHMOVR7,#20;利用寄存器R7计数20次MOVA,#01HSETBEA;开放总中断SETBET1;T1溢出中断允许SETBTR1;启动T1开始工作SJMP$T1_INT:MOVTL1,#0B0H;重新赋初值MOVTH1,#03CHDJNZR7,NEXT;R7减1不为0,说明中断次数未到20次,跳转到NEXT;处返回MOVP1,A;RLA;为下一次做准备MOVR7,#20;重新赋给R7值50NEXT:RETIENDC51程序:#include<STC12C5A.h>unsignedchari=0; unsignedcharj;voidmain(){ TMOD=0x10;//T1工作在方式1 TL1=0xB0;//给T1装入初值 TH1=0x3C; j=0x01; EA=1;//开放总中断 ET1=1;//T1溢出中断允许 TR1=1;//启动T1开始工作 while(1);}voidT1_INT()interrupt3//T1中断服务程序{ TH1=0x3C; TL1=0xB0;//重新置入初值 i++; if(i==20) { P1=j;//已定时中断20次 i=0; j=_crol_(j,1);}}7-9假设STC12C5A60S2单片机的系统时钟频率为12MHz,利用定时/计数器T1在方式1下的功能,分别用汇编语言和C51编程实现测量P3.3()引脚上的正脉冲的宽度(单位μs)。汇编程序:;计时数据存放到60H(高位字节)、61H、62H单元。 ORG0 LJMPSTARTORG001BH LJMPT1_INT START:MOVTMOD,#90H MOVTL1,#00H MOVTH1,#00H MOVR0,#60H MOVA,#0SETBEA;SETBET1; JBP3.3,$ SETBTR1 JNBP3.3,$ JB P3.3,$ CLRTR1 MOV@R0,A INCR0 MOV@R0,TH1INC R0MOV @R0,TL1SJMP$T1_INT:INCA RETIENDC51语言:#include<STC12C5A.h>#include<intrins.h>//声明本征函数库#defineucharunsignedcharsbitP3_3=P3^3;ucharnvar0=0,nvar1,nvar2;//存放计时数据voidmain(){

TMOD=0x90;

TH1=0x00;

TL1=0x00;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);}voidT1_INTinterrupt3{nvar0++;}7-10在STC89/90xx系列单片机中利用定时/计数器T2的时钟输出功能,分别用汇编语言和C51编程实现在P1.0引脚上输出频率为50Hz的方波。分析:设系统时钟频率为12MHz,工作在12T模式,n=2,已知需要输出频率为50Hz的方波,由公式(RCAP2H,RCAP2L)=65536-,计算出重装初值为RCAP2H=15H,RCAP2L=A0H.汇编程序:TH2 DATA 0CDH;特殊功能寄存器地址声明TL2 DATA 0CCHRCAP2L DATA 0CAHRCAP2H DATA 0CBHT2MOD DATA 0C9HT2CON DATA 0C8HTR2 BIT 0CAHTF2 BIT 0CFHORG0000HLJMP MAINORG0100HMAIN: MOV T2CON,#00H;T2工作在时钟输出方式 MOV T2MOD,#02H;T2输出时钟使能 MOV TL2,#0A0H;输出50Hz频率方波 MOV TH2,#15H MOVRCAP2L,#0A0H MOVRCAP2H,#15H SETB TR2;T2开始工作 SJMP $END C51程序:#include<reg52.h>sfrT2MOD=0xC9;voidmain(){T2CON=0x00;T2MOD=0x02;TL2=0xA0;//输出50Hz频率方波TH2=0x15;RCAP2L=0xA0;RCAP2H=0x15;TR2=1;while(1);}7-11简述STC12C5A60S2单片机的PCA模块的功能。PCA每个模块都有自己的工作方式寄存器,通过对工作方式寄存器的设置,可以使各模块工作在定时方式(相当于定时、计数器)、捕获方式(相对应模块计数器所计数据进行捕获的方式,用于测量外部信号产生的时间间隔)、方波输出方式、输出信号脉宽调制(PWM)方式。7-12假设系统时钟频率为12MHz,利用PCA模块的功能,分别用汇编语言和C51编程实现在P1.3引脚上间断重复输出频率为450Hz的方波,持续和停止时间均为4s。分析:将PCA模块的工作方式寄存器CCAPM0寄存器写为4DH,即PCA0设为时钟输出方式,从而可以在P1.3引脚自动翻转,输出方波,并允许PCA中断。要求方波频率为450hz,即周期为1/450,定时时间应设定为1/900s,选择计数器时钟来源为系统时钟频率的12分频,即工作方式寄存器CMOD设为00H,需要计数(1/900)/(12/12000000)=10000/9≈1111=0457H个时钟脉冲,可将CL、CH初始值设为零,CCAP0H设为04H,CCAP0L设为57H,在每次PCA中断里:将计数值加到比较匹配寄存器里CCAP0H、CCAP0L=CCAP0H、CCAP0L+0457H启动PCA计数持续4秒(CR=1),停止(CR=0)持续4秒;4秒钟定时:定时器T1,工作在方式1

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论