单片机原理及接口技术课后习题第9章 答案

更新时间:2023-11-05 23:53:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

第九章复习思考题

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,设计接口电路并编制检测控制程序。

80C51P0.0P0.1P0.2P0.3P0.4P0.5P0.6P0.7D0D1D2D3D4D5D6D7CLKQ0Q1Q2Q3Q4Q5Q6Q7CLRLED0LED1LED2LED3LED4LED5LED6LED7R0R1R2R3R4R5R6R7+5 V74LS27374LS244WRP2.6?1?1RD1Y11Y21Y31Y42Y12Y22Y32Y41A11A21A31A42A12A22A32A41G2GR8R9R10R11R12R13R14R15K0K1K2K3K4K5K6K7

图9.1题3接口电路原理图

接口电路原理图如图9.1 源程序: MOV DPTR,#BFFFH ;设置输入/输出口地址

MOVX A,@DPTR NOP NOP

MOVX @DPTR,A AJMP CONT

;读取开关状态 ;延时,总线稳定 ;输出,驱动LED显示 ;延时,总线稳定

COMT:

5. 74LS377是8D触发器,其功能表见表9.17,其中Di为触发器的数据输入端,Qi为触发器的数据输出端,G是使能控制端,CLK是时钟输入端,Q0为建立稳态输入条件之前,锁存器输出Q的状态。采用它为8051单片机扩展1个8位的并行输出口。

80C51P0.0P0.1P0.2P0.3P0.4P0.5P0.6P0.7P2.7D0D1D2D3D4D5D6D7GCLKQ0Q1Q2Q3Q4Q5Q6Q7LED0LED1LED2LED3LED4LED5LED6LED7R0R1R2R3R4R5R6R7+5 VWR74LS377图9.2 题5接口电路原理图

用74LS377扩展的输出口电路如图9-2所示。用P2.7与74LS377的使能控制端G相连,当P2.7为0时,74LS377被选中,如果默认其他未用的地址线为1,则扩展的输出口地址为7FFFH。由于MCS-51单片机的WR接到74LS377的时钟输入端CLK,当CPU执行写外部输出口指令MOVX时,把数据输出到数据总线上,在WR信号由低变高时,写出的数据被打入74LS377并锁存。程序如下:

MOV DPTR, #7FFFH ;输出口地址 MOV A, R6 ;取数据 MOVX @DPTR, A ;输出,

6. 74LS245是一种具有双向驱动的8位三态输出缓冲器,它的功能表见表9.18,其中G为使能端,DIR为方向控制端,A1~A8为A端的数据输入/输出,B1~B8为B端的数据输入/输出。当G为低电平时,DIR为高电平把A端数据传送至B端;DIR为低电平,把B端数据传送至A端。在其他情况下不传送数据,并输出呈高阻态。采用它为8051单片机扩展1个8位的输入口。

80C51P0.0P0.1P0.2P0.3P0.4P0.5P0.6P0.7RDP2.0?180C5174LS245A1A2A3A4A5A6A7A8G74LS245B1B2B3B4B5B6B7B8DIRB1B2B3B4B5B6B7B8DIRR+5 VP0.0P0.1P0.2P0.3P0.4P0.5P0.6P0.7RDP2.0A1A2A3A4A5A6A7A8G

(1) (2) 图9-3 题6采用74LS245扩展输入口的2种电路

图9-3为采用74LS245扩展输人接口电路。

电路(1)中,DIR上拉为高电平,74LS245数据传送方向强制为B端到A端,当P2.0为0时,且RD为低电平时,使能端G为低电平,74LS245三态门打开,单片机CPU读取外设输入的数据。其他情况下,74LS245的三态门呈高阻状态。

电路(2)中,只有单片机读取外设数据时,P2.0=0使74LS245的使能端G有效,如果RD为低电平,把74LS245数据传送方向置为A端到B端,其A→B方向的三态门打开,单片机CPU读取外设输入的数据。P2.0=1时,使能端G无效,A端和B端处于隔离状态。 图9-3的2个电路都采用P2.0为片选,其输入口地址为0FEFFH(默认未用地址线为1)。 7. 采用8155芯片为8051单片机系统扩展接口,外设为开关组(8个开关组成)和8个LED,每个开关控制1个LED。现需要读取开关组的状态,并把其状态存储到8155芯片RAM中,若开关组的开关全部断开,则不记录。设计接口电路并编制检测程序。

