490 likes | 628 Views
单片机接口及 C 程序设计. 广东机电职业技术学院 智能电子教研室. 模块四 扩展接口模块. 4.1 键盘接口电路. 4.1.1 键盘控制原理. 1 、 按键开关去抖动问题. 一、 键盘接口概述. 键盘的抖动时间一般为 5 ~ 10ms , 抖动现象会引起 CPU 对一次键操作进行多次处理,从而可能产生错误 。. 消除抖动不良后果的方法:. ⑴ 硬件去抖动. 其中 RC 滤波电路去抖动电路简单实用,效果较好 。. ⑵ 软件去抖动 检测到按键按下后,执行 延时 10ms 子程序后再确认 该键是否确实按下,消除抖动影响。.
E N D
单片机接口及C程序设计 广东机电职业技术学院 智能电子教研室
模块四 扩展接口模块 4.1 键盘接口电路 4.1.1 键盘控制原理 1、按键开关去抖动问题 一、键盘接口概述 键盘的抖动时间一般为5~10ms,抖动现象会引起CPU对一次键操作进行多次处理,从而可能产生错误。
消除抖动不良后果的方法: ⑴硬件去抖动 其中RC滤波电路去抖动电路简单实用,效果较好。 ⑵ 软件去抖动 检测到按键按下后,执行延时10ms子程序后再确认该键是否确实按下,消除抖动影响。
2、按键连接方式⑴ 独立式按键独立式按键是每个按键占用一根I/O端线。 特点:①各按键相互独立,电路配置灵活;②按键数量较多时,I/O端线耗费较多,电路结构繁杂;③软件结构简单。适用于按键数量较少的场合。 ⑵ 矩阵式键盘I/O端线分为行线和列线,按键跨接在行线和列线上,按键按下时,行线与列线发生短路。特点:①占用I/O端线较少;②软件结构教复杂。适用于按键较多的场合。
3、键盘扫描控制方式 ⑴ 程序控制扫描方式 键处理程序固定在主程序的某个程序段。 特点:对CPU工作影响小,但应考虑键盘处理程序的运行间隔周期不能太长,否则会影响对键输入响应的及时性。 ⑵ 定时控制扫描方式 利用定时/计数器每隔一段时间产生定时中断,CPU响应中断后对键盘进行扫描。 特点:与程序控制扫描方式的区别是,在扫描间隔时间内,前者用CPU工作程序填充,后者用定时/计数器定时控制。定时控制扫描方式也应考虑定时时间不能太长,否则会影响对键输入响应的及时性。 ⑶ 中断控制方式 中断控制方式是利用外部中断源,响应键输入信号。 特点:克服了前两种控制方式可能产生的空扫描和不能及时响应键输入的缺点,既能及时处理键输入,又能提高CPU运行效率,但要占用一个宝贵的中断资源。
4.1.2 硬盘电路硬件制作和软件编程 1、按键直接与I/O口连接
2、按键与扩展I/O口连接 ⑴ 按键与并行扩展I/O口连接
数码管的测试 1、程序
4.2 A/D、D/A转换 4.2.1 A/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/D ADC0809及其接口电路
1、引脚功能和典型连接电路 ⑴ IN0~IN7:8路模拟信号输入端。 ⑵ C、B、A:8路模拟信号转换选择端。 与低8位地址中A0~A2连接。由A0~A2地址000~111选择IN0~IN7八路A/D通道。 ⑶ CLK:外部时钟输入端。 时钟频率高,A/D转换速度快。允许范围为10~1280KHz 。 通常由80C51 ALE端直接或分频后与0809 CLK端相连接。 ⑷ D0~D7:数字量输出端。 ⑸ OE:A/D转换结果输出允许控制端。 OE=1,允许将A/D转换结果从D0~D7端输出。通常由80C51的端与0809片选端(例如P2.0)通过或非门与0809 OE端相连接。 ⑹ ALE:地址锁存允许信号输入端。 0809 ALE信号有效时将当前转换的通道地址锁存。 ⑺ START:启动A/D转换信号输入端。 当START端输入一个正脉冲时,立即启动0809进行A/D转换。START端与ALE端连在一起,由80C51WR与0809片选端(例如P2.0)通过或非门相连。 ⑻ EOC:A/D转换结束信号输出端,高电平有效。 ⑼ UREF(+)、UREF(-):正负基准电压输入端。 ⑽ Vcc:正电源电压(+5V)。GND:接地端。
其中: IN0~IN7:8路模拟量输入端。 D0~D7:8位数字量输出端。 ADDA、ADDB、ADDC:3位地址输入线,用于选择8路模拟通道中的一路,选择情况见表。 ALE:地址锁存允许信号,输入,高电平有效。 START:A/D转换启动信号,输入,高电平有效。
EOC:A/D转换结束信号,输出。当启动转换时,该引脚为低电平,当A/D转换结束时,该线脚输出高电平。EOC:A/D转换结束信号,输出。当启动转换时,该引脚为低电平,当A/D转换结束时,该线脚输出高电平。 OE:数据输出允许信号,输入,高电平有效。当转换结束后,如果从该引脚输入高电平,则打开输出三态门,输出锁存器的数据从D0~D7送出。 CLK:时钟脉冲输入端。要求时钟频率不高于640KHZ. REF+、REF-:基准电压输入端。 Vcc:电源,接+5V电源。 GND:地。 三.ADC0809的工作流程
C语言编程: #include <reg51.h> #include <absacc.h> //定义绝对地址访问 #define uchar unsigned char #define IN0 XBYTE[0x0000] //定义IN0为通道0的地址 static uchar data x[8]; //定义8个单元的数组,存放结果 uchar xdata *ad_adr; //定义指向通道的指针 uchar i=0; void main(void) { IT0=1; //初始化 EX0=1; EA=1; i=0; ad_adr=&IN0; //指针指向通道0 *ad_adr=i; //启动通道0转换 for (;;) {;} //等待中断 }
void int_adc(void) interrupt 0 //中断函数 { x[i]=*ad_adr; //接收当前通道转换结果 i++; ad_adr++; //指向下一个通道 if (i<8) { *ad_adr=i; //8个通道未转换完,启动下一个通道返回 } else { EA=0;EX0=0; //8个通道转换完,关中断返回 } }
三、串行A/D ADC0832及其接口电路 ADC 0832是8位串行A/D转换器; 转换速度较高(250KHz时转换时间32s); 单电源供电,功耗低(15mw)。
表9-3 1、引脚功能 VDD、VSS:电源接地端,VDD同时兼任UREF; CS:片选端,低电平有效; DI:数据信号输入端; DO:数据信号输出端; CLK:时钟信号输入端,要求低于600KHz; CH0、CH1:模拟信号输入端(双通道); 2、典型应用电路 P1.0片选CS; TXD发送时钟信号输入ADC0832 CLK; RXD与DI、DO端连接在一起。
3、串行A/D转换工作时序 工作时序分为二个阶段: ⑴ 起始和通道配置,由CPU发送,从ADC0832 DI端输入; ⑵ A/D转换数据串行输出,由ADC 0832从DO端输出,CPU接收。
四、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转换模拟量输出端;
2、硬件电路设计 该芯片既可用于A/D转换(模拟信号从AIN0~AIN3输入),又可用于D/A转换(D/A转换模拟量从AOUT输出),器件地址为1001,若A2A1A0接地,D/A转换写寻址字节SLAW=90H,A/D转换读寻址字节SLAR=91H。
3、片内可编程功能 ⑴控制命令字 PCF8591内部有一个控制寄存器,用来存放控制命令,其格式如下: D1、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数据操作格式 发出控制命令(写操作) A/D转换(读操作) 其中红色部分由80C51发送,PCF8591接收; 黑色部分由PCF8591发送,80C51接收;
4.2.2 D/A原理 一.D/A转换器的性能指标 1.分辨率。 2.精度 3.线性度 4.温度灵敏度 5.建立时间 二.D/A转换的分类 D/A转换器的品种繁多、性能各异。按输入数字量的位数分:8位、10位、12位和16位等;按输入的数码分:二进制方式和BCD码方式;按传送数字量的方式分:并行方式和串行方式;按输出形式分:电流输出型和电压输出型,电压输出型又有单极性和双极性;按与单片机的接口分:带输入锁存的和不带输入锁存的。下面介绍几种常用的D/A转换芯片。
三.D/A转换器与单处机的连接 1.数据线的连接 D/A转换器与单片机的数据线的连接主要考虑两个问题:一是位数,当高于8位的D/A转换器与8位数据总线的MCS-51单片机接口时,MCS-51单片机的数据必须分时输出,这时必须考虑数据分时传送的格式和输出电压的“毛刺”问题;二是D/A转换器有无输入锁存器的问题,当D/A转换器内部没有输入锁存器时,必须在单片机与D/A转换器之间增设锁存器或I/O接口。 2.地址线的连接 一般的D/A转换器只有片选信号,而没有地址线。这时单片机的地址线采用全译码或部分译码,经译码器输出来控制D/A转换器的片选信号,也可由某一位I/O线来控制D/A转换器的片选信号。 3.控制线的连接 D/A转换器主要有片选信号、写信号及启动转换信号等,一般由单片机的有关引脚或译码器提供。
VREF 输入 寄 存 器 DAC 寄 存 器 D/A 转 换 器 Rfb DI0~DI7 IOUT1 IOUT2 与 LE1 LE2 ILE AGND CS 与 WR1 DAC0832 VCC WR2 与 DGND XFER MCS-51与8位DAC0832的接口 一.DAC0832芯片 DAC0832是一种电流型D/A转换器,数字输入端具有双重缓冲功能,可以双缓冲、单缓冲或直通方式输入,它的内部结构如图。
20 19 18 17 16 15 14 13 12 11 VCC ILE WR2 XFER DI4 DI5 DI6 DI7 IOUT1 IOUT2 1 2 3 4 5 6 7 8 9 10 CS WR1 AGND DI3 DI2 DI2 DI0 VREF RFB DGND 二.DAC0832的引脚 DAC0832有20引脚,采用双列直插式封装,如图所示。 其中: DI0~DI7(DI0为最低位):8位数字量输入端。 ILE:数据允许控制输入线,高电平有效。 :片选信号。 :写信号线1。
:写信号线2。 :数据传送控制信号输入线,低电平有效。 IOUT1:模拟电流输出线1。它是数字量输入为“1”的模拟电流输出端。 IOUT2:模拟电流输出线2,它是数字量输入为“0”的模拟电流输出端,采用单极性输出时,IOUT2常常接地。 Rfb:片内反馈电阻引出线,反馈电阻制作在芯片内部,用作外接的运算放大器的反馈电阻。 VREF:基准电压输入线。电压范围为-10V~+10V。 VCC:工作电源输入端,可接+5V~+15V电源。 AGND:模拟地。 DGND:数字地。 三.DAC0832的工作方式 DAC0832有三种方式:直通方式、单缓冲方式和双缓冲方式。 1.直通方式:
当引脚 、 、 、 直接接地,ILE接电源,DAC0832工作于直通方式,此时,8位输入寄存器和8位DAC寄存器都直接处于导通状态,8位数字量到达DI0~DI7,就立即进行D/A转换,从输出端得到转换的模拟量。 2.单缓冲方式: 当连接引脚 、 、 、 ,使得两个锁存器的一个处于直通状态,另一个处于受控制状态,或者两个被控制同时导通,DAC0832就工作于单缓冲方式,例如下图就是一种单缓冲方式的连接 对于下图的单缓冲连接,只要数据DAC0832写入8位输入锁存器,就立即开始转换,转换结果通过输出端输出。
+5V - -5V - VCC ILE CS WR1 DI0~DI7 WR2 XFER DGND AGND VREF Rfb IOUT1 IOUT2 P2.7 WR P0.0~P0.7 - A + - Vout - 8051 3.双缓冲方式: 当8位输入锁存器和8位DAC寄存器分开控制导通时,DAC0832工作于双缓冲方式,双缓冲方式时单片机对DAC0832的操作分两步,第一步,使8位输入锁存器导通,将8位数字量写入8位输入锁存器中;第二步,使8位DAC寄存器导通,8位数字量从8位输入锁存器送入8位DAC寄存器。第二步只使DAC寄存器导通,在数据输入端写入的数据无意义。下图就是一种双缓冲方式的连接。
+5V - -5V - VCC ILE CS XFER WR1 WR2 DI0~DI7 DGND AGND VREF Rfb IOUT1 IOUT2 P2.7 P2.6 WR P0.0~P0.7 8051 - A + - Vout - 四.DAC0832的应用 D/A转换器在实际中经常作为波形发生器使用,通过它可以产生各种各样的波形。它的基本原理如下:利用D/A转换器输出模拟量与输入数字量成正比这一特点,通过程序控制CPU向D/A转换器送出随时间呈一定规律变化的数字,则D/A转换器输出端就可以输出随时间按一定规律变化的波形。
【例9-1】根据图8.9编程从DAC0832输出端分别产生锯齿波、三角波和方波。【例9-1】根据图8.9编程从DAC0832输出端分别产生锯齿波、三角波和方波。 根据单缓冲方式图的连接,DAC0832的口地址为7FFFH。 汇编语言编程: 锯齿波 MOV DPTR,#7FFFH CLR A LOOP:MOVX @DPTR,A INC A SJMP LOOP 三角波: MOV DPTR,#7FFFH CLR A LOOP1:MOVX @DPTR,A INC A CJNE A,#0FFH,LOOP1 LOOP1:MOVX @DPTR,A DEC A JNZ LOOP2 SJMP LOOP1 方波: MOV DPTR,#7FFFH LOOP:MOV A,#00H MOVX @DPTR,A ACALL DELAY MOV A,#FFH MOVX @DPTR,A ACALL DELAY SJMP LOOP DELAY:MOV R7,#0FFH DJNZ R7,$ RET
C语言编程: 锯齿波: #include <absacc.h> //定义绝对地址访问 #define uchar unsigned char #define DAC0832 XBYTE[0x7FFF] void main() { uchar i; while(1) { for (i=0;i<0xff;i++) {DAC0832=i;} } }
三角波: #include <absacc.h> //定义绝对地址访问 #define uchar unsigned char #define DAC0832 XBYTE[0x7FFF] void main() { uchar i; while(1) { for (i=0;i<0xff;i++) {DAC0832=i;} for (i=0xff;i>0;i--) {DAC0832=i;} } }
方波: #include <absacc.h> //定义绝对地址访问 #define uchar unsigned char #define DAC0832 XBYTE[0x7FFF] void delay(void); void main() { uchar i; while(1) { DAC0832=0; //输出低电平 delay(); //延时 DAC0832=0xff; //输出高电平 delay(); //延时 } } void delay() //延时函数 { uchar i; for (i=0;i<0xff;i++) {;} }
4.2.2 DS18B20测温电路及程序 1、程序 (1)
↑ (2) (3)
↑ (5) (4)
↑ (7) (6)
↑ (8) (9)
↑ (10) (11)
↑ (13) (12)