单片机常用外围设备接口电路_第1页
单片机常用外围设备接口电路_第2页
单片机常用外围设备接口电路_第3页
单片机常用外围设备接口电路_第4页
单片机常用外围设备接口电路_第5页
已阅读5页,还剩52页未读 继续免费阅读

下载本文档

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

文档简介

第9章常用外围设备接口电路本章要点:LED数码管及编码方式静态显示方式及其典型应用电路动态显示方式及其典型应用电路虚拟I2C总线串行显示电路键盘去抖动和连接、控制方式独立式按键及其接口电路矩阵式键盘及其接口电路并行A/DADC0809及其接口电路串行A/DADC0832及其接口电路I2C串行A/D典型应用电路DAC0832及其接口电路I2C串行D/A典型应用电路开关量驱动输出接口电路§0开关量驱动输出接口电路一、驱动发光二极管二、

驱动继电器三、光电隔离接口LED输出电路§1LED数码管显示接口一、LED数码管LED显示器的扩展(结构)LED数码管的结构:①共阳与共阴@

单片机系统扩展LED数码管时多用共阳LED:共阳数码管每个段笔画是用低电平(“0”)点亮的,要求驱动功率很小;而共阴数码管段笔画是用高电平(“0”)点亮的,要求驱动功率较大。@

通常每个段笔画要串一个数百欧姆的降压电阻。公共阳极hgfedcbaabcdgefh公共阴极hgfedcbaabcdgefhhgf……ahgf……a高电平点亮低电平点亮接高电平接地LED数码管的软件译码八段LED数码管段代码编码表(连线不同可有多种表):公共阳极hgfedcbaabcdgefh公共阴极hgfedcbaabcdgefhhgf……ahgf……a高电平点亮低电平点亮接高电平接地字形0123456789黑共阳0C00F90A40B09992820F880900FF共阴3F065B4F666D7D077F6F00LED数码管分类:按其内部结构可分为共阴型和共阳型;

按其外形尺寸有多种形式,使用较多的是0.5"和0.8";

按显示颜色也有多种形式,主要有红色和绿色;

正向压降一般为1.5~2V,额定电流为10mA,最大电流为40mA。静态显示时取10mA为宜,动态扫描显示,可加大脉冲电流,但一般不超过40mA。

按亮度强弱可分为超亮、高亮和普亮。二、LED数码管编码方式

表9-1共阴和共阳LED数码管几种八段编码表

显示数字共阴顺序小数点暗共阴逆序小数点暗共阳顺序小数点亮共阳顺序小数点暗

Dpgfedcba16进制abcdefgDp16进制0001111113FH11111100FCH40HC0H10000011006H0110000060H79HF9H2010110115BH11011010DAH24HA4H3010011114FH11110010F2H30HB0H40110011066H0110011066H19H99H5011011016DH10110110B6H12H92H6011111017DH10111110BEH02H82H70000011107H11100000E0H78HF8H8011111117FH11111110FEH00H80H9011011116FH11110110F6H10H90H【例9-1】已知显示数存在内RAM30H(高位)、31H中,试将其转换为5位共阴字段码(顺序),存在以30H(高位)为首址的内RAM中。⑴从显示数中分离出显示的每一位数字

方法是将显示数除以十进制的权显示数转换为显示字段码的步骤:⑵将分离出的显示数字转换为显示字段码

方法是查表SPRT:MOVR0,#30H;置万位BCD码间址

MOVA,30H;置被除数

MOVB,31H;MOVR6,#27H;置除数10000=2710HMOVR5,#10H;LCALLSUM;除以10000,万位商存30H,余数存A、BMOVR6,#03H;置除数1000=03E8HMOVR5,#0E8H;INCR0;指向千位商间址(31H)LCALLSUM;除以1000,千位商存31H,余数存A、BMOVR6,#0;置除数100

MOVR5,#100;INCR0;指向百位商间址(32H)LCALLSUM;除以100,百位商存32H,余数存A(B=0)MOVB,#10;置除数10DIVAB;除以10INCR0;指向十位商间址(33H)MOV@R0,A;十位商存33HXCHA,B;读个位数

INCR0;指向个位间址(34H)MOV@R0,A;个位存34HRET;解:连续调用下列二个子程序即可。⑴分离显示数字子程序说明:SUM是16位除以16位子程序:(A、B)÷(R6、R5)=商@R0,余数(A、B)。(参阅例4-9)⑵转换显示字段码子程序CHAG:MOVDPTR,#TAB

;置共阴字段码表首址

MOVR0,#30H

;置显示数据区首址CGLP:MOVA,@R0

;取显示数字

MOVCA,@A+DPTR

;读相应显示字段码

MOV@R0,A

;存显示字段码

INCR0

;指向下一显示数字

CJNER0,#35H,CGLP;判5个显示数字转换完否?未完继续

