• 356.67 KB
  • 2022-04-22 11:18:51 发布

《单片机原理与应用》习题答案和拓展资料.docx

  • 40页
  • 当前文档由用户上传发布,收益归属用户
  1. 1、本文档共5页,可阅读全部内容。
  2. 2、本文档内容版权归属内容提供方,所产生的收益全部归内容提供方所有。如果您对本文有版权争议,可选择认领,认领后既往收益都归您。
  3. 3、本文档由用户上传,本站不保证质量和数量令人满意,可能有诸多瑕疵,付费之前,请仔细先通过免费阅读内容等途径辨别内容交易风险。如存在严重挂羊头卖狗肉之情形,可联系本站下载客服投诉处理。
  4. 文档侵权举报电话:19940600175。
'第一章习题答案1.什么叫单片机?它有哪些主要特点?单片机是将中央处理器(CPU)、随机存储器(RAM)、只读存储器(ROM)、中断系统、定时/计数器、I/O口等主要计算机部件集成在一片集成电路芯片上的单片微型计算机(SingleChipMicrocomputer)的简称。具有体积小、功耗低、价格便宜、控制功能强等特点。2.请简述单片机的技术发展历史,单片机的主要技术发展方向是什么?单片机技术发展经历了单芯片微机形成阶段、性能完善提高阶段和微控制器化阶段三个主要阶段。目前单片机主要技术发展方向是:大容量高性能化、小容量低价格化、外围电路内装化、多品种化以及I/O接口功能的增强、功耗降低等。4.单片机主要用在哪些方面?由于单片机体积小、功耗低、价格便宜,广泛应用于仪器仪表、家用电器、医用设备、航空航天专用设备的智能化管理及过程控制等领域;又由于单片机具有较强的实时数据处理能力和控制功能,可以使系统保持在最佳工作状态,提高系统的工作效率和产品质量,所以在工业控测控、航空航天、尖端武器等各种实时控制系统中,都作为控制器件使用。 第二章习题参考答案1.单片机系统复位后,PC值为(0000H)。2.MCS-51单片机中,一个机器周期=(6)状态周期=(12)振荡周期。当主频为12MHz时,一个机器周期为(1µs)3.PSW中RS1RS0=01时,寄存器R2的地址为(10H)PSW中RS1RS0=10时,寄存器R2的地址为(12H)4.MCS-51单片机的=0,程序存储器访问的是(片外ROM)5.MCS-51单片机上有(4)个独立的存储空间。6.MCS-51系列单片机在片内集成了哪些主要逻辑功能部件?答:有微处理器CPU、程序存储器、数据存储器、定时/计数器、中断源、并行I/O端口等功能部件组成。7.程序计数器(PC)作为不可寻址寄存器,它有哪些特点?数据地址指针DPTR有哪些特点?答:PC是一个16位的特殊功能寄存器,又称程序指针,它具有自动加1的功能,始终指向下一条指令的首地址,以保证程序按顺序执行;DPTR是一个16位的专用地址指针寄存器。作间址寄存器使用,用来存储外接64KB的数据存储器和I/O端口,DPTR也可以拆成两个独立8位的寄存器,即DPH(高8位字节)和DPL(低8位字节),分别占据83H和82H两个地址。8.MCS-51单片机片内256B的数据存储器可分为几个区?分别作什么用?答:00H~1FH共32个单元通常作为工作寄存器区,20H~2FH可用位寻址区,可直接进行位操作,30H~7FH共80个单元为用户RAM区,作堆栈或数据缓冲器用,80H~FFH为特殊功能寄存器区。9.开机复位后,CPU使用的是哪组工作寄存器?它们的地址是什么?CPU如何确定和改变当前工作寄存器组?答:开机复位后,由于PSW复位值是00H,CPU使用的是0区的工作寄存器R0~R7,它们的地址是00~07H,可以通过改变PSW的RS1RS0两个位的值确定和改变当前工作寄存器组。10.堆栈有哪些功能?堆栈指针(SP)的作用是什么?在程序设计时,为什么还要对SP重新赋值答:堆栈是一个特殊的存储区,用来暂存数据和地址。堆栈指针SP是用来管理堆栈的它指示出堆栈顶部在片内RAM中的位置。系统复位后,SP初始化为07H,使得堆栈实际上从08H单元开始。由于08H~1FH单元分属于工作寄存器1~3区,20H~2FH为位寻址区,若程序中要用到这些区,应把SP值改为30H或更大的值。11.MCS-51的SFR占用了什么空间?其寻址方式如何?答:MCS-51的SFR占用了片内数据存储器的空间,地址范围为80H~FFH。其寻址方式为直接寻址。12.程序状态寄存器PSW的作用是什么?有哪些常用状态位,它们的作用各是什么?答:PSW是一个8位的特殊功能寄存器。用于存放程序运行中的各种状态信息。常用状态位及其作用:(1)进位标志位Cy。在进行加或减运算时,如果操作结果最高位有进位或借位,Cy由硬件置“1”,否则清“0”。(2)辅助进位标志位Ac 。在进行加或减运算时,如果低四位数向高位有进位或借位,硬件会自动将Ac置“l”,否则清“0”。(3)工作寄存器区指针RSlRS0。用于选择CPU当前工作寄存器的工作区。可由用户用软件来改变RSlRS0的组合,以切换当前选用的寄存器的工作区。(4)溢出标志位OV。当进行算术运算时,如果产生溢出,则由硬件将OV位置“l”,否则清“0”。(5)奇偶标志位P。该位始终跟踪累加器A中含“1”个数的奇偶性。如果A中有奇数个“1”,则P置“l”,否则置“0”。13.MCS-51单片机复位条件是什么?常用复位电路有哪些?答:复位条件是在单片机的RST引脚输入持续至少两个机器周期高电平。MCS-51单片机通常采用上电复位和上电+按钮电平复位两种方式。 【2.1任务拓展】:了解发光二极管的工作条件,限流电阻的计算方法。发光二极管为正向导通反向截止,其工作电压一般红、绿色:1.8-2.4V蓝/白:3.0-3.8V。MCS-51的输出电压为3.7V左右,输出最大电流约为20mA,接近LED的工作限流,因此需要通过限流电阻保护LED不受突然的电流增强所导致的损坏。限流电阻的计算公式为:(电源电压-导通压降)/导通电流这里,“导通压降”即LED工作电压,“导通电流”根据用户需求而定,如电源电压为5V,导通压降为2V,电路所需工作电流为15mA通过计算得限流电阻为200Ω,根据电阻的常用型号,可选取最接近该值的220Ω。【2.2任务拓展】:了解Proteus使用,将任务2.2在Proteus中仿真实现。在Proteusisis中绘制硬件原理图,在源代码调试环境里输入源程序,编译调试,生成.HEX文件后,加载到单片机中。按仿真按钮进行仿真,拨动开关至左端4脚,会观察到LED1点亮;拨动开关至右端1脚,会观察到LED2闪烁,LED1熄灭。 第三章习题参考答案1.选择题:(1)可以实现片外数据存储器访问的指令是(A)。A.MOVXB.MOVC.NOPD.DIV(2)下列指令中,可以实现将累加器A的第0位置1(其它位不变)的指令是(B)。A.MOVA,#01HB.SETB ACC.0C.ANLA,#0FFHD.SETBACC(3)MOVXA@DPTR指令中,源操作数的寻址方式是(B)A.寄存器寻址B.寄存器间接寻址C.直接寻址D.立即寻址(4)LCALL指令操作码地址是2000H,执行完子程序返回指令后,PC=(D)。A.2000HB.2001HC.2002HD.2003H(5)对程序存储器的读操作,只能使用(B)A.MOVXB.MOVCC.PUSHD.MOV(6)执行下面指令后,30H内容是(C)MOV R1,#30HMOV 40H,#0E0HMOV @R1,40HA.40HB.30HC.0E0HD.FFH(7)下列指令格式正确的是(D)。A.DEL:XCHA,30HB.MOV:INCAC.2AB:MOVA,#20HD.ABC:MOV23H,A(8)当执行指令(A)后,累加器A的内容为00H。A.ANLA,#00HB.ORLA,#00HC.XRLA,#00HD.以上都不对2.比较下面各组指令,并在指令后添加注释(1)MOVA,20H;20H内容送累加器AMOVC,20H;位地址20H内容送位累加器C(2)MOVA,20H;20H内容送累加器AMOVR1,#20H;20H送累加器AMOVA,@R1;20H指向地址的内容累加器A(3)CJNEA,@R1,L1;比较A和R1指向地址的内容,若相等程序顺序运行,不相等则转L1处DJNZR2,L1;R2内容减1,不等于0转L1处,等于0则顺序运行3.判断下列指令是否正确,并改正错误(1).SUBB30H,#12H该指令错误,带进位减法指令目的操作数必须是A,要将立即数12H和30H内容相加,可改为:MOVA,30HSUBBA,#12H(2).MOVA,2000H该指令错误,MOV为内部数据传送指令,范围只是在内部数据存储器和累加器传送,地址不超过FFH。要将外部2000H送累加器可改为MOVDPTR,2000HMOVXA,@DPTR (3).ADDR0,0A3H该指令错误,要将A3H内容和R0内容相加,可改为:MOVA,R0ADDA,0A3H(4).CJNE20H,#20H,L1该指令错误,CJNE第一操作数可以是A、寄存器Rn或@Ri可改为:MOVR1,20HCJNER1,#20H,L1(5).RLCA该指令正确4.设R0的内容为32H,A的内容为48H,而片内RAM32H单元的内容为80H,40H单元的内容为08H。请指出在执行下列程序段后,上述各单元的内容变化。MOVA,@R0;R0指向地址32H内容送A,即(A)=80HMOV@R0,40H;32H←(40H),即(32H)=(40H)=08HMOV40H,A;40H←(A),即(40H)=(A)=80HMOVR0,#35H;R0←35H,,(R0)=35H5.根据要求要求写出相应的指令。1).将R0的内容送R1MOVA,R0MOVR1,A2)将30H内容送20H。MOV20H,30H3)将立即数30H送R0HMOVR0,#30H5)将R0的内容送以R1中内容为地址的存储单元。MOVA,R0MOV@R1,A6)将内部RAM30H内容送外部20H单元。MOVA,30MOVR1,#20HMOVX@R1,A7)将外部RAM3000H内容送内部30H单元。MOVDPTR,#3000HMOVXA,@DPTRMOV30H,A8)将ROM2000H内容送R1。MOVDPTR,#3000HMOVCA,@A+DPTRMOVR1,A9)将ROM2000H内容送内部30H单元。MOVDPTR,#2000HMOVCA,@A+DPTRMOV20H,A 10)将ROM2000H内容送外部20H单元。MOVDPTR,#2000HMOVCA,@A+DPTRMOVR1,#20HMOVX@R1,A6.编程将片外数据存储器地址为40H~60H区域的数据块,全部搬移到片内RAM的同地址区域,并将原数据区全部填为FFH。MOVR0,#40HMOVR1,#33LOOP:MOVXA,@R0MOV@R0,AMOVA,#0FFHMOVX@R0,AINCR0DJNZR1,LOOPRET7.编程找出片外2000H~200FH数据区中的最小值,结果存放于R2中。MOVDPTR,#2000HMOVR7,#0FHMOVXA,@DPTR MOVB,ALOOP:INCDPTRMOVXA,@DPTRCJNEA,B,LOOP1LOOP1:JNCLOOP2MOVB,ALOOP2:DJNZR7,LOOPMOVR7,BRET 【3.1任务拓展】1.目的操作数的寻址方式对于两个操作数的指令,源操作数有寻址方式,目的操作数也有寻址方式。如:“MOV@R0,30H”,对于源操作数属于直接寻址,而对于目的操作数属于寄存器间接寻址。若不特殊声明,一般都指源操作数的寻址方式。2.分析不同寻址方式适用的存储空间寻址方式寻址空间(操作数存放空间)立即寻址程序存储器直接寻址片内RAM低128字节、SFR寄存器寻址工作寄存器R0~R7,A,B,DPTR寄存器间接寻址片内RAM:@R0,@R1,SP片外RAM:@R0,@R1,@DPTR变址寻址程序存储器:@A+PC,@A+DPTR相对寻址程序存储器256字节范围内:PC+偏移量位寻址片内RAM的位寻址区(20H~2FH字节地址)某些可位寻址的SFR【3.2任务拓展】编程实现两个16位无符号数5678H-1234H的减法运算,结果保存在31H和30H单元。解:减数和被减数都是16位二进制数,计算时要先进行低8位的减法,然后在进行高8位的减法,低8位的减法不需要考虑进位,所以要在减法指令之前将借位标志位清零。程序如下:ORG0040HCLRCMOVA,#78HSUBBA,#34HMOV30H,AMOVA,#56HSUBBA,#12HMOV31H,AEND【3.3任务拓展】若(A)=10001011B,直接执行指令“RLA”能实现2倍操作吗?如果不行“RLCA”呢?对CY应该进行怎样的初始化?答:(A)=10001011B(139D),直接执行指令“RLA”后,(A)=00010111B(23D),显然结果错误,用指令CLR CRLC A结果:(CY)=1,(A)=00010110B(16H),116H(278D)才是正确结果。采用循环移位实现累加器A中无符号数乘2时,A中数据为[00H,7FH]时,直接采用“RLA”即可,若超过7FH,则应使用“RLCA”指令,使用该指令前CY应该初始化为0。 【3.5任务拓展】图3-16循环闪烁灯电路图ORG指令作用?ORG指令为程序段说明伪指令其含义是向汇编程序说明程序段的起始地址,也称起始伪指令。程序中去掉RLA指令,会出现什么情况?上述任务重若去掉RLA指令,运行程序会发现只有发光二极管D1一直闪烁,其余均不亮。 第四章习题参考答案1.是在外部RAM中的xdata区定义了无符号字符型的字变量OUTX2,它的地址是(1002H)。2.(1)编程容易 ;(2)容易实现复杂的数值计算;(3)容易阅读、调试、维护程序;(4)容易实现模块化开发;(5)程序可移植性好。3.bit,data,idata,pdata,code,xdata,sbit,sfr,sfr164.bit和sbit都是C51扩展的变量类型。bit是位变量,编译器在编译过程中分配地址。除非指定,否则这个地址是随机分配的。这个地址是整个可寻址空间,也就是内部RAM、外扩RAM和ROM。sbit是对应可位寻址空间的一个位,包括可位寻址区:20H~2FH和特殊功能寄存器区。一旦用了形如sbixxx=REGE^6的定义,这个sbit量就确定地址了。bit和sbit的最大区别在于,bit是定义一个变量;sbit经常用在寄存器中的,方便对寄存器的某位进行操作。5.(1)使用C51运行库中的预定义宏;(2)通过指针访问;(3)使用C51扩展关键字_at_。6.(1)中断函数不能进行参数传递,如果中断函数中包含任何参数声明都将导致编译出错。(2)中断函数没有返回值,如果企图定义一个返回值将得不到正确的结果,建议在定义中断函数时将其定义为void类型,以明确说明没有返回值。(3)在任何情况下都不能直接调用中断函数,否则会产生编译错误。因为中断函数的返回是由8051单片机的RETI指令完成的,RETI指令影响8051单片机的硬件中断系统。如果在没有实际中断情况下直接调用中断函数,RETI指令的操作结果会产生一个致命的错误。(4)如果在中断函数中调用了其它函数,则被调用函数所使用的寄存器必须与中断函数相同。否则会产生不正确的结果。(5)C51编译器对中断函数编译时会自动在程序开始和结束处加上相应的内容,具体如下:在程序开始处对ACC、B、DPH、DPL和PSW入栈,结束时出栈。中断函数未加usingm修饰符的,开始时还要将R0~R1入栈,结束时出栈。如中断函数加usingm修饰符,则在开始将PSW入栈后还要修改PSW中的工作寄存器组选择位。(6)C51编译器从绝对地址8n+3处产生一个中断向量,其中n为中断号,也即interrupt后面的数字。该向量包含一个到中断函数入口地址的绝对跳转。(7)中断函数最好写在文件的尾部,并且禁止使用extern存储类型说明。防止其它程序调用。7.有small,compact和large三种存储器模式。Small存储器模式参数及局部变量放入可直接寻址的内部存储器(最大128B,默认存储器类型为data)compact存储器模式参数及局部变量放入分页外部数据存储器(最大256B,默认存储器类型为pdata)large存储器模式参数及局部变量直接放入外部数据存储器(最大64KB,默认存储器类型为xdata)8.#includemain(){inti; unsignedcharxdata*p=0x2000;/*指针指向2000H单元*/for(i=0;i<256;i++)/*清零2000H-20FFH单元*/{*p=0;p++;}}9.(1)unsignedcharcodedis_code[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};(2)unsignedchardataTL0_L_at_0x30;unsignedchardataTH0_H_at_0x31;(3)unsignedcharidatadata_buf[20];(4)unsignedcharxdatadata_array[100];(5)unsignedcharbdatastatus;sbitflag_lamp1=status^0;sbitflag_lamp2=status^1;sbitflag_machine1=status^2;sbitflag_machine2=status^3;sbitflag_port1=status^4;sbitflag_port2=status^5;sbitflag_calcu1=status^6;sbitflag_calcu2=status^7; 【任务拓展1】以上实现了简单的流水灯,是一个比较简单的例子,大家根据自己的兴趣可以修改此例,实现更为复杂或自己喜欢的流水灯效果,比如:奇数序号灯亮,偶数序号灯灭,然后奇数序号灯灭,偶数序号灯亮,依次循环。电路图不变,实现程序如下(只给出了主程序,其它与本章任务实施的程序相同):voidmain(void){while(1){P1=0x55;delay();P1=0xaa;delay();}}【任务拓展2】0号、7号灯亮一会儿,然后灭;1号、6号灯亮一会儿,然后灭;2号、5号灯亮一会儿,然后灭;3号、4号灯亮一会儿,然后灭,依次循环。电路图不变,实现程序如下(只给出了主程序,其它与本章任务实施的程序相同):voidmain(void){while(1){P1=0x7e;delay();P1=0xbc;delay();P1=0xc;delay();P1=0xe7;delay();}} 第五章习题参考答案1.MCS-51单片机有5个中断源,2个中断优先级。优先级由软件填写特殊功能寄存器IP加以选择。2.外部中断请求标志位是IE0和IE1。3.8051单片机响应中断后,产生长调用指令LCALL,执行该指令的过程包括:首先把当前PC的内容压入堆栈,对断点保护,然后把长调用指令的16位地址送PC,使程序转向执行中断入口地址区。4.8051单片机的IP寄存器功能是设置中断优先级5.用指令完成下列要求。⑴.INT1、T0开中断,其余禁止中断;MOVIE,#86H⑵.全部开中断MOVIE,#FFH⑶.INT0、T0开中断,其余保持不变;SETBEASETBEX0SETBET0⑷.INT1、串行口为高优先级,其余为低优先级;MOVIP,#85H5.子程序和中断程序有何异同,为什么子程序返回指令RET和中断返回指令RETI不能相互替代?答:中断类似于子程序设计中的调用子程序,但它们有着本质的区别。调用子程序是程序员事先安排好的,而中断是由一些特殊事件触发的,是随机的。RET功能是恢复堆栈中PC的值,从调用指令的下一条指令开始运行程序,不影响标志位。RETI除了具有RET指令功能外,还清除内部相应的中断状态触发器,因此中断服务程序必须以RETI为指令结束。CPU执行RETI指令后至少再执行一条指令,才能响应新的中断请求,因此不能互换。1.外部中断有几种中断触发方式?对跳变触发和电平触发信号有什么要求?如何设置?答:外部中断有低电平触发和边沿触发两种触发方式。低电平触发时,施加在相应引脚上的低电平在中断返回前必须撤消,否则将再次申请中断造成出错。即施加在引脚上的低电平持续时间应大于一个机器周期,且小于中断服务程序的执行时间。在边沿触发方式中,为了保证CPU在两个机器周期内能够检测到由高至低跳变的电平,输入的高电平和低电平的持续时间至少要保持12个振荡周期(即一个机器周期的时间)。通过TCON寄存器的IT1和IT0来设置。ITi设置为“0”时,相应的外部中断为低电平触发方式;设置为“1”时,相应的外部中断为边沿触发方式,7.为何要在程序的首地址安排一条跳转到主程序的指令?在响应中断的过程中为什么要保护现场?应如何保护?答:因为程序的首地址与外中断0的入口地址之间只相差3各单元,放不下完整的主程序,一般将主程序放到0030H以后的单元,故要安排一条跳转到主程序的指令。主程序中通常用到PSW、工作寄存器和特殊功能寄存器等。如果在中断服务程序中要用这些寄存器,会造成这些现场寄存器中数据的混乱,在中断服务前应将它们的内容保护起来称保护现场。通常利用堆栈操作来保护现场。 8.利用做一个计数器。当有脉冲时,A的内容加1。并且当A的内容大于或等于100时将P1.0置位。ORG0000HLJMPMIN0ORG0003HLJMPINTB0ORG0030HMIN0:MOVSP,#30H;主程序SETBIT0SETBEX0SETBEAMOVA,#00MIN1:NOPLJMPMIN1ORG0100HINTB0:PUSHPSW;的中断服务程序ADDA,#01CJNEA,#100,INTB1LJMPINTB2INTB1:JCINTB3INTB2:SETBP1.0INTB3:POPPSWRETIEND 【5.1任务拓展】了解中断响应后,中断请求标志位如何撤除?当中断有效,CPU响应中断请求后,在中断返回前,应该及时返回撤除上一个中断请求,否则会引起另一次中断。中断请求的产生是由硬件自动完成的,但是不同中断源的中断请求标志的撤除却并不同。(1).外部中断请求的撤除对于下降沿触发的外部中断,CPU响应中断后,由硬件自动清除有关的请求标志位。对于电平激活的外部中断,撤除方法较复杂。因为在电平触发方式下,CPU响应中断时,不会自动清除IE0或IE1标志,所以在响应中断后应立即撤除和引脚上的低电平,由于CPU不能控制和引脚上外接的信号,所以必须用软硬结合的方法处理。图5-5电路是一个可行方案。外部中断请求信号接在D触发器的CP端,当外部中断请求信号正脉冲出现在CP端时,由于D端接低电平,所以D触发器输出的输出低电平,申请中断。当CPU响应中断时,执行两条指令:SETBP1.0CLRP1.0在P1.0输出一个负脉冲,D触发器被置1.Q输出为1,撤销了中断请求信号。8051INT0P1.0QDSDCP外部中断请求信号图5-5电平方式外中断请求的撤除电路(2)定时/计数器溢出标志的撤除对定时/计数器溢出中断,CPU响应中断后,由硬件自动清除了有关的中断请求标志位TF0或TF1。即中断请求是自动撤除的,无需采取其他措施。(3)串行口收发结束中断标志的撤除对串行口中断,CPU响应中断后,标志位TI和RI不能自动撤除,需要用软件来清楚相应标志。 第六章习题答案1.当定时器T0工作在方式3时,要占用定时器T1的TF1和TR1两个控制位。2.在定时器工作在方式1下,计数器的计数器的宽度为16位,若fosc=12MHz,最大定时时间为1μs,若fosc=6MHz,则最大定时时间为2μs。3.定时时间与定时器的工作方式、计数初值及晶振频率有关。4.MCS-51的定时器/计数器作计数器使用时,计数脉冲由外部信号通过引脚P3.4和P3.5提供。5.MCS-51的定时器/计数器T0门控信号GATE设置为1时,只有INT0引脚为高电平且由软件使TR0置1时,才能启动定时器工作。6.MCS-51系列单片机内部设有几个定时器/计数器?它们是由哪些专用寄存器组成?有哪几种工作方式?简述各种工作方式的功能特点。MCS-51单片机内部设有两个16位定时器/计数器T0和T1。分别有的8位计数器TH0、TL0和TH1、TL1组成,各有4种工作方式。方式0是一个13位的定时器/计数器。只用了16位寄存器中的高8位(THi)和低5位(TLi的D4~D0位),TLi的高3位未用。方式1为16位定时器/计数器方式,由THi的8位和TLi的8位构成16位加1计数器,,当16位计数满溢出时,溢出标志位TFi置“1”。方式2为8位自动重装计数器。仅TLi作为计数器,而THi的值在计数中不变。TLi溢出时,THi中的值自动装入TLi中。方式3只适用定时器/计数器T0。T0在该方式下被拆成两个独立的8位计数器TH0和TL0,TL0可作8位的定时器或计数器用,而TH0借用T1的控制位和溢出标志位TR1和TF1,只可用作简单的定时器使用。该方式下T1可用作串行口波特率发生器。7.MCS-51系列单片机定时器/计数器作定时器或计数器使用时,其计数脉冲分别由谁提供?作定时器使用时,其实质是在单片机内部对机器周期进行计数,计数脉冲输入信号由内部时钟提供,每一个机器周期计数器自动加1。作计数器使用时,其实质是对外部事件进行计数,计数脉冲来自相应的外部输入引脚T1或T0,当外部输入脉冲信号由1至0的跳变时,计数器自动加1。8.采用程序查询方式,由T1产生一个50Hz的方波,从P1.1输出,fosc=12MHz。解:方波周期T=1/50=0.02s=20ms,用T1定时10ms,计数初值为:216-10×10-3×12×106/12=65536-10000=55536=D8F0H源程序如下:ORG0000HLJMPT1BUSORG0030HT1BUS:MOVTMOD,#10H;T1方式1,定时模式SETBTRl;启动T1LOOP:MOVTH1,#0D8H;送T1计数初值MOVTL1,#0F0HLOOP1:JNBTF1,LOOP1;T1没有溢出等待CLRTF1;产生溢出清标志位CPLP1.1;P1.1取反输出SJMPLOOP;循环 END【任务拓展】门控位的应用。当GATE=0时,定时器/计数器的启停只跟TRi位有关TRi置“1”时,定时器/计数器开始工作;TRi为“0”时,定时器/计数器停止工作;当GATE=1时,定时器/计数器的启动要由外部中断引脚和TRi位共同控制。只有当外部中断引脚或为高时,TR0或TR1置“1”才能启动对应的定时器工作。利用T0门控位测引脚上出现的正脉冲宽度,并将所测得的高8位值存入片内71H单元,低8位值存入片内70H单元。已知fosc=12MHz。解:设外部脉冲由(P3.2)输入,T0工作于定时模式,选择方式1(16位计数器),GATE设为1。测试时,应在为低电平时,设置TR0为1,一旦变为高电平,就启动计数;再次变为低电平时,停止计数。此计数值对应被测正脉冲的宽度。程序段如下(用查询方式):MOVTMOD,#09H;T0定时模式,方式1,GATE=1MOVTL0,#00H;T0从0000H开始计数MOVTH0,#0OHMOVR0,#70HLOOP:JBP3.2,LOOP;等待P3.2变低CLREACLRET0SETBTR0;P3.2变低,准备启动T0LOOP1:JNBP3.2,LOOP1;等待P3.2变高,启动计数LOOP2:JBP3.2,LOOP2;等待P3.2再次变低,当P3.2为高电平时,定时器T0;在硬件作用下自动计时CLRTR0;P3.2变低后,停止计数MOV@R0,TL0;存入计数值INCR0MOV@R0,TH0这种方案的最大被测脉冲宽度为65535μs(fosc=12MHz),由于靠软件启动和停止计数器,测量的数值有一定的误差,其误差与采用的指令有关。上述程序被测的脉冲宽度t为:t=12×N/fosc=Nμs式中N为定时器中的计数值,等于71H70H单元中的数值。 第七章习题答案1.选择题(1)MCS-5l系列单片机的串行口是(B)。A.单工B.全双工C.半双工D.并行口(2)表示串行数据传输速率的指标是(D)。A.USARTB.UARTC.字符帧D.波特率(3)串行口的控制寄存器是(C)。A.PCONB.SMODC.SCOND.SBUF(4)当设置串行口工作于方式2时,采用(A)指令。A.MOVSCON,#80HB.MOVSCON,#10HC.MOVPCON,#80HD.MOVPCON,#10H(5)当串行口工作于方式0时,其波特率(C)。A.取决于定时器1的溢出率B.取决于PCON的SMODC.取决于时钟频率D.取决于PCON的SMOD和定时器1的溢出率(6)当串行口工作于方式1时,其波特率(D)。A.取决于定时器1的溢出率B.取决于PCON的SMODC.取决于时钟频率D.取决于PCON的SMOD和定时器1的溢出率(7)串行口的发送数据和接收数据端为(A)。A.TXD和RXDB.TI和RIC.TB8和RB8D.REN(8)串行口是单片机的(A)。A.内部资源B.外部资源C.输入设备D.输出设备简答题1.串行口有几种工作方式?有几种帧格式?各工作方式的波特率如何确定?SM0SM1工作方式功能波特率00方式08位同步移位寄存器/120l方式l10位UART可变(由定时器控制)10方式211位UART/64、/3211方式311位UART可变(由定时器控制)2.何谓波特率、溢出率?如何计算和设置MCS-51系列单片机串行通信的波特率?波特率是串行数据传输中,串行口每秒钟发送(或接收)的二进制位数称为波特率,单位是b/s(位/秒)。溢出率是指定时器T1作为波特率发生器使用时的溢出频率,其大小为溢出周期之倒数在方式0时,每个机器周期发送或接收一位数据,因此波特率固定为振荡频率的l/12,且不受SMOD位的控制。方式2的波特率要受PCON中SMOD位的控制,波特率=,当SMOD设置为“0”时,波特率等于/64,若SMOD设置为“1”时,则波特率等于/32。 方式1或方式3时,其波特率由定时器/计数器T1的溢出率与SMOD位共同控制。其波特率可表示为:波特率=T1的溢出率/(32/)3.为什么T1用作串行口波特率发生器时,常选用操作方式2?定时器T1工作于方式2是8位的自动重装方式,这样就避免了由于软件装载引起的误差,故通常将T1设置为方式2,作为波特率发生器。4.串行口控制寄存器SCON中TB8、RB8起什么作用?在什么方式下使用?TB8和RB8:方式2和方式3时发送和接受的第9位数据。在双机通信中可以作为奇偶校验位,在多机通信中,可作为地址和数据的区别 【7.1任务拓展】并口转换串口:在单片机的串行口外接一个并入串出移位寄存器74LS165,实现并口到串口的转换,外部8位并行数据通过移位寄存器74LS165进入单片机的串行口,再送往P0点亮LED指示灯。硬件电路如图:程序清单:ORG0000HLJMPSTARTORG0020HSTART:CLRP1.0SETBP1.0;发送移位脉冲MOVSCON,#10H;设串行口方式0,开放接收允许RQ1:JNBRI,RQ1;等待接收完一帧数据CLRRI;清RI中断标志MOVA,SBUF;读SBUFMOVP0,A;接收数据送P0LCALLDELAYSJMPSTARTORG1000HDELAY:MOVR7,#10;延时程序DL1:MOVR6,#200DL2:MOVR5,#250DL3:DJNZR5,DL3DJNZR6,DL2DJNZR7,DL1RETEND 【7.3任务拓展】了解串行通信中奇偶校验位的原理和方法,编制偶校验方式发送和接收的程序。答:奇校验是指通信双方发送和接收的数据中8位有效数据连同1位附加位中二进制“1”的个数位奇数;偶校验指通信双方发送和接收的8位有效数据连同1位附加位中,二进制“1”的个数为偶数。如果约定发送采用奇校验,则若发送的8位有效数据中“1”的个数为偶数,则要人为添加一个附加位“1”一起发送;若发送的8位有效数据中“1”的个数为奇数,则要人为添加一个附加位“0”一起发送。约定接收采用奇校验,若接收到的9位数据中“1”的个数为奇数,则表明接收正确,取出8位有效数据即可;若接收到的9位数据中“1”的个数为偶数,则表明接收出错!应当进行出错处理偶校验的处理方法与奇检验相反。奇偶校验是检验串行通信双方传输的数据正确与否的一个措施,并不能保证通信数据的传输一定正确,换言之:如果奇偶校验发生错误,表明数据传输一定出错了;如果奇偶校验没有出错,绝不等于数据传输完全正确。选用偶校验方式发送PIPL:PUSHPSW;保护现场PUSHACCCLRTI;清发送中断标志以备下次发送MOVA,@R0;取由R0所指向的单元中的数据MOVC,P;将奇偶标志位通过C放进TB8MOVTB8,C;一起发送出去MOVSBUF,A;启动发送INCR0;指针指向下一个数据单元POPACC;恢复现场POPPSWRETI;中断返回选用偶校验方式接收:PIPL:PUSHPSW;保护现场PUSHACCCLRRI;清接收中断标志以备下次接收MOVA,SBUF;读进收到的数据MOVC,P;奇偶标志位®C=JNBP,L1JNCL1;C=0时转到L1P=0时转到L1JNBRB8,ERR;P=1时转到L2,若RB8=0“出错”SJMPL2;RB8=1则表明接收正确,转L2L1:JBRB8,ERR;P=0且RB8=1表明“出错”L2:MOV@R0,A;P=0且RB8=0表明接收正确INCR0;指针指向下一个数据单元POPACC;恢复现场POPPSWERR:出错处理……RETI;中断返回RETI 第八章习题答案1.地址译码方法包括线选法和译码法。其中译码法又分为部分地址译码法和全地址译码法。全地址译码法是将各扩展芯片上的地址线均接到单片机系统对应的地址总线上,剩余的全部地址线全部连接到译码器上,各芯片的片选信号由译码电路产生,因此得到的每个选中单元的地址都是唯一的。而部分译码法是将部分剩余高位地址线通过译码的方式生成外设地址,所以地址可能不唯一。2.不会。这是因为访问外部程序存储器使用MOVC指令,而访问外部数据存储器和IO采用MOVX指令,两者对应的时序和控制信号是不同的,总线不会冲突。3.电路如下所示。6264(1)地址范围:0000H~1FFFH;6264(2)地址范围:2000H~3FFFH;2764(1)地址范围:0000H~1FFFH;2764(2)地址范围:2000H~3FFFH;4.8255IO口有三种工作方式基本输入/输出、选通输入/输出、双向选通输入输出方式。其中通过其控制寄存器设定。8155A有四种IO工作方式,包含基本IO和选通IO等组合,也需通过其控制寄存器进行配置。5.设8255控制寄存器地址为XXH,则A口工作与方式2,则B口只能工作与方式0。8255初始化程序:MOVA,#11000010BMOVDPTR,#XXHMOVX@DPTR,A6.单片机晶振频率为12Mhz,将其24分频,工作频率为500K,要获得10ms定时,需要对该信号计数5000次。对应十六进制数1388H,设只需要进行单次10ms计数,则定时计数器M2M1=00,则定时器低位寄存器为88H,高位为13H。设控制口地址为C000H,则定时计数器低位地址为C0004H,定时计数器高位地址为C0005H。则初始化程序为:MOVDPTR,#0C000HMOVA,#00000101B;8155IO工作方式3,A输出,B输入MOV@DPTR,AMOVDPTR,#0C004H;装入初值低8位 MOVA,#88HMOV@DPTR,AMOVA,#13H;装入初值高8位INCDPTRMOV@DPTR,AMOVA,#11000101B;启动定时器 【任务拓展1】:将任务8.1中的发光二极管改为共阳极数码管,将被按下开关的编号送至数码管显示。【任务分析】:要实现该任务,须先通过8155PB口获得开关的编码信息,再通过查表的方式获得其共阳极编码,经8155PA口输出。设电路图如同8-43所示。图8-43扩展应用【任务实施】参考C51代码如下:#include"reg51.h"#include#defineucharunsignedchar#definePMXBYTE[0x0100]//8155命令状态口#definePAXBYTE[0x0101]//PA口#definePBXBYTE[0x0102]//PB口ucharcodetab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x98};//共阳极段码voidmain(){uchari;PM=0x01;//PA输出,PB输入while(1){i=PB;//读取开关状态switch(i)//查询开关编号,并输出{case0xfe:PA=tab[0];break;case0xfd:PA=tab[1];break;case0xfb:PA=tab[2];break;case0xf7:PA=tab[3];break;case0xef:PA=tab[4];break;case0xdf:PA=tab[5];break;case0xbf:PA=tab[6];break; case0x7f:PA=tab[7];break;default:PA=0xff;break;}}}【任务拓展2】:在任务8.2中,在图8-41中,利用8155产生1000Hz的音频信号(时钟信号为1Mhz),当相应按钮按下时,对外连接的SOUNDER发出1kHz的提示音。本例中需要对8155定时器1000分频,故计数值为1000,其16进制数为03E8H。连续方波输出是M2M1=01,故计数初值为43E8H。参考C51程序:#include"reg51.h"#include//绝对定位头文件#defineucharunsignedcharsbitP10=P1^0;#definePMXBYTE[0x0100]//8155命令/状态口#definePAXBYTE[0x0101]//PA口#definePBXBYTE[0x0102]//PB口#definePCLXBYTE[0x0104]//定时器低位#definePCHXBYTE[0x0105]//定时器高位ucharcodetab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x98};//共阳段码表voiddelay(){unsignedlongd=1000;while(d--);}voidmain(){uchari;PM=0x01;PCL=0xe8;//送计数初值1000,连续方波输出PCH=0x43;PM=0xc1;while(1){i=PB;//读取开关状态switch(i){case0xfe:PA=tab[0];P10=1;delay();break;//开关按下,输出编号响铃case0xfd:PA=tab[1];P10=1;delay();break;case0xfb:PA=tab[2];P10=1;delay();break;case0xf7:PA=tab[3];P10=1;delay();break;case0xef:PA=tab[4];P10=1;delay();break;case0xdf:PA=tab[5];P10=1;delay();break; case0xbf:PA=tab[6];P10=1;delay();break;case0x7f:PA=tab[7];P10=1;delay();break;default:PA=0xff;P10=0;delay();break;//无开关按下}}}【任务拓展3】:单片机外部扩展4KB串行I2C程序存储器24C04A。使用单片机的P2.0模拟产生SCK时钟信号,使用P1.1实现数据SDA的传输,使用单片机P3.0连接SOUNDER演奏音乐,电路图如图8-44所示。试使用C语言编程实现程序首先向24C04写入一段音符,然后读取并播放;并比较与汇编语言的异同之处。图8-44单片机连接串行存储器参考C语言程序#include#include#defineucharunsignedchar#defineuintunsignedint#defineNOP4(){_nop_();_nop_();_nop_();_nop_();}sbitSCL=P1^0;sbitSDA=P1^1;sbitSPK=P3^0;//标准音符频率对应的延时表ucharcodeHI_LIST[]={0,226,229,232,233,236,238,240,241,242,244,245,246,247,248};ucharcodeLO_LIST[]={0,4,13,10,20,3,8,6,2,23,5,26,1,4,3};//待写入24C04的音符ucharcodeSong_24C04[]={1,2,3,1,1,2,3,1,3,4,5,3,4,5};ucharsidx;//读取音符索引//延时 voidDelayMS(uintms){uchari;while(ms--)for(i=0;i<120;i++);}//IIC开始voidStart(){SDA=1;SCL=1;NOP4();SDA=0;NOP4();SCL=0;}//IIC停止voidStop(){SDA=0;SCL=0;NOP4();SCL=1;NOP4();SDA=1;}//读取应答voidRACK(){SDA=1;NOP4();SCL=1;NOP4();SCL=0;}//发送非应答信号voidNO_ACK(){SDA=1;SCL=1;NOP4();SCL=0;SDA=0;}//向24C04中写一个字节数据voidWrite_A_Byte(ucharb){uchari;for(i=0;i<8;i++){b<<=1;SDA=CY;_nop_();SCL=1;NOP4();SCL=0;}RACK();}//向指定地址写数据voidWrite_IIC(ucharaddr,uchardat){Start();Write_A_Byte(0xa0);Write_A_Byte(addr);Write_A_Byte(dat);Stop();DelayMS(10);}//从24C04中读一个字节数据 ucharRead_A_Byte(){uchari,b;for(i=0;i<8;i++){SCL=1;b<<=1;b|=SDA;SCL=0;}returnb;}//从当前地址读取数据ucharRead_Current(){uchard;Start();Write_A_Byte(0xa1);d=Read_A_Byte();NO_ACK();Stop();returnd;}//从任意地址读取数据ucharRandom_Read(ucharaddr){Start();Write_A_Byte(0xa0);Write_A_Byte(addr);Stop();returnRead_Current();}//定时器0中断voidT0_INT()interrupt1{SPK=~SPK;TH0=HI_LIST[sidx];TL0=LO_LIST[sidx];}//主程序voidmain(){uinti;IE=0x82;//EA=1,ET0=1TMOD=0x00;for(i=0;i<14;i++)//向24C04写入音符表{Write_IIC(i,Song_24C04[i]);}while(1)//反复读取音符并播放 {for(i=0;i<15;i++)//从24C04中读取音符{sidx=Random_Read(i);//从指定地址读取TR0=1;//播放DelayMS(300);}}} 第九章参考答案1.参看9.1节第二部分(二)矩阵式键盘。2.分为软件消抖和硬件消抖两种方法。去抖方法参看9.1节第一部分。判断键是否释放方法:计算键值以后,再以延时和扫描的方式等待并判定键释放。3.参考电路图如下:C51参考程序:#include#defineucharunsignedchar#defineuintunsignedintucharHSM,LJC;//定义行扫描码和列检测数据uchartmp,keyvalue;//定义接收键值和键值ucharkeyscan();voiddelay(uintx);/*********************************************************************函数名称:main()函数功能:主函数,键值处理**********************************************************************/voidmain(){while(1){tmp=keyscan();switch(tmp){case0x11:P0=0x3f;//0break;case0x21:P0=0x06;//1break;case0x41:P0=0x5b;//2break;case0x81:P0=0x4f;//3 break;case0x12:P0=0x66;//4break;case0x22:P0=0x6d;//5break;case0x42:P0=0x7d;//6break;case0x82:P0=0x07;//7break;case0x14:P0=0x7f;//8break;case0x24:P0=0x6f;//9break;case0x44:P0=0x77;//Abreak;case0x84:P0=0x7c;//Bbreak;case0x18:P0=0x39;//Cbreak;case0x28:P0=0x5e;//Dbreak;case0x48:P0=0x79;//Ebreak;case0x88:P0=0x71;//Fbreak;default:P0=0x00;}delay(100);}}/*************************************************************************函数名称:voiddelay(uintx)函数功能:延时xms,振荡器频率为f=12MHz**************************************************************************/voiddelay(uintx){ucharj,k;for(;x>0;x--)for(j=4;j>0;j--)for(k=250;k>0;k--);}/**************************************************************************函数名称:voidkeyscan()函数功能:键盘扫描及按键处理 **************************************************************************/ucharkeyscan(){P1=0xf0;//行扫描全为低电平,列线全为高电平LJC=P1&0xf0;//第一次读列检测状态if(LJC!=0xf0){delay(10);//若有键盘被按下,则延时10msLJC=P1&0xf0;//第二次读取列检测状态:0xe0、0xd0、0xb0、0x70if(LJC!=0xf0)//若有闭合键,则逐行扫描{HSM=0xfe;//扫描码分别为0xfe、0xfd、0xfb、0xf7while((HSM&0x10)!=0)//若扫描码为0xef,则结束扫描{P1=HSM;//输出行扫描码LJC=P1&0xf0;//读列检测数据:0xe0、0xd0、0xb0、0x70if(LJC!=0xf0)//如果有按键闭合{keyvalue=(~HSM)+(~(LJC|0x0f));//计算键盘值return(keyvalue);//返回键值}elseHSM=(HSM<<1)|0x01;//行扫描左移1位,准备扫描下一行}}}return(0x00);}汇编语言参考程序:ORG00HLJMPMAINMAIN:LCALLKEYJUDGELCALLKEYSCANLCALLDISPLJMPMAINKEYJUDGE:MOVP3,#0F0HMOVA,P3XRLA,#0F0HJNZDELAYLJMPMAINDELAY:MOVR4,#08HLOOP1:MOVR5,#0FAHLOOP2:DJNZR5,LOOP2 DJNZR4,LOOP1MOVP3,#0F0HMOVA,P3XRLA,#0F0HJZMAINRETKEYSCAN:MOVR0,#00HMOVR1,#00HMOVR2,#0FEHMOVR3,#04HKEY:MOVP3,R2KEY0:JBP3.4,KEY1MOVR1,#00HLJMPNUMKEY1:JBP3.5,KEY2MOVR1,#04HLJMPNUMKEY2:JBP3.6,KEY3MOVR1,#08HLJMPNUMKEY3:JBP3.7,NEXTMOVR1,#0CHLJMPNUMNEXT:INCR0MOVA,R2RLAMOVR2,ADJNZR3,KEYLJMPNUMNUM:MOVA,R0ADDA,R1MOVDPTR,#TABMOVCA,@A+DPTRMOVR6,ARETDISP:MOVP0,R6LCALLDELAY1RETDELAY1:MOVR4,#0FHLOOP10:MOVR5,#0FAHLOOP20:DJNZR5,LOOP20DJNZR4,LOOP10 RETTAB:DB3FH,06H,5BH,4FH,66H,6DH,7DH,07HDB7FH,6FH,77H,7CH,39H,5EH,79H,71HEND4.静态显示:静态显示方式要求每位LED显示器的公共端(COM)必须接地(共阴极),或接高电平(共阳极)。而每位LED显示器都由一个具有锁存功能的8位端口去控制。动态显示:把所有显示器的同名字段互相连接在一起,并把它们连到字形口上。为了防止各个显示器同时显示出相同的字符,每个显示器的公共端(COM)还要受另一组信号控制,即把它们接到字位口上。这样对于一组LED数码显示器需要有两种信号控制:一组是字形口输出的字形码,用来控制显示内容;另一组是字位口输出的字位码,用来控制将字符显示在第几位显示器上。在这两组信号的控制下使各个显示器依次从左至右轮流点亮一遍,过一段时间再轮流点亮一遍,如此不断重复。虽然在任意时刻只有一位显示器被点亮,但由于显示器具有余辉效应,而人眼又具有视觉惰性,所以看起来与全部显示器持续点亮效果完全一样。字形码:为了将数字或字符在LED显示器上输出,把数字或字符在LED显示器上显示时所对应的发光二级管状态按照一定顺序进行编码,称为字形码。LED显示器的字形码分为共阳LED编码和共阴LED编码。5.电路图参考图9-10.C51参考程序:#include#defineucharunsignedcharunsignedcharcodetable[]={0x0c0,0x0f9,0x0a4,0x0b0,0x99,0x92,0x82,0x0f8,0x80,0x92};Ucharsec,mSec;Voidmain(){UcharshowData;Sec=0;mSec=0;TMOD=0x10;//T1模式1,定时TH1=0xd8;//T1计数初值TL1=0x0f0;EA=1;//CPU、T1开中断ET1=1;TR1=1;//启动T1While(1){If(sec%2==0){showData=2;Display(showData);showData=0;Display(showData);showData=1; Display(showData);showData=6;Display(showData);}Else{showData=2;Display(showData);showData=0;Display(showData);showData=4;Display(showData);showData=9;Display(showData);}}}Voiddisplay(unsignedcharindx){unsignedchartemp=table[indx];SBUF=temp;While(!TI){}TI=0;}voidtimer1()interrupt3{TH1=0x0d8;//T1计数初值TH1=0x0f0;mSec++;If(mSec==100){Sec++;mSec=0;}}汇编语言程序:ORG00HLJMPMAINORG001BHLJMPINT1ORG0030HMAIN:MOVTMOD,#01H;选T1方式1,晶振12MHZ,定时50msMOVTH1,#3CH;赋初值高8位MOVTL1,#0B0H;赋初值低8位 SETBTR1;启动T1定时SETBET1;开T1中断允许MOVR0,#00HSETBEA;开总中断允许DIS:MOVA,#2ACALLDSPLYMOVA,#0ACALLDSPLYMOVA,#1ACALLDSPLYMOVA,#6ACALLDSPLYCJNER0,#14H,DISDIS1:MOVR0,#0MOVA,#2ACALLDSPLYMOVA,#0ACALLDSPLYMOVA,#4ACALLDSPLYMOVA,#9ACALLDSPLYCJNER0,#14H,DIS1MOVR0,#0AJMPDISDSPLY:MOVDPTR,#TABLEMOVCA,@A+DPTRMOVSBUF,AJNBTI,$CLRTIRETINT1:MOVTH1,#3CH;赋初值高8位MOVTL1,#0B0H;赋初值低8位INCR0RETITABLE:DB0C0H,0F9H,0A4HDB0B0H,99H,92HDB82H,0F8H,80H,90HEND4.电路图参考图9-6和图9-20。图9-6对应汇编程序实现把键值存放到A 中,调用键扫描后程序后,只需要把A中内容用传送指令MOV40H,A指令即可把键值存储40H单元。至于题目中要求2秒钟扫描一次键盘,需要2秒钟定时,可以把题目5中的1秒钟定时中断服务程序作如下修改即可:C51参考程序:voidtimer1()interrupt3{TH1=0x0d8;//T1计数初值TH1=0x0f0;mSec++;If(mSec==200){Sec++;Key=keyscan();}}在主程序中等待key的改变,根据不同的key值作出相应的输出。汇编语言参考程序:ORG00HLJMPMAINORG001BHLJMPINT1ORG0030HMAIN:MOVTMOD,#01H;选T1方式1,晶振12MHZ,定时50msMOVTH1,#3CH;赋初值高8位MOVTL1,#0B0H;赋初值低8位SETBTR1;启动T1定时SETBET1;开T1中断允许MOVR0,#00HMOVR1,#40HSETBEA;开总中断允许SCANKEY:CJNER0,#3CH,SCANKEY;3秒钟扫描一次键盘MOVR0,#00HLCALLKEY1;KEY1为按键扫描子程序,键值存放在A中MOV@R1,AINCR1CJNER1,#7FH,SCANKEY;若地址超过7FH,重新从40H单元开始存键值MOVR1,#40HAJMPSCANKEYINT1:MOVTH1,#3CH;赋初值高8位MOVTL1,#0B0H;赋初值低8位INCR0RETI 【9.1任务拓展】图9-3所示的独立式连接键盘需要不停地扫描有无按键按下才可能保证当有按键按下是没有漏判,当单片机主程序所要处理的任务量较大时,很难保证能够及时扫描到按键的状态,而且不停地扫描有无键按下,CPU没有足够精力去处理别的事情,造成系统整体性能下降。为解决此问题,可以对9-3所示的电路图进行改造,只需要把P1口的每个I/O口线共同接到与门上,然后与门输出到外部中断0,当有按键按下时,低电平引起外部中断0中断,可以在中断服务程序中再启动键扫描程序,这样既保证了按键不漏判,又不影响CPU的运行效率。此方法作为课外题目留给同学们讨论和尝试。【任务拓展】请同学们根据参考答案,把题目2、5在proteus中作图,并在keilμvision4中编制程序,把生成的.hex下载到proteus方正图的单片机中,验证结果是否正确。 第十章习题答案1.启动AD转换器的方法,在芯片选中的情况下,在START端口施加200ns以上的正脉冲即可启动ADC0809。单片机可通过查询EOC信号判断AD转换是否完成。可通过定时/查询/中断的方式读取AD转换的结果。参考电路图2.双缓冲方式是指DAC0832内部两个寄存器均处于受控状态的工作方式。这种工作方式适合于多模拟信号同时输出的应用场合。3.控制信号共5根::片选线,低电平有效。:输入寄存器的写选通输入线,低电平有效(宽度应大于500ns)。ILE:数据锁存允许控制信号输入线,高电平有效。输入寄存器的锁存信号由、和ILE的逻辑结合产生。当=0、ILE=1、=0时,DI0~DI7的数据被锁存至输入寄存器。:传送控制信号输入线,低电平有效,可作为地址线用。:DAC寄存器写选通输入线,低电平有效(宽度应大于500ns)。当=0、=0时,输入寄存器的内容传送至DAC寄存器中。4.电路图可参考图10-7。关键参考程序如下:voidjxbo(){DAC0832=128;//高电平为2.5VDelayMS(1);DAC0832=64;//低电平1.25VDelayMS(4);} 第11章习题答案1.简述典型单片机应用系统通常具有的结构层次。答:典型的单片机应用系统通常包括三个层次:单片机、单片机系统和单片机应用系统。2.简述单片机、单片机系统和单片机应用系统的区别。答:单片机是单片机应用系统的核心器件,它提供了构成单片机应用系统的硬件基础和软件基础。硬件基础包括单片机所提供的总线、通用I/O口、时钟、中断系统、串行口等;软件基础是单片机的指令系统。单片机系统是单片机应用系统中的计算机电路系统。通常是指按照单片机的要求,在外部配置单片机运行所需要的电源模块、时钟电路、复位电路等,构成单片机最小系统,以及为满足嵌入对象功能要求,在单片机外部扩展CPU外围电路,如存储器、定时/计数器、中断源等,形成能满足具体嵌入式应用的一个计算机系统。单片机应用系统是满足使用要求,能在使用环境中可靠地实现预定功能的产品系统。它在单片机系统的基础上配置了面向对象的接口电路。3.简述单片机应用系统设计的总体设计流程。答:单片机应用系统的总体设计流程是:除了产品立项后的方案论证外,主要有总体设计、硬件系统设计与调试、软件设计、仿真调试和系统脱机运行检查5个部分。在总体设计完成后,硬件系统设计调试和应用程序设计可以同时进行,而应用程序仿真调试则应在硬件系统设计与制作调试完成后进行。4.简述单片机应用系统总体方案设计包含的几个步骤。答:单片机应用系统总体方案设计包含以下几个步骤:需求分析、确定技术指标、方案论证、机型和器件选择以及硬件和软件的功能划分等。5.单片机系统硬件设计中,系统扩展和配置应遵循的几个原则。答:系统扩展和配置应遵循以下原则:(1)尽可能选择典型电路,并符合单片机常规用法,多参考相关的成熟电路、标准电路。为硬件系统的标准化、模块化打下良好的基础。(2)系统扩展与外围设备的配置水平应充分满足应用系统的功能要求,并留有适当余地,以便进行二次开发。(3)单片机I/O口的驱动能力是有限的,若挂接的外设较多,应考虑增加总线驱动电路或减少芯片功耗,以降低系统负担。(4)硬件结构应结合应用软件方案一并考虑。硬件结构与软件方案会产生相互影响,考虑的原则是:软件能实现的功能尽可能由软件实现,以简化硬件结构。但必须注意,由软件实现的硬件功能,一般响应时间比硬件实现长,且占用CPU时间。(5)系统中的相关器件要尽可能做到性能匹配。如选用CMOS芯片单片机构成低功耗系统时,系统中所有芯片都应尽可能选择低功耗产品。(6)可靠性及抗干扰设计是硬件设计必不可少的一部分,它包括芯片、器件选择、去耦滤波、印刷电路板布线、通道隔离等。6.简述单片机应用系统干扰形成的几个基本要素和耦合方式。答:形成干扰的基本要素有:干扰源、传播路径、敏感器件等。基本耦合方式有:静电耦合、互感耦合、公共阻抗耦合、电磁场辐射耦合、漏电流等7.简述单片机应用系统常用的抗干扰措施。答:常用的硬件抗干扰措施有:抑制干扰源、切断干扰传播路径、提高敏感器件的抗干扰性能等。常用的软件抗干扰措施:消除模拟输入信号的噪声(如数字滤波技术);程序运行混乱(程序“跑飞”)时使程序重入正轨的方法,如指令冗余方法、拦截技术等。'