MCS-51P2.7P2.0RDWRALEP0.7P0.6P0.5P0.4P0.3P0.2P0.1P0.0RESETCSIO/MRDWRALEAD7AD6AD5AD4AD3AD2AD1AD0RESET8155PA0PA1PA2PA3PA4PA5LED6PA6PA7LED7LED0LED1LED2LED3LED4LED5+5 VR0R1R2R3R4R5R6R7+5 V

PB0PB1PB2PB3PB4PB5PB6PB7R8R91R01RR1121R31R41R5K0K1K2K3K4K5K6K7

图9.4 题7接口电路

接口电路如图9.4所示, 8155的PB口用作读取开关组状态,PA口用作控制LED组,分配地址如下:命令/状态寄存器:0100H;PA口:0101H;PB口:0102H; PA和PB口为基本输入输出方式。K0控制LED0,K1控制LED1,以此类推。设存储开关状态的单元为STATE。

程序如下:

CMMD EQU 0100H PORTA EQU 0101H PORTB EQU 0102H PORTC EQU 0103H STATE EQU 20H

MOV A,#02H MOVX @DPTR, A MOV A,#0FFH MOV DPTR,#0101H MOVX @DPTR,A NOP

;初始化,工作方式控制字 ;设置工作方式,初始化完成

MOV DPTR,# 0100H ;控制寄存器地址

;上电后,熄灭LED ;没有开关闭合 ;PB口地址

MOV STATE,#0FFH

DETECT: MOV DPTR,#0102H

MOVX A,@DPTR MOVX @DPTR,A NOP

CJNE A,#0FFH,VALID SJMP DETECT

;从PB口读开关状态

;从PA口输出控制LED指示灯

MOV DPTR,#0101H ;PA口地址

VALID: MOV STATE,A;

AJMP DETECT

;记录开关状态

8. 采用8255芯片为8051单片机系统扩展接口,外设为开关组(8个开关组成)和8个LED,每个开关对应1个LED。现需要每隔50ms读取一次开关组的状态,并把其状态存储到内部RAM中。设计接口电路并编制检测程序。假设系统晶振频率为12MHz。

80C51WRRDP2.0WRRDCSD7D6D5D4D3D2D1D0Q7Q6Q5Q4Q3Q2Q1Q08255PA0PA1PA2PA3PA4PA5LED6PA6LED7PA7LED0LED1LED2LED3LED4LED5+5 VR0R1R2R3R4R5R6R7+5 V+5VREAP0.7P0.6P0.5P0.4P0.3P0.2P0.1P0.0ALE74LS373A1A0GOED7D6D5D4D3D2D1D0PB0PB1PB2PB3PB4PB5PB6PB7K0K1K2K3K4K5K6K7RESETRESETPC0~PC7R8R9R10R11R12R13R14R15 图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,用定时器/计数

50ms器T0定时50ms,工作方式为方式1,初始值为:216??15536,即3CB0H

TM

PORTA EQU 0100H PORTB EQU 0101H PORTC EQU 0102H CMMD EQU 0103H STATE EQU 20H ACALL Ini8255; ACLL IniTimer0 JBC TF0,DETECT SJMP WAIT

//mian program

WAIT:

DETECT: MOV TH0,#3CH

MOV TL0,#0B0H MOV DPTR, #PortB MOVX A,@DPTR MOVX @DPTR,A NOP

MOV STATE,A AJMP WAIT

;PB口地址 ;从PB口读开关状态

;从PA口输出控制LED指示灯

MOV DPTR, #PortA ;PA口地址

Ini8255:

MOV A,#82H MOV DPTR,#CMMD MOVX @DPTR, A MOV A,#0FFH MOV DPTR,#PORTA MOVX @DPTR,A NOP RET

MOV TH0,#3CH MOV TL0,#0B0H SETB TR0 RET

;初始化,工作方式控制字 ;控制寄存器地址

;设置工作方式,初始化完成

;上电后,熄灭LED

IniTimer0: MOV TMOD,#01H

9. 简述矩阵键盘的行列扫描和线反转法原理。

(1)行列扫描法: 在按键识别过程时,依次使行线输出电平,然后检查列线的输入电平,如果所有列线的输入全为高电平,则该行无按键按下;如果不全为高电平,则被按下的按键在本行,且在输入电平变为低电平的列的交叉点上。 (2)线反转法: 第一步,首先使行线为输入,列线为输出。列线全部输出低电平,那么,行线中变为低电平的行线为按键所在的行。 第二步,使行线变为输出,列线变为输入。行线输出全部为低电平,那么,列线中变为低电平的列线为按键所在的列。