RET;转换完毕,结束TAB:DB3FH,06H,5BH,4FH,66H;共阴字段码表

DB6DH,7DH,07H,7FH,6FH;三、静态显示方式及其典型应用电路⑵动态显示方式,在某一瞬时显示一位,依次循环扫描,轮流显示,由于人的视觉滞留效应,人们看到的是多位同时稳定显示。

特点:占用I/O端线少,电路较简单,编程较复杂,CPU要定时扫描刷新显示。一般适用于显示位数较多的场合。LED数码管显示分类:静态显示方式和动态显示方式。⑴静态显示方式,每一位字段码分别从I/O控制口输出,保持不变直至CPU刷新。

特点:编程较简单,但占用I/O口线多,一般适用于显示位数较少的场合。LED显示器的扩展(显示方式)LED数码管的显示方式:③静态与动态动态显示特点:有闪烁,用元器件少,占I/O线少,必须扫描,花费CPU时间,编程复杂。(有多个LED时尤为突出)静态显示特点:无闪烁,用元器件多,占I/O线多,无须扫描,节省CPU时间,编程简单。静态显示:各数码管在显示过程中持续得到送显信号,与各数码管接口的I/O口线是专用的。动态显示:各数码管在显示过程中轮流得到送显信号,与各数码管接口的I/O口线是共用的。1、并行扩展静态显示电路

【例9-2】按图9-3编制显示子程序,显示数(≤255)存在内RAM30H中。

解:DIR1:MOVA,30H;读显示数

MOVB,#100;置除数

DIVAB;产生百位显示数字

MOVCA,@A+DPTR;读百位显示符

MOVDPTR,#0DFFFH;置74377(百位)地址

MOVX@DPTR,A;输出百位显示符

MOVA,B;读余数

MOVB,#10;置除数

DIVAB;产生十位显示数字

MOVDPTR,#TAB;置共阳字段码表首址

MOVCA,@A+DPTR;读十位显示符

MOVDPTR,#0BFFFH;置74377(十位)地址

MOVX@DPTR,A;输出十位显示符

MOVA,B;读个位显示数字

MOVDPTR,#TAB;置共阳字段码表首址

MOVCA,@A+DPTR;读个位显示符

MOVDPTR,#7FFFH;置74377(个位)地址

MOVX@DPTR,A;输出个位显示符

RET;TAB:DB0C0H,0F9H,0A4H,0B0H,99H;共阳字段码表

DB92H,82H,0F8H,80H,90H;2、串行扩展静态显示电路DIR2:MOVSCON,#00H;置串口方式0

CLRES;串口禁中

SETBP1.0;“与”门开,允许TXD发移位脉冲

MOVSBUF,30H;串行输出个位显示字段码

JNBTI,$;等待串行发送完毕

CLRTI;清串行中断标志

MOVSBUF,31H;串行输出十位显示字段码

JNBTI,$;等待串行发送完毕

CLRTI;清串行中断标志

MOVSBUF,32H;串行输出百位显示字段码

JNBTI,$;等待串行发送完毕

CLRTI;清串行中断标志

CLRP1.0;“与”门关,禁止TXD发移位脉冲

RET;【例9-3】按图9-4编制显示子程序,显示字段码已分别存在32H~30H内RAM中。解:要求:根据上图编写通过串行口和74LS164驱动共阳LED数码管查表显示的子程序。条件:系统有6个LED数码管,待显数据(00H—09H)已放在35H—30H单元中(分别对应十万位→个位),DSPLY:MOVDPTR,#TABLE;共阳LED数码管译码表首址

MOVR0,#30H;待显数据缓冲区的个位地址REDO:MOVA,@R0;通过R0实现寄存器间接寻址

MOVCA,@A+DPTR;查表

MOVSBUF,A;经串行口发送到74LS164JNBTI,$;查询送完一个字节的第8位?

CLRTI;为下一字节发送作准备

INCR0;R0指向下一个数据缓冲单元

CJNER0,#36H,REDO;判断是否发完6个数?

RET;发完6个数就返回TABLE:DB0C0H,0F9H,0A4H,0B0H,99H;共阳LED译码表

DB92H,82H,0F8H,80H,90H3、BCD码输出静态显示电路CD4511是“BCD码→七段共阴译码/驱动”IC;4511是4线-7段锁存/译码/驱动电路,能将BCD码译成7段显示符输出。图中:4511ABCD为0~9二进制数输入端(A是低位),abcdefg为显示段码输出端,LE为输入信号锁存控制(低电平有效),数码管为共阴数码管。

利用4511实现静态显示与一般静态显示电路不同,一是节省I/0端线,段码输出只需4根;二是不需专用驱动电路,可直接输出;三是不需译码,直接输出二进制数,编程简单;缺点是只能显示数字,不能显示各种符号。

解:编程如下:DIR3:MOVP1,#11100000B;选通个位

