• 2.60 MB
  • 2022-04-22 11:19:03 发布

《单片机原理与接口技术》课后答案(段晨东主编)详尽版.docx

  • 104页
  • 当前文档由用户上传发布,收益归属用户
  1. 1、本文档共5页,可阅读全部内容。
  2. 2、本文档内容版权归属内容提供方,所产生的收益全部归内容提供方所有。如果您对本文有版权争议,可选择认领,认领后既往收益都归您。
  3. 3、本文档由用户上传,本站不保证质量和数量令人满意,可能有诸多瑕疵,付费之前,请仔细先通过免费阅读内容等途径辨别内容交易风险。如存在严重挂羊头卖狗肉之情形,可联系本站下载客服投诉处理。
  4. 文档侵权举报电话:19940600175。
'第一章复习思考题答案一、选择题1:B2:C3:B4:A5:B6:D7:D8:C9:B10:B二、思考题1.简述微型计算机的组成和工作原理。微型计算机主要由微处理器CPU、存储器、输入设备和输出设备组成。当使用计算机解决某个具体问题时,首先,根据解决问题的方案,编写出一系列解决这个问题的程序;然后,把程序输入到计算机中,命令计算机按照这些事先拟定步骤顺序执行。CPU包括控制器和运算器。CPU是计算机中最重要的部件,由它实现程序控制、操作控制、时序控制、数据加工、输入与输出控制、对异常情况和请求的处理等等。存储器是计算机中的记忆部件,用来存储编写的程序,存放程序所用的数据以及产生的中间结果。由输入设备把程序和数据送入计算机内部的“存储器”中保存,程序处理完毕把结果通过“输出设备”输出,以便人们识别。接通电源后,CPU会自动地从存储器中取出要执行的程序代码,通过译码解析出代码所赋予的功能,如果进行数据运算,则从存储器中提取运算所需要的数据,再进行运算操作,并把运算结果存储到程序指定的存储区域,结束本次执行操作;如果执行转移操作,则提取程序代码中的转移信息,计算出程序转移的目标地址,然后跳转。紧接着,CPU再从存储器中提取下一次要执行的代码,不断地重复上述操作过程。2.简述单片机在结构上与微型计算机的区别与联系。微型计算机是以微处理器为基础,配以内存储器及输入输出(I/0)接口电路和相应的辅助而构成。单片机是采用超大规模集成电路技术把具有数据处理能力的中央处理器CPU、随机存储器RAM、只读存储器ROM、多种I/O口和中断系统、定时器/计时器等集成到一块芯片上的微型计算机。3.单片机与微处理器有什么不同?单片机也称微控制器,它集成CPU、ROM、RAM、存储器、I/O口等,而微处理器是是CPU,它仅集成了运算器和控制器,没有存储器和接口。4.把下列十进制数转换为二进制数、八进制和十六进制数。(1)32768(2)23.156(3)-56.8125(4)59解:(1)(32768)10=(1000000000000000)2=(100000)8=(8000)16(2)(23.156)10=(10111.00100111)2=(27.116)8=(17.27)16(3)(-56.8125)10=(-111000.1101)2=(-70.64)8=(-38.D)16(4)(59)10=(111011)2=(73)8=(3B)165.把下列二进制数转换为十进制数、十六进制数:(1)10001010111(2)10110.11101解:(1)(10001010111)2=(1111)10=(457)16(2)(10110.11101)2=(22.90625)10=(16.E8)16 6.求下列数据的原码、反码、补码(以8位表示)(1)73(2)23(3)-1(4)-109解:(1)[73]原=01001011[73]反=01001011[73]补=01001011(2)[23]原=00010111[23]反=00010111[23]补=00010111(3)[-1]原=10000001[-1]反=11111110[-1]补=11111111(4)[-109]原=11101101[-109]反=10010010[-109]补=100100117.求下列数据的原码、反码、补码(以16位表示)(1)-12137(2)0(3)-1(4)23679解:(1)[-12137]原=1010111101101001[-12137]反=1101000010010110[-12137]补=1101000010010111(2)[+0]原=0000000000000000[+0]反=0000000000000000[+0]补=0000000000000000[-0]原=1000000000000000[-0]反=1111111111111111[+0]补=0000000000000000(3)[-1]原=1000000000000001[-1]反=1111111111111110[-1]补=1111111111111111(4)[+23679]原=0101110001111111=[+23679]反=[+23679]补8.把下列十进制数转换为二进制、十六进制数,并把它们用BCD码表示:(1)128(2)7891(3)819(4)21解:(1)(128)10=(10000000)2=(80)16=(000100101000)BCD(2)(7891)10=(1111011010011)2=(1ED3)16=(0111100010010001)BCD(3)(819)10=(1100110011)2=(333)16=(100010010001)BCD(4)(21)10=(10101)2=(15)16=(00100001)BCD9.写出下列数据的定点小数和浮点数,定点小数的小数部分为1个字节,浮点数为3字节浮点数格式。(1)-76.25(2)3789(3)-32767(2)1.109375解:(1)定点数11001100.00100000浮点数879840H(2)定点数111011001101.00000000浮点数0CECD0H(3)定点数1111111111111111浮点数8FFFFEH(4)定点数0001.00011011浮点数018D80H10.请把下列字符串用ASCII码表示。(1)WWW.CCTV.COM(2)Wo123_Password:0解:(1)5757572E434354562E434F4D(2)576F3132335F50617373776F72643A30 第二章复习思考题答案一、选择题1:B2:B3:A4:D5:C6:C7:A8:B9:B10:B11:B12:D13:B14:A15:B16:C17:B18:C19:C20:B21:C22:D23:C24:C25:B26:A27:A28:D29:D30:C31:A32:B33:C34:D35:B36:D37:A38:A39:B40:C二、简答题1.MCS-51单片机芯片包含哪些主要逻辑功能部件?各有什么功能?中央处理器CPU:完成运算和控制操作。存储器:内部数据存储器RAM用于存放程序的机器代码和常数;内部程序存储器用于存放可读写的数据。特殊功能寄存器用于存放相应功能部件的控制命令、状态和数据。并行口:P0~P3除了可以作为基本的I/O功能之外,P3口的第二功能还提供了串行口、外部中断、外部计数等功能以及访问外部数据存储器和外部I/O口的控制信号。串行口:用于串行通信。定时/计数器:2个16位定时器/计数器,具有多种工作模式,用于计数、定时和产生串行通信的波特率。中断系统:单片机有5个中断源,分别为2个外部中断、2个定时器/计数器溢出中断、1个串行口接收/发送中断,提供2个中断优先级。实现实时控制等。2.MCS-51的控制总线信号有哪些?它们各起什么作用?ALE——地址锁存控制信号,输出。ALE用于锁存地址总线的低八位。该信号频率为振荡器频率的1/6,可作为外部定时或时钟使用。——外部程序存储器读选通信号,输出,为低电平时,CPU从外部程序存储器的单元读取指令。——内、外程序存储器选择控制端,输入,当接地(=0)时,CPU对程序存储器的操作仅限于单片机外部。当接高电平(=1)时,CPU对程序存储器的操作从单片机内部开始,并可延伸到单片机的外部。RESET——复位信号。在RESET引脚上保持2个机器周期以上的高电平,单片机复位。3.MCS-51单片机的信号有什么功能?在使用8031时,引脚应如何处理?为内、外程序存储器选择控制端,当接地(=0)时,CPU对程序存储器的操作仅限于单片机外部。当接高电平(=1)时,CPU对程序存储器的操作从单片机内部开始,并可延伸到单片机的外部。8031无片内ROM,所以必须接地。4.程序计数器PC的作用是什么?程序计数器PC是一个16位的寄存器,用来存放下一条即将执行指令的地址。CPU每取一次机器码,PC的内容自动加1,CPU执行一条指令,PC的内容自动增加该指令的长度(指令的字节数)。CPU复位后,PC的内容为0000H,它意味着程序从头开始执行。5.MCS-51单片机有哪些控制信号需要芯片引脚以第二功能的方式提供? (1)串行口:P3.0作为串行口数据的接收端RXD;P3.1作为串行口数据的发送端TXD;(2)外部中断触发信号的输入P3.2作为外部中断的中断触发信号的输入端;P3.3作为外部中断的中断触发信号的输入端;;(3)外部计数脉冲的输入端P3.4作为定时/计数器T0外部计数信号的输入;P3.5作为定时/计数器T1外部计数信号的输入;(4)访问外部RAM的读写控制信号P3.6作为外部数据存储器写控制信号;P3.7作为外部数据存储器读控制信号6.MCS-51单片机的存储器地址空间如何划分?各个空间的地址范围和容量是多少?MCS-51单片机的存储器地址空间可分为以下5类:程序存储器,最大空间64K;片内数据存储器,128个单元;特殊功能寄存器,共21个;位寻址空间,211位;外部数据寄存器,最大空间64K。7.简述内部RAM的功能分区?说明各部分的使用特点。片内RAM分为3个区域:(1)00~1FH:32个单元为工作寄存器区,包含4个工作寄存器组。(2)20~2FH:16个单元为位寻址区。CPU可以对每一位按位地址直接操作。(3)30~7FH:80个单元为数据缓冲区。数据缓冲区作为数据缓冲、数据暂存、作为堆栈区使用;这些单元只能按单元访问。8.如何选择MCS-51单片机的当前工作寄存器组?单片机当前工作寄存器组是由程序状态寄存器PSW中的RS1、RS0的状态决定:当RS1、RS0=00时,选择工作寄存器组0区,R0~R7对应单元地址为00H~07H;当RS1、RS0=01时,选择工作寄存器组1区,R0~R7对应单元地址为08H~0FH;当RS1、RS0=10时,选择工作寄存器组2区,R0~R7对应单元地址为10H~17H;当RS1、RS0=11时,选择工作寄存器组3区,R0~R7对应单元地址为18H~1FH;9.堆栈有哪些功能?堆栈指针SP是多少位的寄存器?SP的作用是什么?在应用系统程序设计时,为什么要对SP重新赋值?堆栈的功能是保护CPU执行程序的现场(如子程序调用、中断调用等);堆栈指针SP是8位寄存器;其作用是指出栈顶位置;对SP重新赋值是为了避免堆栈向上生成时覆盖所存储的有效数据和标志,一般情况下,把堆栈区设在30H单元之后的区域。10.MCS-51单片机有多少个可以寻址的特殊功能寄存器(SFR)?简要介绍它们的功能。共21个,其中与CPU相关的有:ACC,B,PSW,SP,DPTR(DPH,DPL)。与并行I/O口相关的有:P0,P1,P2,P3。与串行口相关的有:SCON,SBUF,PCON。与定时器/计数器相关的有:TCON,TMOD,TH0,TL0,TH1,TL1。与中断系统相关的有:IP,IE。B寄存器,用于乘除法运算,其他情况作为缓冲寄存器使用;ACC:累加器,用于算数运算,逻辑运算,移位运算以及传送运算;PSW:程序状态寄存器,用于反映累加器ACC参与运算时的一些特征,指出当前工作寄 存器组;DPTR可作为访问外部RAM的地址指针或作为访问程序存储器的基地址寄存器。堆栈指针SP指出栈顶位置;P0~P3作为I/O口,P0和P2还可以作为地址和数据总线,P3可提供第二功能。中断优先级寄存器IP用于设置中断源的优先级;中断控制寄存器IE控制中断开放和禁止,串行口控制寄存器SCON用于定义串口工作方式,控制数据的接收和发送,记录工作状态标志。:定时/计数器控制寄存器TCON记录中断标志,控制定时/计数器。11.在MCS-51单片机中,CPU对特殊功能寄存器(SFR)访问有什么特点?CPU访问这些SFR只能采用直接寻址方式,即按单元地址访问的模式。12.简单说明MCS-51单片机PSW寄存器各个标志位的意义。Cy进位位。在运算过程中,最高位D7有(借)进位时,(Cy)=1,否则,(Cy)=0;AC辅助进位位。用于十进制数(BCD)运算。在运算过程中,当D3向D4位(即低四位向高四位)进(借)位时,(AC)=1,否则,(AC)=0;OV溢出标志位。在运算过程中,对于D6、D7两位,如果其中有一位有进(借)位而另一位无进(借)位时,(OV)=1,否则,(OV)=0;P奇偶校验位。运算结束时,如果ACC中1的个数为奇数,(P)=1,否则,(P)=0。F0用户标志位,用户在编程时可作为自己定义的测试标志位。RS0、RS1寄存器组选择位,选择当前工作寄存器组。。13.简述MCS-51单片机的位寻址空间的构成?由两部分构成,一部分是内部RAM位寻址区20H~2FH单元的128位,位地址范围为00H~7FH,另一部分是11个单元地址尾数为0和8的SFR构成的位寻址区,共83位,位地址范围为80H~FFH。14.MCS-51单片机的P0~P3口在结构上有何不同?在使用上各有什么特点?MCS-51系列单片机的P0~P3并行口在结构上基本相同,每个并行口包含1个锁存器(特殊功能寄存器P0~P3)、1个输出驱动器和1个输入缓冲器。P0当作为通用的I/O口使用时,输出电路是漏极开路的,因此,需要外接上拉电阻。另外,用作输入时,应先向输出口的锁存器写1,然后再读相应的引脚。P0可用作地址/数据总线,口的每位输出可以驱动8个TTL负载。P1、P2、P3口的输出电路含有内部上拉电阻,口的每一位能驱动4个TTL负载,在作为输入口时,必须先对相应的锁存器写1,即进行设置输入口的操作。15.把P1.4作为输入,外接一个开关,如果要读取开关的状态,如何操作?当将P1.4作为输入之前,必须先向锁存器写入1,当P1.4输入数据时,“读引脚”信号有效,打开输入缓冲器,使数据进入内部总线,完成P1.4输入。16.MCS-51单片机的时钟电路有几种实现方式?请分别给出相应的电路。两种方式,内部方式和外部方式。内部方式利用单片机芯片上提供的反相放大器电路,在XTAL1,XTAL2引脚之间外接振荡源构成一个自激振荡器,自激振荡器与单片机内部时钟发生器构成单片机的时钟电路;如图1.1所示。外部方式实现单片机的时钟电路时,单片机的时钟直接由外部时钟信号源提供,即单片 机使用外部振荡器。如图1.2所示。17.什么是时钟周期、机器周期和指令周期?如何计算机器周期?晶振频率为12MHz时,计算时钟周期、机器周期。时钟周期:振荡器信号的周期。机器周期:CPU完成一个基本操作所用的时间。指令周期:执行一条指令需要的时间。计算公式:,其中为晶振频率。当晶振频率为=12MHZ时,时钟周期:。机器周期:TM=1。18:MCS-51单片机的复位条件是什么?在应用系统设计时,实现单片机的复位有几种方法?请给出相应的电路原理图。单片机复位条件是在单片机RESET引脚上保持2个机器周期以上的高电平。有两种复位方式,上电自动复位电路,如图1.3所示;按钮开关及上电自动复位电路,如图1.4所示;图1.3上电自动复位电路图1.4按钮开关及上电自动复位电路19.简述MCS-51单片机复位后的状态。单片机复位后,程序计数器PC内容为0000H;累加器A、B寄存器、数据指针DPTR被清0;程序状态字寄存器PSW的内容为00H,P0~P3寄存器中所有的位被置1,I/O口P0~P3的锁存器内容为0FFH;除了串行口数据缓冲器SBUF的内容不确定外,其他与定时器/计数器、中断系统、串行口有关的特殊功能寄存器(SFR)中的有效位为全部被清0。20.MCS-51单片机运行出错或程序进入死循环时,采用强制复位摆脱困境。在这种情况下,单片机内部RAM和特殊功能寄存器(SFR)的状态与复位前相比有什么变化?在单片机由于某种原因被强制复位时,内部RAM单元的内容不会受复位的影响,会保持复位以前的状态。对于位寻址空间来说,单片机工作过程中的强制复位,不会影响位于内部RAM的20~2FH单元中的位的状态,而SFR中的可寻址位却被遗失了。特殊功能寄存器A、B、DPTR被清0;PSW的内容为00H,P0~P3寄存器中所有的位被置1,I/O口P0~P3的锁存器内容为0FFH;除了串行口数据缓冲器SBUF的内容不确定外,其他与定时器/计数器、中断系统、串行口有关的特殊功能寄存器(SFR)中的有效位为全部被清0。第三章复习思考题答案 一、选择题1.B2.D3.D4.C5.A6.A7.D8.E9.B10.C11.D12.C13.A14.B15.A16.C17.C18.D19.D20.A21.C22.B23.C24.B25:B26.D27.A28.B29.D30.C二、思考题1.寻址方式是CPU执行指令时获取操作数的方式。MSC-51单片机有7种不同的寻址方式:立即寻址、直接寻址、寄存器寻址、寄存器间接寻址、变址寻址、位寻址和相对寻址。2.(A)=25H,(R0)=50H,(50H)=00H,(51H)=25H3.(DPTR)=25F0H4.(A)=30H,(B)=20H5.(A)=80H6.XCH:字节交换指令,将源操作数与A累加器的内容互换,源操作数必须是工作寄存器、SFR或内部RAM的存储单元。XCHD:半字节交换指令,把指定单元内容的低4位与累加器A的低4位互换,而二者的高4位保持不变。SWAP:高低四位互换指令,将累加器A的高4位和低4位互换。7.MOVCA,@A+DPTR:常数所在存储单元的地址由DPTR和累加器A的内容之和确定。常数表可以放在程序存储器64K的任何区域,最大长度可以是64KB。MOVCA,@A+PC:常数所在存储单元的地址由程序计数器PC和累加器A的内容之和确定。常数表紧随该指令存放,最大长度不能超过256个字节。8.1030H9.8140H10.(SP)=62H,60H单元内容不变,(61H)=30H,(62H)=70H11.(SP)=60H,60H单元内容不变,(61H)=50H,(62H)=7AH,(DPTR)=7A50H12.(A)=34H,(Cy)=1,(AC)=1,(OV)=1,(P)=113.(A)=83H,(Cy)=1,(AC)=1,(OV)=0,(P)=114.(A)=00H,(R3)=10H,(30H)=F1H,(R0)=01H15.(A)=23H,(Cy)=116.20H、30H和31H单元进行了加法运算,结果存放在31H单元17.ADD:不带进位位的加法指令。ADDC:带进位位的加法指令。18.DA:其功能就是在用加法指令完成BCD码加法运算之后,对运算结果进行处理,把运算结果转换为BCD码形式。使用方法:必须与加法指令联合使用;19.(A)=0EH,(R7)=18H,(30H)=0FFH,(R1)=40H,(41H)=0FDH20.20H和30H单元参与减法运算,程序的结果存储在2FH单元。21.(A)=00H,(B)=32H,(Cy)=0,(OV)=122.(A)=0DH,(B)=11H,(Cy)=0,(OV)=023.0CBH24.(1)(A)=00H,(R5)=0AAH(2)(A)=0FFH,(R5)=0AAH(3)(A)=0FFH,(R5)=0AAH25.26.LCALL指令在调用前,先把下一条指令的地址推入堆栈保留,以便执行子程序返回指令RET时能找到返回地址,实现正确返回;而转移指令LJMP指令不需要保护返回地址。 27.转移到REDO处28.当ACC.7为1时,执行JB指令程序转移到LABEL处,执行JBC指令程序转移到LABEL处并将ACC.7淸0。29.RET:子程序返回指令,子程序的最后一条指令必须是RET,它标志子程序结束。RETI:中断返回指令,令专用于中断处理程序,是中断处理结束的标志。RETI指令与RET指令的区别在于RETI指令在实现中断返回的同时,重新开放中断使CPU能够接收同优先级的另外一个中断请求。30.,执行时间为:1+125×+2=753ms三、程序设计1.把内部RAM的20H、21H、22H单元的内容依次存入2FH、2EH和2DH中。MOV2FH,20HMOV2EH,21HMOV2DH,22H2.把外部RAM的2040H单元内容与3040H单元内容互换。方法一:MOVDPTR,#2040HMOVXA,@DPTRMOV20H,AMOVDPTR,#3040HMOVXA,@DPTRMOV21H,APUSH20HPUSH21HPOP20HPOP21HMOVDPTR,#2040HMOVA,20HMOVX@DPTR,AMOVDPTR,#3040HMOVA,21HMOVX@DPTR,A方法二:MOVDPTR,#2040HMOVXA,@DPTRMOV20H,AMOVDPTR,#3040HMOVXA,@DPTRXCHA,20HMOVX@DPTR,AMOVDPTR,#2040HMOVA,20HMOVX@DPTR,A3.把内部RAM的40H单元与5000H单元的低四位互换。 MOVDPTR,#5000HMOVXA,@DPTRMOVR1,#40HXCHDA,@R1MOVX@DPTR,A4.已知一个2维数据表格如下,存储在程序存储器中,编程实现自动查表。X01234…0B0C0D0E0FY111201ADDD…AB244B7CAAMOVDPTR,#5000HMOVCA,@A+DPTRRET5000HDB11H5001HDB12H5002HDB01H......500EHDB7CH500FHDBAAH5.已知二进制数X和Y,X被存放在20H(高8位)和21H(低8位)单元,Y被存放在22H,编程实现下X+Y。MOVA,21HADDA,22HMOV25H,AMOVA,20HADDCA,#00HMOV24H,AMOVA,#00HADDCA,#00HMOV23H,A6.已知二进制数X和Y,X被存放在20H(高8位)、21H、22H单元,Y被存放在30H(高8位)、31H、32H单元,编程实现下X+Y。MOVA,22HADDA,32HMOV32H,AMOVA,21HADDCA,31HMOV31H,AMOVA,20HADDCA,30HMOV30H,AMOVA,#00HADDCA,#00HMOV2FH,A7. 已知8位十进制数X和Y以压缩BCD的格式存储,X被存放在20H~23H单元,Y被存放在40H~43H,编程实现下X+Y。MOVR0,#20HMOVR1,#40HMOVA,@R0ADDA,@R1DAAMOV10H,AINCR0INCR1MOVA,@R0ADDCA,@R1DAAMOV11H,AINCR0INCR1MOVA,@R0ADDCA,@R1DAAMOV12H,AINCR0INCR1MOVA,@R0ADDCA,@R1DAAMOV13H,AMOVA,#00ADDCA,#00MOV14H,A8.已知二进制数X和Y,X=6F5DH,Y=13B4H,编程求X—Y。MOV21H,#5DHMOV20H,#6FHMOV23H,#0B4HMOV22H,#13HMOVR0,#21HMOVR1,#23HMOVA,@R0CLRCySUBBA,@R1MOV@R0,ADECR0DECR1MOVA,@R0SUBBA,@R1 MOV@R0,A9.已知二进制数X和Y,已知X被存放在20H(高8位)、21H和22H单元,Y被存放在22H,编程实现下X—Y。MOVA,22HCLRCSUBBA,32HMOV22H,AMOVA,21HSUBBA,#00HMOV21H,AMOVA,20HSUBBA,#00HMOV20H,A10.已知二进制数X和Y,X被存放在20H~23H单元,Y被存放在30H~33H单元,编程实现下X-Y。MOVA,23HCLRCSUBBA,33HMOV23H,AMOVA,22HSUBBA,32HMOV22H,AMOVA,21HSUBBA,31HMOV21H,AMOVA,20HSUBBA,30HMOV20H,A11. 已知十进制数X和Y以压缩BCD码的格式存储,X被存放在20H(高位)和21H单元,Y被存放在22H和23H单元,编程实现下X-Y。MOVA,#9AHCLRCSUBBA,23HMOV23H,AMOVA,#9AHCLRCSUBBA,22HMOV22H,AMOVA,21HADDA,23HDAAMOV23H,AMOVA,20HADDCA,22HDAAMOV22H,A12.已知二进制数X被存放在20H,编程实现下X3。MOVA,20HMOVB,20HMULABMOV21H,AMOV22H,BMOVA,21HMOVB,20HMULABMOV23H,AMOV24H,BMOVA,20HMOVB,22HMULABMOV25H,AMOV26H,BCLRCMOVA,24HADDA,25HMOV24H,AMOVA,26HADDCA,#0MOV25H,A 13.已知二进制数X被存放在20H(高8位)21H、22H单元,Y被存放在30H单元,编程实现下X×Y。MOVA,22HMOVB,30HMULABMOV22H,AMOV23H,BMOVA,21HMOVB,30HMULABMOV24H,AMOV25H,BMOVA,20HMOVB,30HMULABMOV26H,AMOV27H,BMOVA,23HADDA,24HMOV23H,AMOVA,25HADDCA,26HMOV24H,AMOVA,27HADDCA,#00HMOV25H,A 14.二进制数X被存放在20H(高8位)21H单元,用移位方法实现2X。MOVA,21HCLRCRLCAMOV21H,AMOVA,20HRLCAMOV20H,ACLRARLCAMOV19H,A15.4位十进制数X以压缩BCD的格式存储在内部RAM中,编程实现X乘以10。MOVR1,#20HSCALLBCD2BMOV30H,R7MOV31H,R6MOVA,31HMOVB,#10MULABADDA,30HMOV30H,AMOVA,BADDCA,#00MOV31H,AMOVR1,#21HSCALLBCD2BMOV32H,R7MOV33H,R6MOVA,33HMOVB,#10MULABADDA,32HMOV32H,A MOVA,BADDCA,#00MOV33H,ABCD2B:MOVA,#0XCHDA,@R1MOVR7,AMOVA,@R1SWAPAMOVR6,ARET16.二进制数X被存放在20H(高8位)21H单元,用移位方法实现X/2。MOVA,20HCLRCRRCAMOV20H,AMOVA,21HRRCAMOV21H,A17.4位十进制数X以压缩BCD的格式存储在内部RAM中,编程实现X/10,并把小数部分存储在R6中。MOV22H,#4REL:MOVA,21HCLRCRRCAMOV21H,AMOVA,20HRRCAMOV20H,ADJNZ22H,RELMOVR6,CRET18.MOVA,21HXRLA,#FFHMOV21H,AMOVA,20HXRLA,#7FH MOV20H,AMOVA,21HADDA,#01HMOV21H,AMOVA,20HADDCA,#00HMOV20H,A19.MOVDPTR,#JMP_TABLEMOVA,XJMP@A+DPTRJMP_TABLE:AJMPPROG1AJMPPGOG2AJMPPGOG3AJMPPGOG420.XEQU20HYEQU21HZEQU22HMOVA,XCLRCSUBBA,YJCLOOPMOVA,XCLRCSUBBA,ZJCLOOP1MOV50H,XJMPRRETLOOP:MOVA,YCLRCSUBBA,ZJCLOOP1MOV50H,YJMPRRETLOOP1:MOV50H,ZRRET:RET 21.MOVR0,#20HMOVDPTR,#2000HMOVR1,#16LOOP:MOVA,@R0MOVX@DPTR,AINCR0INCDPTRDJNZR1,LOOPRET22.MOVA,5FHRRAXRLA,5FHMOV5FH,A23.MOVC,P3.3 ORLC,P1.2ANLC,P1.1MOV20H.0,CMOVC,28H.1ANLC,/2EH.0CPLCMOV21H.0,CMOVC,20H.0ORLC,/TFOORLC,21H.0MOVP1.5,C24.MOVR0,#20HMOVR1,#100CLRR7MAIN:MOVA,@R0CLRCSUBBA,#65HJZLOOP1INCR0DJNZR1,MAINRETLOOP:INCR7INCR0DJNZR1,MAINRET 25.MOVR0,#10HMOVR7,#50MOVR1,#50HMAIN:MOVA,@R0JNBACC.0,LOOPAJMPLOOP1LOOP:MOV@R1,AINCR1LOOP1:INCR0DJNZR7,MAINRET26.MOV20H,#7MOVR5,#00MOVR6,#00MOVDPTR,#3000HMOVXA,@DPTRLOP:JNBACC.0LOOPINCR6RRAAJMPLOOP1LOOP: INCR5RRALOOP1:DJNZ20H,LOPRET27.MOVR1,20HSCALLEXCHMOV30H,R6MOV31H,R7MOVR1,21HSCALLEXCHMOV32H,R6MOV33H,R7LOOP:NOPNOPSJMPLOOPEXCH:CLRAXCHDA,@R1MOVR7,AMOVA,@R1SWAPAMOVR6,ARET28.LIGHTEQU20HORG0000HJMPMAINORG0030HMAIN: MOVLIGHT,#0FFHMOVP1,LIGHTLOP:MOVR1,#8LOOP:CLRCMOVA,LIGHTRLCAMOVLIGHT,AMOVP1,LIGHTLCALLDELAY200MSDJNZR1,LOOPMOVR1,#8MOVLIGHT,#0LOOP1:SETBCMOVA,LIGHTRRCAMOVLIGHT,AMOVP1,LIGHTLCALLDELAY200MSDJNZR1,LOOP1LCALLDELAY2SMOVLIGHT,#00MOVP1,LIGHTLCALLDELAY2SMOVLIGHT,#0FFHMOVP1,LIGHTLJMPLOP 第四章一、选择题1.C2.A3.A4.D5.C6.C7.C8.A9.B10.C11.C12.B,D13.D14.C15.D16.C17.A18.B19.B20.A二、思考题1.在计算机系统中,什么是中断、中断源、断点和中断处理?中断是指CPU在执行程序的过程中,由于某一事件发生时,要求CPU暂停正在执行的程序,而去执行相应的处理程序,待处理结束后,再返回到原来程序停止处继续执行;中断源是指触发产生中断的事件;CPU停止执行现行程序的间断处称为断点;CPU执行的与中断相关的处理程序的处理过程即为中断处理。2.在计算机系统中,中断处理和子程序调用有什么不同?主要区别在于:子程序调用时,调用哪个子程序、完成什么任务是用户在设计程序时事先安排好的,采用子程序调用指令实现。中断事件发生是随机的,哪个事件发生、何时调用中断处理程序是事先无法确定的,在程序中无法事先安排调用指令,调用中断处理程序的过程是由硬件自动完成的。3.MCS-51单片机提供了哪几种中断源?在中断管理上如何控制?各个中断源中断优先级的高低如何确定?MCS-51单片机具有5个中断源,分别为2个外部事件中断、2个定时器/计数器计数溢出事件触发的中断和1个串行口缓冲器接收到或发送完数据触发的中断。MCS-51单片机在中断管理实行2级控制,CPU开放中断与否、中断源是否允许中断由中断控制寄存器IE设定,中断优先级由中断优先级寄存器IP中的位来设定,优先级相同时CPU响应中断请求的顺序由查询电路确定,实现硬件调用响应的中断处理程序。4.MCS-51单片机响应中断的条件是什么?如果此时不存在下列3种情形,CPU将响应这个中断请求进行中断处理。这3种情形如下:(1)CPU正在处理相同优先级或高级优先级的中断。(2)当前的机器周期不是指令的最后一个机器周期。(3)正在执行的指令是RETI、或者是访问特殊功能寄存器IE或IP的指令。CPU响应中断时,必须是在一条指令执行结束之后。另外,CPU执行RETI指令和对寄存器IE和IP访问的指令时,即使指令执行结束也不会立即相应,必须至少再执行一条指令方可响应中断请求。5.MCS-51单片机的CPU响应多个中断请求时,如何处理多个中断同时请求的问题?当有多个中断同时向MCS-51单片机发出请求时,单片机首先会响应高优先级的中断,CPU响应中断请求时,中断系统会根据中断源的优先级把相应的高优先级触发器或低优先级触发器置1,以封锁相同优先级和低级优先级的中断请求;然后执行中断处理程序。 6.MCS-51单片机如何分配中断处理程序入口地址的?应用系统中没有中断时,这些单元如何处理?如果中断处理程序太长,编程时如何处理?MCS-51单片机中断处理程序入口地址分配如下:外部事件中断的中断处理程序入口地址0003H;定时器/计数器溢出T0的中断处理程序入口地址000BH;外部事件中断的中断处理程序入口地址00013H;定时器/计数器溢出T1的中断处理程序入口地址0001BH;串行口的中断处理程序入口地址000BH。如果不使用中断处理,为了避免干扰或其他因素意外触发中断导致程序“跑飞”的现象发生,在中断入口地址所在单元放置RETI指令,使程序能够安全地返回到断点处继续运行。由于2个中断入口地址之间只有8个单元,中断处理程序太长时,通常在入口地址处安排一条无条件转移指令LJMP或AJMP,把中断处理程序存放在程序存储器的其它区域;7.简述MCS-51单片机的中断响应过程。在设置CPU的中断控制位和中断允许控制位以后,当中断源触发中断时,相应的中断标志位被置1。单片机的中断系统在每一个机器周期的S5P2相采样所有的中断标志位的状态,并在随后的一个机器周期查询这些中断标志,以确定哪一个中断源请求中断。如果中断系统检测到某个中断标志为1,则表明该中断源向CPU发出了中断请求。如果此时不存在下列3种情形,CPU将响应这个中断请求,立即产生一个硬件调用,使程序转移到相应的中断处理程序入口地址处调用中断处理程序,进行中断处理。这3种情形如下:(1)CPU正在处理相同优先级或高级优先级的中断。(2)当前的机器周期不是指令的最后一个机器周期。(3)正在执行的指令是RETI、或者是访问特殊功能寄存器IE或IP的指令。CPU响应中断时,必须是在一条指令执行结束之后。另外,CPU执行RETI指令和对寄存器IE和IP访问的指令时,即使指令执行结束也不会立即响应,必须至少再执行一条指令方可响应中断请求。CPU响应中断时,对外部事件中断和跳变触发方式时的中断请求标志IE0和IE1,定时器/计数器溢出的中断标志TF0和TF1,自动清除中断请求标志,CPU响应中断请求时,中断系统会根据中断源的优先级把相应的高优先级触发器或低优先级触发器置1,以封锁相同优先级和低级优先级的中断请求;然后由硬件调用把当前程序计数器PC的内容(即断点)压入堆栈保护,并且把相应的中断处理程序入口地址装入程序计数器PC,使程序转移到中断处理程序。当执行到RETI指令时,结束此次中断处理过程,从堆栈中取出断点地址送给PC,使程序返回到断点处继续向下执行。8.在应用系统中只包含一个优先级的中断处理时,给出中断处理程序的一般结构。在应用系统中只包含一个优先级的中断处理时中断处理程序的一般结构如图4.1图4.1题8中断处理程序的一般结构 9.如果应用系统包含了2个优先级的中断处理,高、低优先级的中断处理程序结构有什么不同?高、低优先级的中断处理程序结构如图4.2所示。(1)高优先级中断处理程序(2)低优先级中断处理程序图4.2题9中断处理程序的结构10.对于输入信号检测来说,中断处理方式和程序查询方式有什么不同?对于中断处理方式,在主程序的流程中,不用刻意去关注中断方式发送了没有,这样在没有中断请求时,就解放了信号检测电路和单片机上的硬件软件资源,而查询方式是在主程序流程中不断循环检测。中断方式可以更高效利用CPU,节省CPU的时间,查询就会增加CPU负担,在程序执行功能较少时,两种差别不大,功能较多时,一般都会采用中断方式。三、程序设计1.在图4.11电路中,通常情况下,L0~L7依次循环显示,每扳动一次开关K,L0~L7以2灯为1组循环显示1次。用中断方式实现上述要求。程序框图如4.3所示.ORG0000HLJMPMAIN;转移到主程序ORG0003HLJMPINT_PRO;中断处理程序入口ORG0030HMAIN:MOVSP,#70H;开辟堆栈区SETBIT0;外部事件中断的触发方式SETBEA;开放CPU中断SETBEX0;允许INT0中断CPUCLRPX0;设置优先级MOVA,#01H;显示控制码初值,ROT_DIS:MOVP1,A;输出显示ACALLDLY;延时RLA;产生下1个显示控制码 AJMPROT_DIS;延时子程序DLY:MOVR7,#100DEL1:MOVR6,#200DEL0:NOPNOPNOPDJNZR6,DEL0DJNZR7,DEL1RET;中断处理程序ORG0300HINT_PRO:PUSHACC;保护现场PUSHPSWMOVR5,#4;左移次数CONT:MOVA,#03H;点亮最低两位灯ACALLDLYRLA;左移两位,换成点亮高2位RLADJNZR5,CONT;左移4次完否?POPPSW;恢复现场POPACCRETI;中断返回END2.如图4.15所示,P1.0~P1.3为输出,外接指示灯L0~L3,P1.7~P1.4为输入,外接开关K0~K3,欲采用外部中断控制方式实现按开关K0~K3闭合状态分别控制指示灯L0~L3的状态,外部中断每触发一次,程序改变1次指示灯的显示状态。要求用跳变触发方式。ORG0000HAJMPMAINORG0003HAJMPINT_PROORG0030HMAIN:MOVSP,#70HSETBIT0SETBEX0SETBEACLRPX0CON:NOPNOPLJMPCON ;中断处理程序ORG0200HINT_PRO:PUSHACCPUSHPSWMOVA,#0F0HMOVP1,AMOVA,P1ANLA,#0F0HCPLASWAPAMOVP1,APOPPSWPOPACCRETI3.如图4.16为一个应用系统,单片机通过P1口与智能传感器相连,STB为传感器输出的选通信号,传感器每从DB输出一个7位二进制数据后(最高位是0),就从STB输出一个负脉冲,8051单片机读取的数据存储在内部RAM的50H单元,如果读取的数据超过7位(最高位为1)的次数超过20次,则终止从传感器读数。采用中断方式实现数据接收功能。ORG0000HLJMPMAINORG0003HLJMPP_INT0MAIN:MOVSP,#70HSETBIT0SETBEASETBEX0CLRPX0MOVR1,#00HLOOP:NOPLJMPLOOP;中断处理程序P_INT0:PUSHACCPUSHPSWMOVA,P1ANLA,#10000000BJZNONINCR1NON:CJNER1,#20,PDCRU:MOV50H,P1RETURN:POPPSWPOPACCRETI PD:JCCRUCLREX0AJMPRETURN4.路灯控制器如图4.17所示,夜晚路灯L1自动启动,白天路灯L1自动熄灭。采用中断方式实现路灯的自动控制。图4.17中,VL为光敏三极管,有光照射时,VL导通,无光照射时,VL截止。ORG0000HLJMPMAINORG0013HLJMPP_INT1MAIN:MOVSP,#70HCLRIT1SETBEASETBEX1CLRPX1LOOP:NOPNOPNOPCLRP1.7LJMPLOOP;中断处理程序P_INT1:PUSHACCPUSHPSWSETBP1.7CALLDLYRETURN:POPPSWPOPACCRETI;延时子程序DLY:MOVR7,#100DEL1:MOVR6,#200DEL0:NOPNOPNOPDJNZR6,DEL0DJNZR7,DEL1RET5.图4.18为单片机应用系统,4个外部扩展中断源EXINT0~EXINT3共享外部事件中断,当其中有一个或几个出现高电平时向单片机发出中断请求。设它们的优先级顺序为EXINT0→EXINT3,中断源EXINT0~EXINT3的中断处理程序分别为PREX0、PREX1、PREX2和PREX3,请用中断方式实现上述要求。。主程序:ORG0000H LJMPMAINORG0003HLJMPP_INT0MAIN:MOVSP,#70HCLRIT0SETBEASETBEX0CLRPX0LOOP:NOPLJMPLOOP中断处理程序:P_INT0:PUSHACCPUSHPSWJBP1.0,EXINT0JBP1.1,EXINT1JBP1.2,EXINT2JBP1.3,EXINT3RETURN:POPPSWPOPACCRETIEXINT0:ACALLPREX0AJMPRETURNEXINT1:ACALLPREX1AJMPRETURNEXINT2:ACALLPREX2AJMPRETURNEXINT3:ACALLPREX3AJMPRETURN6.一个控制系统中有5台外围设备需要集中监控,出现故障时需要立即处理,设备1~5的故障状态信号分别为EX1~EX5,其中,设备1和设备2的故障危害性大,设备3~设备5的为一般性故障,危害较小。请用MCS-51单片机中断式实现上述设备的监控,设计电路并编程,设相应的中断处理子程序Ex1Pro~Ex5Pro。ORG0000HLJMPMAINORG0003HLJMPPint0;中断入口地址ORG0013HLJMPPint1;中断入口地址ORG0030HMAIN:MOVSP,#60H;开辟栈区CLRIT0;电平触发方式CLRIT1;电平触发方式 MOVIE,#85H;CPU开放中断,允许和中断MOVIP,#01H;INT0设为高级中断,INT1设为低级CONT:NOPNOPSJMPCONT高优先级中断处理程序:Pint0:PUSHACCPUSHPSWJBP1.0,EXINT1JBP1.1,EXINT2RETURN:POPPSWPOPACCRETIEXINT1:ACALLEx1ProAJMPRETURNEXINT2:ACALLEx2ProAJMPRETURN低优先级中断处理程序:Pint1:CLREAPUSHACCPUSHPSWSETBEAJBP1.2,EXINT3JBP1.3,EXINT4JBP1.4,EXINT5RETURN1:CLREAPOPPSWPOPACCSETBEARETIEXINT3:ACALLEx3ProAJMPRETURN1EXINT4:ACALLEx4ProAJMPRETURN1EXINT5:ACALLEx5ProAJMPRETURN17.单片机应用系统如图4.19所示,P1口外接8个指示灯L0~L7。要求实现下面的要求:1)一般情况下,指示灯L0~L7以100ms的间隔闪烁;2)S0、S1、S2为3种显示模式,当S0、S1、S2被按下时,暂时中断闪烁方式,熄灭全部 指示灯,进入相应的显示模式:(1)当按下S0时,从指示灯L0开始逐个点亮并保持200ms,直至L0~L7全部点亮,然后熄灭,重复上述过程10次后退出。(2)当按下S1时,从指示灯L0开始,每个点亮200ms后熄灭,重复上述过程10次后退出。(3)当按下S2时,从指示灯L7开始以3个为一组点亮并保持,直至L7~L0全部点亮,然后熄灭,重复上述过程10次后退出。ORG0000HLJMPMAINORG0013HLJMPP_INT1MAIN:MOVSP,#70HSETBIT1SETBEASETBEX1CLRPX1CONT:MOVP1,#0FFHCALLDLYMOVP1,#00HCALLDLYLJMPCONT;延时子程序DLY:MOVR7,#100DEL1:MOVR6,#200DEL0:NOPNOPNOPDJNZR6,DEL0DJNZR7,DEL1RET中断处理程序:P_INT1:PUSHACCPUSHPSWJNBP1.0,S0JNBP1.1,S1JNBP1.2,S2RETURN:POPPSWPOPACCRETIS0:MOVR0,#10S0_B:MOVR1,#8MOVA,#00HS0_A:SETBCRLCAMOVP1,A CALLDLYCALLDLYDJNZR1,S0_AMOVP1,#00HCALLDLYCALLDLYDJNZR0,S0_BAJMPRETURNS1:MOVR0,#10S1_B:MOVR1,#8MOVA,#01HCLRCS1_A:MOVP1,ACALLDLYCALLDLYRLCADJNZR1,S1_ADJNZR0,S1_BAJMPRETURNS2:MOVR0,#10S2_B:MOVR1,#3MOVA,#0E0HS2_A:MOVP1,ACALLDLYCALLDLYSETBCRRCASETBCRRCASETBCRRCADJNZR1,S2_AMOVP1,#00HCALLDLYCALLDLYDJNZR0,S2_BAJMPRETURN8.在图4.20单片机应用系统中,A、B两路检测信号分别从P3.2()和P3.3()引入单片机,通常情况下,当A、B为高电平。系统工作正常时,指示灯L1亮;当A出现低电平时,指示灯L1灭,L2以500ms的间隔闪烁,除非A再次变为高电平,系统恢复正常。无论在什么情况下,只要B出现低电平,关闭指示灯L1,L2以200ms的间隔闪烁,同时蜂鸣器BUZ以200ms的间隔鸣叫,除非B再次变为高电平,系统恢复正常。采用中断方式实现以上监控功能。ORG0000H LJMPMAINORG0003HLJMPPint0;中断入口地址ORG0013HLJMPPint1;中断入口地址ORG0030HMAIN:MOVSP,#60H;开辟栈区CLRIT0;电平触发方式CLRIT1;电平触发方式MOVIE,#85H;CPU开放中断,允许和中断MOVIP,#04H;INT1设为高级中断,INT0设为低级CONT:SETBP1.4CLRP1.5CLRP1.6SJMPCONTPint0:PUSHACCPUSHPSWCLRP1.4CLRP1.6P0_B:CPLP1.5MOVR0,#5P0_A:CALLDLYDJNZR0,P0_APOPPSWPOPACCRETIPint1:PUSHACCPUSHPSWCLRP1.4P1_A:CPLP1.5CPLP1.6CALLDLYCALLDLYPOPPSWPOPACCRETI;延时100ms子程序DLY:MOVR7,#100DEL1:MOVR6,#200DEL0:NOPNOPNOPDJNZR6,DEL0 DJNZR7,DEL1RET第五章复习思考题答案一、基础题1.B2.A3.B4.C5.B6.C7.B8.A9.A10.C二、思考题与编程题1.简述MCS-51单片机的定时器/计数器的结构和工作原理。答:MCS-51单片机的定时器/计数器的结构:MCS-51单片机有2个定时器/计数器,被称为定时器/计数器T0和定时器/计数器T1。定时器/计数器T0的计数器由2个8位的特殊功能寄存器TL0和TH0构成;定时器/计数器T1的计数器由特殊功能寄存器TL1和TH1构成,T0和T1有多种工作方式,由定时器/计数器方式寄存器TMOD设置。T0和T1的启动和停止由定时器/计数器控制寄存器TCON控制。工作原理:定时器/计数器工作在计数模式时,计数器对外部脉冲进行计数,脉冲信号发生1到0负跳变,计数器自动加1;定时器/计数器工作在定时模式时,计数脉冲信号来自单片机的内部,每个机器周期产生一个计数脉冲,计数器自动加1,也就是每个机器周期计数器加1。计数器计满后,再计一次,计数器溢出,溢出标志被置1。2.MCS-51单片机的定时器/计数器T0中有哪几种工作方式?作为计数器和定时器使用时,它们的计数信号有什么不同?其最大计数和定时时间分别是多少?答:T0有4种工作方式,方式0:13位定时器/计数器,方式1:16位定时器/计数器,方式2:8位常数自动装入的定时器/计数器,方式3:2个8位的定时器/计数器作为计数器,计数信号由外部脉冲提供,作为定时器,计数信号由单片机内部提供;计数模式时,方式0的最大计数次数为8192,方式1的最大计数次数为65536,方式2和方式3的最大计数次数为256。设单片机的机器周期为最大定时为,定时模式时,方式0的最大定时为8192,方式1的最大定时为65536,方式2和方式3的最大定时为256。3.设置工作方式寄存器TMOD时,GATE位对定时器/计数器的工作有什么影响?定时器/计数器工作在方式2时,与其他几种方式有什么区别?当设置为方式3时,定时器/计数器T1将如何工作?答:当GATE=0时,只要TR0被置1时,定时器/计数器T0启动开始计数。当GATE=1时,定时器/计数器T0启动受引脚的外部信号控制。只有当TR0被置1,且引脚输入信号为高电平时,定时器/计数器T0才开始计数。定时器/计数器工作在方式2时,与其他几种方式的区别在于当计数器TL0溢出时,TF0被置1,同时把TH0的内容装载到TL0,计数器便以该值为初始值重新开始计数,而其他几种方式计数器将清零。当设置为方式3时,定时器/计数器T1将停止工作。 4.用内部定时方法产生10kHz的等宽脉冲并从P1.1输出,设晶振频率为12MHz。等宽方波的高、低电平的持续时间相同。10kHz的等宽方波脉冲信号的周期为0.1ms,因此,只需在P1.1引脚输出持续时间为50μs的高低电平交替变化的信号即可,则定时时间应为50μs。用方式0实现。(1)计算计数初始值因为系统的晶振频率为12MHz,则机器周期。设计数初始值为:转换为二进制数得1111000001100B。取的高8位赋给TH0,的低5位赋给TL0,则(TH0)=11110000B=0F0H,(TL0)=00001100B=0CH,TL0的高3位默认为0。(2)设置工作方式方式0:M1M0=00,定时器模式:,计数器启动不受外部控制:GATE=0,因此,TMOD的内容为00H。(3)采用查询方式的程序设计如下:MOVTMOD,#00HMOVTH0,#0F0HMOVTL0,#0CH;设置计数器初始值SETBTR0;启动定时器/计数器LOOP:JBCTF0,OVFLOW;查询计数溢出AJMPLOOPOVFLOW:MOVTH0,#0F0H;重新设置计数初值MOVTL0,#0CHCPLP1.0AJMPLOOP;重复循环(4)采用中断方式的程序设计如下:ORG0000HLJMPMAINORG000BHLJMPP_T0ORG0030HMAIN:MOVSP,#60H;开辟栈区MOVTMOD,#00000000B;设置工作方式0和定时器模式MOVTH0,#0F0HMOVTL0,#0CH;设置计数器初始值SETBTR0;计数器启动SETBEASETBET0HERE:AJMPHERE;模拟执行一段较长的主处理程序;中断处理程序: P_T0:PUSHACC;保护现场PUSHPSWMOVTH0,#0F0HMOVTL0,#0CH;设置计数器初始值CPLP1.0;产生方波POPPSWPOPACCRETI5.用定时器/计数器T1计数,每计1000个脉冲,从P1.1输出一个100ms单脉冲。程序框图见图5.1MAIN:MOVTMOD,#01000000B;设置工作方式0和计数器模式MOVTH1,#11100000B;设置计数初始值高8位MOVTH1,#00011000B;设置计数初始值低5位SETBTR1;启动计数器CNTING:JBCTF1,OK;检测是否溢出,溢出,清标志SJMPCNTING;等待,计数OK:SETBP1.1;脉冲开始输出ACALLDL100MS;脉冲保持100msCLRP1.1;脉冲结束RET;延时100ms子程序,晶振频率为12MHzDL100MS:MOVR7,#100DL1MS:MOVR6,#200DL:NOPNOPNOPDJNZR6,DLDJNZR7,DL1MSRET6.一批数据存放在外部RAM以data单元开始数据区,数据长度为100个,要求以50ms的间隔从外部RAM读取一个字节的数据,然后从P1口输出,设晶振频率为6MHz。要求定时用以下方式实现:(1)一个定时器;(2)两个定时器串联。(1)一个定时器实现,程序流程图见图5.2MAIN:MOVR0,#100;数据长度MOVDPTR,#8000H;外部数据存储首地址MOVTMOD,#00010000B;工作方式1和定时器模式MOVTH1,#10011110B;计数初始值高8位MOVTL1,#01011000B;计数初始值低8位 SETBTR1;定时器启动CNTING:JBCTF1,OK;检测是否溢出SJMPCNTING;OK:MOVTH1,#10011110B;重新装入计数常数值MOVTL1,#01011000BMOVXA,@DPTR;取外部数据MOVP1,A;输出外部数据INCDPTR;改变地址,指向下个数据DJNZR0,CNTING;判断数据取完否,否则跳转CLRTR1;关定时器/计数器RET(2)两个定时器串联MAIN:MOVR0,#100;数据长度MOVDPTR,#8000H;外部数据存储首地址MOVTMOD,#00010001B;工作方式1和定时器模式D1:MOVTH1,#11001111B;设置计数初始值高8位MOVTL1,#00101100B;设置计数初始值低8位SETBTR1;定时器启动T1CNTING1:JBCTF1,D0;检测是否溢出SJMPCNTING1D0:MOVTH0,#11001111B;设置定时初始值高8位MOVTL0,#00101100B;设置定时初始值低8位CLRTR1SETBTR0;定时器启动T0CNTING0:JBCTF0,OK;检测是否溢出,若溢出,清溢出标志SJMPCNTING0OK:MOVTH1,#11001111B;设置计数初始值高8位MOVTL1,#00101100B;设置计数初始值低8位SETBTR1;定时器启动T1CLRTR0MOVXA,@DPTR;取外部数据MOVP1,A;输出外部数据INCDPTR;改变地址,指向下个数据DJNZR0,D1;判断数据取完否,否则跳转CLRTR1CLRTR0RET7.一个声光报警器如图5.19所示。当设备运行正常时,Em为高电平,绿色指示灯L1亮;当设备运行不正常时,Em为低电平,绿色指示灯L1灭,要求声光报警,红色指示灯L2闪烁、报警器持续鸣响。当Em再次为高电平时,报警解除,恢复为正常状态。闪烁定时间隔为200ms,单片机的晶振频率为12MHz。程序流程框图见图5.3.主程序: ORG0000HSTAR:AJMPMAINORG0003H;外部事件0中断入口地址AJMPExtInt;转到中断处理程序ORG0030HMAIN:MOVSP,#70H;设置堆栈区CLRIT0;电平触发方式SETBEX0;允许外部事件0中断源中断SETBEA;开放CPU中断允许CLRPX0;设置中断优先级,HERE:SETBP1.4;点亮L1CLRP1.5;关闭L2CLRP1.6;关闭警报器AJMPHERE;模拟执行很长的程序;中断处理程序:ORG0200HExtInt:PUSHACC;入栈保护PUSHPSWSETBP1.6;打开警报器CLRP1.4;熄灭L1MOVR0,#4;定时4次,每次50ms,共200msMOVTMOD,#00010000B;工式1和定时器模式MOVTH1,#00111100B;设置定时初始值高8位MOVTL1,#10110000B;设置定时初始值低8位SETBTR1;定时器启动CNTING:JBCTF1,OK;检测是否溢出SJMPCNTINGOK:MOVTH1,#00111100B;重新装入计数常数值MOVTL1,#10110000BDJNZR0,CNTING;200ms到否,否怎跳转CPLP1.5;取反,L2闪烁POPPSW;恢复现场POPACCRETI;中断返回8.一个单片机应用系统要求每隔1秒检测一次P1.0的状态,如果所读的状态为1,从单片机的内部RAM的20H单元提取控制信息并左移一次,从P2口的输出,如果所读的状态为0,则把提取的控制信息右移一次,从P2口的输出。假定晶振频率为12MHz。程序流程图如图5.4所示。MAIN:MOVR0,#20;MOVTMOD,#00010000B;设置为工作方式1和定时器模式MOVTH1,#00111100B;设置定时初始值高8位MOVTL1,#10110000B;设置定时初始值低8位SETBTR1;定时器启动 CNTING:JBCTF1,OK;检测是否溢出SJMPCNTINGOK:MOVTH1,#00111100B;重新装入计数常数值MOVTL1,#10110000BDJNZR0,CNTINGMOVC,P1.0MOVA,20HJCLESSRRAMOVP2,ARETLESS:RLAMOVP2,ARET图5.4题8程序流程图9.航标灯控制器如图5.20所示,夜晚航标灯自动启动,以亮2s灭2s的方式指示航向,白天航标灯自动熄灭。以定时方式实现上述要求,系统晶振频率为6MHz。程序流程框图见图5.5。主程序:ORG0000HSTAR:AJMPMAINORG0003H;外部事件0中断入口地址AJMPExtInt;转到中断处理程序ORG0030HMAIN:MOVSP,#70H;设置堆栈区CLRIT0;电平触发方式SETBEX0;允许外部事件0中断源中断SETBEA;开放CPU中断允许图5.5题9程序流程图HERE:CLRP1.7;熄灭导航灯 AJMPHERE;模拟执行很长的程序;中断处理程序:ORG0200HExtInt:PUSHACC;入栈保护PUSHPSWMOVR0,#20MOVTMOD,#00010000B;设置为工作方式1和定时器模式MOVTH1,#00111100B;设置定时初始值高8位MOVTL1,#10110000B;设置定时初始值低8位SETBTR1;定时器启动CNTING:JBCTF1,OK;检测是否溢出SJMPCNTINGOK:MOVTH1,#00111100B;重新装入计数常数值MOVTL1,#10110000BDJNZR0,CNTING;定时够2s否,否则跳转CPLP1.7;取反,使L1闪烁POPPSW;恢复现场POPACCRETI;中断返回10.晶振频率为6MHz的MCS-51单片机系统,使用定时器T0以定时方法,在P1.0输出周期为400,占空比为90%的矩形波。程序流程框图见图5.6。MAIN:MOVR0,#9;设置占空比为90%MOVTMOD,#00010000B;设置为工作方式1和定时器模式MOVTH1,#11111111B;设置定时初始值高8位MOVTL1,#11101100B;设置定时初始值低8位SETBTR1;定时器启动CNTING:JBCTF1,OK;检测是否溢出,若溢出,清溢出标志SJMPCNTINGOK:MOVTH1,#11111111B;重新装入计数常数值MOVTL1,#11101100B图5.6题10程序流程图SETBP1.0MOVR0,#9CNTING1:JBCTF1,OK1;检测是否溢出,若溢出,清溢出标志SJMPCNTING1OK1:MOVTH1,#11111111B;重新装入计数常数值MOVTL1,#11101100BDJNZR0,CNTING1CLRP1.0SJMPCNTING 11.用单片机的定时器/计数器对外部事件计数,每计数1000个脉冲定时器/计数器转为定时模式,定时100后,再转为计数方式,如此循环不止。设晶振频率为12MHz。程序流程框图见图5.7。MAIN:MOVTMOD,#01000000B;T1设置为工作方式0和计数器模式MOVTH1,#11100000B;设置计数初始值高8位MOVTH1,#00011000B;设置计数初始值低5位SETBTR1;计数器启动CNTING:JBCTF1,OK;检测是否溢出,若溢出,清溢出标志SJMPCNTINGOK:MOVTMOD,#00000000B;T1设置为工作方式0和定时器模式MOVTH1,#11111100B;设置定时初始值高8位MOVTL1,#00011100B;设置定时初始值低5位SETBTR1;定时器启动图5.7题11程序流程图CNTING1:JBCTF1,OK1;检测是否溢出,若溢出,清溢出标志SJMPCNTING1OK1:RET12.转速是每分钟多少转。应用系统用光电码盘为传感器测量电动机转速,它与电动机输出轴相连,电动机每转1圈,光电码盘输出256个脉冲。设计程序实现转速测量,设晶振频率为12MHz。解题思路参考例题5.10,电路图见图5.8。每按动一次开关K,测量一次方波信号的频率,使得定时器/计数器工作在受引脚输入信号电平控制的计数方式,通过单片机定时产生持续时间为1秒的引脚高电平输入信号。用T0统计被测信号的负跳变次数,T1实现定时在引脚输出所需脉宽为1秒的高电平信号。1秒定时采用例5.9的方法二实现。当1秒定时时间到时,立即关闭定时器/计数器,转速等于计数器内容乘以60。(1)定时器/计数器工作方式的设定由以上分析可知,T0为受外部控制的计数模式,工作方式设置为方式1。T1为定时模式,为了实现50ms的定时,它的工作方式设置为方式1,且启停不受外部控制,TMOD设置为00011101B,即1DH(2)计数初始值的计算T0从0开始计数,则(TH0)=00H,(TL0)=00H,当T0溢出时,计数65536次,则转速为:当前计数器(TH0)(TL0)的内容乘以60。T1需要基本定时50ms,溢出20次后实现1秒的定时。则计数初始值计算如下:因此,。(3)采用查询方法实现的程序如下;定义区 TIM_CNTEQU31HFLAGEQU20H.0ERROREQU20H.1;程序ORG0000HLJMPMAINORG001BHLJMPP_T1ORG0030HMAIN:MOVSP,#60HSETBP1.2;设置P1.2为输入SETBP3.2;设置P3.2(端)为输入WAIT:JBP1.2,WAITNEXT:MOVTH0,#00MOVTL0,#00MOVTH1,#3CHMOVTL1,#0B0HMOVTIM_CNT,#20MOVTMOD,#1DHSETBEASETBET1SETBTR1SETBTR0CLRFLAGCLRERRORCLRP1.0;端为高电平COUNT:JBCTF0,F_OVERJBFLAG,T_OVERSJMPCOUNT//===================================F_OVER:SETBERROR;溢出,计数出错调用出错处理程序//==========================T_OVER:MOVA,TL0;计算转速,结果存入R4,R5两个单元中,高位在前MOVB,#60MULABMOVR6,AMOVR5,BMOVA,TH0MOVB,#60MULABADDA,R5MOVR5,AMOVA,#00 ADDCA,BMOVR4,ADIS:调用显示子程序;显示转速JBP1.2,DISLJMPNEXT;T1中断处理程序P_T1:PUSHACCPUSHPSWMOVTH1,#3CHMOVTL1,#0B0HDJNZTIM_CNT,CONTSETBP1.0;1s定时到,端为低电平SETBFLAGCLRTR1CONT:POPPSWPOPACCRETI13.单片机应用系统的晶振频率为12MHz,请用定时器/计数器输出占空比可变的方波实现PWM调速。设方波的频率为100Hz,占空比在1%~99%之间可调。方波的频率为100Hz,则其周期为10ms,把10ms分成100份,每份为0.1ms即为定时时间。采用方式2实现。则初始常数为256-100/1=156MAIN:;占空比存入SETVALUE,取值范围为1-99.表示1%-99%MOVTMOD,#00100000B;设置为工作方式1和定时模式MOVTH1,#156;设置计数初始值高8位MOVTL1,#156;设置计数初始值低5位SETBTR1;定时器启动OK2:SETBP1.0MOVA,SETVALUECNTING:JBCTF1,OK;检测是否溢出SJMPCNTINGOK:DECAJNZCNTINGCLRP1.0MOVA,#100SUBBA,SETVALUECNTING1:JBCTF1,OK1;检测是否溢出,若溢出,清溢出标志SJMPCNTING1OK1:DECAJNZCNTING1SJMPOK2 14.采用定时器/计数器设计一个计时器,最大计时不大于100小时,用3个内部RAM单元Hour、Minute和Second存储时、分和秒,压缩BCD格式存储,设晶振频率为12MHz。MAIN:MOVHOUR,#00MOVMinute,#00MOVSecond,#00MOVTMOD,#00010000B;设置为工作方式1和定时器模式MOVTH1,#00111100B;设置定时初始值高8位,50ms定时MOVTL1,#10110000B;设置定时初始值低8位SETBTR1;定时器启动CONVERT:MOVR4,#20;CNTING:JBCTF1,OK;检测是否溢出SJMPCNTINGOK:MOVTH1,#00111100B;重新装入计数常数值MOVTL1,#10110000BDJNZR4,CNTING;是否定时1s,否则跳转MOVA,Second;;取秒位数值ADDA,#01;;秒加一DAAMOVSecond,ACJNESecond,#01100000B,CONVERT;秒位是否等于60,否则跳转MOVSecond,#00000000B;秒清零MOVA,Minute;ADDA,#01;;分钟加一DAA;MOVMinute,A;CJNEMinute,#01100000B,CONVERT;分钟位是否等于60,否则跳转MOVMinute,#00000000B;分钟清零MOVA,HOURADDA,#01;;小时加一DAA;MOVHOUR,ASJMPCONVERT第六章复习思考题答案一、选择题1.B2.A3.C4.A5.B6.A7.C8.B9.A10.D11.B12.A 二、思考题与编程题1.串行通信有几种方式?各有什么特点?答:串行通信有单工通信、半双工通信和全双工通信3种方式。单工方式下,数据只能单方向地从一端向另一端传送,而不能往相反地方向传输。半双工方式下,允许数据向两个相反的方向传输,但不能同时传输,任一时刻数据只能向一个方向传送,即以交替方式分时实现两个相反方向的数据传输。全双工方式下,数据可以同时向两个相反的方向传输2.实现异步通信时,通信双方需要遵守哪些基本约定?答:(1)字符格式必须相同。(2)通信速率必须相同。3.MCS-51有几种工作方式?各种方式下的通信波特率如何确定?答:MCS-51串行口工作方式有4种。工作在方式0的波特率是固定不变的,为单片机振荡器频率的12分频,即波特率为;方式2时,波特率可以编程为单片机振荡器频率的64分频或32分频,并且与SMOD的设置有关,计算公式为;方式1和3时波特率都是可变的,波特率的设置和计算方法相同,由定时器/计数器T1作为串行通信方式1的波特率发生器,T1的计数器初始值为。4.简述方式0的串行通信原理?答:方式0的串行通信原理:工作在方式0时,串行口为同步移位寄存器的输入或输出模式,主要用于扩展并行输入输出口,数据由RXD(P3.0)脚输入或输出,同步移位时钟由TXD(P3.1)脚输出,发送和接收的是8位数据,低位在先,高位在后,其波特率为单片机振荡器频率的12分频,即1个机器周期发送1位。5.简述方式1的串行通信数据帧的组成和通信原理?答:方式1的串行通信数据帧由1位起始位,8位数据位和1位停止位组成。通信原理:方式1是8位数据异步通信模式,TXD为发送端,RXD为接收端,且波特率是可变的。发送时,CPU执行任何一条以SBUF为目的寄存器的指令,如:“MOVSBUF,A”,就可以启动串行口发送,数据位逐位从TXD引脚输出,当发送完所有的数据位时,发送控制器把TI置为1。接收时,串行口接收允许位REN设置为1,数据由RXD端输入,当检测到RXD引脚上的电平出现1到0跳变时,串行口开始接收过程,一帧接收完毕以后,且满足接收条件,这次接收才真正有效,才会把标志位RI置1。6.方式2和方式3是如何进行多机通信的?它们的数据帧格式与方式1相比有何不同? 答:在串行口工作在方式2或方式3时,如果SM2=1,只有在接收器接收到第9位数据为1时,数据才装入接收缓冲器SBUF,并将接收中断标志位RI置1,向CPU请求中断,如果接收器接收到的第9位为0,则接收中断标志位不置1,并把接收到的数据丢弃。当SM2为0时,接收到一个数据帧后,不管第9位数据是0还是1,都会把接收中断标志RI置1,并将接收到的数据装入接收缓冲器SBUF。利用这个特点,可以实现多个MCS-51单片机之间的通信。数据帧格式与方式1相比多了第9位,从机的地址信息和数据信息可以通过第9位来区分,以实现多机通信。7.采用MCS-51单片机的串行口扩展3个并行输出口,每隔100ms分别把40H、41H和42H单元的内容依次从这3个并行输出口输出。MAIN:MOVSCON,#00H;设置串行口为工作方式0,发送模式MOVTMOD,#00010000B;T1设置为工式1和定时器模式MOVTH1,#00111100B;设置定时初始值高8位MOVTL1,#10110000B;设置定时初始值低8位SETBTR1;定时器启动CNTING:JBCTF1,OK;检测是否溢出,若溢出,清溢出标志SJMPCNTINGOK:SETBP1.0;允许以为MOVR0,#42H;数据首地址MOVR2,#03H;输出3个字节DPLY:MOVA,@R0;取数据MOVSBUF,A;输出TRNSMT:JBCTI,RDY;发送完否?SJMPTRNSMT;为发送完,继续RDY:DECR0;下一个字节的地址DJNZR2,DPLY;数据发送完否?CLRP1.0;数据发送完,禁止移位RET8.采用图6.17构成监控系统来监控某个设备,在扩展的2个并行输入口连接了16个检测开关,系统不断地查询检测这些开关的状态。检测开关闭合时接口电路接收到低电平,否则,接收到高电平。设计程序实现:当开关状态改变时,把16个开关的新状态重新放到35H和36H中保存,开关状态不变时,系统不处理,继续查询。SERIAL00:MOVR2,#02H;接收字节数MOVR0,#30H;接收数据暂存单元地址CLRP1.0;74LS165引脚的状态被置入移位寄存器NOP NOPSETBP1.0;允许寄存器移位MOVSCON,#00010000B;设置串行口为方式0、接收WAIT:JNBRI,WAIT;等待接收CLRRI;清接收标志,准备下接收MOVA,SBUF;读取数据MOV@R0,A;存储INCR0;修改存储单元地址DJNZR2,WAIT;接收完否?MOVR2,#02H;接收字节数MOVR0,#30H;接收数据暂存单元地址MOVR1,#35H;接收数据存储单元地址WAIT1:MOVA,@R0SUBBA,@R1CJNEA,#00H,ST;判读有开关状态改变否,有则跳转INCR0INCR1DJNZR2,WAIT1;数据判断完否,否则跳转RETST:MOV35H,30H;数据不相同,则更新数据MOV36H,31HRET9.A、B两台单片机应用系统进行串行通信,A机工作在发送状态,B为接收状态,现需要将A机片内RAM从30H单元开始存储的8个字节的数据发送到B机,并存储在片内RAM的50H单元开始的区域。2个系统的晶振频率均为11.0592MHz,波特率为2400bit/s。发送程序:TRANS:MOVTMOD,#20H;定时器T1的方式2,定时模式MOVTH1,#0F4HMOVTL1,#0F4HMOVSCON,#40H;设定串行口工作方式1发送MOVPCON,#00H;SMOD=0SETBTR1MOVR0,#30H;设发送数据的地址指针MOVR2,#08H;设发送数据的长度LOOP:MOVA,@R0;取发送数据送AMOVSBUF,A;启动发送WAIT:JBCTI,LOOP1;是否发送完?SJMPWAITLOOP1:INCR0DJNZR2,LOOPRET 接收程序:RECEIVE:MOVTMOD,#20H;定时器/计数器T1工作方式2MOVTH1,#0F4HMOVTL1,#0F4HMOVSCON,#50H;串行口方式1、接收模式(REN=1)MOVPCON,#00HSETBTR1MOVR0,#50H;设接收数据的地址指针MOVR1,#08H;设接收数据的长度LOOP:JBCRI,LOOP1;等待接收数据LJMPLOOPLOOP1:MOVA,SBUF;读入一帧数据MOV@R0,AINCR0DJNZR2,LOOPRET10.A、B两台单片机应用系统具有双工通信功能,现需要将A机片内RAM从30H单元开始存储的8个字节的数据发送到B机,并存储在片内RAM的50H单元开始的区域。2个系统的晶振频率均为11.0592MHz,波特率为4800bit/s。要求如下:(1)在A机发送时,每次发送10个字节,其中,第1个字节为起始标志0F5H,第2到第9字节为要发送的8个字节数据,第10个字节为8个字节数据的异或校验值(8个字节连续异或的值)。(2)B机接收到数据后,先进行异或校验,如果接收到的8个数据的异或值与接收到的第10个字节数据相同,则把数据存放到本机的50H单元开始的区域,并发送2个字节的重发请求0F5H、0FFH;否则,丢弃本次接收到的所有数据,并发送2个字节的重发请求0F5H、0DDH,其中为0F5H起始标志。A机接收到0FFH时,停止发送,接收到重发请求后,按照(1)重发数据。(3)B发送重发请求超过10次,则中断接收。程序框图见图6.10A机:TRANS:MOVTMOD,#20H;定时器/计数器T1工作方式2MOVTH1,#0FAHMOVTL1,#0FAHMOVSCON,#50H;串行口方式1、接收模式(REN=1)MOVPCON,#00HSETBTR1;计算异或校验值MOVR0,#30H;设数据的地址指针MOVR1,#08H;设数据的长度MOVA,#00HNEXT:XRLA,@R0INCR0 DJNZR1,NEXTMOV38H,A;校验值存入58H单元;发送05FH起始标志,8个字节的数据和一个字节的校验值FS:MOVA,#05FH;取发送数据送AMOVSBUF,A;启动发送WAIT0:JBCTI,LOOP0;是否发送完?SJMPWAIT0LOOP0:MOVR0,#30H;设发送数据的地址指针MOVR2,#09H;设发送数据的长度LOOP:MOVA,@R0;取发送数据送AMOVSBUF,A;启动发送WAIT:JBCTI,LOOP1;是否发送完?SJMPWAITLOOP1:INCR0DJNZR1,LOOP;等待B机回复,如果B机回复0FFH,发送结束;回复0DDH,则重新发送LOOP2:JBCRI,LOOP3;等待接收数据LJMPLOOP2LOOP3:MOVA,SBUF;读入一帧数据CJNEA,#05FH,LOOP2LOOP4:JBCRI,LOOP5;等待接收数据LJMPLOOP4LOOP5:MOVA,SBUF;读入一帧数据CJNEA,#0DDH,RTSJMPFSRT:CJNEA,#0FFH,LOOP2RETB机:RECEIVE:MOVTMOD,#20H;定时器/计数器T1工作方式2MOVTH1,#0FAHMOVTL1,#0FAHMOVSCON,#50H;串行口方式1、接收模式(REN=1)MOVPCON,#00HSETBTR1MOVR2,#10;接收起始标志05FHLOOP2:JBCRI,LOOP3;等待接收数据LJMPLOOP2LOOP3:MOVA,SBUF;读入一帧数据CJNEA,#05FH,LOOP2;接收8个字节数据和一个字节的校验值MOVR0,#50H;设接收数据的地址指针MOVR1,#09H;设接收数据的长度LOOP:JBCRI,LOOP1;等待接收数据 LJMPLOOPLOOP1:MOVA,SBUF;读入一帧数据MOV@R0,AINCR0DJNZR1,LOOP;计算异或校验值MOVR0,#50H;设数据的地址指针MOVR1,#08H;设数据的长度MOVA,#00HNEXT:XRLA,@R0INCR0DJNZR1,NEXT;判断接收数据是否正确CJNEA,58H,WG;计算的校验值和接收的校验值比较,不相等则跳转MOVA,#05FH;取发送数据送AMOVSBUF,A;启动发送WAIT0:JBCTI,LOOP0;是否发送完?SJMPWAIT0LOOP0:MOVA,#0FFH;取发送数据送AMOVSBUF,A;启动发送WAIT1:JBCTI,LOOP4;是否发送完?SJMPWAIT1LOOP4:RET;接收数据不正确WG:MOVA,#05FH;取发送数据送AMOVSBUF,A;启动发送WAIT5:JBCTI,LOOP5;是否发送完?SJMPWAIT5LOOP5:MOVA,#0DDH;取发送数据送AMOVSBUF,A;启动发送WAIT6:JBCTI,LOOP6;是否发送完?SJMPWAIT6LOOP6:DJNZR2,LOOP2;判断是否请求重发10次,否则跳转重新接收MOVR0,#50H;设数据的地址指针MOVR1,#08H;设数据的长度NEXT1:MOV@R0,#00HINCR0DJNZR1,NEXT1RET 第七章复习思考题答案1.已知a、b为8位无符号二进制数,分别存在data和data+1单元,编写程序计算5a+b.解:令data为30,则a.b存在30.31单元。结果“5a+b”存在20H,21H,其中20H存放高八位。MOVA,30HMOVB,#05HMULABADDA,31HMOV21H,AMOVA,#00HADDCA,BMOV20H,ARET2.已知16位二进制数以补码形式存放在data和data+1单元,求其绝对值并将结果存储在原单元。(提示:求出原码后,再求绝对值)解:设data为2OHdata+1为21HMOVA,20HANLA,#80H;判断首位是否为0,即为正JZCONT;为0则跳转MOVA,20HXRLA,#7FH MOV20H,AMOVA,21HXRLA,#0FFHADDA,#01HMOV21H,AMOVA,#00ADDCA,20HMOV20H,AMOVA,20HANLA,#01111111BMOV20H,ACONT:RET3.假设0~40的平方值以表的形式存储程序存储器中,采用查表方法编制一个实现获取()平方值的子程序。解:设x的平方值以双字节的格式存储在程序存储器中,首地址为SQ_TABMOVDPTR,#SQ_TABMOVA,R2;取xADDA,R2;计算2xMOVR2,A;2x暂存于R2中MOVCA,@A+DPTR;取x的平方值的第一个字节MOVR3,A;平方值的第一个字节存入R3INCR2;2x+1MOVA,R2MOVCA,@A+DPTR;取平方值的第二个字节MOVR4,A;存入R4RETSQ_TAB:DW0,1,4,9,16......,16004.根据R6的内容使程序转向相应的操作子程序。操作子程序的入口地址分别为OPRD0,OPRDl,…OPRDn。解:MOVDPTR,#ETR_TABMOVA,R6RLA;R6值乘以2MOVR6,AMOVCA,@A+DPTR;取入口地址高8位PUSHACC;高8位入口地址入栈INCR6MOVA,R6MOVCA,@A+DPTR;取入口地址低8位MOVDPL,A;组装入口地址,低8位入口送DPLPOPDPH;高8位入口地址送DPH CLRAJMP@A+DPTR;转向相应程序ETR_TAB:DWOPRD0,OPRD1,OPRD2......OPRDnOPRD0:程序0OPRD1:程序1OPRD2:程序2……OPRDn:程序n5.在单片机内部RAM中从20H单元开始存储50个数据,请编制一个程序统计其中正数的个数,并将统计结果存放于70H单元。解:将数据区首地址存放在R0中,个位放在R1中。MOVR0,#20HMOVR1,#50MOV70H,#00HCONT:MOVA,@ROJZNEXTANLA,#80HJNZNEXTINC70HNEXT:INCR0DJNZR1,CONTRET6.从内部RAM的20H单元开始存一批带符号的八位二进制数据,数据长度存放在1FH单元中,请统计其中大于0、小于0、等于0的个数,并把统计结果分别存放在ONE、TWO、THREE单元。解:将数据区首地址存放在RO中。ONEEQU30HTWOEQU31HTHREEEQU32HMOVR0,20HMOVONE,#00MOVTWO,#00MOVTHREE,#00CONT:MOVA,@R0JZLINGANLA,#80HJZZHENGINCTWONEXT:INCR0DJNZ1FH,CONTRET LING:INCTHREELJMPNEXTZHENG:INCONELJMPNEXT7.从内部RAM的20H单元开始存放30个带符号的八位二进制数据,编制一个程序,分别把正数和负数存放在51H和71H开始的区域,并统计正数和负数的个数,分别存放在50H和70H单元。解:MOVR0,#20HMOVR2,#51HMOVR3,#71HMOVR4,#30MOV50H,#00MOV70H,#00CONT:MOVA,@R0JZNEXT;数据为0则跳转ANLA,#80HJNZFUSHUMOVA,R2;数据为正数MOVR1,AMOVA,@R0MOV@R1,AINC50HINCR2NEXT:INCR0DJNZR4,CONTRETFUSHU:MOVA,R3;数据为负数MOVR1,AMOVA,@R0MOV@R1,AINC70HINCR3LJMPNEXT8.设内RAM的30H和31H单元存放两个带符号数(原码格式),求出其中的大数并将它存放在32H单元中。解:MOVA,30HANLA,#10000000HMOVR0,A;30H的正负号暂存于R0MOVA,31H ANLA,#10000000BXRLA,R0;比较两个数的符号JNZDISA;异号则跳转MOVA,30HANLA,#01111111BMOVR2,AMOVA,31HANLA,#01111111BSUBBA,R2;比较两个数绝对值大小JCBJ;小于则跳转MOVR2,31HMOVR3,30HSJMPPDBJ:MOVR2,30HMOVR3,31HPD:CJNER0,#00H,FZ;RO为负则跳转MOV32H,R2RETFZ:MOV32H,R3RETDISA:CJNER0,#00H,LW;R0为负则跳转MOV32H,30HRETLW:MOV32H,31HRET9.搜索一串ASCII码字符串中的最后一个非空格字符,该字符串从外部RAM的8000H单元开始存放,以回车符(ASCII码为ODH)结束。编程实现搜索,并将搜索到的最后一个非空格字符的单元地址存放在40H和41H单元。MOVDPTR,#8000HLOOP:MOVXA,@DPTRCJNEA,#0DH,DORETDO:CJNEA,#"SPACE",NONMOV40H,DPHMOV41H,DPLNON:INCDPTRSJMPLOOP10.5个双字节无符号数求和,数据存放在外部RAM的5000H单元开始的区域,把结果存放在以SUM开始的内部RAM单元中。数据存储方式定义为低位在前,高位在后 SUMEQU50HMOVR7,#05MOVR0,#SUM;将结果存储单元清零MOV@R0,#00INCR0MOV@R0,#00HINCR0MOV@R0,#00HMOVDPTR,#5000HCONT:MOVR0,#SUMMOVXA,@DPTRADDA,@R0MOV@R0,AINCR0INCDPTRMOVXA,@DPTRADDCA,@R0MOV@R0,AINCR0MOVA,@R0ADDCA,#00MOV@R0,AINCDPTRDJNZR7,CONTRET11.比较两个ASCII码字符串是否相等,字符串的长度存放在内部RAM的40H单元,两个字符串的首地址分别为42H和52H,当两个字符串相等时,置40H单元为0FFH,否则,40H单元清0。MOVR7,40HMOVR0,#42HMOVR1,#52HREDO:MOVA,@R0MOV70H,@R1CJNEA,70H,NONINCR1INCR0DJNZR7,REDOMOV40H,#0FFHRETNON:MOV40H,#00HRET12.把外部RAM中BLOCK1为首地址的数据块传送到内部RAM的以BLOCK2为首地址开始的区域,数据长度为length. BLOCK1EQU50000HBLOCK2EQU50HlengthEQU20MOVDPTR,#BLOCK1MOVR0,#BLOCK2MOVR1,#lengthREDO:MOVXA,@DPTRMOV@R0,AINCDPTRINCR0DJNZR1,REDORET13.把长度为LENGTH的字符串从内部RAM的BLOCK1单元开始传送到外部RAM的以BLOCK2单元开始的区域,在传送过程中如果碰到回车符CR时,传送即刻结束。LENGTHEQU50HBLOCK1EQU20HBLOCK2EQU0010HMOVR1,#BLOCK1MOVR7,#LENGTHMOVDPTR,#BLOCK2REDO:MOVA,@R1CJNEA,#"CR",GOONRETGOON:MOVX@DPTR,AINCR1INCDPTRDJNZR7,REDORET14.应用系统数据缓冲区开辟在外部RAM中,用于存储单字节数据,缓冲区从BUFFER单元开始,长度为100个单元,为了某种统计需要,要求缓冲区的非负数存储在单元地址为BLOCK1开始的区域,其余的数存储在在单元地址为BLOCK2开始的区域,这两个缓冲区也设置在外部RAM中。BLOCK1EQU2021H;定义外存储段的地址BLOCK2EQU2223HBUFFEREQU3031HMOVDPTR,#BLOCK1;将存贮地址暂存于寄存器 MOV20H,DPHMOV21H,DPLMOVDPTR,#BLOCK2MOV22H,DPHMOV23H,DPLMOVDPTR,#BUFFERMOV30H,DPHMOV31H,DPLMOVR5,#100CONT:MOVDPL,31HMOVDPH,30HMOVXA,@DPTR;取数据ANLA,#80H;判断数据的正负JZHUIFU;非负则跳转MOVXA,@DPTR;存储负数MOVDPH,22HMOVDPL,23HMOVX@DPTR,AINCDPTRMOV22H,DPHMOV23H,DPLNEXT:MOVDPL,31H;修改外部数据地址MOVDPH,30HINCDPTRMOV31H,DPLMOV30H,DPHDJNZR5,CONTRETHUIFU:MOVXA,@DPTR;存储非负数MOVDPH,20HMOVDPL,21HMOVX@DPTR,AINCDPTRMOV20H,DPHMOV21H,DPLLJMPNEXT15.编制一个程序,把外部RAM中从BLOCK1单元开始存储的20个数据与内部RAM的以BLOCK2为开始存储的数据依次交换。BLOCK1EQU0010HBLOCK2EQU20HMOVR1,#BLOCK2MOVR7,#20 MOVDPTR,#BLOCK1NEXT:MOVXA,@DPTRXCHA,@R1MOVX@DPTR,AINCDPTRINCR1DJNZR7,NEXTRET16.单片机应用系统开机自检时,为了检测扩展的外部RAM是否完好,通常逐个向外部RAM的存储单元写入数据,然后再读出,如果读出的数据与写入的数据相同,则存储单元状态良好,否则,认为损坏。检测分2步进行,第一步写入的检测数据为0AAH,如果所有单元测试正确,进行第二步,第二步写入数据为55H,如果所有单元测试正确,则外部RAM状态良好。在测试过程中,如果发现读出数据与写入数据不同,则记录该单元地址,并报警。编写一个自检256个外部RAM单元的程序。MAIN:CLRP1.0MOVR0,#0AAH;设置存入0AAHCALLCX;调用检测子程序MOVC,P1.0;判断是否出现错误JCNEXT;有错误则跳转,结束MOVR0,#55H;设置存入55HCALLCX;调用检测子程序NEXT:RETCX:MOVDPTR,#2000H;外RAM首地址MOVR1,#0FFHNEXT1:MOVA,R0MOVX@DPTR,A;将R0存入RAMMOVXA,@DPTR;从RAM取出数据SUBBA,R0;判断数据是否相同JNZWG;不同则跳转INCDPTRDJNZR1,NEXT1RETWG:MOVR2,DPH;出错存储单元的地址高8位存入R2MOVR3,DPL;出错单元的地址低8位存入R3SETBP1.0;P1.0置1,报警RET17.在单片机应用系统中,为了数据规格化,需要把二进制数据高位的0去掉,使最高位为1。设计程序实现一个16位二进制数的规格化,并记录所去掉的0个数。 MOV30H,#00;存储去掉的0个数MOVR7,#16NEXT:MOVA,20HJNBACC.7,GOON;判断高位是否为0,为0则跳转RETGOON:MOVA,21H;数据左移一位,去除0位CLRCyRLCAMOV21H,AMOVA,20HRLCAMOV20H,AINC30HDJNZR7,NEXTRET18.已知无符号数二进制数存于20H单元,存放于21H单元,编程实现下列表达式:解:MOVA,20HCLRCSUBBA,#05JNCGT5MOVA,20HMOVB,#02DIVABMOV21H,ARETGT5:MOVA,20HCLRCSUBBA,#15JNCGT15MOVA,20HMOVB,#05MULABSUBBA,#07MOV21H,ARET GT15:MOV21H,#30RET19.已知逻辑表达式,其中,Q为P1.5,X为P1.0,U为P1.1,V为P1.2,W为22H.0,D为22H.5,E为定时计数器T0的溢出标志TF0,请编制程序实现上述逻辑功能。QBITP1.5XBITP1.0UBITP1.1VBITP1.2WBIT22H.0DBIT22H.5EBITTF0MOVC,WORLC,VCPLCMOV22H.1,C;将的结果暂存于22H.1中MOVC,DANLC,ECPLCANLC,/UORLC,XCPLC;C中为的结果ORLC,22H.1;计算最终结果MOVQ,C;存入QRET20.有一个工程应用问题,需要在程序运行的1、3、5、6次时调用SUB1,而在2、4、7、8时调用SUB2。(提示:采用移位方式,判断进位位的状态)MOVA,#01010101BMOVR0,#08HLOOP:RLCAJCCALL_B2CALLSUB1LJMPNEXTCALL_B2:CALLSUB2NEXT:DJNZR0,LOOPRETSUB1:子程序1RETSUB2:子程序2RET 21.在20H、21H和22H单元的存储了一个6位十进制数,把该数转换成ASCII码并放到30H单元开始的区域。MAIN:MOVR0,#30HMOVR1,#20HMOVR2,#3LOOP:MOVA,@R1SWAPAANLA,#0FHADDA,#30HMOV@R0,AINCR0MOVA,@R1ANLA,#0FHADDA,#30HMOV@R0,AINCR0INCR1DJNZR2,LOOPRET22.假设6位十进制数存在20H、21H和22H,高位在前,转换结果存在23H、24H和25H三个单元,高位在前设:,则程序如下:(1)2位BCD码转换为二进制数的子程序:入口条件:待转换的2位十进制(BCD)码整数在累加器A中。出口条件:转换后的单字节十六进制整数仍在累加器A中。影响寄存器:PSW、A、B、R4,堆栈需求:2字节BCDH:MOVB,#10H;分离十位和个位DIVABMOVR4,B;商为十位数,余数为个位数,暂存个位于R4MOVB,#10;将十位转换成二进制数MULAB;ADDA,R4;转换结果在A中RET(2)6位十进制数转换为二进制数子程序:BCD2BIN:MOVA,22H;将个位十位转换成十六进制LCALLBCDH;调用子程序MOV22H,A;存个位十位的二进制数转换结果MOVA,21H;将千位和百位转换成二进制 LCALLBCDH;MOV21H,AMOVA,20HLCALLBCDH;MOV20H,A;十万、万位转换的二进制数MOVDPTR,#1000;以下为十万、万位转换的二进制数*1000MOVB,DPLMULABMOV2AH,AMOV2BH,BMOVA,20HMOVB,DPHMULABADDA,2BHMOV2BH,ACLRAADDCA,BMOV2CH,A;十万、万位转换的二进制数存在2CH、2BH、2AH单元MOVA,21H;千位和百位转换成的二进制数*100MOVB,#100MULABMOV25H,AMOV24H,BMOVA,22H;取十位、个位转换的二进制数ADDA,25HMOV25H,ACLRAADDCA,24HMOV24H,A;十进制数的低四位转换为二进制数存在24H,25H单元MOVA,2AHADDA,25HMOV25H,AMOVA,2BHADDCA,24HMOV24H,AMOVA,2CHADDCA,#00MOV23H,A;二进制数在23H、24H和25H单元RET 第八章复习思考题答案1.简述MCS-51单片机的总线构造原理。如图8.1所示,P0口在ALE为高电平有效期间,输出低8位地址A7~A0,同时,P2口上输出高8位地址A15~A8。在ALE出现下跳沿时,把P0口的地址信息锁存,在ALE为低电平有效时,CPU对A15~A0状态指定的单元进行操作,此时,P0口作为数据总线。图8.1题1总线构造原理2.用1片Intel2764给8051单片机扩展一个8KB的外部程序存储器,同时保留片内程序存储器,请画出电路连接图并分析解:电路连接图如图8.2所示。图8.2题2电路连接图分析:8051内部程序存储器占用了程序存储器地址空间的前4KB,即0000~0FFFH,要求扩展的地址空间与8051的内部ROM 相衔接,则外部程序存储器地址不能与内部程序存储器地址冲突,可以设计为2000H~3FFFH,所以将P2.6和P2.7管脚空置,令P2.5为1时外部ROM有效,外部程序存储器地址为2000H~3FFFH。3.用3片Intel2764给8051单片机扩展24KB的外部程序存储器,要求地址空间与8051的内部ROM相衔接,请画出电路连接图并分析各芯片的地址范围。扩展电路如图8.3所示图8.3题3电路连接图分析:8051内部程序存储器占用了程序存储器地址空间的前4KB,即0000~0FFFH,要求扩展的24KB外部程序存储器地址空间与8051的内部ROM相衔接,则外部程序存储器地址不能与内部程序存储器地址冲突,上图通过采用2-译码器输出作为IC3~IC5的片选,P2.5、P2.6分别作为74LS139的数据输入A、B,实现对Intel2764的片选功能片内ROM的地址范围:0000~0FFFH;IC3的地址范围:2000~3FFFH;IC4的地址范围:4000~5FFFH;IC5的地址范围:6000~7FFFH。4.一个8051的应用系统需要扩展8KB的数据存储器,请画出逻辑连接图,并说明各芯片的地址范围。编制程序测试外部RAM所有单元是否可用。方法:先写入一个数据,然后读出,如果二者相同,则单元可用,否则,通过标志位报错。若全部单元都可用,外部RAM可用,只要发现读写不一致,则停止检测并报错,同时输出该单元地址。 图8.4题4电路连接图扩展电路见图8.4,芯片的地址为0000H-1FFFH检测程序如下:MAIN:MOVDPTR,#0000H;外部数据存储器起始地址MOVR2,#0FFH;设置校验时存入的数据MOVR0,#40H;要完全检查8K外部数据存储器LOOP1:MOVR1,#50H;要循环检查2000H次LOOP:MOVA,R2MOVX@DPTR,A;存入数据MOVXA,@DPTR;读出数据SUBBA,R2JNZWG;判读是否出错,错误则跳转INCDPTR;修改地址DJNZR1,LOOPDJNZR0,LOOP1RETWG:MOVR3,DPH;存储地址MOVR4,DPLSETBP1.0;设置标志位,报警RET5.在MCS-51单片机系统中,扩展的程序存储器和数据存储器都使用16位地址线和8位数据线,为什么不发生冲突?答:由于单片机访问外部程序存储器时,使用控制对外部程序存储器单元的读取操作;单片机访问外部数据存储器时,外部数据存储器的读写由MCS-51单片机的(P3.7)和(P3.6)控制,因此,即使程序存储器和数据存储器的单元地址完全相同,也不会造成访问冲突。6.外部I/O接口地址是否可以与外部数据存储器地址重叠?为什么? 答:不可以,外部数据存储器和外部I/O口是统一编址的,它们共同占用同一地址空间,且写入读出操作相同,所以不可地址重叠。7.试用Intel2764和6264为单片机设计一个存储器系统,使它具有16KB程序存储器和8KB数据存储器。画出该存储器系统的硬件连接图,并说明各芯片的地址范围。答:硬件连接图如图8.5所示图8.4题7电路连接图l当P2.5=0,P2.6=1,默认P2.7=0时,IC3和IC5的地址范围为4000~5FFFH;l当P2.5=1,P2.6=0,默认P2.7=0时,IC4的地址范围为2000~3FFFH;第九章复习思考题1.计算机系统中为什么要设置输入输出接口?输入/输出接口电路是CPU与外设进行数据传输的桥梁。外设输入给CPU的数据,首先由外设传递到输入接口电路,再由CPU从接口获取;而CPU输出到外设的数据,先由CPU输出到接口电路,然后与接口相接的外设获得数据。CPU与外设之间的信息交换,实际上是与I/O接口电路之间的信息交换。2.简述输入输出接口的作用。I/O接口电路的作用主要体现在以下几个方面:(1)实现单片机与外设之间的速度匹配;(2)实现输出数据锁存;(3)实现输入数据三态缓冲;(4)实现数据格式转换。3.在计算机系统中,CPU与输入输出接口之间传输数据的控制方式有哪几种?各有什么特点?在计算机系统中,CPU与I/O接口之间传输数据有3种控制方式:无条件方式,条件方式,中断方式,直接存储器存取方式。在无条件方式下,只要CPU执行输入/输出指令,I/O接口就已经为数据交换做好了准备,也就是在输入数据时,外设传输的数据已经传送至输入接口,数据已经在输入接口端准备好;输出数据时,外设已经把上一次输出的数据取走,输出接口已经准备好接收新的数据。 条件控制方式也称为查询方式。CPU进行数据传输时,先读接口的状态信息,根据状态信息判断接口是否准备好,如果没有准备就绪,CPU将继续查询接口状态,直到其准备好后才进行数据传输。在中断控制方式下,当接口准备好数据传输时向CPU提出中断请求,如果满足中断响应条件,CPU则响应,这时CPU才暂时停止执行正在执行的程序,转去执行中断处理程序进行数据传输。传输完数据后,返回原来的程序继续执行。直接存储器存取方式即DMA方式,它由硬件完成数据交换,不需要CPU的介入,由DMA控制器控制,使数据在存储器与外设之间直接传送。4.采用74LS273和74LS244为8051单片机扩展8路输入和8路输出接口,设外设8个按钮开关和8个LED,每个按钮控制1个LED,设计接口电路并编制检测控制程序。图9.1题3接口电路原理图接口电路原理图如图9.1源程序:MOVDPTR,#BFFFH;设置输入/输出口地址COMT:MOVXA,@DPTR;读取开关状态NOP;延时,总线稳定MOVX@DPTR,A;输出,驱动LED显示NOP;延时,总线稳定AJMPCONT5.74LS377是8D触发器,其功能表见表9.17,其中Di为触发器的数据输入端,Qi为触发器的数据输出端,是使能控制端,CLK是时钟输入端,Q0为建立稳态输入条件之前,锁存器输出Q的状态。采用它为8051单片机扩展1个8位的并行输出口。图9.2题5接口电路原理图用74LS377扩展的输出口电路如图9-2所示。用P2.7与74LS377的使能控制端 相连,当P2.7为0时,74LS377被选中,如果默认其他未用的地址线为1,则扩展的输出口地址为7FFFH。由于MCS-51单片机的接到74LS377的时钟输入端CLK,当CPU执行写外部输出口指令MOVX时,把数据输出到数据总线上,在信号由低变高时,写出的数据被打入74LS377并锁存。程序如下:MOVDPTR,#7FFFH;输出口地址MOVA,R6;取数据MOVX@DPTR,A;输出,6.74LS245是一种具有双向驱动的8位三态输出缓冲器,它的功能表见表9.18,其中为使能端,DIR为方向控制端,A1~A8为A端的数据输入/输出,B1~B8为B端的数据输入/输出。当为低电平时,DIR为高电平把A端数据传送至B端;DIR为低电平,把B端数据传送至A端。在其他情况下不传送数据,并输出呈高阻态。采用它为8051单片机扩展1个8位的输入口。(1)(2)图9-3题6采用74LS245扩展输入口的2种电路图9-3为采用74LS245扩展输人接口电路。电路(1)中,DIR上拉为高电平,74LS245数据传送方向强制为B端到A端,当P2.0为0时,且为低电平时,使能端为低电平,74LS245三态门打开,单片机CPU读取外设输入的数据。其他情况下,74LS245的三态门呈高阻状态。电路(2)中,只有单片机读取外设数据时,P2.0=0使74LS245的使能端有效,如果为低电平,把74LS245数据传送方向置为A端到B端,其A→B方向的三态门打开,单片机CPU读取外设输入的数据。P2.0=1时,使能端无效,A端和B端处于隔离状态。图9-3的2个电路都采用P2.0为片选,其输入口地址为0FEFFH(默认未用地址线为1)。7.采用8155芯片为8051单片机系统扩展接口,外设为开关组(8个开关组成)和8个LED,每个开关控制1个LED。现需要读取开关组的状态,并把其状态存储到8155芯片RAM中,若开关组的开关全部断开,则不记录。设计接口电路并编制检测程序。 图9.4题7接口电路接口电路如图9.4所示,8155的PB口用作读取开关组状态,PA口用作控制LED组,分配地址如下:命令/状态寄存器:0100H;PA口:0101H;PB口:0102H;PA和PB口为基本输入输出方式。K0控制LED0,K1控制LED1,以此类推。设存储开关状态的单元为STATE。程序如下:CMMDEQU0100HPORTAEQU0101HPORTBEQU0102HPORTCEQU0103HSTATEEQU20HMOVA,#02H;初始化,工作方式控制字MOVDPTR,#0100H;控制寄存器地址MOVX@DPTR,A;设置工作方式,初始化完成MOVA,#0FFHMOVDPTR,#0101HMOVX@DPTR,A;上电后,熄灭LEDNOPMOVSTATE,#0FFH;没有开关闭合DETECT:MOVDPTR,#0102H;PB口地址MOVXA,@DPTR;从PB口读开关状态MOVDPTR,#0101H;PA口地址MOVX@DPTR,A;从PA口输出控制LED指示灯NOPCJNEA,#0FFH,VALIDSJMPDETECTVALID:MOVSTATE,A;;记录开关状态AJMPDETECT8.采用8255芯片为8051单片机系统扩展接口,外设为开关组(8个开关组成)和8个LED,每个开关对应1个LED。现需要每隔50ms读取一次开关组的状态,并把其状态存储到内部RAM中。设计接口电路并编制检测程序。假设系统晶振频率为12MHz。 图9.5单片机与8255接口电路图9.5为接口电路,PA、PB、PC和控制寄存器地址分别为:0000H、0001H、0002H和0003H。根据开关K0~K7状态控制LED0~LED7的显示状态,K0控制LED0,依此类推。设置8255的工作方式,PA口外接开关,为方式0的输入,PB口外接LED,为方式0的输出,则工作方式控制字的标志位D7为1,D6~D3(A组):0000,D2~D0(B组):010,组合后的控制字为:10000010,即82H。设存储开关状态的单元为STATE,用定时器/计数器T0定时50ms,工作方式为方式1,初始值为:,即3CB0HPORTAEQU0100HPORTBEQU0101HPORTCEQU0102HCMMDEQU0103HSTATEEQU20H//mianprogramACALLIni8255;ACLLIniTimer0WAIT:JBCTF0,DETECTSJMPWAITDETECT:MOVTH0,#3CHMOVTL0,#0B0HMOVDPTR,#PortB;PB口地址MOVXA,@DPTR;从PB口读开关状态MOVDPTR,#PortA;PA口地址MOVX@DPTR,A;从PA口输出控制LED指示灯NOPMOVSTATE,AAJMPWAITIni8255:MOVA,#82H;初始化,工作方式控制字MOVDPTR,#CMMD;控制寄存器地址 MOVX@DPTR,A;设置工作方式,初始化完成MOVA,#0FFHMOVDPTR,#PORTAMOVX@DPTR,A;上电后,熄灭LEDNOPRETIniTimer0:MOVTMOD,#01HMOVTH0,#3CHMOVTL0,#0B0HSETBTR0RET9.简述矩阵键盘的行列扫描和线反转法原理。(1)行列扫描法:在按键识别过程时,依次使行线输出电平,然后检查列线的输入电平,如果所有列线的输入全为高电平,则该行无按键按下;如果不全为高电平,则被按下的按键在本行,且在输入电平变为低电平的列的交叉点上。(2)线反转法:第一步,首先使行线为输入,列线为输出。列线全部输出低电平,那么,行线中变为低电平的行线为按键所在的行。第二步,使行线变为输出,列线变为输入。行线输出全部为低电平,那么,列线中变为低电平的列线为按键所在的列。10.一个简单计数器的电路原理图如图所示。要求每按一次S键,计数器计数一次,计数值送P1口显示,采用单只数码管显示,计16次后从0开始。图9.6题10原理图1BITP3.3VALUEEQU20HORG0000HLJMPMAINORG1000HMAIN:SETBP3.3MOVVALUE,#00ACALLDISP;初始化显示0 WAIT0:JBS1,WAIT0;ACALLDEL10MSWAIT1:JBS1,WAIT1;判断按下WAIT2:JNBS1,WAIT2;ACALLDEL10MSWAIT3:JNBS1,WAIT3;判断释放INCVALUE;加1ANLVALUE,#00001111B;仅显示低位ACALLDISP;显示SJMPWAIT0//显示子程序DISP:MOVA,VALUE;取显示信息MOVDPTR,#SEG_TAB;字型码表的首地址MOVCA,@A+DPTR;通过显示信息查其字型码MOVP1,A;输出显示NOPRET//延时子程序DEL10MS:MOVR5,#10DELX:MOVR6,#200DEL0:NOPNOPNOPDJNZR6,DEL0DJNZR5,DELXRETSEG_TAB:DB0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90HDB88H,83H,0C6H,0A1H,86H,8EH;以下为显示字型码表,0~9,A~FEND11.简述LED数码管的静态显示和动态显示原理。(1)静态显示:在多位静态显示时,各个LED数码管相互独立,公共端COM接地(共阴极)或接正电源(共阳极)。每个数码管的8个显示字段控制端分别与一个8位并行输出口相连,只要输出口输出字型码,LED数码管就立即显示出相应的字符,并保持到输出口输出新的字型码。(2)动态显示:多位LED数码管动态显示方式是各个LED数码管一位一位地轮流显示。在硬件电路上,各个数码管的显示字段控制端并联在一起,由一个8位并行输出口控制;各个的LED数码管的公共端作为显示位的位选线,由另外的输出口控制。动态显示时,各个数码管分时轮流地被选通,即在某一时刻只选通一个数码管,并送出相应的字型码,并让该数码管稳定地显示一段短暂的时间,在下一时刻选通另一位数码管,并送出相应的字型码显示,并保持显示一段时间,如此循环,即可以在各个数码管上显示需要显示的字符。 图9.7LED数码管静态显示原理图9.8LED数码管动态显示原理12.用P1和P3口作为输出口,设计一个5位的LED数码管显示系统,并在显示器上显示“HELLO”。图9.9题12接口电路图接口电路图如图9.9所示,用2片74LS245提高接口的驱动能力,LED数码管为共阴型。程序如下:SEG_OUTEQUP3BIT_OUTEQUP1//====================================ORG0000HLJMPSTARTORG0030HSTART:MOVSP,#60HMOV20H,#40H//显示"HELLO"对应字型表序号编码:401223MOV21H,#12HMOV22H,#23HMOVR1,#30HMOVR0,#20HCALLSPLITINCR0INCR1CALLSPLITINCR0INCR1CALLSPLITRED:ACALLDSPLY1 SJMPRED//===================================SPLIT:MOVA,@R0ANLA,#0F0HSWAPAMOV@R1,AINCR1MOVA,@R0ANLA,#0FHMOV@R1,ARET//===========================================//6位显示DSPLY1:MOVR0,#30H;显示缓冲区地址MOVR2,#11111110B;显示起始位置REDO:ACALLDISP;显示1位MOVA,R2;计算下一个显示位置RLAMOVR2,AINCR0;修改显示缓冲区地址指针XRLA,#10111111B;6位显示完否JNZREDO;未完,继续显示RET;返回//==========================================;显示一位子程序DISP:MOVDPTR,#LED_SEG;字型码表首地址MOVA,@R0;取显示数据MOVCA,@A+DPTR;求显示数据的字型码MOVSEG_OUT,A;输出字型码MOVA,R2;取显示位置MOVBIT_OUT,A;显示ACALLDL1MSMOVA,#0FFH;稳定显示1msMOVBIT_OUT,ARET;字型码表LED_SEG:DB76H;H序号:00DB79H;E序号:01DB38H;L序号:02DB3FH;0序号:03DB00H;BLANK序号:04DL1MS:MOVR5,#200;12M时延时1msDEL:NOP NOPNOPDJNZR5,DELRETEND13.一个显示电路如图9.60所示。请采用串行口方式0实现LED数码管的动态显示,在显示器上自左向右动态显示“654321”,每个字符保持时间为0.1s。图9.10习题13原题电路图ORG0000HLJMPSTARTORG0030HSTART:MOVSP,#60HMOV20H,#12H//显示数据MOV21H,#34HMOV22H,#56HMOVR1,#30HMOVR0,#20HCALLSPLIT//分离BCD码INCR0INCR1CALLSPLITINCR0INCR1CALLSPLITRED:ACALLDISPLYSJMPRED//===================================SPLIT:MOVA,@R0ANLA,#0F0HSWAPAMOV@R1,AINCR1MOVA,@R0 ANLA,#0FHMOV@R1,ARET//================================DISPLY:MOVR0,#30H;显示缓冲区首地址MOVR2,#05H;显示位置,最右端1位NEXT:ACALLDISP11;显示INCR0;修改显示缓冲区地址指针DECR2;计算下一位显示位置CJNER2,#0FFH,NEXT;6位显示完否?RET;显示完返回;显示1位子程序DISP11:MOVA,@R0;取显示数据MOVDPTR,#SEG_TABMOVCA,@A+DPTR;取显示数据的字型码MOVSBUF,A;输出字型码GOON:JBCTI,DPLYAJMPGOONDPLY:MOVA,R2MOVP1,A;输出显示位置ACALLDL100MS;延时MOVP1,#07HRET;字型码表SEG_TAB:DB0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90HDB88H,83H,0C6H,0A1H,86H,8EH//====================================DL1MS:MOVR5,#200;12M时延时1msDEL:NOPNOPNOPDJNZR5,DELRETDL100MS:MOVR6,#100DELX0:ACALLDL1MSDJNZR6,DELX0RETEND14.采用8155或8255扩展I/O口,设计一个显示电路显示“654321”。 图9.11采用8255扩展的LED数码管动态显示接口电路图9.11为采用8255扩展的LED数码管动态显示接口电路。图中PA口用于输出字型码,PB口用于输出显示位置,LED数码管为共阴型,显示位置采用译码器译码的方式实现。在电路中采用同相缓冲器74LS07提高PA口的驱动能力,同相驱动器SN75451用于驱动显示器的公共端。电路中8255的PA和PB口处于基本输入/输出方式的输出模式,PA口地址为0000H,PB口为0001H,命令寄存器地址为0003H。定义SEG_OUT为PA口地址,BIT_OUT为PB口地址。程序如下://定义区SEG_OUTEQU0000H//PortA输出字型码BIT_OUTEQU0001H//PortB输出位控码PortCEQU0002H//CMMDEQU0003H//命令寄存器地址//========================ORG0000HLJMPSTARTORG0030HSTART:MOVSP,#60HMOVDPTR,#CMMD//8255初始化MOVA,#10000000B//方式0,A/B/C口为输出MOVX@DPTR,ANOPNOPMOV20H,#12H//显示数据MOV21H,#24HMOV22H,#56HMOVR1,#30HMOVR0,#20HCALLSPLITINCR0INCR1CALLSPLITINCR0INCR1 CALLSPLITRED:ACALLDSPLY2SJMPRED//===================================SPLIT:MOVA,@R0ANLA,#0F0HSWAPAMOV@R1,AINCR1MOVA,@R0ANLA,#0FHMOV@R1,ARET//===========================================//6位显示DSPLY2:MOVR0,#30H;显示缓冲区首地址MOVR2,#00000000B;显示起始位置REDO:ACALLDISP;显示1位INCR2;计算下一次的显示位置INCR0;修改显示缓冲区指针CJNER2,#06H,REDO;6位显示完否?RET;显示结束返回//==========================================;显示一位子程序DISP:MOVDPTR,#LED_SEG;字型码表首地址MOVA,@R0;取显示数据MOVCA,@A+DPTR;求显示数据的字型码MOVDPTR,#SEG_OUT;字型码输出口地址MOVX@DPTR,A;输出字型码MOVA,R2;取显示位置MOVDPTR,#BIT_OUT;显示位置输出口地址MOVX@DPTR,A;显示ACALLDL1MSMOVA,#0FFH;稳定显示1msMOVX@DPTR,ARET;字型码表LED_SEG:DB3FH,06H,5BH,4FH,66H,6DH,7DH,07H;"0,1,2,3,4,5,6,7"DB7FH,6FH,77H,7CH,39H,5EH,79H,71H;"8,9,A,B,C,D,E,F"DB3EH,50H,40H,08H,00H;"U,r,-,_,BLANK//======================================DL1MS:MOVR5,#200;12M时延时1msDEL:NOPNOP NOPDJNZR5,DELRETEND15.一个单片机的键盘显示系统采用3×4矩阵式键盘、8位LED数码管显示器。12个按键定义为数字键0~9、功能键ENTER和STOP。系统工作时,键入一组数值,按下ENTER键后,新数值替换原来的显示值在显示器上循环显示,按下STOP键,循环显示终止,显示数据被清除。设计硬件电路和编写相应的程序。图9.12题15原理图//definationSEG_OUTEQUP2//字型输出BIT_OUTEQUP3//位控输出DISPBUFEQU40H//显示缓冲区40H~47HSETPTREQU38H//设定数据时的存指针的单元HOLDTIMEEQU39H//ENTER时,存储每位稳定时间的单元DLETIMEEQU255//enter稳定时间BIT_CODEEQU3AH//ENTER时存字型的单元BIT_LOCEQU3BH//ENTER时存位控的单元ETR_FLAGBIT28H.0//ENTER按下标志STP_FLAGBIT28H.1//STOP按下标志//============================ORG0000HLJMPSTARTORG0030HSTART:MOVSP,#60H//======================ENTER按下的初始化=================CLRETR_FLAGCLRSTP_FLAGMOVHOLDTIME,#DLETIME//ENTER按下时,每位的保持时间MOVBIT_CODE,#DISPBUF MOVBIT_LOC,#01111111B//===========清显示缓冲区=========MOVR0,#DISPBUFMOVR3,#8ACALLCLRRAM;MOVSETPTR,#DISPBUF//设定指针初始化,未键入数据时,显示“-”MOVDISPBUF,#12HSCANK:MOVP1,#0FH//键盘扫描MOVA,P1ANLA,#00000111BXRLA,#00000111BJZNON0ACALLDL20MS//消抖MOVP1,#0FHMOVA,P1ANLA,#00000111BXRLA,#00000111BJZNON0//键按下//此处判断哪个键按下MOVR3,#11101111BCONTI:MOVP1,R3MOVA,P1//逐行扫描ANLA,#00000111BXRLA,#00000111BJNZFOUNDMOVA,R3RLAMOVR3,AXRLA,#11111110BJNZCONTINON0:JMPNON//没有键按下FOUND:MOVP1,#00000111BMOVA,P1ANLA,#00001111BMOVR4,A//暂存列编码MOVA,R3ANLA,#11110000B//取行编码ORLA,R4MOVR4,A//存特征码,等待键释放NO_RLSE:MOVP1,#0FH//键释放MOVA,P1ANLA,#00000111BXRLA,#00000111BJNZNO_RLSE ACALLDL20MS//消抖MOVP1,#0FHMOVA,P1ANLA,#00000111BXRLA,#00000111BJNZNO_RLSEMOVA,R4CJNEA,#0E6H,NUM2MOVR4,#01HJMPGODISP//1NUM2:CJNEA,#0E5H,NUM3MOVR4,#02H//2JMPGODISPNUM3:CJNEA,#0E3H,NUM4MOVR4,#03H//3JMPGODISPNUM4:CJNEA,#0D6H,NUM5MOVR4,#04H//4JMPGODISPNUM5:CJNEA,#0D5H,NUM6MOVR4,#05H//5JMPGODISPNUM6:CJNEA,#0D3H,NUM7MOVR4,#06HJMPGODISP//6NUM7:CJNEA,#0B6H,NUM8MOVR4,#07HJMPGODISP//7NUM8:CJNEA,#0B5H,NUM9MOVR4,#08HJMPGODISP//8NUM9:CJNEA,#0B3H,ENTERMOVR4,#09HJMPGODISP//9ENTER:CJNEA,#076H,NUM0MOVR4,#0AH//ENTERJMPETR_DISP//ENTER按下,循环显示NUM0:CJNEA,#075H,STOPMOVR4,#00H//0JMPGODISPSTOP:CJNEA,#073H,NUMXMOVR4,#0BHJMPSTP_DISP//STOP按下NUMX:JMPNON//没有按键按下 GODISP:CLRETR_FLAGCLRSTP_FLAGMOVR0,SETPTRMOVA,R4MOV@R0,AINCR0MOVSETPTR,R0CJNER0,#DISPBUF+8,GOONMOVSETPTR,#DISPBUFGOON:JMPREDNON:JBETR_FLAG,ETR_DISP//无键按下,之前ENTER按下JBSTP_FLAG,STP_DISP//无键按下,之前STOP按下//无键按下,之前有数字键按下RED:MOVR0,#DISPBUFACALLDSPLY1//显示键入的数据JMPSCANKETR_DISP:MOVSETPTR,#DISPBUF//enter件按下,设定数据循环显示SETBETR_FLAGMOVR0,BIT_CODEMOVR2,BIT_LOC;显示起始位置ACALLDISP;显示1位DJNZHOLDTIME,SKIP0MOVHOLDTIME,#DLETIMEMOVA,BIT_LOC;计算下一个显示位置RRAMOVBIT_LOC,AINCBIT_CODE;修改显示缓冲区地址指针XRLA,#01111111B;8位显示完否JNZSKIP0MOVBIT_CODE,#DISPBUFMOVBIT_LOC,#01111111BMOVHOLDTIME,#DLETIME;未完,继续显示SKIP0:JMPSCANK;返回//STOP处理STP_DISP:MOVSETPTR,#DISPBUFSETBSTP_FLAGMOVR0,#DISPBUFMOVR3,#8ACALLCLRRAM;//清显示缓冲区内容MOVDISPBUF,#12HMOVR0,#DISPBUF//最左边显示“-”ACALLDSPLY1 JMPSCANK//===========================================//8位显示DSPLY1:MOVR2,#01111111B;显示起始位置REDO:ACALLDISP;显示1位MOVA,R2;计算下一个显示位置RRAMOVR2,AINCR0;修改显示缓冲区地址指针XRLA,#01111111B;8位显示完否JNZREDO;未完,继续显示RET;返回//==========================================;显示一位子程序DISP:MOVDPTR,#LED_SEG;字型码表首地址MOVA,@R0;取显示数据MOVCA,@A+DPTR;求显示数据的字型码MOVSEG_OUT,A;输出字型码MOVA,R2;取显示位置MOVBIT_OUT,A;显示ACALLDL1MSMOVA,#0FFH;稳定显示1msMOVBIT_OUT,ARET;字型码表LED_SEG:DB3FH,06H,5BH,4FH,66H,6DH,7DH,07H;"0,1,2,3,4,5,6,7"DB7FH,6FH,77H,7CH,39H,5EH,79H,71H;"8,9,A,B,C,D,E,F"DB3EH,50H,40H,08H,00H;"U,r,-,-,BLANKDL1MS:MOVR5,#200;12M时延时1msDEL:NOPNOPNOPDJNZR5,DELRETDL20MS:MOVR7,#20;12M时延时20msDEL00:ACALLDL1MSDJNZR7,DEL00RETCLRRAM:MOV@R0,#14H//不显示INCR0DJNZR3,CLRRAMRET END16.简述A/D和的作用。A/D把模拟量变成数字量。D/A把数字量转换成模拟量。17.在检测系统中,通常采用均值滤波的方法来消除检测数据的随机干扰,即连续采样多次,取平均值作为测量值。采用ADC0809设计一个检测系统,对IN5通道接入的模拟采样8次,把它们的均值存放在30H单元。图9.12题17的MCS-51单片机与ADC0809的接口电路18.采用ADC0809设计一个8路巡回检测系统,每隔50ms对8个回路检测1次,并把采样值存储在40H开始的区域。系统晶振频率为12MHz。接口电路与题17相同。程序流程图见图9.13。程序如下:ORG0000HLJMPSTARTORG000BHLJMPTimer0InterruptSTART:MOVSP,#60HLCALLInitTimer0MOVR0,#40H;置数据区首地址指针MOVR6,#00H;指向模拟量输入通道0,通道地址的低八位LOOP:NOPLJMPLOOPInitTimer0:;定时器0,定时50msMOVTMOD,#01H MOVTH0,#3CHMOVTL0,#0B0HSETBEASETBET0SETBTR0RETTimer0Interrupt:PUSHDPHPUSHDPLPUSHACCMOVTH0,#3CHMOVTL0,#0B0HMOVDPH,#0BFH;P2.6=0,通道地址的高八位MOVDPL,R6;模拟通道0MOVX@DPTR,A;启动A/D转换。WAITAD:JBP3.3,WAITADMOVXA,@DPTR;读A/D转换结果MOV@R0,A;存转换结果INCR0;修改数据区指针INCR6;模拟通道地址加1CJNER6,#08,EXIT;8个通道全采样完了吗?MOVR6,#00H;8路巡检结束,重新采样模拟量输入通道IN0MOVR0,#40H;重设数据区首地址指针EXIT:POPACCPOPDPLPOPDPHRETIEND19.采用2片ADC0809为8051单片机扩展16路模拟量输入通道。图9.13地址分析:IC2:P2.7=1,P2.6=0,8个通道地址为:IN0:8000H;IN1:8001HIN2:8002H;IN3:8003HIN4:8004H;IN5:8005HIN6:8006H;IN7:8007HIC3:P2.7=0,P2.6=1,8个通道地址为:IN0:4000H;IN1:4001HIN2:4002H;IN3:4003H IN4:4004H;IN5:4005HIN6:4006H;IN7:4007H图9.142片ADC0809为8051单片机接口电路图20.用8051单片机和DAC0832设计一个应用系统,输出连续的三角波。接口电路和程序框图见图9.15。ORG0020HMOVDPTR,#7FFFH;指向0832LOOP:MOVR2,#0FFH;循环次数MOVA,#00H;赋初值LOOP1:MOVX@DPTR,A;D/A转换输出INCADJNZR2,LOOP1MOVR2,#0FEHLOOP2:DECAMOVX@DPTR,ADJNZR2,LOOP2ALMPLOOP END(a)接口电路(b)程序流程框图图9.15题20接口电路和程序流程框图21.用8051单片机和DAC0832设计一个应用系统,连续输出周期为5.12秒的三角波(提示:每10ms转换1次,三角波的周期等于定时时间×转换次数)。接口电路如图9.15。程序框图见图9.16图9.16题21程序流程图ORG0000HLJMPSTARTORG000BHLJMPTimer0InterruptSTART:MOVSP,#60HLCALLInitTimer0;定时初始化MOVR6,#0;三角波DA转换值,起始值为0MOVR7,#0;三角波上升下降标志,0=上升,1=下降LOOP:;主处理程序NOP NOPALMPLOOPInitTimer0:MOVTMOD,#01HMOVTH0,#0D8HMOVTL0,#0F0HSETBEASETBET0SETBTR0RETTimer0Interrupt:MOVTH0,#0D8HMOVTL0,#0F0HCJNER7,#0,LOOP1INCR6CJNER6,#0FFH,LOOP01MOVR7,#1LOOP01:MOVDPTR,#7FFFH;指向0832MOVA,R6MOVX@DPTR,A;D/A转换输出SJMPRET0LOOP1:DECR6CJNER6,#0,LOOP11MOVR7,#0LOOP11:MOVDPTR,#7FFFH;指向0832MOVA,R6MOVX@DPTR,A;D/A转换输出SJMPRET0RET0:RETIEND22.用8051单片机和DAC0832设计一个应用系统,输出占空比为50%的双极性方波,幅值在–5~+5V之间。接口电路见图9.17,程序流程框图见图9.18。根据图9.17接口电路的连接关系,可以推导出下列公式:程序流程框图见图9.17。程序如下:ORG1000HSTART:MOVDPTR,#7FFFHLOOP:MOVA,#00HMOVX@DPTR,ACALLDELAY10MS MOVA,#0FFHMOV@DPTR,ACALLDELAY10MSJMPLOOP图9.17接口电路图图9.18程序流程图第十章复习思考题答案1.与并行扩展方法相比,串行总线扩展方法有哪些优点?与并行扩展方法相比,串行总线扩展传输连线少,可以使应用系统的硬件设计简化;串行总线的故障自诊断和调试也更为简单。2.在I2C总线中,主机和从机是如何确定的?它们在总线工作时起什么作用?I2C总线是一个多主机总线,即总线上可以有一个或多个主机(或称主控制器件),总线运行由主机控制。主机是指启动数据的传送(发启动状态)、发出时钟信号、发出终止信号的器件。通常,主机由单片机或其它微处理器担任。被主机访问的器件叫从机,它可以是其它单片机或外围芯片,如:A/D、D/A、LED或LCD驱动、串行存储器芯片。 3.在I2C总线主从系统中,S状态和P状态是由哪一方发出的?它们的作用是什么?S状态和状态P是由主机发出的。在总线上出现S状态后,标志着总线处于“忙”状态。如果总线上出现P状态时,在该状态出现一段时间后,总线处于“闲”状态。4.简述I2C总线的数据传输过程。传输到SDA上的数据必须为8位。每次传输的字节数不受限制。每个字节后必须跟1个应答(Acknowledge,ACK)位。数据传输时,首先传送最高位,如果从机暂时不能接收下一个字节数据,例如从机响应内部中断,那么可以使SCL保持为低电平,迫使主机处于等待状态;当从机准备就绪后,再释放SCL,使数据传输继续进行。图10-1中,ACK为应答时钟,S表示启动状态,Sr表示重新启动状态,P表示停止状态。图10-1I2C总线的数据传输5.简述I2C总线的从机地址的格式,在工作过程中器件如何识别对它的读写操作的?每个连接在I2C总线的器件都具有唯一确定的地址。在任何时刻,I2C总线上只能有一个主机对总线实行控制权,分时地实现点对点的数据传送。器件的地址由7位组成,它与1位方向位()构成了I2C总线数据传输时启动状态S之后第1个字节。当主机发送了第1个字节后,系统中的每个从机(器件)都在S状态之后把高7位与本机的地址比较,如果与本机地址一样,则该从机被主机选中,是接收数据还是发送数据由确定。从机地址由固定位和可编程位组成。固定位由器件出厂时给定,用户不能自行设置,它是器件的标识码,通常为A6~A3。如I/O接口芯片PCF8574的器件标识码0100。从机地址中的可编程位(A3~A0)为器件的地址,当系统中使用了多个相同的器件时,从机地址中的可编程位,可使这些器件具有不同的地址;这些可编程位也规定了I2C总线上同类芯片的最大个数,如在同一系统中最多可使用8个PCF8574。6.采用MAX128监测8路模拟量,已知所有模拟量的电压范围为0~5V,设计程序对8路模拟量循环检测,并把结果存在内部RAM的40H单元开始的区域。系统晶振频率为12MHz,作为I2C总线的SDA的I/O口线定义为VSDA,作为时钟线SCL的I/O口线定义为VSCL。程序流程图: 图10-2程序流程图汇编源代码:(部分子程序为参见教材)VSDABITP1.6;定义虚拟I2C总线数据线端口VSCLBITP1.7;定义虚拟I2C总线时钟线端口CHNEQU50HORG0000HJMPMAINORG0030HMAIN:MOVR3,#8MOVR1,#40HMOVCHN,#0AD_LOOP:LCALLMAX128_READLCALLDELAY100MSINCCHNDJNZR3,AD_LOOPJMPMAINMAX128_READ:LCALLSTAT MOVA,#01010000B;器件地址,写操作LCALLWRBYT;写入一个字节LCALLCACK;检查应答位JBF0,$MOVA,CHNSWAPAANLA,#01110000BORLA,#10001000B;控制字节,CHN通道LCALLWRBYT;写入一个字节LCALLCACK;检查应答位JBF0,$LCALLSTOPLCALLDELAY100MSLCALLSTATMOVA,#01010001B;器件地址,读操作LCALLWRBYT;写入一个字节LCALLCACK;检查应答位JBF0,$LCALLDELAY10MS;延时10ms转换时间LCALLRDBYT;读取一个字节MOV@R1,A;存放高字节INCR1LCALLMACK;发送应答标志位LCALLRDBYT;读取一个字节ANLA,#0F0HMOV@R1,A;存放低字节INCR1LCALLMNACK;发送非应答位/数据LCALLSTOP;发送结束IIC信号RET7.单片机应用系统采用MAX128作为A/D转换器,现要求每隔50ms对CH6通道采样一次,并把采样值存在R6和R7中。设系统晶振频率为12MHz,作为I2C总线的SDA的I/O口线定义为VSDA,作为时钟线SCL的I/O口线定义为VSCL。程序流程图如图图10-3所示。 图10-3程序流程图汇编源代码:(部分子程序为参见教材)VSDABITP1.6;定义虚拟I2C总线数据线端口VSCLBITP1.7;定义虚拟I2C总线时钟线端口ORG0000HJMPMAINORG0030HMAIN:LCALLMAX128_READLCALLDELAY50MS;延时50MSJMPMAINMAX128_READ:LCALLSTATMOVA,#01010000B;器件地址,写操作LCALLWRBYT;写入一个字节LCALLCACK;检查应答位JBF0,$MOVA,#11101000B;控制字节,6通道LCALLWRBYT;写入一个字节LCALLCACK;检查应答位JBF0,$LCALLSTOPLCALLDELAY10MSLCALLSTATMOVA,#01010001B;器件地址,读操作LCALLWRBYT;写入一个字节LCALLCACK;检查应答位JBF0,$LCALLDELAY10MS;延时10ms转换时间 LCALLRDBYT;读取一个字节MOVR6,A;存放高字节LCALLMACK;发送应答标志位LCALLRDBYT;读取一个字节ANLA,#0F0HMOVR7,A;存放低字节LCALLMNACK;发送非应答位/数据LCALLSTOP;发送结束IIC信号RET8.MAX5822几种掉电方式有什么不同?MAX5822具有3种低功耗掉电模式,通过PD1、PD2这两位设置,见表10.1。这3种模式都可以关闭输出缓冲器、断开DAC寄存器与REF的连接、使电源电流降至1、基准电流降至1以下。在掉电模式期间,输入数据被保持在输入寄存器和DAC寄存器中。MAX5822被唤醒后,DAC输出被恢复到以前的值。表10.1掉电模式设置模式PD1PD0功能唤醒00上电,DAC输出恢复到原来的值001掉电模式0,DAC输出浮空,输出为高阻抗110掉电模式1,DAC输出通过1kΩ电阻接地211掉电模式2,DAC输出通过100kΩ电阻接地9.简述MAX5822的初始化过程和启动D/A转换的过程?在初始化时,首先需要用唤醒命令激活所选的通道,另外,设置所选通道的掉电模式。初始化主机写入扩展命令字的过程如图10-4所示。主机在发送芯片地址之后,待MAX5822应答后,开始发送2个命令字节,第一个字节的基本命令字为11110000B,告知MAX5822随后的字节是扩展命令字,待其应答后,发送初始化命令字,MAX5822接收到第二个字节后,对D/A转换器进行初始化。图10-4初始化过程完成初始化以后,D/A转换器就可以使用,从机发送数据及启动D/A的过程如图10-5所示。主机发送的第一个字节为所选MAX5822的地址,待其应答后,随后第二、第三个字节,包括4位命令字和12位数据,MAX5822接收到第二个字节后设置D/A转换通道的工作模式,待第三个字节到达后,随即启动D/A转换,把模拟量输出到芯片的输出端。图10-5启动A/D转换过程10.如何读取MAX5822的DAC寄存器的内容? MAX5820具有读工作方式,在此种方式时,它把其内部的DAC寄存器的内容输出到总线上。数据流的方向与MAX5820的地址应答相反,工作过程如图10-6所示。主机首先发送要读取的D/A芯片地址,待其应答后,再发送命令字,通过命令字指定读取的D/A转换器。再次接收到D/A芯片的应答后,插入一个重启动状态Sr,进入读DAC寄存器过程。读DAC寄存器过程包括3步,第一,主机发送D/A芯片地址和读命令;第二,主机接收D/A芯片发送的DAC寄存器的高8位,其中最高2位为随机位(未定义),随后的2位为PD1和PD0,低4位转换数据的D11~D8,第三,主机接收D/A芯片发送的DAC寄存器的低8位,它们是转换数据的低8位为D7~D0。图10-6读DAC寄存器的过程11.采用MAX5822的B通道产生连续三角波,信号的幅值范围为0~5V。设系统晶振频率为12MHz,作为I2C总线的SDA的I/O口线定义为VSDA,作为时钟线SCL的I/O口线定义为VSCL。程序流程图如图10.7所示。图10-7程序流程图 汇编源代码:(部分子程序为参见教材)VSDABITP1.1;定义虚拟I2C总线数据线端口VSCLBITP1.0;定义虚拟I2C总线时钟线端口SLAEQU50H;器件地址BUDBEQU32H;B通道高字节BLDBEQU33H;B通道低字节UDBEQU34H;高字节LDBEQU35H;低字节ORG0000HJMPMAINORG0030HMAIN:MOVSLA,#01110000BLCALLInitial_5822;初始化START:MOVBUDB,#00HMOVBLDB,#00HDA_LOOP1:MOVA,BUDBORLA,#00010000BMOVUDB,AMOVLDB,BLDBLCALLSend_5820;发送两个字节数据CLRCMOVA,BLDBADDA,#1MOVBLDB,AMOVA,BUDBADDCA,#0MOVBUDB,ACJNEA,#10H,DA_LOOP1MOVBUDB,#0FHMOVBLDB,#0FFHDA_LOOP2:MOVA,BUDBORLA,#00010000BMOVUDB,AMOVLDB,BLDBLCALLSend_5820;发送两个字节数据CLRCMOVA,BLDB SUBBA,#1MOVBLDB,AMOVA,BUDBSUBBA,#0MOVBUDB,ACJNEA,#00,DA_LOOP2MOVA,BLDBCJNEA,#00,DA_LOOP2JMPSTART;循环Initial_5822:MOVSLA,#01110000B;1001为MCP3221器件标识码,101为器件地址位,0表示写操作LCALLSTAT;启动IIC总线MOVA,SLALCALLWRBYT;写入一个字节LCALLCACK;检查应答位JBF0,$MOVA,#0F0H;扩展命令模式LCALLWRBYT;写入一个字节LCALLCACK;检查应答位JBF0,$MOVA,#08H;#00001000B表示B通道均打开LCALLWRBYT;写入一个字节LCALLCACK;检查应答位JBF0,$LCALLSTOPRET12.单片机应用系统采用MAX5822作为D/A转换器,现要求每隔20ms启动一次通道A,把存储在data和data+1单元的12位数据转换为模拟量。设系统晶振频率为12MHz,作为I2C总线的SDA的I/O口线定义为VSDA,作为时钟线SCL的I/O口线定义为VSCL。程序流程图如图10.8所示。 图10-8程序流程图汇编源代码:(部分子程序为参见教材)VSDABITP1.1;定义虚拟I2C总线数据线端口VSCLBITP1.0;定义虚拟I2C总线时钟线端口SLAEQU50H;器件地址DATA1EQU32H;A通道高字节UDBEQU34H;高字节LDBEQU35H;低字节ORG0000HJMPMAINORG0030HMAIN:MOVSLA,#01110000BMOVR1,#DATA1MOV@R1,#0FHINCR1MOV@R1,#0FHLCALLInitial_5822;初始化START:MOVR1,#DATA1MOVUDB,@R1INCR1MOVLDB,@R1LCALLSend_5820;发送两个字节数据LCALLDELAY20MS;延时20msJMPSTART;循环Initial_5822:MOVSLA,#01110000B;1001为MCP3221器件标识码,101为器件地址位,0表示写操作LCALLSTAT;启动IIC总线MOVA,SLALCALLWRBYT;写入一个字节LCALLCACK;检查应答位JBF0,$MOVA,#0F0H;扩展命令模式LCALLWRBYT;写入一个字节LCALLCACK;检查应答位JBF0,$MOVA,#04H;#00001100B表示AB通道均打开LCALLWRBYT;写入一个字节LCALLCACK;检查应答位 JBF0,$LCALLSTOPRET13.简述SPI总线的特点。SPI总线的主要特点:全双工;可以当作主机或从机工作;提供频率可编程时钟;发送结束中断标志;写冲突保护;总线竞争保护等。14.采用TLC2543对8路模拟量检测,已知所有模拟量的电压范围为0~5V,设计程序实现循环检测,并把结果存在内部RAM的40H单元开始的区域。TLC2543与MCS-51单片机借口电路如图10-9所示,AD分辨率选择为8位。程序流程图见图10.10。图10-10程序流程图汇编源代码:(部分子程序为参见教材)CHNEQU31HORG0000HJMPMAINORG0030HMAIN:MOVR1,#40HMOVCHN,#0LCALLTLC_8ADLCALLTLC_8ADLOOP1:MOVR1,#40HMOVR3,#8MOVCHN,#0LOOP2: LCALLTLC_8ADLCALLDELAYINCR1INCCHNDJNZR3,LOOP2JMPLOOP1TLC_8AD:MOVA,CHNSWAPAORLA,#00000100B;命令字,AIN0,8位数据、高位在前CLRP1.3CLRP1.0;片选有效,选中TLC2543MSB:MOVR5,#08;发送8位命令字,接收8位结果LOOP:MOVC,P1.2RLCA;把转换结果移入(A),同时写命令字MOVP1.1,C;将命令字的一位经DIN移入TLC2543SETBP1.0NOPCLRP1.0DJNZR5,LOOPMOV@R1,ASETBP1.3LCALLDELAYCLRP1.3;片选有效,选中TLC2543RET15.单片机应用系统采用TLC2543作为A/D转换器,现要求每隔50ms对AIN5通道连续采样8次,并把采样的均值存在R6和R7中。TLC2543与MCS-51单片机借口电路如图10-8所示,AD采样分辨率为12位。程序流程图如图10.11所示。汇编源代码:(部分子程序为参见教材)ORG0000HJMPMAINORG0030HMAIN:LCALLTLC_12ADLCALLTLC_12ADMOVP1,#04H;P1.2为输入CLRP1.0;初始化I/OCLOCK为低SETBP1.3;初始化图10-11程序流程图LOOP1:MOVR7,#00 MOVR6,#00MOVR1,#8;采样8次并求和LOOP2:LCALLTLC_12AD;调转换12位AD转换子程序CLRCMOVA,R5ADDA,R7MOVR7,AMOVA,R4ADDCA,R6MOVR6,ALCALLDELAY50MS;延时50msDJNZR1,LOOP2MOVR1,#3;求8次采样的平均值LOOP3:MOVA,R6CLRCRRCAMOVR6,A;采样平均值高4位MOVA,R7RRCAMOVR7,A;采样平均值低8位DJNZR1,LOOP3LCALLDELAYJMPLOOP1TLC_12AD:MOVA,#01010000B;设置通道选择和工作模式(IN5,12位分辨率)CLRP1.3;置为低MOVR3,#12;12位转换结果LOOP:MOVP1,#04H;置P1.2为输入MOVC,P1.2;读入1位转换结果RLCA;1位结果移入,同时移出1位命令字MOVP1.1,C;输出1位命令字SETBP1.0;产生1个时钟脉冲NOPCLRP1.0CJNER3,#04,LOP1;已移入8位转换结果了吗?MOVR4,A;高8位存入R4CLRA;继续移入转换结果的剩余4位LOP1:DJNZR3,LOOPANLA,#0FH;屏蔽无用位信息SWAPAMOVR5,A;存低4位转换结果到R5。SETBP1.3MOVR2,#4;转换结果右移4位。R4为高4位,R5为低8位。LOOP4:MOVA,R4 CLRCRRCAMOVR4,AMOVA,R5RRCAMOVR5,ADJNZR2,LOOP4RET16.采用TLC2543和TLC5615组成1个A/D-D/A测试系统。由D/A转换器连续输出模拟量0~5V,再由A/D转换器转换为数字量,当A/D转换器转换的数值与D/A转换器输入的数字量相差50H时,进行报警处理。完成硬件和程序设计。TLC5615DA转换的模拟量输出端DOUT连接至TLC2543模拟输入通道AIN0,将TLC5615A/D转换器转换的数值与TLC2543D/A转换器AIN0通道采集的数字量进行比较,差值高于50H,LEDB灯亮,LEDA灭;差值不高于50H时,LEDB灯灭,LEDA灯亮。电路原理图如图10-12所示。程序流程图如图10-13所示图10-12电路原理图图10-13程序流程图汇编源代码:(部分子程序为参见教材)LEDGBITP1.4LEDRBITP1.5ORG0000H JMPMAINORG0030HMAIN:SETBLEDGSETBLEDRLCALLTLC_12ADLCALLTLC_12ADMOVP1,#04H;P1.2为输入CLRP1.0;初始化I/OCLOCK为低SETBP1.3;初始化MOV20H,#00HMOV21H,#0FFHHERE:MOVA,21HANLA,#11111100BMOVR7,AMOVR6,20HLCALLTLC_DA;DA输出LCALLDELAYLCALLTLC_12AD;AD采集LCALLLED;LED报警灯指示LCALLADD2021;DA数值调整JMPHERELED:;LED报警灯指示MOVA,20HCJNEA,40H,LOOPRMOVA,21HCLRCSUBBA,41HJCLOOPR1SUBBA,#50HJNCLOOPRJMPLOOPGLOOPR1:MOVA,41HCLRCSUBBA,21HSUBBA,#50HJNCLOOPRJMPLOOPGLOOPG:CLRLEDGSETBLEDRRETLOOPR:CLRLEDRSETBLEDGRETADD2021:;20H21H内容数值调整 MOVA,21HCLRCADDA,#20MOV21H,AMOVA,20HADDCA,#0MOV20H,ACJNEA,#00010000B,ADDRETMOV20H,#00HMOV21H,#00HADDRET:RETTLC_12AD:MOVA,#00000000B;设置通道选择和工作模式(IN0,12位)CLRP1.3;置为低MOVR5,#12;12位转换结果LOOP:MOVP1,#04H;置P1.2为输入MOVC,P1.2;读入1位转换结果RLCA;1位结果移入,同时移出1位命令字MOVP1.1,C;输出1位命令字SETBP1.0;产生1个时钟脉冲NOPCLRP1.0CJNER5,#04,LOP1;已移入8位转换结果了吗?MOV40H,A;高8位存入40HCLRA;继续移入转换结果的剩余4位LOP1:DJNZR5,LOOPANLA,#0FH;屏蔽无用位信息SWAPAMOV41H,A;存低4位转换结果到41H。SETBP1.3MOVR5,#4LOP2:MOVA,40HCLRCRRCAMOV40H,AMOVA,41HRRCAMOV41H,ADJNZR5,LOP2RET'