10. 一个简单计数器的电路原理图如图所示。要求每按一次S键,计数器计数一次,计数值送P1口显示,采用单只数码管显示,计16次后从0开始。

MCS-51510?P1.0P1.1P1.2P1.3P1.4P1.5P1.6P1.7aabcfgbdeedcfdpgdpCOMRS+5VP3.3

图9.6 题10原理图

1 BIT P3.3

VALUE EQU 20H

ORG 0000H LJMP MAIN ORG 1000H

MOV VALUE,#00 ACALL DISP ACALL DEL10MS

;判断按下

ACALL DEL10MS

;判断释放 ;加1

;仅显示低位 ;显示

INC VALUE

;初始化显示0

MAIN: SETB P3.3

WAIT0: JB S1,WAIT0;

WAIT1: JB S1,WAIT1 WAIT2: JNB S1,WAIT2;

WAIT3: JNB S1,WAIT3

ANL VALUE,#00001111B ACALL DISP SJMP WAIT0

//显示子程序 DISP:

MOV A,VALUE

;取显示信息 ;字型码表的首地址 ;通过显示信息查其字型码 ;输出显示

MOV DPTR, #SEG_TAB MOVC A,@A+DPTR MOV P1,A NOP RET

//延时子程序

DEL10MS:MOV R5,#10 DELX: DEL0:

MOV R6,#200 NOP NOP NOP

DJNZ R6,DEL0 DJNZ R5,DELX RET

SEG_TAB: DB 0C0H, 0F9H, 0A4H, 0B0H, 99H, 92H, 82H, 0F8H, 80H, 90H DB 88H, 83H, 0C6H, 0A1H, 86H, 8EH ;以下为显示字型码表,0~9,A~F END

11. 简述LED数码管的静态显示和动态显示原理。

(1)静态显示:在多位静态显示时,各个LED数码管相互独立,公共端COM接地(共阴极)或接正电源(共阳极)。每个数码管的8个显示字段控制端分别与一个8位并行输出

口相连,只要输出口输出字型码,LED数码管就立即显示出相应的字符,并保持到输出口输出新的字型码。 (2)动态显示:多位LED数码管动态显示方式是各个LED数码管一位一位地轮流显示。在硬件电路上,各个数码管的显示字段控制端并联在一起,由一个8位并行输出口控制;各个的LED数码管的公共端作为显示位的位选线,由另外的输出口控制。动态显示时,各个数码管分时轮流地被选通,即在某一时刻只选通一个数码管,并送出相应的字型码,并让该数码管稳定地显示一段短暂的时间,在下一时刻选通另一位数码管,并送出相应的字型码显示,并保持显示一段时间,如此循环,即可以在各个数码管上显示需要显示的字符。

输出口输出口输出口输出口输出口COMCOMCOMCOM

输出口COMCOMCOMCOM 图9.7 LED数码管静态显示原理 图9.8 LED数码管动态显示原理

12. 用P1和P3口作为输出口,设计一个5位的LED数码管显示系统,并在显示器上显示“HELLO”。

IC1VccREAIC3A0~A7P1B0B1B2B3B4B5B6B7COMCOMCOMCOMCOMCOMA0~A7P3+5VIC2B0~B7+5VRP1DIRG 74LS245a~dpa~dpa~dpa~dpa~dpa~dp80C51+5VDIRG 74LS245

图 9.9 题12接口电路图

接口电路图如图9.9所示,用2片74LS245提高接口的驱动能力,LED数码管为共阴型。程序如下:

SEG_OUT EQU P3 BIT_OUT EQU P1 ORG 0000H LJMP START ORG 0030H

//====================================

START: MOV SP,#60H

MOV 20H,#40H MOV 21H,#12H MOV 22H,#23H MOV R1,#30H MOV R0,#20H

//显示\对应字型表序号编码:40 12 23

CALL SPLIT INC R0 INC R1 CALL SPLIT INC R0 INC R1 CALL SPLIT ACALL DSPLY1 SJMP RED

RED:

//=================================== SPLIT: MOV A,@R0

ANL A,#0F0H SWAP A MOV @R1,A INC R1 MOV A,@R0 ANL A,#0FH MOV @R1,A RET

//=========================================== //6位显示

DSPLY1: MOV R0, #30H REDO: ACALL DISP MOV A, RL A

MOV R2, A

INC R0 ;修改显示缓冲区地址指针 XRL A, #10111111B JNZ REDO RET

;6位显示完否 ;返回 ;未完,继续显示

;显示缓冲区地址

;显示起始位置 ;显示1位

;计算下一个显示位置

MOV R2, #11111110B

R2

//==========================================