ORLP1,30H;输出个位显示数

MOVP1,#11010000B;选通十位

ORLP1,31H;输出十位显示数

MOVP1,#10110000B;选通百位

ORLP1,32H;输出百位显示数

RET;【例9-4】按图9-5试编制显示子程序(小数点固定在第二位),已知显示数存在内RAM30H~32H中。动态显示电路连结形式:①显示各位的所有相同字段线连在一起,共8段,由一个8位I/O口控制;②每一位的公共端(共阳或共阴COM)由另一个I/O口控制。四、动态显示方式及其典型应用电路LED数码管动态显示举例P1.5P1.4P1.3P1.2P1.2P1.0P0.7P0.6P0.5P0.4P0.3P0.2P0.1P0.07406OC门X3上拉电阻×14+5VAT89C51工作原理:从P0口送段代码,P1口送位选信号。段码虽同时到达6个LED,但一次仅一个LED被选中。利用“视觉暂留”,每送一个字符并选中相应位线,延时一会儿,再送/选下一个……循环扫描即可。共阴数码管位选线段代码P1.5P1.4P1.3P1.2P1.2P1.0P0.7P0.6P0.5P0.4P0.3P0.2P0.1P0.07406OC门X3+5VAT89C51位选线段代码要求:此处为共阴数码管,P0口送段代码,P1口送位选信号。通过查表实现动态显示。条件:待显数据(00H—09H)已放在:7FH—7AH单元中(分别对应十万位~个位)说明:由于用了反相驱动器7406,要用共阳译码表。共阴数码管上拉电阻×147406OC门X3+5V(7FH)(7EH)(7DH)(7CH)(7BH)(7AH)十万万位千位百位十位个位数据缓冲区/显示缓冲区P0口送段代码,P1口送位选信号。待显数据已经放在:7FH—7AH单元(分别对应十万位→个位)使用共阳译码表。DIR:MOVDPTR,#DSEG

;数码管译码表首址

MOVR0,#7AH;待显缓冲区个位地址

MOVR3,#01H;个位的位选信号=01HLD1:MOVA,@R0;通过R0间接寻址

MOVCA,@A+DPTR

;查表

MOVP0,A

;字段码送到P0口

MOVP1,R3;字位选择送到P1口

LCALLDELY

;调延时1ms子程序

INCR0;R0指向下一字节

MOVA,R3JBACC.5,LD2

;判是否发完6个数?

RLA;R1指向下一个位

MOVR3,A;位选信号存回R1SJMPLD1

;跳去再显示下一个数LD2:

RET;发完6个数就返回DSEG:DB0C0H,0F9H,0A4H,0B0H,99H;共阳译码表

DB92H,82H,0F8H,80H,90HP0口送段代码,P1口送位选信号。待显数据已经放在:7FH—7AH单元(分别对应十万位→个位)使用共阳译码表。动态显示举例(循环显示“8”的实验)实验箱从P0口扩展了两个8位的简单I/O口:

一个送段代码(字形状),地址是0DCH;

一个送位选信号(字位置),地址是0DDH。

ORG0000H

MOVR0,#0DCH;指向字形口

MOVA,#80H;送“8”的字形代码

MOVX@R0,A;输出字形代码

MOVR1,#0DDH

;指向字位口

MOVA,#20H

;从最高位开始

LEDO:

MOVX@R1,A

;输出字位代码

ACALLDEYS

;调延时子程序

RRA

;右移一位

SJMPLEDO

;循环显示“8”1、共阴型8位动态显示电路DIR4:MOVR2,#10;置循环扫描次数

MOVDPTR,#7FFFH;置74377口地址DLP1:ANLP1,#11111000B;第0位先显示

MOVR0,#30H;置显示字段码首址DLP2:MOVA,@R0;读显示字段码

MOVX@DPTR,A;输出显示字段码

LCALLDY2ms;调用延时2ms子程序(参阅例4.13)

INCR0;指向下一位字段码

INCP1;选通下一位显示

CJNER0,#38H,DLP2;判8位扫描显示完否?未完继续

DJNZR2,DLP1;8位扫描显示完毕,判10次循环完否?

CLRA;10次循环完毕,显示暗

MOVX@DPTR,A;RET;子程序返回【例9-5】按图9-7,试编制循环扫描(10次)显示子程序,已知显示字段码存在以30H(低位)为首址的8字节内RAM中。解:编程如下:2、共阳型3位动态显示电路DIR5:MOVDPTR,#0BFFFH;置74377地址

MOVR2,#100;置循环显示次数DIR50:SETBP1.2;百位停显示

MOVA,40H;取个位字段码

MOVX@DPTR,A;输出个位字段码

CLRP1.0;个位显示

LCALLDY2ms;调用延时2ms子程序(参阅例4.13)DIR51:SETBP1.0;个位停显示

