首页 韶关学院《单片微型计算机与接口技术》(第5版)思考题与习题解答

韶关学院《单片微型计算机与接口技术》(第5版)思考题与习题解答

举报
开通vip

韶关学院《单片微型计算机与接口技术》(第5版)思考题与习题解答《单片微型计算机与接口技术》思考题与习题解答 第0章 基础知识 0.1 将下列十进制数转换为十六进制数:64,98,80,100,125,255。 0.1  40H,62H,50H,64H,7DH,FFH 0.2 将下列十六进制无符号数转换为十进制数:32CH,68H,D5H,100H,B78H,3ADH。 O.2  812,104,213,256,2936,941 0.3 写出下列十进制数的原码和补码,用8位或16位数填人表1中(要求用十六进制数表示)。 表1 十进制数 原码 补码 十进制数 原码 ...

韶关学院《单片微型计算机与接口技术》(第5版)思考题与习题解答
《单片微型计算机与接口技术》思考 快递公司问题件快递公司问题件货款处理关于圆的周长面积重点题型关于解方程组的题及答案关于南海问题 与习题解答 第0章 基础知识 0.1 将下列十进制数转换为十六进制数:64,98,80,100,125,255。 0.1  40H,62H,50H,64H,7DH,FFH 0.2 将下列十六进制无符号数转换为十进制数:32CH,68H,D5H,100H,B78H,3ADH。 O.2  812,104,213,256,2936,941 0.3 写出下列十进制数的原码和补码,用8位或16位数填人表1中(要求用十六进制数表示)。 表1 十进制数 原码 补码 十进制数 原码 补码 28     250     -28     -347     l00     928     -130     -928                 0.3 十进制数 原码 补码 十进制数 原码 补码 28 1CH 1CH 250 FAH FAH -28 9CH E4H -347 815BH FEA5H 100 64H 64H 928 03AOH 03AOH -130 8082H FF7EH -928 83AOH FC60H             0.4 用十进制数写出下列补码表示的机器数的真值:1BH,97H,80H,F8H,397DH,7AEBH,9350H,CF42H。 O.4 机器数的真值分别为:27,233,-128,-8,14717,31467,-27824,-12478 0.5 用补码运算完成下列算式,并指出溢出OV和进位CY: (1) 33H+5AH    (2) -29H-5DH    (3) 65H-3EH    (4) 4CH-68H 0.5  (1) 33H+5AH=8DH,OV=1,CY=0    (2) -29H-5DH=7AH,OV=1,CY=1 (3) 65H-3EH=27H,OV=0,CY=1    (4) 4CH-68H=E4H,0V=O,CY=O 0.6 将表2中的十进制数按要求转换,用十六进制数填入。 表2 十进制数 压缩BCD数 非压缩BCD数 ASCII码 38       255       483       764       1000       1025               O.6 十进制数 压缩BCD数 非压缩BCD数 ASCII码 38 38H 0308H 3338H 255 255H 020505H 323535H 483 483H 040803H 343833H 764 764H 070604H 373634H 1000 1000H 01000000H 31303030H 1025 1025H 01000205H 31303235H         0.7 写出下列ASCII码表示的十六进制数(如313035H为105H):374341H,32303030H,3841353DH。 0.7 ASCIl码表示的十六进制数分别为:105H,7CAH,200¨。H,8A50H 第1章 MCS-51单片机 1.1 什么是嵌入式系统?其控制核心有哪几种类型? 1.1 见绪论 1.2 单片微型计算机与微处理器在结构上和使用中有什么差异?单片机和DSP在使用上有什么差别? 1.2 单片微型计算机是包含CPU、存储器和I/O接口的大规模集成芯片,即它本身包含了除外部设备以外构成微机系统的各个部分,只需接外设即可构成独立的微机应用系统。微机处理器仅为CPU,CPU是构不成独立的微机系统的。DSP是数据处理的专用芯片,单片机主要用做控制,也具有简单的数据处理能力。 1.3 51系列单片机内部有哪些功能部件? 1.3 见1.1.1节 1.4 51系列单片机有哪些品种?结构有什么不同?各适用于什么场合? 1.4 见绪论 1.5 51系列单片机的存储器可划为几个空间?各自的地址范围和容量是多少?在使用上有什么不同? 1.5 见表1-5 1.6 在单片机内部RAM中,哪些字节有位地址,哪些没有位地址?特殊功能寄存器SFR中哪些可以位寻址?有什么好处? 1.6 见表1-1和表1-2 1.7 已知PSW=10H,通用寄存器R0~R7的地址分别是多少? 1.7 当PSw=10H,表明选中的为第二组通用寄器RO~R7的地址为10H~17H 1.8 程序存储器和数据存储器可以有相同的地址,而单片机在对这两个存储区的数据进行操作时,不会发生错误,为什么? 1.8 序存储器和数据存储器尽管地址相同,但在数据操作时,所使用的指令不同,选通信号也不同,因此不会发生错误。 1.9 填空: 堆栈设在      存储区,程序存放在        存储区,I/0接口设置在      存储区,中断服务程序存放在          存储区。 1.9 内部数据 程序 外部数据 程序 1.10 若单片机使用频率为6MHz的晶振,那么状态周期、机器周期和指令周期分别是多少? 1.10 振荡周期=0.1667us,机器周期=2us,指令周期=2~8us 1.11 复位时,A=      ,PSW=      ,SP=      ,P0~P3=      1.11  A=0,PSW=0,SP=07,P0~P3=FFH 第2章 指令系统 2.1 MCS-51单片机有哪几种寻址方式,适用于什么地址空间?用表格表示。 2.1 见2.1节 2.2 MCS-51单片机的PSW程序状态字中无ZERO(零)标志位,怎样判断某内部数据存储单元的内容是否为O? 2.2 因为累加器A自带零标志,因此,若判断某内部RAM单元的内容是否为零,必须将其内容送到A,通过 JZ指令即可进行判断。 2.3 设A=0,执行下列两条指令后,A的内容是否相同,说明道理。 (1) MOVC A,@A+DPTR (2) MOVX  A,@DPTR 2.3 当A=O时,两条指令的地址虽然相同,但操作码不同,MOVC是寻址程序存储器,MOVX是寻址外部数据存储器,送入A的是两个不同存储空间的内容。 2.4 指出下列各指令中操作数的寻址方式 指 令 目的操作数寻址方式 源操作数寻址方式 ADD A,40H     PUSH ACC     MOV B,20H     ANL P1,#35H     MOV @R1,PSW     MOVC A,@A+DPTR     MOVX @DPTR,A           2.4 目的操作数    源操作数    寄存器        直接        SP间接寻址    直接      直接          直接      直接          立即        寄存器问址    直接        寄存器        变址        寄存器间址    寄存器      2.5 执行下列程序段 MOV A,#56H ADD A,#74H ADD A,ACC 后,CY=    ,OV=    ,A=    。 2.5  CY=1,OV=0,A=94H        2.6 在错误的指令后面括号中打×。 MOV  @R1,#80H    ( )    MOV  R7,@R1      ( )    √    × MOV  20H,@R0    ( )    MOV  R1,#0100H    ( )    √    × CPL  R4          ( )    SETB  R7,0        ( )    ×    × MOV  20H,21H    ( )    ORL  A,R5        ( )    √    √ ANL  R1,#OFH    ( )    XRL  P1,#31H      ( )    ×    √ MOVX  A,2000H    ( )    MOV  20H,@DPTR    ( )    ×    × MOV  A,DPTR      ( )    MOV  R1,R7        ( )    ×    × PUSH  DPTR        ( )    POP  30H          ( )    ×    √ MOVC  A,@R1      ( )    MOVC  A,@DPTR      ( )    ×    × MOVX  @DPTR,#50H  ( )    RLC  B            ( )    ×    × ADDC A,C        ( )    MOVC  @R1,A      ( )    ×    × 2.6    √    × √    × ×    × √    √ ×    √ ×    × ×    × ×    √ ×    × ×    × ×    × 2.7 设内部RAM中(59H)=50H,执行下列程序段: MOV A,59H MOV R0,A MOV A,#0 MOV @R0,A MOV A,#25H MOV 51H,A MOV 52H,#70H 问A=    ,    (50H)=    ,    (51H)=    ,    (52H)=    。 2.7 A=25H,(50H)=O,(51H)=25H,(52H)=70H 2.8 设SP=60H,内部RAM的(30H)=24H,(31H)=10H,在下列程序段注释的括号中填执行结果。 PUSH  30H    ;SP=(  ),  (SP)=(  ) PUSH  3lH    ;SP=(  ),  (SP)=(  ) POP  DPL    ;SP=(  ),  DPL=(  ) POP  DPH    ;SP=(  ),  DPH=(  ) MOV A,#00H MOVX  @DPTR,A 最后执行结果是(                )。 2.8 SP=(61H),(SP)=(24H) SP=(62H),(SP)=(10H) SP=(61H),DPL=(10H) SP=(60H),DPH=(24H)执行结果将0送外部数据存储器的2410单元。 2.9 对下列程序中各条指令作出注释,并 分析 定性数据统计分析pdf销售业绩分析模板建筑结构震害分析销售进度分析表京东商城竞争战略分析 程序运行的最后结果。 MOV 20H,#0A4H MOV A,#017)6H MOV R0,#20H MOV R2,#57H ANL A,R2 ORL A,@R0 SWAP A CPL A ORL 20H,A SJMP  $ 2.9 程序运行后内部RAM(20H)=B4H,A=90H 2.10 将下列程序译为机器码。 机器码              源程序 LA: MOV A,#01H LB: MOV P1,A RL A CJNE A,#10,LB SJMP LA 2.10    机器码    源程序 7401      LA:M()V A,#01H F590      LB:M()V  P1,A 23        RL  A B40AFA    CJNE  A,#10,LB 80F6      SJMP LA 2.11 将累加器A的低4位数据送P。口的高4位,P。口的低4位保持不变。 2.11  ANL  A,#0FH SWAP A ANL  P1.#OFH ORL P1,A SJMP  $ 2.12 编程将R0(R2)的内容和R1(R3)的内容相交换。 2.12  MOV A,RO XCH  A,R1 MOV R0,A SJMP  $ 2.12  MOV A,R2 XCH  A,R3 MOV R2,A SJMP  $ 2.13 试用3种方法将A累加器中的无符号数乘4,积存放于B和A寄存器中。 2.13 (1)利用乘法指令 MOV B,#04H MUL AB SJMP  $ (2) 利用位移指令 RL  A RL  A MOV 20H。A ANL A,#03H MOV B,A MOV A,20H ANL  A,#OFCH SJMP  $ (3) 用加法指令完成 ADD A,ACC MOV RO,A  :RO=2A MOV A,#0 ADDC A。#0 MOV B,A    ;B存2A的进位 MOV A,RO ADD  A,ACC MOV R1,A    ;R1=4A MOV A,B ADDC A,B    ;进位x 2 MOV B,A    ;存积高位 MOV A,R1    ;存积低位 SJMP  $ 2.14 编程将内部RAM 40H单元的中间4位变反,其余位不变放回原单元。 2.14 方法1:XRL 40H,#3CH SJMP  $ 方法2:MOV A,40H CPL  A ANL A,#3CH ANL 40H,#OC3H ORL 40H,A SJMP  $ 2.15 有两个BCD码数存放在(20H)和(21H)单元,完成(21H)+(20H)=>(23H)(22H)。(24H)+(25H)=>(23H)(22H) 2.15 MOV A,20H ADD A,21H DA  A MOV 22H,A    ;存和低字节 MOV A,#O ADDC A,#0 MOV 23H,A    ;存进位 SJMP  $ 2.15 MOV A,24H ADD A,25H DA  A MOV 22H,A    ;存和低字节 MOV A,#O ADDC A,#0 MOV 23H,A    ;存进位 SJMP  $ 2.16 如果R0的内容为0,将R1置为0,如R0内容非0,置R1为FFH,试进行编程。 2.16    MOV A.R0 JZ  ZE MOV R1.#OFFH SJMP  $ ZE:MOV R1,#O SJMP  $ 2.17 完成(51H)×(50H)=>(53H)(52H)的编程(式中均为内部RAM)。 2.17 MOV A,50H MOV B,51H MUL AB MOV 53H。B MOV 52H,A SJMP  $ 2.18 将P1.1和P1.0同时取反10次。(将P1.2和P1.0同时取反10次) 2.18    MOV R7,#0AH WOP:XRL  P1,#03H DJNZ  R7,WOP SJMP  $ 2.18    MOV R7。#0AH WOP:XRL  P1,#05H DJNZ  R7,WOP SJMP  $ 2.19 将内部RAM单元3字节数(22H)(21H)(20H)×2送(23H)(22H)(21H)(20H)单元。 2.19 单片机的移位指令只对A,且只有循环移位指令,为了使本单元的最高位移进下一单元的最低位,必须用大循环移位指令移位4次。 ORG  O CLR  C MOV A,20H RLC A MOV 20H,A MOV A,21H RLC  A MOV 21H,A MOV A,22H RLC A MOV 22H.A MOV A,#O RLC  A MOV 23H,A SLMP  $ 第3章 程序 设计 领导形象设计圆作业设计ao工艺污水处理厂设计附属工程施工组织设计清扫机器人结构设计 3.1 编写程序,把片外数据存储器0000H~0050H中的内容传送到片内数据存储器20H~70H中。 3.1  因为是多个单元操作,为方便修改地址,使用问址操作。片外地址用DPTR指示.只能用M()Vx指令取数到A,片内地址用RO或R1指示,只能用MOV指令操作,因此,循环操作外部数据存储器一A一内部数据存储器。 ORG  OOOOH MOV  DPTR,#0000H MOV R0,#20H LOOP:MOVX  A,@DPTR MOV @R0,A INC DPTR INC  R0 CJNE  R0,#71H, LOOP SJMP  $ 3.2 编写程序,实现双字节加法运算,要求RIR0+R7R6=>(52H)(51H)(50H)(内部RAM)。 3.2 要注意两高字节相加应加低字节相加时产生的进位,同时要考虑最高位的进位。 ORG 0 MOV A,RO ADD A,R6 MOV 50H,A MOV A,R7 ADDC A,R1 MOV 51H,A MOV A,#0 ADDC A,#O MOV 52H,A SJMP$ 3.3 设X在累加器A中(0≤X≤20),求X2并将平方数高位存放在R7中,低位存放在R6中。试用查表法编出子程序。 3.3 A中放X(小于14H)的数,平方表的一个数据占2个字节,可用BCD码或二进制数存放(如A中放的是 BCD码,则要先化成二进制数再查表)。 ORG 0 MOV  DPTR,#TAB ADD  A,ACC    ;A*2 PUSH  ACC MOVC  A,@A+DPTR MOV R7,A POP  ACC INC  A MOVC  A,@A+DPTR MOV R6,A SJMP  $ TAB:DB 00,00,00,01,OO,04,OO,09,OO,16H,… DB…  04H,00 3.4设内部RAM的20H和21H单元中有两个带符号数,将其中的大数存放在22H单元中,编出程序。 3.4 先用异或指令判两数是否同号,在同号中判大小,异号中正数为大。 ORG  0 MOV A,20H XRL A.21H ANL A,#80H JZ CMP JB 20H.7,BG AG:MOV 22H,20H SJMP  $ BG:MOV 22H,21H SJMP  $ CMP:MOV A,20H CJNE  A,21H,GR GR:JNC  AG MOV 22H,21H SJMP  $ 3.5若单片机的晶振频率为6MHz,求下列延时子程序的延时时间。 DELAY:  MOV R1,#0F8H LOOP: MOV R3,#0FBH DJNZ R3,$ DJNZ R1,LOOP RET 3.5 fosc=6MHz,MC=2us 机器周期数 DELAY:MOV R1,#OF8H      1 LOOP:  MOV  R3,#0FBH    1 DJNZ  R3,$                2 DJNZ  R1,LOOP            2 RET                        2    (1+2+(1+2×251+2)×248)×2us=250.48ms 3.6 编程将内部数据存储器20H~24H单元压缩的BCD码转换成ASCII码存放在25H开始的单元内。 3.6 将待转换的数分离出高半字节并移到低4位加30H;再将待转换的数分离出低半字节并加30H,安排好源地址和转换后数的地址指针,置好循环次数。 ORG  0000H MOV R7,#05H MOV RO,#20H MOV R1,#25H NET:MOV A,@RO ANL  A,#OFOH SWAP ADD A,#30H MOV @R1,A INC R1 MOV A,@RO ANL A,#OFH ADD A,#30H MOV @R1,A INC  R0 INC  R1 DJNZ  R7,NE SJMP  $ END 3.7 从内部存储器30H单元开始,有16个数据,试编一个程序,把其中的正数、负数分别送40H和50H开始的存储单元,并分别将正数、负数和零的个数送R4,R5,R6。 3.7 片内RAM间址寄存器只有Ro和R1,而正数、负数和零共需3个寄存器指示地址,这时可用堆栈指针指示第3个地址,POP和PUSH指令可自动修改地址。RO指正数存放地址,Rl指负数存放地址,SP指源数据存放的末地址,POP指令取源数据,每取一个数地址减1。 ORG  0000H MOV R7,#10H MOV A,#0 MOV R4,A MOV R5,A MOV R6,A MOV R0,#40H MOV R1,#50H MOV SP,#2FH NEXT:POP  ACC JZ  ZER0 JB ACC.7,NE INC  R4 MOV @RO,A INC  R0 AJMP DJ NE:INC  R5 MOV @R1,A INC  R1 AJMP DJ ZER0:INC  R6 DJ:DJNZ  R7,NEXT SJMP  $ END 3.8 内部存储单元40H中有一个ASCII字符,试编一个程序给该数的最高位加上奇校验。 3.8 可直接用P标志判断(JB P,ret) ORG  0000H MOV A。40H JB P,EN    ;奇数个1转移 0RL A,#80H    ;偶数个1最高位加“1” EN:SJMP$ 3.9 编写一段程序,将存放在自DATA单元开始的一个四字节数(高位在高地址)取补后送回原单元。 3.9 取补不同于求补码,求补码应区别正、负数分别处理,而取补不分正、负,因正、负数均有相对于模的补数。可用取反加l求补,也可用模(00H)减该数的方法求补。 ORG  0000H MOV R7,#03H MOV R0,#DATA MOV A,@RO CPL  A ADD A,#01 MOV @RO,A AB:INC RO MOV A,@RO CPL  A ADDC A,#O DJNZ  R7,AB SJMP  $ 3.10 以BUFl为起始地址的外存储区中,存放有16个单字节无符号二进制数,试编一个程序,求其平均值并送BUF2单元,余数存在BUF2—1单元。 3.10 16个单字节累加应用ADD指令而不能用ADDC指令,和的低位存A,当和超过一个字节时,和的高字节存于B,并要加低位相加时产生的进位,16个单字节加完后,采用右移4次进行除16求平均值的运算,商在 BUF2单元,余数在BuF2-1单元。 0RG  0000H MoV R7,#0FH MOV R0,#BUFl MOV B,#0 MOV A,@R0 MOV R2,A NEXT:MOV  A,R2 INC  R0 ADD A,@R0 MOV R2,A MOV A,B ADDC A,#0 MOV B,A DJNZ  R7,NEXT ;以上完成求和 MOV R6,#04H MOV BUF2,A MOV BUF2-1,#O NEX:CLR  C    MOV A,B RRC  A MOV B,A MOV A,BUF2 RRC  A MOV BUF2,A MOV  A,BUF2-1 RRC  A MOV BUF2-l,A DJNZ R6,NEX SJMP  $ ;以上完成除16运算 3.11 将内部RAM的20H单元中的十六进制数变换成ASCII存入22H,21H单元,高位存入22H单元,要求用子程序编写转换部分。 3.11 将20H单元的内容分解为高4位和低4位,根据是否大于9分别进行加37H和30H处理。 0RG  0000H MOV A,20H ANL A,#0F0H SWAP A ACALL  ASCII MOV 22H,A MOV A.20H ANL A,#0FH ACALL  ASCII MOV 21H,A SJMP  $ END ASCII:CJNE  A,#0AH,NE NE:JC  A30 ADD A,#37H RET A30:ADD A,30H RET 3.12 编写一段程序,以实现图中硬件的逻辑运算功能。 3.12要注意,位的逻辑运算其中一个操作数必须在C。 ORG  0000H MOV C,20H ANL C,2FH CPL C ORL C,/2FH CPL C ANL C,53H MOV P1.0,C SJMP $ END 3.13 用位操作指令实现下面的逻辑方程(×表示逻辑乘,+表示逻辑加): P1.2=(ACC.3×P1.4×-ACC.5)+(-B.4×-P1.5) 3.13  ORG 0000H MOV C,ACC.3 ANL C。P1.4 ANL C,/ACC.5 MOV 20H,C MOV C,B.4 CPL  C ANL C,/P1.5 ORL C,20H MOV P1.2,C SJMP  $ END 3.14 试编写一个3字节无符号数乘1字节的乘法程序。 3.14 设一字节乘数存放在R1,三字节的被乘数存放在data开始的内部RAM单元,且低字节存放在低位地址单元,R0作为被乘数和积的地址指针,用MUL指令完成一字节乘一字节,每一次部分积的低位加上一次部分积的高位,其和的进位加在本次部分积的高位上,并暂存,三字节乘一字节共需这样3次乘、加、存操作,以R7作循环3次的计数寄存器。 ORG 0000H MOV R7,#03H MOV R0,#data MOV R2,#0 NEXT:MOV A,@R0 MOV B,R1 MUL AB ADD A,R2 MOV @RO,A MOV A,#O ADDC;A,B MOV R2,A INC R0 DJNZ R7,NEXT MOV @R0,B SJMP  $ END 第4章 单片机的C语言 4.1 改正下面程序的错误。 4.1  1:#include    本程序有如下错误: 2:main() 3:{a=c;            ①变量a,c必须先定义再引用 4:int a=7,c;      ②第5句调用函数后必须加分号    . 5:delay()          ③main()函数没有反大括号 6:void delay();    ④被调函数delay()在main()后面,必须在前面先声明 7:{ 8:char i;          ⑤第6句函数说明语句后的分号应去掉 9:for(i=O;i<:255;i++); 10:} 4.2 试说明为什么xdata型的指针长度要用2个字节? 4.2 因为xdata是外部数据存储器,最大可有64KB的存储单元,xdata指针是表示外部数据存储单元的地址,要表示64KB个单元地址,所以必须用2个字节,共16位表示。 4.3 定义变量a、b、c; a为内部RAM的可位寻址区的字符变量; b为外部数据存储区浮点型变量;c为指向int型xdata区的指针。 4.3  bdata char a; xdata float b: xdata int~c; 4.4  编程将8XX51的内部数据存储器20H单元和35H单元的数据相乘,结果存到外部数据存储器中(位置不固定)。 4.4 main() {char data*pl,*p2; xdata int a; p1=0x20; p2=0x35; a=*p1*(*p2); } 4.5 将如下汇编程序译成C程序(等效即可)。 ORG 0000H MOV P1,#04H MOV R6,#0AH MOV R0,#30H CLR  P1.O SETB P1.3 ACALL  TLC SJMP  $ TLC:MOV A,#0 CLR  P1.3 MOV R5,#08 LOOP: MOV C,P1.2 RLC A SETB P1.0 CLR  P1.O DJNZ R5,LOOP MOV @RO,A INC  R0 DJNZ  R6,TLC2543 RET END 4.5  #include(reg51.h) #define uchar unsigned char sbit P1_0=P1^0; sbit Pl_l=P1^1; sbit P1_2=P1^2; sbit P1_3=P1^3; sbit msb=ACC^7; sbit lsb=ACC^0; uchar tlc(void); main(  ){ uchar *P; P1=0x04; P=0x30; P1_0=0; Pl_3=1; for(i=O;i<10;i++) {*P=tlc(  ); P++:} } uchar tlc(void){ uchar i,y; ACC=0; Pl_3=0; for(i=0:i<8:i++){ P1_1=msb;    /*发出ACC的低位*/ y=ACC<<1;    /*ACC右移1位*/ lsb=P1_2;    /*接收一位放在ACC的高位*/ P1_0=1; P1_0=O; } return y; } 4.6 8051的片内数据存储器25H单元中放有一个0~10的整数,编程求其平方根(精确到5位有效数字),将平方根放到30H单元为首址的内存。 4.6 方法l:使用查表法 float code tab[11]={0,1,1.4142,1.7321,2,2.2361, 2.4495,2.6458,2.8284,3,3.1623}: main() {char data*P1; float data*P2; P1=0x25; P2=0x30; *P2=tab[*P1]; } 方法2:使用库函数 #lnclude main(){ float*P2; char*P1; P1=0x25; *P2=sqrt(*P1); } 4.7 完成逻辑表达式P1.2=P1.4×ACC.0+ACC.7(“×”表示逻辑与,“+”表示逻辑或)。 4.7 #include sbit P12=P1^2: main() {P12=~(P1^4&ACC^0)|ACC^7;} 4.8 将外部RAM的10H~15H单元的内容传送到内部RAM的10H~15H单元。 4.8  #lnclude main() { char pdata *m; char data *n; P2=0; for(m=0x10;m<=0x15;m++) {n=m;*n=*m;} } 4.9 内部RAM的20H、21H和22H、23H单元分别存放着两个无符号的16位数,将其中的大数置于24H和25H单元。 4.9  #define uint unsigned int main() { uint data*m,*n,*P; for(;;){ m=0x20;n=0x22;P=0x24; if(*m<*n)*P=*n; else *P=*m: } } 4.10 将内部RAM 21H单元存放的BCD码数转换为二进制存入30H为首址的单元,BCD码的长度存放在20H单元中。 4.10 main() { int data a=O,*P3: char i,*P1,*P2; Pl=0x20: P2=0x21: P3=0x30; for(i=O;i<*P1;i++) { a=a*10+*P2; P2++; } *P3=a; } 4.11 将内部RAM 30H单元存放的2字节二进制数转换为十进制数存于21H为首的单元中,长度存放于20H单元中。 4.11  main() {unsigned int a,k,*P3; char i,*P1,*P2: P1=0x20: P2=0x25: P3=0x30; a=*P3;k=10000; while(a/k==0)k=k/10; for(i=0;a!=0;i++) {*P2=a/k; a=a%k; P2++; k=k/10: *P1=i: } 第5章 并行口 5.1 什么是接口?CPU与外设之间为什么需要接口?接口的功能是什么? 5.2 8XX51的4个I/()端口的作用是什么?8XX51对外的三总线是如何分配的? 5.3 8XX51的4个I/0端口在结构上有何异同?使用时应注意什么? 5.4 为什么说8XX51能全部作为I/O口使用的仅有P1端口? 5.1~5.4 参阅5.1节 5.5 在例5-2中有如下语句: MOV P1,#0FFH      ;高4位的LED全灭,低4位输入线送“1” ABC:  MOV A,P1          ;读P1口引脚开关状态,并送入A 为什么执行了ABC语句后A的值低4位为开关状态,而不是前一句的FFH,那么它的高4位值是什么呢? 5.5 由内部结构图可知,MOV P1,#0FFH将使锁存器Q=1,同时Q=0,VT截止,当执行MOV A,P1时,读引脚信号有效,低4位的开关电平通过门2进入内部总线到A,而读锁存器信号无效,门1关闭,Q的信号进不了内部总线,高4位没有引脚新的电平变化,由于VT截止,二极管也截止,进入门2的是VT的漏极电压Vcc,因此,高4位通过门2读入的均是高电平即1111 B。 5.6 利用8XX51的P1口,监测某一按键开关,使每按键一次,输出一个正脉冲(脉宽随意),画出电路并编出程序。 5.6 用P1.7监测按键开关,P1.0引脚输出正脉冲,正脉冲的产生只需要将P1.0置零、置1、延时、再置零即可。P1.0接一示波器可观察波形。如果再接一发光二极管,可观察到发光二极管的闪烁。电路 设计图 农村自建房设计图免费下载设计图纸下载可摘局部义齿设计图谱pdf英文书写纸设计图下载养猪场设计图 如习题5.6图。 习题5.6图 汇编语言程序 ORG 0000H ABC:CLR P1.0 SETB  P1.7 JB P1.7,$    ;等键按下 JNB P1.7,$  ;待键弹起 SETB  P1.0 MOV R2,#0 DAY:NOP NOP DJNZ R2,DAY SJMP ABC C语言编程 sfr P1=0x90: sbit p1_O=P1^O; sbit p1_7=P1^7; main(){ unsigned char i; while(1){ P1=0x80: do{}while(p1_7==1);/*等键按下*/ do{}while(p1_7==O);/*等键弹起*/ p1_0=1; for(i=O;i<255;i++); }} 5.7 利用8XX51的P1口控制8个发光二极管LED。相邻的4个LED为一组,使两组每隔0.5s交替发亮一次,周而复始,画出电路并编写程序(设延时0.5s子程序为D05,已存在)。 5.7 电路见习题5.7图,初始值送0FH到P1,再和0FFH异或从P1口输出,或使用SWAP A指令。然后从P1口输出,循环运行,注意输出后要延时。 习题5.7图 汇编语言程序 ORG  0000H MOV A,#OFH ABC:MOV P1,A ACALL D05 SWAP A SJMP ABC D05:MoV R6,250 DY:MOV R7,250 DAY:NOP NOP DJNZ  R7,DAY DJNZ  R6,DY RET END C语言编程 sfr P1=0x90; main(  ){ int i; P1=0xf0; while(1){ P1=~P1; fOr(i=0;i<5000;i++); } 5.8 用89C51/89S51并行口设计显示…个数码的电路,使数码管循环显示“O”~“F”。 5.8 如使用共阴极数码管,阴极接地,阳极a~g分别接P0~P3的某个口的7位,将0~F的段码列成表,表的内容顺次从该口输出。如数码管接P3口。 汇编语言程序 0RG  0000H MOV  DPTR,#TAB AGAIN:MOV R0,#0 NEXT:MOV  A,RO MOVC  A,@A+DPTR MOV P3,A MOV R7,#0 DAY:NOP NOP DJNZ R7,DAY INC  R0 CJNE  R0,#10H,NEXT SJMP AGAIN    ;段码表(略) TAB:DB  3FH,06H… END C语言程序 #include(reg51.h) #defint uint unsigned int #define uchar unsigned char main(){ umtj; uchar i; uchar code tab[16]={0x3f,0x06……);,/*段码表(略)*/ while(1){ for(i=O;i<=15;i++) {P3=tab[i]}; for(j=O;j<10000;j++);/*延时*/ } } 5.9 设计一个能显示4位数码的电路,并用C语言和汇编语言编程使“8”能跑马显示8遍。 5.9 电路设计参考5.3节的图5-8,分别用汇编语言和C语言的编程如下: 图5-8 接5个共阴极数码管的动态显示接口电路 汇编语言程序 0RG  0000H MOV A,#08H M()V DPTR,#TAB MOVC  A,@A+DPTR MOV P1,A MOV R2,#08H AGAIN:M()V A,#01 NEXT:M()V P3,A ACALL  DAY RL  A CJNE  A,#10H,NEXT DJNZ  R2,AGAIN TAB:DB 3FH,06H… END C语言程序 #include #definc uint unslgned int #deflne uchar unsigned char main(){ uchar code tabl[]={0x3f,0s06…} uchar i,m; uint j; for(m=O;m<8;i++){ P3=0x01: for(i=0;i<4;i++){ P1=tabl[8] P3<<=1: for(j=0;j<=25000;j++); }}} 5.10 利用89C51/89S51并行口设计8×8的矩阵键盘并用箭头标明信号的方向。 5.10 P1口的8根线接行线,输出行扫描信号,P3口的8根线接列线,输入回馈信号。参考5.3节图5.9。 8×8的矩阵键盘电路设计见习题5.10图。 习题5.10图 第6章 中断 6.1 解释下列名词:中断、中断源、中断优先级、中断的嵌套、中断系统。 6.2 8XXSl有几个中断源?各中断标志是如何产生的,又如何清除? 6.3 8XX51中断源的中断请求被响应时,各中断入口地址是多少?在什么物理存储空间? 6.4 MCS-51系列单片机的中断系统有几个优先级?如何设定? 6.5 简述8XX51中断处理的过程,画出流程图。 6.1~6.5 参见 6.1节~6.2节 6.6 用8XX51的P1口接8个LED发光二极管,由INT0接一消抖开关,开始P1.0的LED亮,以后每中断一次,下一个LED亮,顺序下移,且每次只一个LED亮,周而复始。画出电路图,并编制程序。 6.6 电路设计见习题6.6图 汇编语言程序 ORG 0000H AJMP  MAlN 0RG 0003H RL A    ;中断服务 MOV P1.A RETI MAIN:MOV A,#0FEH MOV P1,A  ;第一灯亮 SETB EA SETB EX0 SETB IT0 SJMP$ C语言程序 #include int0() interrpt 0{ P1=P1<<1|0x01; } main(){ P1=0xfe; EA=1;EX0=1; IT0=1; do{}whik(1);} 习题6.6图 汇编语言中只有一个中断源,不存在占用别的中断源向量地址问题,程序顺序排下,应注意程序的执行过程。C语言无循环移位指令,移位后,后面补零,因此和01相或。 6.7 在题6.6电路的基础上,要求8个LED同时亮或同时灭,每中断一次,变反一次,编出程序。 6.7 略 6.8 要求同题6.7,要求亮、灭变换5次(一亮,一灭为一次),编出程序。 6.8 汇编语言程序 ORG  O000H AJMP MAIN ORG 0003H    ;中断服务 XRL P1,#OFFH DJNZ R0,NE CLR EA NE:RETI ORG  0030H MAIN: SETB  EA SETB EXO SETB ITO MOV  P1,#OFFH MOV R0,#OAH SJMP$    ;等待中断 C语言程序 #include char i: ic()itrrupt 0{ i++: if(i<=10)P1=~P1: eIse EA=O: } main() {EA=1;EX0=1;IT0=1; P1=0xff: for(;;);/*等待中断*/ } 因一亮一灭为一次,所以共10次。 6.9 利用8XX51的并行口接2个数码管,显示INT1中断次数(次数不超过FFH)。 6.9两个数码管阳极经驱动器接P1口,阴极分别接P3.0、P3.1。 #include void intr(void) void delay(void); unsigned char a,b,i=0; unsigned char code tab[16]={0x3f,0x06,0x5b,Ox4f,0x66,0x7d,0x07, 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x73}: sbit p3_O=P3^0; sbit p3_1=P3^1; main(){ a=tab[O]; b=tab[0]; p3_0=O; p3_1=0; EA=1; EX0=1; IT0=1; for(;;){ p3_O=1; p3_1=0; P1=b: delay(); p3_0=O; p3_1=1; P1=a: delay(); }} void intr()interrupt 0{ unsigned charj,k; EX0=O; i++; j=i&0x0f; k=i&0xf0; k>>=4; a=tab[k]; b=tab[j]; EX0=1;} void delay(void){ int x; for(x=0;x<1000;x++); } 第7章 定时计数器 7.1 8XX51单片机内部设有几个定时/计数器?它们是南哪些专用寄存器组成的? 7.2 8XX51单片机的定时/计数器有哪几种工作方式?各有什么特点? 7.3 定时/计数器用做定时时,其定时时间与哪些因素有关?用做计数时,对外界计数频率有何限制? 7.1~7.3参7.1节 7.4 设单片机的fosc=6MHz,定时器处于不同工作方式时,最大定时范围分别是多少? 7.4 方式0:16.38ms,方式1:131ms,方式2:512us 7.5 利用8XX51的T0计数,每计10个脉冲,P1.0变反一次,用查询和中断两种方式编程。 7.5 使用方式2,计数初值c=100H—OAH=F6H 查询方式: 0RG  0000H MOV TMOD,#06H MOV THO,#0F6H MOV TL0,#0F6H SETB TR0 ABC:JNB  TF0,$ CLR TF0 CPL  P1.0 SJMP ABC 中断方式: ORG  0000H AJMP  MAIN ORG  OOOOBH CPL  P1.0 RETI MAIN:MOV  TMOD,#06H MOV TH0,#OF6H SETB EA SETB ET0 SETB TR0 SJMP $    ;等待中断 C语言程序查询方式: #include sbit p10=P1^O; main(){ TMOD=Ox06;THO=-10;TLO=-10; TRO=1:{ while(1) dO{}while(TF0==0) TF0=0;p10=~p10; }} 中断方式:#include sbit p1_O=P1^O; tov()interrrupt 1 {p1_O=~p1_O; } maln(){ EA=1;ET0=1;TMOD=0x06; TH0=0xf6;TL0=0xf6;TR0=1; while(1);}/*等待中断*/ 7.6 在P1.0引脚接一驱动放大电路驱动扬声器,利用T1产生lOOOHz的音频信号从扬声器输出。 7.6  1000Hz的周期为1ms,即要求每500us P1.0变反一次,使用T1方式1,MC=12/fosc=1us,C=216-500us/1us=FE0CH,除TMOD=10H,TH0=FEH,Tl0=0CH外,程序与7.5题相同,注意每次要重置TH0和TL0。 7.7 已知8XX51单片机系统时钟频率为6MHz,利用定时器T0使P1.2每隔350us,输出一个50us脉宽的正脉冲。 7.7 fosc=6MHz,MC=2us,方式2的最大定时为512us,合乎题目的要求。50us时,计数初值为C1=256-25=E7H,350us时,计数初值为C2=256-175=51H 汇编语言程序 ORG  0000H MOV TMOD,#02H NEXT:MOV TH0,#51H MOV TL0,#51H CLR P1.2 SETB TR0 AB1:JBC TF0,EXT SJMP AB1 EXT:SETB  P1.2 MOV TH0,#0E7H MOV TL0,#0E7H AB2:JBC TF0,NEXT SJMP AB2 C语言程序 #include void timet(unsigned char t); sbit p1_2=P1^2 main(){for(;;) p1_2=O;timer(7); p1_2=1;timer(1); } void timer(unslgned char t) {unsigned char i; for(i=0;i sbit p11=P1^l; sbit p10=P1^0; main(){ char i; TMOD=0x02;TH0=06;TL0=06:TR0=1; while(1){ for(i=0;i<4:i++){ do{}while(!TF0); P11=~P11: } P10=~P10: }} 7.9 设系统时钟频率为6MHz,试用定时器T0。作为外部计数器,编程实现每计到1000个脉冲后,使T1定时2ms,然后T0又开始计数,这样反复循环。 7.9 C语言程序 T0计数1000个脉冲,采用方式1;T1定时2ms,fosc=6MHz,C=-2ms/2us=-1000 include counter(){ TH0=-1000/256;  TLO=-1000%256;  TR0=1;TR1=0; while(TF0!=1); TF0=0; } timer(){ TH1=-1000/256;TL1=-1000%256;TR1=1;TR0=0; while(TF1!=0); TF1=0; } main() TMOD=0x15; for(;;){ counter(): timer(): 7.10 利用8XX51单片机定时器T0测量某正单脉冲宽度,已知此脉冲宽度小于10ms,主机频率为12MHz。编程测量脉宽,并把结果转换为BCD码,顺序存放在以片内50H单元为首地址的内存单元中(50H单元存个位)。 7.10 C语言程序 #lnclue sbit p3_2=P3^2; main(){ unsingcd char  *P,i; int a; P=0x50; TMOD=0x09; TL0=0;TH0=0; while(P3_2==1);/*等待INT0变低*/ TR0=1; while(P3_2==0);/*等待-INT0变高*/ while(P3_2==1);/*等待-INT0变低*/ TR0=0; i=TH0; a=i*256+TL0; for(;a!=O;) {    /*转换为非压缩IR7D码*/ *P=a%10; a=a/10; P++; } } 第8章 串行口 8.1 什么是串行异步通信?它有哪些特点?MCS-51单片机的串行通信有哪几种帧格式? 8.1见8.1节 8.2 某异步通信接口按方式3传送,已知其每分钟传送3600个字符,计算其传送波特率。 8.2 方式3为每帧11位数据格式.即3600*11/60=660(波特) 8.3 为什么定时器T1用做串行口波特率发生器时,常采用工作方式2? 若已知系统时钟频率、通信选用的波特率,如何计算其初值? 8.3 T1的方式2模式不需要重装时间常数(计数初值),不影响cPU执行通信程序。设波特率为fboud计数初值为X,依据公式 fbaud=(2smod/32)*(fosc/12(256-X)) 求得X=256-((2smod/32)*(fosc/fbaud))。 8.4 已知定时器T1设置为方式2,用做波特率发生器,系统时钟频率为6MHz,求可能产生的最高和最低的波特率是多少? 8.4最低波特率为,T1定时最大值时,此时计数初值为256,并且SMOD=0,得 fbaud=(1/32)*(fosc/(12(256-0))=61 最高波特率为T1定时最小值且SOMD=1时,得 fbaud=(2/32)*fosc/(12(256-1))=31250 8.5 设甲、乙两机采用方式1通信,波特率为4800,甲机发送O,1,2,…,1FH,乙机接收存放在内部 RAM以20H为首址的单元,试用查询方式编写甲、乙两机的程序(两机的fosc=6MHz)。 8.5取SMOD=1计算TH1=TL1=B2; ;***********************发送查询方式****** ORG  0000H MOV  TMOD,#20H MOV THl,#OB2H MOV TL1,#0B2H SETB TR1 MOV SCON,#40H MOV A,#O NEXT:MOV  SBUF,A TES:JBC  T1,ADD1 SJMP TES ADD1:INC A CJNE  A,#20H,NEXT SJMP  $ END ;************************发送中断方式********************************* ORG  0000H AJMP MAIN;转主程序 ORG 0023H  ;中断服务 CLR  TI INC  A MOV SBUF,A CJNE A,#20H,RE CLR  ES RE:RETI MAIN:MOV TMOD,#20H;主程序 MOV TH1,#0B2H MOV TL1,#082H SETB TR1 MOV SCON,#40H SETB EA SETB  ES MOV A,#O MOV SBUF,A SJMP$  ;等待中断 ;*******************************接收查询方式*************************** ORG  0000H MOV  TMOD,#20H MOV TH1,#0B2H MOV TL1,#0B2H SETB TR1 MOV SCON,#50H MOV RO。#20H TEC:JBC  R1,REC SJMP TES REC:MOV  @R0,SBUF INC  R0 CJNE  R0,#40H,TEC SJMP  $ END ;******************************接收中断斤方式**************************** ORG  O000H AJMP MAIN;转主程序 ORG 0023H;中断服务 CLR  RI MOV @RO,SBUF INC  R0 CJNF R0,#40,RE CLR ES RE:RETI MAlN:MOV TMOD,#20H;主程序 MOV TH1,#0B2H MOV TL1,#0B2H SETB TR1 MOV SCON,50H SETB EA SETB  ES SJMP$  ;等待中断 END 8.6 一个8XX511单片机的双机通信系统波特率为9600, fosc=12MHz,用中断方式编写程序,将甲机片外RAM 3400H~34AOH的数据块通过串行口传送到乙机的片外RAM 4400H~44AOH单元中去。 8.6 /********************************发送程序***************************/ #include #define uchar unsigned char VOId int4(void) uchar xdata*P; {P=Ox3400 TMOD=0x20; TL1=0xfd;TH1=0xfd; SCON=0x40: TR1=1;EA=1;ES=1; SBUF=*P: whaile(1);/*等待中断*/ } void int4(void)interrupt 4 {TI=O: P++: SBUF=*P; if(P==0x34a0)EA=0; } /***********************接收程序***************************/ #include #define ucher Unsigeried char void int4(void) char xdata*P: void mian() {P=0x4400: TMOD=0x20; TL1=Oxfd: TH1=0xfd; SCON=0x50; TR1=1;EA=1;ES=1; for(;;);/*等待中断*/ } void int4(viod)interrupt 4 {RI=0; *P=SBUF; P++; if(P==0x44a1)EA=O; } 8.7 数据传送要求同题8.6,要求每帧传送一个奇校验位,编出查询方式的通信程序。 8.7 利用串行通信方式2(波特率固定),采用奇校验方式,将校验位放在TB8中.乙机检验校验位,如正确,则存于片外4400H开始的RAM中,如错误, 通知 关于发布提成方案的通知关于xx通知关于成立公司筹建组的通知关于红头文件的使用公开通知关于计发全勤奖的通知 对方重发,R6存放数据块长度。汇编语言程序如下: 发送方 ORG  0000H MOV DPTR,#3400H MOV R6,#0A1H MOV SCON,#90H MOV SBUF,R6 L2:  JBC TI,L3 AJMP L2 L3:  MOV A,@DPTR JB  P,L4 SETB TB8 L4:  MOV SBUF,A L5: JBC TI,L6 AJMP L5 L6: JBC RI,L7 AJMP L6 L7:  MOV A,SBUF CJNE A,#0FFH,L8 AJMP L3 L8:  INC DPL DJNZ R6,L4 SJMP  $ 接收方 ORG  0000H MOV DPTR,#4400H MOV SCON,#90H L1:  JBC RI,L2 AJMP L1 L2:  MOV A,SBUF MOV R6,A L3:  JBC RI,L4 AJMP L3 L4:  MOV A,SBUF JB  P,L5 JNB RB8,L8 sIMP  $ L5:  JB JB8,L8 L6:MOVX @DPTR,A INC DPL INC DPH DJNZ R6,L3 SJMP  $ L8:  MOV A,#0FFH MOV SBUF,A L9:  JBC TI,L3 AJMP L9 SJMP  $ END 8.8 利用89C51串行口设计4位静态数码管显示器,画出电路并编写程序,要求4位显示器上每隔1s交替地显示"0123"和“4567”。 8.8 电路图见图8-12 /*****************************查询方式****************************/ #include #define uchar unsigned char sbit P3_3=P3^3; char code tab[]={0xc0,0xf9,0xa4,0xb0,0x99, 0x92,0x82,Oxf8,0xf8,0x80,0xg0}; void timer(uchar); main(){ucha i,a=3; SCON=0; for(;;) {P3_3=1; for(i=0;i<4;i++) {SBUF=tab[a]; a--; while(!TI); TI=O; if(a==255)a=7; P3_3=0; timet(100); }} void timer(uchre t) {uehar i; for(i=O;i #define uehar unsigned char sbit P3_3=P3^3; uchar a=3; char code tab[]={0xc0;0xf9;0xa4, 0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; void timet(uchar t); void int4(void); main() {uchar i,j; SCON=0;EA=1;ES=1; for(;;) {P3_3=1; for(i=O,i<4,i++) {SBUF=tab[a]; j=a; while(j==a); } P3_3=0; timer(100); if(a==255)a=7; } void int4(void)interrupt 4 {TI=0; a--; } void timer(uchar t) {uchar i; for(i=0;i #define COM8255 XBYTE[0x7fff] #define  A8255 xBYTE[0x7fff] main(){ unsigned int j; COM8255=0x80; A8255=0xf3: while(1){ COM8255=0x0; for(j=O;j<=10000;j++); COM8255=0x01: for(j=0;j<=10000;j++); }} 9.10 在8XX51单片机上扩展一片8255,使用A口和C口设计4位数码管动态显示电路,显示"good"字符(G为小写)。 9.10  8255A口、B口、C口、控制口地址分别为7CFFH、7DFFH、7EFFH、7FFFH,A口方式O输出,C口输出,控制字80H。设计见习题9.10图。 ORG  0000H MOV  DPTR,#7FFFH    ;指向控制口 MOV A,#80H    ;A口、B口均采用基本输出方式 MOVX @DPTR,A    ;写控制字 MOV  DPTR,#7CFFH MOV A,#0 MOVX @DPTR,A    ;清显示 AGAIN:  MOV R0,#0    ;R0存字形表偏移量 MOV R1,#01    ;R1置数码表位选代码 NEXT:  MOV DPTR,#7EFFH    ;指向C口 MOV A,R1 MOVX @DPTR,A    ;从C口输出位选码 MOV A,R0 MOV DPTR,#TAB    ;置字形表头地址 MOVC  A,@A+DPTR  ;查字形码表 MOV DPTR,#7CFFH  ;指向A口 MOVX @DPTR,A    ;从A口输出字形码 ACALL  DAY    ;延时 INC R0    ;指向下一位字形 MOV A,R1 RL A    ;指向下一位 MOV R1,A CJNE Rl,#10H,NEXT  ;4个数码管显示完 SJMP  AGAIN DAY:MOV R6,#50    ;延时子程序 DL2:MOV R7,#7DH DL1:NOP NOP DJNZ  R7,DLl DJNZ  R6,DL2 RET TAB1:DB 6FH,3FH,3FH,5EH;“good”(good)的字形码 9.1l 在8XX51单片机上扩展一片EPROM 27128、一片RAM 6264和一片8255,采用线选方式,写出各自的地址范围。 9.11 提示:EPROM 27128 16KB×8,地址线为14根,6264为8KB×8位,地址线为13根,电路参阅图9-21。 9.12 列出图9-27中的I/O口、RAM、计数器、控制口地址。 9.12 根据电路连线图,见习题9.12图。 I/O口:A口:FDF8H,B口:FDF9H,C口:FDFAH 命令/状态口:FDFBH 定时器TIMEL:FDFCH  TIMEH:FDFDH 存储器RAM:FC00H~FCFFH 图9-27 习题9.12图 第10章 单片机接口技术 补充题1 设4位ADC;当数字量为1000B时,Vo=5v时满档10V的。求被测电压Vi=8.2V的逐次逼近波形图。 补充题1(答案) 10.1 设计8XX51和DAC0832接口,要求地址为F7FFH,满量程电压为5V,采用单缓冲工作方式。画出电路图,编程使输出如下要求的模拟电压: (1) 幅度为3V,周期不限的三角波电压。 (2) 幅度为4V,周期2ms的方波。 (3) 周期为5ms的阶梯波,阶梯的电压幅度分别为0V,1V,2V,3V,4V,5V,每一阶梯为1ms。 10.1  电路参照图10-3,不同的是将P2.7改为P2.3先计算各模拟量对应的数字量。3V对应的数字量为 5V/3V一255/X,  X=153=99H 同样可算得1V,2V,4V对应的数字量分别为33H,66H,CCH ①三角波 MOV  DPTR,#OF7FFH NEXTl:MOV A,#O NEXT:MOVX  @DPTR,A NOP NOP INC A CJNE A,#9AH,NEXT NEXTA:DEC  A MOVX  @DPTR,A NOP NOP CJNE  A,#0,NEXTA SJMP  NEXT1 END #inclde #include #define da0832  XBYTE[0xf7ff] main(){ unsigned char i,j; while{ for(i=O;i<=153:i++) {da0832=i: for(j=0;j<=100;j++); } for(i=153;i>=0:i--) {da0832=i; for(j=O;j<=100;j++); }}} ②方波4V对应的数字量为CCH MOV  DPTR,#0F7FFH MOV A,#0 NEXT:MOVX  @DPTR,A ACALL  D2MS XRL A,#0CCH SJMP NEXT #include #include #define da0832 XBYTE[0xf7ff] main(){ unsingde a=O,j; while(1){ da0832=a; for(j=0;j<=255;j++); a=a^Oxcc:    - }} ③阶梯波 MOV  DPTR,#OF7FFH NEC:MOV A,#O NEXT:MOVX  @DPTR,A ACALL  D1MS ADD A,#33H CJNE  A,#OFFH,NEXTA NEXTA:MOVX  @DPTR,A ACALL  D5MS SJMP NEC main(){ unsigued char i; unsigued int j; while(1){ for(i=0;i<=255:i+=51) {da0832=i; for(j=O;j<=100;j++;); }}} 10.2 题目要求同题10.1,采用双缓冲方式。 lO.2  电路参考图10-4,增加一个地址.使用两条输出指令才能输出一个数据,其他同上。 10.3 设计89S51和DAC0832的接口,采用单缓冲方式,将内部RAM 20H~2FH单元的数据转换成模拟电压,每隔1ms输出一个数据。 10.3  电路参照图10-3,地址为7FFFH。 ORG 0000H MOV  DPTR,#7FFFH MOV R0,#20H MOV A,@R0 NEXT:MOVX @DPTR,A ACALL  D11MS INC  R0 CJNE R0,#30H,NEXT SJMP$ END #include #include #define da0809 XBYTE[Ox7fff] main(){ unsigned char *p,i,j; p=0x20; for(i=0;i<=16;i++) {da0832= *p; p++; for(i=0,j<=255;j++); }} 10.4 内部RAM的30H~3FH中存放着8个12位的二进制数,其中高4位放在高地址单元,低8位放在低地址单元,利用DACl210转换成模拟电压输出,要求用P2.0,P2.1,P2.2进行线选,编出程序,画出硬件电路。 10.4  电路参阅图10-6,不同的是将P2.5~P2.7改为P2.0~P2.2各地址分别为FEFFH、FDFFH、FBFFH。程序参照10.1节,注意修改RAM地址,循环执行该程序。 10.5 设计89S51和ADC0809的接口,采集2通道10个数据,存入内部RAM的50H~59H单元,画出电路图,编出:(1)延时方式;(2)查询方式;(3)中断方式的程序。 1O.5电路参阅图10-9,不同的是:①延时方式:EOC悬空;②查询方式:EOC经非门接单片机P1.0(见习题10.6图);③中断方式同原图。 下面仅编查询程序。IN2的地址为7FFAH,由于EOC经非门接单片机P1.0端口线,查询到P1.0为零,即转换结束。 ORG 0000H MOV R7,#OAH MOV R0,#50H MOV  DPTR,#7FFAH NEXT:MOVX  @DPTR,A  ;启动转换 JB P1.0,$    ;查询等待 MOVX  A.@DPTR    ;渎人数据 MOV @R0,A INC  R0 DJNZ  NEXT SJMP  $ #includc #include #define uchar unslgnde char #define IN2 xBYTE[ox7ffa]  /*IN2地址*/ sbit adbusy=P1^0);    /*EOC*/ void main(void) {uchar idata ad[10]; uchar i; for(i=O;i<=10;i++);    /*采集10个数*/ {IN2=0;    /*启动转换*/ while(adbusy==1);    /*D3C等于O循环*/ ad[i]=IN2    /*存转换结果*/}} 10.6 设计89C51和ADC0809的接口,使用中断方式顺序采集8路模拟量。存入地址为20H~27H的内部RAM中。 10.6  ADC0809采集8路模拟信号,顺序采集一次,将采集结果存放于数组ad中。ADC0809模拟通道0~7的地址为7FF8H~7FFFH,以P1.0查询ADC0809的转换结束端EOC,电路如习题10-6图所示的查询方式。 程序如下: #lnclude #include #define uchar unsigned char #define IN0 XBYTE[0x7ff8] /*IN0地址*/ sbit adbusy=P1^0;    /*EOC*/ void ad0809(uchar idata*x)  /*A/D*/ {uchar ii; uchar xdata*ad_adr; ad_adr=&IN0; for(i=0;i<8;i++)    /*处理8个通道*/ {  *ad_adr=0;    /*启动转换*/ while(adbusy==1);    /*查EOC*/ x[i]=*ad_adr;    /*存转换结果*/ ad_adr++;    /*指向下一通道*/ }} void main(void) {uchar idata ad[10]; ad0809(ad);    /*采样AD0809通道的值*/} 第11章 串行接口技术 11.1 在AT89S52上扩展两片AT24C04。 11.1 见习题11.1图 习题11.1图 11.2 完成将O~9写入AT24C04的O~9单元。 11.2 参阅11.L 5节 11.3 完成将AT24C04的O~9单元内容读出并分别存入内部RAM的20H~29H单元。 11.3 参阅11.1.5节 11.4 试用一片TLC5615设计一个51波形发生器,使能产生方波、锯齿波。 11.4 参阅第13章实验指导的实验7 11.5 使用一片TLC549设计一个基于51单片机测量的低频有效值的电压表。 11.5 参阅第13章实验指导的实验8 第12章 嵌入式系统的设计与调试 12.1 单片机的抗干扰措施有哪些? 12.1 参阅12.3节 12.2 设计一个电子数字钟,并接一个小喇叭,使 (1) 具有交替显示年、月、日、时、分、秒的功能; (2) 具备校正功能; *(3) 具备设定闹钟和定时闹钟响功能; *(4) 具备整点报时功能; *(5) 具备生日提醒功能。 其中,*为选做的扩展功能。 12.2 提示:利用定时/计数器定时l00ms,中断10次达1s,满60s,分加1s清O;满60分,小时加1分清0,同时分、秒均有十位数和个位数,按十进制进位,并送显示,显示可采用6个数码管(或8个数码管),校对可用按键中断方式或按键的查询进行加1校对,用并行口接驱动器(非门或三极管)驱动扬声器进行闹钟,如果采用89C51/S51做,由于片内已有程序存储器,4个口用户均可使用。 12.3 用单片机的定时器设计一个音乐盒,使能用按键选择演奏两支小乐曲,已知乐谱和频率的关系如下: C调音符 5 6 7 1 2 3 4 5 6 7 频率(Hz) 392 440 494 524 588 660 698 784 880 988                       12.3 提示:使用定时器产生不同频率的信号构成节拍,可以两个定时器联合使用。 12.4 设计一个模拟量采集系统,将所采集的模拟量显示在4个LED显示器或4个LCD显示器上。 12.4 提示:硬件由单片机、A/D转换、LED显示器或LCD显示器及必要的驱动、译码等电路构成。 12.5 题目题12.4,要求利用串行通信,使采集的数据或波形显示在PC的电脑屏幕上。 12.5 略 第13章 单片机实验(略)
本文档为【韶关学院《单片微型计算机与接口技术》(第5版)思考题与习题解答】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_105949
暂无简介~
格式:doc
大小:209KB
软件:Word
页数:0
分类:理学
上传时间:2019-08-17
浏览量:71