;显示一位子程序

#LED_SEG

A A

;字型码表首地址 ;取显示数据 ;求显示数据的字型码 ;输出字型码 ;取显示位置 ;显示

;稳定显示1ms

DISP: MOV DPTR, MOVC

MOV A, @R0 MOV SEG_OUT, MOV A, R2 MOV BIT_OUT, ACALL DL1MS

MOV A,#0FFH RET

;字型码表

MOV BIT_OUT,A

A, @A+DPTR

LED_SEG:

DB 76H ; H DB 79H ; E DB 38H ; L DB 3FH ; 0

序号:00 序号:01 序号:02 序号:03 序号:04

DB 00H ; BLANK

DL1MS: MOV R5,#200; DEL:

NOP NOP NOP

DJNZ R5,DEL RET END

12M时延时1ms

13. 一个显示电路如图9.60所示。请采用串行口方式0实现LED数码管的动态显示,在显示器上自左向右动态显示“654321”,每个字符保持时间为0.1s。

IC2IC1RXDTXDQAQBQCBQDAQEQFQGQHCLKCLR+5VIC4RP1+5V74LS244a~dpa~dpa~dpa~dpa~dpa~dpCOMMCS-51COMCOMCOMCOMCOMCBA74LS138P1.2P1.1P1.0IC3Y0Y1Y2Y3Y4Y5RP2Q1Q2Q3Q4Q5Q6G2AG2BG+5V+5V

图9.10 习题13原题电路图

ORG 0000H

LJMP START ORG 0030H

START: MOV SP,#60H

MOV 20H,#12H MOV 21H,#34H MOV 22H,#56H MOV R1,#30H MOV R0,#20H CALL SPLIT INC R0 INC R1 CALL SPLIT INC R0 INC R1

CALL SPLIT ACALL DISPLY

//分离BCD码 //显示数据

RED:

SJMP RED

//=================================== SPLIT: MOV A,@R0

ANL A,#0F0H SWAP A MOV @R1,A INC R1 MOV A,@R0 ANL A,#0FH MOV @R1,A RET

//================================ DISPLY: MOV R0, #30H MOV R2, #05H NEXT: ACALL DISP11 INC R0 DEC R2 RET ;显示1位子程序

DISP11: MOV A, @R0

;取显示数据

;取显示数据的字型码 ;输出字型码

MOV DPTR, #SEG_TAB MOVC A, @A+DPTR MOV SBUF, A GOON: JBC TI, DPLY AJMP GOON DPLY: MOV A, R2 MOV P1, A MOV P1,#07H

RET

;字型码表

;输出显示位置 ;延时

;显示缓冲区首地址 ;显示位置,最右端1位

;显示

;修改显示缓冲区地址指针 ;计算下一位显示位置 ;6位显示完否? ;显示完返回

CJNE R2, #0FFH, NEXT

ACALL DL100MS

SEG_TAB:DB 0C0H, 0F9H, 0A4H, 0B0H, 99H, 92H, 82H, 0F8H, 80H, 90H DB 88H, 83H, 0C6H, 0A1H, 86H, 8EH //==================================== DL1MS: MOV R5,#200; DEL:

NOP NOP NOP

DJNZ R5,DEL RET

12M时延时1ms

DL100MS:MOV R6,#100 DELX0: ACALL DL1MS

DJNZ R6,DELX0

RET END

14. 采用8155或8255扩展I/O口,设计一个显示电路显示“654321”。

80C51WRRDP2.0ALE8255WRRDPA.0CSPA.7D7D6D5D4D3D2D1D0GQ7Q6Q5Q4Q3Q2Q1Q0OEIC474LS07RP1+5V+5VREAP0.7P0.6P0.5P0.4P0.3P0.2P0.1P0.0~a~dpa~dpa~dpa~dpa~dpa~dpA1A0PB.2PB.1PB.0RESETCBACOMCOMCOMCOMCOMIC574LS138COMIC2RESETG2AG2BIC1IC3GY0Y1Y2Y3Y4Y5+5VSN75451

图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_OUT EQU 0000H //PortA 输出字型码 BIT_OUT EQU 0001H //PortB输出位控码

PortC EQU 0002H//

CMMD EQU 0003H//命令寄存器地址 ORG 0000H LJMP START ORG 0030H

//========================

START: MOV SP,#60H

MOV DPTR,#CMMD //8255初始化

MOV A,#10000000B //方式0,A/B/C口为输出 MOVX @DPTR,A NOP NOP