MOVA,41H;取十位字段码

MOVX@DPTR,A;输出十位字段码

CLRP1.1;十位显示

LCALLDY2ms;延时2msDIR52:SETBP1.1;十位停显示

MOVA,42H;取百位字段码

MOVX@DPTR,A;输出百位字段码

CLRP1.2;百位显示

LCALLDY2ms;延时2msDJNZR2,DIR50;判循环显示结束否?未完继续

ORLP1,#00000111B;3位灭显示

RET;【例9-6】根据图9-8电路,试编制3位动态扫描显示程序(循环100次),已知显示字段码存在以40H(低位)为首址的3字节内RAM中。解:编程如下:1、SAA1064引脚功能五、虚拟I2C总线串行显示电路①VDD、VEE:电源、接地端。电源4.5~15V;②P1~P16:段驱动输出端。分为两个8位口:P1~P8;P9~P16。P8、P16为高位。口锁存器具有反相功能,置1时,端口输出0。③MX1、MX2:位码驱动端。静态显示驱动时,一片SAA1064可驱动二位LED数码管;动态显示驱动时,按图9-10连接方式,一片SAA1064可驱动四位LED数码管;④SDA、SCL:I2C总线数据端、时钟端;⑤CEXT:时钟振荡器外接电容,典型值2700pF⑥ADR:地址引脚端。SAA1064引脚地址A1、A0采用ADR模拟电压比较编址。当ADR引脚电平为0、3VDD/8,5VDD/8、VDD时,相应引脚地址A2、A1、A0分别为000、001、010、011;2、硬件电路设计

⑴片内寄存器

符号COMdata1data2data3data4装载内容控制命令显示段码1显示段码2显示段码3显示段码4片内地址00H01H02H03H04H3、片内可编程功能⑵控制命令COMCOMD7D6D5D4D3D2D1D000H—C6C5C4C3C2C1C0CO:静动态控制,C0=1,动态显示,动态显示时,data1、data2轮流从P8~P1输出,data3、data4轮流从P16~P9输出;C1:显示位1、3亮暗选择,C1=1,选择亮;C2:显示位2、4亮暗选择,C2=1,选择亮;C3:测试位,C3=1,所有段亮;C4、C5、C6:驱动电流控制位,C4、C5、C6分别为1时,驱动电流分别为3mA、6mA、12mA;C4、C5、C6全为1时,驱动电流最大,可达21mA。⑶写数据操作格式

SSLAWASADRACOMAdata1Adata2Adata3Adata4AP

红色部分由80C51发送,SAA1064接收;黑色部分由SAA1064发送,80C51接收。SLAW为写SAA1064寻址字节,按图9-10所示连接电路:SAA1064(1)SLAW=01110000B;SAA1064(2)SLAW=01110110B。其中0111(D7~4)为SAA1064器件地址,

D3~1为A2A1A0寻址字节,末位D0为R/W;SADR为片内寄存器地址;COM为控制命令。解:VSAA:MOVMTD,#00H;置SAA1064控制命令寄存器COM片内子地址

MOV31H,#01000111B;置控制命令字,动态显示,驱动电流12mAMOVNUMB,#6;置发送数据数:SADR+COM+data1~4=6SAA1:MOVRO,#51H;将51H~54H显示符数据移至32H~35HLCALLMOVB;MOVSLA,#01110000B;置SAA1064(1)写寻址字节SLAWLCALLWRNB;发送给SAA1064(1)SAA2:MOVR0,#55H;将55H~58H显示符数据移至32H~35H

LCALLMOVB;MOVSLA,#01110110B;置SAA1064(2)寻址字节SLAWLCALLWRNB;发送给SAA1064(2)RET;MOVB:MOVR1,#32H;显示符数据移至32H~35H子程序MOVB1:MOVA,@R0;读出

MOV@R1,A;存入

INCRO;指向下一读出单元

INCR1;指向下一存入单元

CJNER1,#36H,MOVB1;判4个数据移完否?未完继续

RET;【例9-7】已知8位显示符(共阴编码)已依次存入内RAM51H~58H中,试按图9-10编程将其输入SAA1064(1),(2)动态显示,驱动电流为12mA。设VIIC软件包已装入ROM,VSDA.VSCL.SLA.NUMB.MTD.MRD均已按8.3.2软件包小结中协议定义。4、程序设计1、按键开关去抖动问题

§2键盘接口一、键盘接口概述键盘的抖动时间一般为5~10ms,抖动现象会引起CPU对一次键操作进行多次处理,从而可能产生错误。⑴

硬件去抖动

消除抖动不良后果的方法:其中RC滤波电路去抖动电路简单实用,效果较好。⑵软件去抖动检测到按键按下后,执行延时10ms子程序后再确认该键是否确实按下,消除抖动影响。2、按键连接方式

独立式按键