MOV 20H,#12H MOV 21H,#24H MOV 22H,#56H MOV R1,#30H MOV R0,#20H CALL SPLIT INC R0

//显示数据

INC R1 CALL SPLIT INC R0 INC R1 CALL SPLIT ACALL DSPLY2 SJMP RED

//=================================== ANL A,#0F0H SWAP A MOV @R1,A INC R1 MOV A,@R0 ANL A,#0FH MOV @R1,A RET

RED:

SPLIT: MOV A,@R0

//=========================================== //6位显示

DSPLY2: MOV R0, #30H REDO:

ACALL DISP INC R2

;显示缓冲区首地址 ;显示起始位置 ;显示1位

;计算下一次的显示位置 ;6位显示完否? ;显示结束返回

MOV R2, #00000000B

INC R0 ;修改显示缓冲区指针 CJNE R2, #06H, REDO RET

//==========================================

;显示一位子程序

#LED_SEG

;字型码表首地址 ;取显示数据

;求显示数据的字型码 ;输出字型码 ;字型码输出口地址 ;取显示位置 ;显示位置输出口地址

;显示

DISP: MOV DPTR, MOVC MOVX

MOV A, @R0 MOV DPTR,

A, @A+DPTR

#SEG_OUT

@DPTR, A

MOV A, R2 MOV DPTR, MOVX

#BIT_OUT

@DPTR, A

ACALL DL1MS

MOV A,#0FFH RET

;字型码表

;稳定显示1ms

MOVX

@DPTR, A

LED_SEG: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H ;'0,1,2,3,4,5,6,7' DB 7FH,6FH,77H,7CH,39H,5EH,79H,71H ;'8,9,A,B,C,D,E,F' DB 3EH, 50H, 40H, 08H, 00H ;'U, r, -, _, BLANK

//====================================== DL1MS: MOV R5,#200; DEL:

NOP NOP NOP

DJNZ R5,DEL RET END

12M时延时1ms

15. 一个单片机的键盘显示系统采用3×4矩阵式键盘、8位LED数码管显示器。12个按键定义为数字键0~9、功能键ENTER和STOP。系统工作时,键入一组数值,按下ENTER键后,新数值替换原来的显示值在显示器上循环显示,按下STOP键,循环显示终止,显示数据被清除。设计硬件电路和编写相应的程序。

IC1VccREAIC3A0~A7P3B0B1B2B3B4B5B6B7COMCOMCOMCOMCOMCOMCOMCOMA0~A7P2+5VIC2B0~B7+5VRP1DIRG 74LS245a~dpa~dpa~dpa~dpa~dpa~dp369STOP2580147ENTER+5VDIRG80C51 74LS245

图9.12 题15原理图

//defination

SEG_OUT BIT_OUT DISPBUF SETPTR DLETIME BIT_CODE BIT_LOC STP_FLAG

EQU P2 EQU P3 EQU 40H EQU 38H EQU 39H EQU 255 EQU 3AH EQU 3BH BIT 28H.1

//字型输出 //位控输出

//显示缓冲区40H~47H //设定数据时的存指针的单元

//ENTER时,存储每位稳定时间的单元 //enter稳定时间 //ENTER时存字型的单元 //ENTER时存位控的单元 //ENTER按下标志 //STOP按下标志

HOLDTIME

ETR_FLAG BIT 28H.0

//============================

ORG 0000H ORG 0030H LJMP START

START: MOV SP,#60H

//======================ENTER按下的初始化=================

CLR ETR_FLAG CLR STP_FLAG

MOV HOLDTIME,#DLETIME MOV BIT_CODE,#DISPBUF MOV BIT_LOC,#01111111B

//===========清显示缓冲区========= MOV R0,#DISPBUF MOV R3,#8 ACALL CLRRAM; MOV SETPTR,#DISPBUF MOV DISPBUF,#12H

//键盘扫描

MOV A,P1

ANL A,#00000111B XRL A,#00000111B JZ NON0

ACALL DL20MS //消抖 MOV P1,#0FH MOV A,P1

ANL A,#00000111B XRL A,#00000111B JZ NON0

//键按下

//此处判断哪个键按下

//设定指针初始化,未键入数据时,显示“-”

//ENTER按下时,每位的保持时间

SCANK: MOV P1,#0FH

MOV R3,#11101111B

CONTI: MOV P1,R3

MOV A,P1

// 逐行扫描

ANL A,#00000111B XRL A,#00000111B JNZ FOUND MOV A,R3 RL A MOV R3,A

XRL A,#11111110B JNZ CONTI JMP NON MOV A,P1

ANL A,#00001111B MOV R4,A MOV A,R3