独立式按键是每个按键占用一根I/O端线。

特点:

①各按键相互独立,电路配置灵活;

②按键数量较多时,I/O端线耗费较多,电路结构繁杂;

③软件结构简单。

适用于按键数量较少的场合。

⑵矩阵式键盘

I/O端线分为行线和列线,按键跨接在行线和列线上,按键按下时,行线与列线发生短路。

特点:

①占用I/O端线较少;

②软件结构教复杂。

适用于按键较多的场合。3、键盘扫描控制方式

⑴程序控制扫描方式键处理程序固定在主程序的某个程序段。

特点:对CPU工作影响小,但应考虑键盘处理程序的运行间隔周期不能太长,否则会影响对键输入响应的及时性。

⑵定时控制扫描方式利用定时/计数器每隔一段时间产生定时中断,CPU响应中断后对键盘进行扫描。

特点:与程序控制扫描方式的区别是,在扫描间隔时间内,前者用CPU工作程序填充,后者用定时/计数器定时控制。定时控制扫描方式也应考虑定时时间不能太长,否则会影响对键输入响应的及时性。

⑶中断控制方式中断控制方式是利用外部中断源,响应键输入信号。

特点:克服了前两种控制方式可能产生的空扫描和不能及时响应键输入的缺点,既能及时处理键输入,又能提高CPU运行效率,但要占用一个宝贵的中断资源。1、按键直接与I/O口连接

二、独立式按键及其接口电路【例9-8】按图9-13(a)、(b),试分别编制按键扫描子程序。解:按图9-13(a)编程如下:KEYA:ORLP1,#07H;置P1.0~P1.2为输入态

MOVA,P1;读键值,键闭合相应位为0CPLA;取反,键闭合相应位为1ANLA,#00000111B;屏蔽高5位,保留有键值信息的低3位

JZGRET;全0,无键闭合,返回

LCALLDY10ms;非全0,有键闭合,延时10ms,软件去抖动

MOVA,P1;重读键值,键闭合相应位为0CPLA;取反,键闭合相应位为1ANLA,#00000111B;屏蔽高5位,保留有键值信息的低3位

JZGRET;全0,无键闭合,返回;非全0,确认有键闭合

JBAcc.0,KA0;转0#键功能程序

JBAcc.1,KA1;转1#键功能程序

JBAcc.2,KA2;转2#键功能程序GRET:RETKA0:LCALLWORK0;执行0#键功能子程序

RETKA1:LCALLWORK1;执行1#键功能子程序

RETKA2:LCALLWORK2;执行2#键功能子程序

RET按图9-13(b)编程如下:

KEYB:ORLP1,#07H;置P1.0~P1.2为输入态

MOVA,P1;读键值,键闭合相应位为1ANLA,#00000111B;屏蔽高5位,保留有键值信息的低3位

JZGRET;全0,无键闭合,返回

LCALLDY10ms;非全0,有键闭合,延时10ms,软件去抖动

MOVA,P1;重读键值,键闭合相应位为1ANLA,#00000111B;屏蔽高5位,保留有键值信息的低3位

JZGRET;全0,无键闭合,返回;非全0,确认有键闭合

JBAcc.0,KB0;转0#键功能程序

JBAcc.1,KB1;转1#键功能程序

JBAcc.2,KB2;转2#键功能程序GRET:RETKB0:LCALLWORK0;执行0#键功能子程序

RETKB1:LCALLWORK1;执行1#键功能子程序

RETKB2:LCALLWORK2;执行2#键功能子程序

RET⑴按键与并行扩展I/O口连接

2、按键与扩展I/O口连接【例9-9】按图9-14,试编制按键扫描子程序,将键信号存入内RAM30H。解:编程如下:KEY99:MOVDPTR,#7FFFH;置74373口地址

MOVXA,@DPTR;输入键信号(“0”有效)

MOV30H,A;存键信号数据

RET;参阅8.2.4,图8-6,【例8-2】。⑵按键与串行扩展I/O口连接三、矩阵式键盘及其接口电路

【例9-10】按图9-15及图9-16,试编制矩阵式键盘扫描程序。

解:KEY:MOVP1,#0F0H;行线置低电平,列线置输入态KEY0:MOVA,P1;读列线数据

CPLA;数据取反,“1”有效

ANLA,#0F0H;屏蔽行线,保留列线数据

MOVR1,A;存列线数据(R1高4位)JZGRET;全0,无键按下,返回KEY1:MOVP1,#0FH;行线置输入态,列线置低电平

MOVA,P1;读行线数据

CPLA;数据取反,“1”有效

ANLA,#0FH;屏蔽列线,保留行线数据

MOVR2,A;存行线数据(R2低4位)JZGRET;全0,无键按下,返回

JBCF0,WAIT;已有消抖标志,转

SETBF0;无消抖标志,置消抖标志