ANL A,#11110000B ORL A,R4 MOV R4,A

// 存特征码,等待键释放

//键释放

//取行编码

//暂存列编码 //没有键按下

NON0:

FOUND: MOV P1,#00000111B

NO_RLSE:MOV P1,#0FH

MOV A,P1

ANL A,#00000111B XRL A,#00000111B JNZ NO_RLSE

ACALL DL20MS //消抖 MOV P1,#0FH MOV A,P1

ANL A,#00000111B XRL A,#00000111B JNZ NO_RLSE MOV A,R4

CJNE A,#0E6H,NUM2 MOV R4,#01H JMP GODISP NUM2:

CJNE A,#0E5H,NUM3

MOV R4,#02H

JMP GODISP

NUM3:

CJNE A,#0E3H,NUM4 MOV R4,#03H

JMP GODISP

NUM4:

CJNE A,#0D6H,NUM5 MOV R4,#04H

JMP GODISP

NUM5:

CJNE A,#0D5H,NUM6 MOV R4,#05H

JMP GODISP

NUM6:

CJNE A,#0D3H,NUM7 MOV R4,#06H JMP GODISP

NUM7:

CJNE A,#0B6H,NUM8

MOV R4,#07H JMP GODISP

NUM8:

CJNE A,#0B5H,NUM9

MOV R4,#08H JMP GODISP

NUM9:

CJNE A,#0B3H,ENTER

MOV R4,#09H JMP GODISP ENTER: CJNE A,#076H,NUM0

MOV R4,#0AH

JMP ETR_DISP //ENTERNUM0:

CJNE A,#075H,STOP MOV R4,#00H

JMP GODISP

//1 //2

//3

//4

//5

//6

//7

//8

//9 //ENTER

按下,循环显示 //0

STOP:

CJNE A,#073H,NUMX MOV R4,#0BH JMP STP_DISP

// STOP按下 //没有按键按下

NUMX: JMP NON GODISP: CLR ETR_FLAG

CLR STP_FLAG MOV R0,SETPTR MOV A,R4 MOV @R0,A INC R0

MOV SETPTR,R0

CJNE R0,#DISPBUF+8,GOON MOV SETPTR,#DISPBUF GOON: JMP RED

NON: JB ETR_FLAG,ETR_DISP JB STP_FLAG,STP_DISP

RED:

MOV R0,#DISPBUF ACALL DSPLY1

JMP SCANK

ETR_DISP:MOV SETPTR,#DISPBUF

SETB ETR_FLAG

MOV R0,BIT_CODE MOV R2,BIT_LOC ; ACALL DISP

DJNZ HOLDTIME, SKIP0

MOV HOLDTIME,#DLETIME

MOV A, BIT_LOC

RR A

MOV BIT_LOC,A

INC BIT_CODE ; XRL A,#01111111B

JNZ SKIP0 MOV BIT_CODE,#DISPBUF MOV BIT_LOC,#01111111B MOV HOLDTIME,#DLETIME SKIP0: JMP SCANK

//STOP处理

STP_DISP: MOV SETPTR,#DISPBUF

SETB STP_FLAG MOV R0,#DISPBUF

MOV R3,#8

无键按下,之前ENTER按下 无键按下,之前STOP按下 无键按下,之前有数字键按下

显示键入的数据

//enter件按下,设定数据循环显示显示起始位置 ;显示1位

;计算下一个显示位置

修改显示缓冲区地址指针 ;8位显示完否

;未完,继续显示

;返回

// // // //

ACALL CLRRAM; //清显示缓冲区内容 MOV DISPBUF,#12H

MOV R0,#DISPBUF //最左边显示“-” ACALL DSPLY1 JMP SCANK

//=========================================== //8位显示

DSPLY1: MOV R2, #01111111B REDO: ACALL DISP MOV A, RR A

MOV R2, A

INC R0 XRL A, #01111111B JNZ REDO RET

;修改显示缓冲区地址指针 ;8位显示完否 ;未完,继续显示 ;返回

R2

;显示起始位置 ;显示1位

;计算下一个显示位置

//==========================================

;显示一位子程序

#LED_SEG

A A

;字型码表首地址 ;求显示数据的字型码

;输出字型码 ;显示 ;取显示位置 ;取显示数据

DISP: MOV DPTR, MOVC

MOV A, @R0 MOV SEG_OUT, MOV A, R2 MOV BIT_OUT, ACALL DL1MS

MOV A,#0FFH RET

;字型码表

A, @A+DPTR

;稳定显示1ms

MOV BIT_OUT,A

LED_SEG: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H ;'0,1,2,3,4,5,6,7' DB 7FH,6FH,77H,7CH,39H,5EH,79H,71H ;'8,9,A,B,C,D,E,F' DB 3EH, 50H, 40H, 08H, 00H ;'U, r, -, -, BLANK

12M时延时1ms

NOP NOP NOP

DJNZ R5,DEL RET

12M时延时20ms

DL1MS: MOV R5,#200; DEL:

DL20MS: MOV R7,#20; DEL00: ACALL DL1MS

DJNZ R7,DEL00 RET

CLRRAM: MOV @R0,#14H //不显示

INC R0

DJNZ R3,CLRRAM RET END

16. 简述A/D和的作用。

A/D把模拟量变成数字量。 D/A把数字量转换成模拟量。

17. 在检测系统中,通常采用均值滤波的方法来消除检测数据的随机干扰,即连续采样多次,取平均值作为测量值。采用ADC0809设计一个检测系统,对IN5通道接入的模拟采样8次,把它们的均值存放在30H单元。

8051ALEP0.7P0.6P0.5P0.4P0.3P0.2P0.1P0.074LS373D7GQ7D6Q6D5Q5D4Q4Q3D3Q2D2Q1D1Q0D0DQCPQADC0809CLOCK74LS74+5VA2A1A0ADDCADDBADDAD7D6D5D4D3D2D1D0IN0IN1IN2IN3IN4IN5IN6IN7REA八路模拟量输入WRP2.6RDINT1?1STARTALEVREF (+)OEEOCVREF(-)+5V?1

图9.12 题17的MCS-51单片机与ADC0809的接口电路

18. 采用ADC0809设计一个8路巡回检测系统,每隔50ms对8个回路检测1次,并把

采样值存储在40H开始的区域。系统晶振频率为12MHz。

接口电路与题17相同。程序流程图见图9.13。程序如下:

ORG 0000H LJMP START ORG 000BH

LJMP Timer0Interrupt

START:

MOV SP,#60H LCALL InitTimer0 MOV R0,#40H MOV R6,#00H

LOOP:

NOP

;置数据区首地址指针

;指向模拟量输入通道0,通道地址的低八位

LJMP LOOP

InitTimer0:

;定时器0,定时50ms

MOV TMOD, #01H MOV TH0, #3CH MOV TL0, #0B0H SETB EA SETB ET0 SETB TR0 RET

Timer0Interrupt:

PUSH DPH PUSH DPL PUSH ACC MOV TH0, #3CH MOV TL0, #0B0H MOV DPH, #0BFH MOV DPL,R6 MOVX @DPTR,A MOVX A,@DPTR MOV @R0,A INC R0 INC R6

;P2.6=0,通道地址的高八位

;模拟通道0 ;启动A/D 转换。 ;读A/D 转换结果 ;存转换结果 ;修改数据区指针 ;模拟通道地址加1 ;8个通道全采样完了吗?

开始设置DAC0832口地址启动AD转换AD转换完成?Y读取AD转换值存储AD转换值存储地址+1AD通道+1AD转换8次完成?YAD通道置0存储地址初始化返回NN图9.13 题18 程序流程图WAITAD: JB P3.3, WAITAD

CJNE R6,#08,EXIT MOV R6,#00H MOV R0,#40H

EXIT:

POP ACC

END

POP DPL POP DPH RETI

;8路巡检结束,重新采样模拟量输入通道IN0 ;重设数据区首地址指针

19. 采用2片ADC0809为8051单片机扩展16路模拟量输入通道。 图9.13 地址分析:

IC2:P2.7=1,P2.6=0,8个通道地址为: IN0:8000H; IN2:8002H; IN4:8004H; IN6:8006H;

IN1:8001H IN3:8003H IN5:8005H IN7:8007H

IC3:P2.7=0,P2.6=1,8个通道地址为:

IN0:4000H; IN2:4002H; IN4:4004H; IN6:4006H;

IC1IN1:4001H IN3:4003H IN5:4005H IN7:4007H

DALEP0.7 P0.6 P0.5 P0.4 P0.3 P0.2 P0.1 P0.0CP74LS373 D7GD6D5D4D3D2D1D0Q7Q6Q5Q4Q3Q2Q1 Q074LS74QQIC2CLOCKADC0809A2 A1 A0 ADDC ADDB ADDA D7D6D5D4D3D2D1D0 IN0 IN1 IN2 IN3 IN4 IN5 IN6 IN7 +5V R EA 8051 八路模拟量输入 WR P2.6 P2.7 RD INT1 ?1?1START ALEVREF (+) OE VREF(-)+5V ?1EOC IC3CLOCKADC0809ADDC ADDB ADDA D7D6D5D4D3D2D1D0 IN0 IN1 IN2 IN3 IN4 IN5 IN6 IN7 八路模拟量输入 ?1?1START ALEVREF (+) OE EOC VREF(-)+5V