LCALLDY10ms;调用10ms延时子程序(参阅例4.13),消抖

SJMPKEY0;重读行线列线数据GRET:RET;WAIT:MOVA,P1;等待按键释放

CPLA;ANLA,#0FH;JNZWAIT;按键未释放,继续等待KEY2:MOVA,R1;取列线数据(高4位)MOVR1,#03H;取列线编号初值

MOVR3,#03H;置循环数

CLRC;KEY3:RLCA;依次左移入C中

JCKEY4;C=1,该列有键按下,(列线编号存R1)DECR1;C=0,无键按下,修正列编号

DJNZR3,KEY3;判循环结束否?未结束继续寻找有键按下的列线KEY4:MOVA,R2;取行线数据(低4位)MOVR2,#00H;置行线编号初值

MOVR3,#03H;置循环数

CLRC;KEY5:RRCA;依次右移入C中

JCKEY6;C=1,该行有键按下,(行线编号存R2)INCR2;C=0,无键按下,修正行线编号

DJNZR3,KEY5;判循环结束否?未结束继续寻找有键按下的行线KEY6:MOVA,R2;取行线编号

CLRC;RLCA;行编号×2RLCA;行编号×4ADDA,R1;行编号×4+列编号=按键编号KEY7:CLRC;RLCA;按键编号×2RLCA;按键编号×4(LCALL+RET共4字节)MOVDPTR,#TABJ;JMP@A+DPTR;散转,执行相应键功能子程序TABJ:LCALLWORK0;调用执行0#键功能子程序

RET;LCALLWORK1;调用执行1#键功能子程序

RET;……LCALLWORK15;调用执行15#键功能子程序

RET;【例9-11】按图9-17,试编制中断方式键盘扫描程序,将键盘序号存入内RAM30H。

ORG0000H;复位地址

LJMPSTAT;转初始化

ORG0003H;中断入口地址

LJMPPINT0;转中断服务程序

ORG0100H;初始化程序首地址STAT:MOVSP,#60H;置堆栈指针

SETBIT0;置为边沿触发方式

MOVIP,#00000001B;置为高优先级中断

MOVP1,#00001111B;置P1.0~P1.3置为输入态,置P1.4~P1.7输出0SETBEA;CPU开中

SETBEX0;开中

LJMPMAIN;转主程序,并等待有键按下时中断解:

OGR2000H;中断服务程序首地址PINT0:PUSHAcc;保护现场

PUSHPSW;MOVA,P1;读行线(P1.0~P1.3)数据

CPLA;数据取反,“1”有效

ANLA,#0FH;屏蔽列线,保留行线数据

MOVR2,A;存行线(P1.0~P1.3)数据(R2低4位)MOVP1,#0F0H;行线置低电平,列线置输入态

MOVA,P1;读列线(P1.4~P1.7)数据

CPLA;数据取反,“1”有效

ANLA,#0F0H;屏蔽行线,保留列线数据(A中高4位)MOVR1,#03H;取列线编号初值

MOVR3,#03H;置循环数

CLRC;PINT01:RLCA;依次左移入C中

JCPINT02;C=1,该列有键按下,(列线编号存R1)DECR1;C=0,无键按下,修正列编号

DJNZR3,PINT01;判循环结束否?未结束继续寻找有键按下列线PINT02:MOVA,R2;取行线数据(低4位)MOVR2,#00H;置行线编号初值

MOVR3,#03H;置循环数PINT03:RRCA;依次右移入C中

JCPINT04;C=1,该行有键按下,(行线编号存R2)INCR2;C=0,无键按下,修正行线编号

DJNZR3,PINT03;判循环结束否?未结束继续寻找有键按下行线PINT04:MOVA,R2;取行线编号

CLRC;RLCA;行编号×2RLCA;行编号×4ADDA,R1;行编号×4+列编号=按键编号

MOV30H,A;存按键编号

POPPSW;POPAcc;RETI;§9-3A/D转换接口电路一、A/D转换的基本概念

A/D转换的功能是把模拟量电压转换为N位数字量。设D为N位二进制数字量,UA为电压模拟量,UREF为参考电压,无论A/D或D/A,其转换关系为:UA=D×UREF/2N

(其中:D=D0×20+D1×21+…+DN-1×2N-1)1、A/D转换器的主要性能指标:

⑴转换精度。转换精度通常用分辨率和量化误差来描述。

①分辨率。分辨率=UREF/2N

表示输出数字量变化一个相邻数码所需输入模拟电压的变化量。N为A/D转换的位数,N越大,分辨率越高,习惯上分辨率常以A/D转换位数N表示。

②量化误差。量化误差是指零点和满度校准后,在整个转换范围内的最大误差。

⑵转换时间。指A/D转换器完成一次A/D转换所需时间。转换时间越短,适应输入信号快速变化能力越强。2、A/D转换器分类

A/D转换器分类:

按转换原理形式可分为逐次逼近式、双积分式和V/F变换式;

按信号传输形式可分为并行A/D和串行A/D。二、并行A/DADC0809及其接口电路

1、引脚功能和典型连接电路

⑴IN0~IN7:8路模拟信号输入端。

⑵C、B、A:8路模拟信号转换选择端。与低8位地址中A0~A2连接。由A0~A2地址000~111选择IN0~IN7八路A/D通道。

⑶CLK:外部时钟输入端。时钟频率高,A/D转换速度快。允许范围为10~1280KHz。通常由80C51ALE端直接或分频后与0809CLK端相连接。

⑷D0~D7:数字量输出端。

⑸OE:A/D转换结果输出允许控制端。

OE=1,允许将A/D转换结果从D0~D7端输出。通常由80C51的端与0809片选端(例如P2.0)通过或非门与0809OE端相连接。

⑹ALE:地址锁存允许信号输入端。

0809ALE信号有效时将当前转换的通道地址锁存。

⑺START:启动A/D转换信号输入端。当START端输入一个正脉冲时,立即启动0809进行A/D转换。START端与ALE端连在一起,由80C51WR与0809片选端(例如P2.0)通过或非门相连。

⑻EOC:A/D转换结束信号输出端,高电平有效。

⑼UREF(+)、UREF(-):正负基准电压输入端。

⑽Vcc:正电源电压(+5V)。GND:接地端。2、ADC0809应用实例

⑴中断方式

【例9-12】按图9-20,用中断方式对8路模拟信号依次A/D转换一次,并把结果存入以30H为首址的内RAM中,试编制程序。

解:

ORG0000H;复位地址

LJMPSTAT;转初始化程序

ORG0013H;中断服务子程序入口地址

LJMPPINT1;中断,转中断服务子程序;

ORG0100H;初始化程序首地址

STAT:MOVR1,#30H;置数据区首址

MOVR7,#8;置通道数

SETBIT1;置边沿触发方式

SETBEX1;开中

SETBEA;CPU开中

MOVDPTR,#0FEF8H;置0809通道0地址

MOVX@DPTR,A;启动0通道A/D

LJMPMAIN;转主程序,并等待A/D中断

ORG0200H;中断服务子程序首地址PINT1:PUSHAcc;保护现场

PUSHPSW;MOVXA,@DPTR;读A/D值

MOV@R1,A;存A/D值

INCDPTR;修正通道地址

INCR1;修正数据区地址

MOVX@DPTR,A;启动下一通道A/DDJNZR7,GORETI;判8路采集完否?未完继续

CLREX1;8路采集已完,关中GORETI:POPPSW;恢复现场

POPAcc;RETI;中断返回⑵查询方式工作在查询方式时,0809EOC端可不必通过反相器与或相连,直接与80C51P1口或P3口中任一端线相连。【例9-13】图9-20中,用P1.0直接与0809EOC端相连,试用查询方式编制程序,对8路模拟信号依次A/D转换一次,并把结果存入以40H为首址的内RAM中。解:MAIN:MOVR1,#40H;置数据区首址

MOVR7,#8;置通道数

SETBP1.0;置P1.0输入态

MOVDPTR,#0FEF8H;置0809通道0地址LOOP:MOVX@DPTR,A;启动A/DJNBP1.0,$;查询A/D转换结束否?未完继续查询等待

MOVXA,@DPTR;A/D已结束,读A/D值

MOV@R1,A;存A/D值

INCDPTR;修改通道地址

INCR1;修改数据区地址

DJNZR7,LOOP;判8路采集完否?未完继续

RET;8路采集完毕,返回⑶延时等待方式工作在延时等待方式时,0809EOC端可不必与80C51相连,是根据时钟频率计算出A/D转换时间,略微延长后直接读A/D转换值。【例9-14】图9-20中,0809EOC端开路,fosc=6MHz,试用延时等待方式编制程序,对8路模拟信号依次A/D转换一次,并把结果存入以50H为首址的内RAM中。解:编程如下:MAIN:MOVR1,#50H;置数据区首址

MOVR7,#8;置通道数

MOVDPTR,#0FEF8H;置0809通道0地址LOOP:MOVX@DPTR,A;启动A/DMOVR6,#17;DJNZR6,$;延时68S:2机周×17=34机周,2S×34=68SMOVXA,@DPTR;读A/D值

MOV@R1,A;存A/D值

INCDPTR;修正通道地址

INCR1;修正数据区地址

DJNZR7,LOOP;判8路采集完否?未完继续

RET;8路采集完毕,返回三、串行A/DADC0832及其接口电路

ADC0832是8位串行A/D转换器;转换速度较高(250KHz时转换时间32s);单电源供电,功耗低(15mw)。1、引脚功能

VDD、VSS:电源接地端,VDD同时兼任UREF;