图9.14 2片ADC0809为8051单片机接口电路图

20. 用8051单片机和DAC0832设计一个应用系统,输出连续的三角波。 接口电路和程序框图见图9.15。

ORG 0020H

MOV DPTR,#7FFFH LOOP: MOV R2,#0FFH MOV A,#00H LOOP1:MOVX @DPTR,A INC A

DJNZ R2,LOOP1 MOV R2,#0FEH LOOP2:DEC A

;指向0832

;循环次数 ;赋初值

;D/A转换输出

MOVX @DPTR,A DJNZ R2,LOOP2 ALMP LOOP END

开始设置DAC0832口地址设置DA转换数字量初值为0DA转换数字量输出DA转换数字量+1循环次数达到256次?DA转换数字量-1NMCS-51P0.7P0.6P0.5P0.4P0.3P0.2P0.1P0.0P2.7DAC0832DI7DI6DI5DI4DI3DI2DI1DI0CSXFERVccILEVrefRfbIout1Iout2AGND+5V-A+VoutDA转换数字量输出循环次数达到255次?YNWRWR1WR2DGND

(a)接口电路 (b)程序流程框图

图9.15 题20接口电路和程序流程框图

21. 用8051单片机和DAC0832设计一个应用系统,连续输出周期为5.12秒的三角波(提示:每10ms转换1次,三角波的周期等于定时时间×转换次数)。

接口电路如图9.15。程序框图见图9.16

开始Y三角波标志R7=0?NDA转换值R6 + 1NDA转换值等于0FFh?Y置三角波标志R7 = 1DA转换值R6 - 1DA转换值等于00h?Y置三角波标志R7 = 0N输出DA值输出DA值返回

图9.16 题21程序流程图

ORG 0000H LJMP START ORG 000BH

LJMP Timer0Interrupt

START: MOV SP, #60H

LCALL InitTimer0 MOV R6,#0

;定时初始化

;三角波DA转换值,起始值为0

MOV R7,#0

LOOP:

NOP NOP ALMP LOOP

InitTimer0:

MOV TMOD,#01H MOV TH0, #0D8H MOV TL0, #0F0H SETB EA SETB ET0 SETB TR0 RET

Timer0Interrupt:

MOV TH0, #0D8H MOV TL0, #0F0H

;三角波上升下降标志,0 = 上升,1 = 下降 ;主处理程序

CJNE R7, #0, LOOP1 INC R6

CJNE R6, #0FFH, LOOP01 MOV R7, #1

LOOP01: MOV DPTR, #7FFFH

MOV A, R6 MOVX @DPTR,A SJMP RET0

LOOP1: DEC R6

CJNE R6, #0, LOOP11 MOV R7, #0

LOOP11: MOV DPTR, #7FFFH

MOV A, R6 MOVX @DPTR,A SJMP RET0

RET0: END

RETI

;D/A转换输出

;指向0832

;D/A转换输出

;指向0832

22. 用8051单片机和DAC0832设计一个应用系统,输出占空比为50%的双极性方波,幅值在–5~+5V之间。

接口电路见图9.17,程序流程框图见图9.18。

根据图9.17接口电路的连接关系,可以推导出下列公式:

Vout??(2R2RVo1?Vref)??(2Vo1?Vref)R2R

程序流程框图见图9.17。

程序如下: ORG 1000H

START: MOV DPTR,#7FFFH

LOOP:

MOV A,#00H MOVX @DPTR,A CALL DELAY10MS MOV A,#0FFH MOV @DPTR,A CALL DELAY10MS JMP LOOP

8051P0.7P0.6P0.5P0.4P0.3P0.2P0.1P0.0P2.7DAC0832DI7DI6DI5DI4DI3DI2DI1DI0CSXFERVccILEVrefRfbIout1Iout2+5V2R2R-A+RVo1-A+VoutWRAGNDWR1WR2DGND

图9.17 接口电路图

开始设置DAC0832口地址DA转换数字量 = 0DA转换数字量输出延时10msDA转换数字量 = 0DA转换数字量输出延时10ms

图9.18 程序流程图

本文来源:https://www.bwwdw.com/article/22r2.html

Top