CS:片选端,低电平有效;

DI:数据信号输入端;

DO:数据信号输出端;

CLK:时钟信号输入端,要求低于600KHz;

CH0、CH1:模拟信号输入端(双通道);2、典型应用电路

P1.0片选CS;

TXD发送时钟信号输入ADC0832CLK;

RXD与DI、DO端连接在一起。编码通道选择CH0CH100

+-01

-+10

+11

+表9-33、串行A/D转换工作时序

工作时序分为二个阶段:⑴起始和通道配置,由CPU发送,从ADC0832DI端输入;⑵A/D转换数据串行输出,由ADC0832从DO端输出,CPU接收。4、软件编程【例9-15】按图9-21(b)电路,试编制程序,将CH0、CH1通道输入的模拟信号A/D转换,分别存入30H31H中。解:AD0832:MOVSCON,#00H;置串口方式0,禁止接收

CLRES;串口禁中

MOVR0,#30H;置A/D数据存储区首址

CLRP1.0;片选0832

MOVA,#06H;置CH0通道配置ADC0:MOVSBUF,A;启动A/DADC1:JNBTI,ADC1;串行发送启动及通道配置信号

CLRTI;清发送中断标志

SETBREN;允许(启动)串行接收ADC2:JNBRI,ADC2;接收第一字节

CLRRI;清接收中断标志,同时启动接收第二字节

MOVA,SBUF;读第一字节数据

MOVB,A;暂存说明:①接收第一字节的8位数据为(注意先接收低位D4):②清串行接收中断标志后,启动串行接收第二字节,其数据为:③组合后的8位数据为:

④高低4位互换后的8位数据为:

ADC3:JNBRI,ADC3;接收第二字节

CLRRI;清接收中断标志

MOVA,SBUF;读第二字节数据

ANLA,#0FH;第二字节屏蔽高4位

ANLB,#0FOH;第一字节屏蔽低4位

ORLA,B;组合

SWAPA;高低4位互换,组成正确的A/D数据

MOV@R0,A;存A/D数据

INCR0;指向下一存储单元

MOVA,#0EH;置CH1通道配置

CJNER0,#32H,ADC0;判两通道A/D完毕否?未完继续

CLRREN;两通道A/D完毕,禁止接收

SETBP1.0;清0832片选

RET;D3D2D1D0D1D2D3D4××××D7D6D5D4D3D2D1D0D7D6D5D4D7D6D5D4D3D2D1D0四、I2C串行A/D典型应用电路

I2C串行A/D芯片PCF8591,同时具有A/D、D/A转换功能。

1、PCF8591引脚功能

SDA、SCL:I2C总线数据线、时钟线;

A2、A1、A0:引脚地址输入端;

AIN0~AIN3:模拟信号输入端,

OSC:外部时钟输入端,内部时钟输出端;

EXT:内外部时钟选择端,EXT=0时选择内部时钟;

VDD、VSS:电源、接地端;

AGND:模拟信号地;

UREF:基准电压输入端;

AOUT:D/A转换模拟量输出端;

该芯片既可用于A/D转换(模拟信号从AIN0~AIN3输入),又可用于D/A转换(D/A转换模拟量从AOUT输出),器件地址为1001,若A2A1A0接地,D/A转换写寻址字节SLAW=90H,A/D转换读寻址字节SLAR=91H。2、硬件电路设计3、片内可编程功能

控制命令字

PCF8591内部有一个控制寄存器,用来存放控制命令,其格式如下:COMD7D6D5D4D3D2D1D0D1、D0:A/D通道编号

00:通道0;01:通道1;10:通道2;11:通道3;D2:自动增量选择

D2=1时,A/D转换将按通道0~3依次自动转换;D3、D7:必须为0;D5、D4:模拟量输入方式选择位:

00:输入方式0(四路单端输入);

01:输入方式1(三路差分输入);

10:输入方式2(二路单端一路差分输入);

11:输入方式3(二路差分输入)。D6:模拟输出允许。D6=1,模拟量输出有效;①输入方式0(四路单端输入):

ANI0——通道0(单端输入)

ANI1——通道1(单端输入)

ANI2——通道2(单端输入)

ANI3——通道3(单端输入)②输入方式1(三路差分输入):

③输入方式2(二路单端一路差分输入):

④输入方式3(二路差分输入):⑵ADC数据操作格式SSLAWACOMASSLARAData0AData1A

发出控制命令(写操作)

A/D转换(读操作)其中红色部分由80C51发送,PCF8591接收;黑色部分由PCF8591发送,80C51接收;4、软件编程

【例9-16】按图9-23(b)编程将AIN0~AIN34个通道的模拟信号A/D转换后,依次存入以50H为首址的内RAM中。设VIIC软件包已装入ROM,VSDA、VS

温馨提示

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

最新文档

评论

0/150

提交评论