ImageVerifierCode 换一换
格式:DOCX , 页数:19 ,大小:235.62KB ,
资源ID:7737489      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/7737489.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(基于PCF8591设计的数字电压表.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

基于PCF8591设计的数字电压表.docx

1、基于PCF8591设计的数字电压表学习情境1-数字电压表的设计之 基于PCF8591设计的数字电压表 点名,复习1、 ADC0832的引脚及其功能,以及与单片机的硬件连接?2、 ADC0808的引脚及其功能,以及与单片机的硬件连接?引言:PCF8591是一个单片集成、单独供电、低功耗、8-bit CMOS数据获取器件。PCF8591具有4个模拟输入、1个模拟输出和1个串行IC总线接口。PCF8591的3个地址引脚A0, A1和A2可用于硬件地址编程,允许在同一个IC总线上接入8个PCF8591器件,而无需额外的硬件。在PCF8591器件上输入输出的地址、控制和数据信号都是通过双线双向IC总线以

2、串行的方式进行传输。 新课讲授3.3 基于PCF8591设计的数字电压表3.31 PCF8591简介 PCF8591的功能包括多路模拟输入、内置跟踪保持、8-bit模数转换和8-bit数模转换。PCF8591的最大转化速率由IC总线的最大速率决定。1、主要技术指标和特性 单独供电 PCF8591的操作电压范围2.5V-6V 低待机电流 通过I2C总线串行输入/输出 PCF8591通过3个硬件地址引脚寻址 PCF8591的采样率由I2C总线速率决定 4个模拟输入可编程为单端型或差分输入 自动增量频道选择 PCF8591的模拟电压范围从Vss到VDD PCF8591内置跟踪保持电路 8-bit逐次

3、逼近A/D转换器 通过1路模拟输出实现DAC增益 2、PCF8591引脚功能 图3-3-1 PCF8591引脚图AIN0AIN3:模拟信号输入端。 A0A3:引脚地址端。 VDD、VSS:电源端。 (2.56V) SDA、SCL:I2C 总线的数据线、 时钟线。 OSC:外部时钟输入端,内部时钟输出端。 EXT:内部、外部时钟选择线,使用内部时钟时 EXT 接地。 AGND:模拟信号地。 AOUT:D/A 转换输出端。 VREF:基准电源端。3、PCF8591内部结构图图3-3-2 PCF8591内部结构图4 功能描述(1)地址IIC总线系统中的每一片PCF8591通过发送有效地址到该地址器件

4、来激活。该地址包括固定部分和可编程部分。可编程部分必需根据地址引脚A0、A1和A2来设置。在IIC总线协议中地址必需是起始条件后作为第一个字节发送。地址字节的最后一位是用于设置以后数据传输方向的读/写。 1001A0A1A2R/ 固定部分 可编程部分(2)控制字控制字节用于实现器件的各种功能,如模拟信号由哪几个通道输入等。控制字节存放在控制寄存器中。总线操作时为主控器发送的第二字节。其格式如下所示: 其中:D1、D0两位是A/D通道编号:00通道0,01通道1,10通道2,11通道3 D2 自动增益选择(有效位为1) D5、D4模拟量输入选择:00为四路单端数入、01为三路差分输入、10为单端

5、与差分配合输入、11为模拟输出允许有效 当系统为A/D转换时,模拟输出允许为0。模拟量输入选择位取值由输入方式决定:四路单端输入时取00,三路差分输入时取01,单端与差分输入时取10,二路差分输入时取11。最低两位时通道编号位,当对0通道的模拟信号进行A/D转换时取00,当对1通道的模拟信号进行A/D转换时取01,当对2通道的模拟信号进行A/D转换时取10,当对3通道的模拟信号进行A/D转换时取11。 在进行数据操作时,首先是主控器发出起始信号,然后发出读寻址字节,被控器做出应答后,主控器从被控器读出第一个数据字节,主控器发出应答,主控器从被控器读出第二个数据字节,主控器发出应答一直到主控器从

6、被控器中读出第n个数据字节,主控器发出非应答信号,最后主控器发出停止信号。(3)A/D转换A/D转换器采用逐次逼近转换技术。在A/D转换周期将临时使用片上转换器和高增益比较器。一个A/D转换周期总是开始于发送一个有效读模式地址给PCF8591之后。A/D转换周期子在应答时钟脉冲的后延被触发。并在传输前一次转换结果时执行(见图3-3-3)图3-3-3 A/D转换一旦一个转换周期被触发,所选通的输入电压采样将保存到芯片并被转换为对应的8位二进制码,取自差分输入的采样将被转换为8位二进制补码 转换结果被保存在ADC数据寄存器等待传输。如果自动增量标志被置1,将选择下一个通道。在读周期传输的第一个字节

7、包含前一次读周期的转换结果代码,以上电复位之后读取的第一个字节是0x80。最高A/D转换速率取决于实际的IIC总线速度。(4)D/A转换发送给PCF8591的第三个字节被存储到DAC数据存储器,并使用片内D/A转换器转换成对应的模拟电压。这个D/A 转换器由连接到外部参考电压的具有256个接头的电阻分压电路和选择开关组成。接头译码器切换一个接头至DAC输出线。模拟输出电压由自动清零单位增益放大器缓冲。这个缓冲放大器可通过设置控制寄存器的模拟输出允许标志来打开或关闭。在激活状态,输出电压将保持到新的数据字节被发送。提供给模拟输出AOUT的输出电压由下式给出。D/A转换顺序的波形图如图3-3-5=

8、 +图3-3-4 D/A转换(5)振荡器片上振荡器产生A/D转换周期和刷新自动清零缓冲放大器需要的时钟信号。在使用这个振荡器时EXT引脚必须连接到VSS。在OSC引脚振荡频率是可用的。如果EXT引脚被连接到VDD,振荡输出OSC将切换到高阻态以允许用户连接外部时钟信号至OSC。6 I2C总线特性I2C总线是不同的IC或模块之间的双向两线通信,这两条线是串行数据线(SDA)和串行时钟线(SCL),这两条线必须通过上拉电阻连接至正电源。数据传输只能是在总线不忙时启动。(1)位传输 一个数据位在每一个时钟脉冲期间传输。SDA线上的数据必须在时钟脉冲的高电平期间保持稳定。这个期间数据线上的改变被当作控

9、制信号。图3-3-5 位传输(2)开始或停止条件 数据和时钟线在总不忙时保持高电平。在时钟为高电平时,数据线上的一个由高到低的变化被定义为开始条件。时钟为高电平时,数据线上的一个由低到高的变化被定义为停止条件。图3-3-6 开始和停止条件(3)系统配置 产生信息的器件称作“发送机”,接收信息的器件称作“接收机”。控制信息的器件称作“主机”,被控制的器件称作“从机”。图3-3-7 系统配置(4)应答在开始和停止条件之间从发送机传输到接收机的数据字节数是没有限制的。每个8位数据字节之后紧跟着一个应答位。应答位是由发送机放在总线的一个高电平,而主机也产生一个额外的与应答有关的时钟脉冲。地址匹配的从接

10、收机必须在接收每一个字节后产生一个应答。在应答时钟脉冲期间,应答的器件必须将SDA线拉低。因此在应答相应的时钟脉冲的高电平期间,SDA线必须保持稳定的低电平。在由从机终止的最后一个字节,主接收机必须通过产生一个低电平应答向发送机发送一个数据结束信号,这样发送机必须将数据线SDA拉高以允许主机产生停止条件。 图3-3-8 I2C 总线应答(5)总线协议 在开始条件后一个有效的硬件地址必须发送至PCF8591。读/写位定义了以后单个或多个字节数据传输的方向。开始条件、停止条件和应答位的格式应定时参考I2C总线特性。在写模式数据传输通过发送下一个数据的停止条件或开始条件来约束。图3-3-9 写模式的

11、总线协议,D/A转换图3-3-10 读模式的总线协议,A/D转换3.3.2 系统硬件设计 硬件电路主要包含单片机最小系统、PCF8591电压数据采集模块电路、LCD1602显示模块。它们之间的具体连接如图6-3-11所示。图3-3-11 系统硬件连接图3.2.3 系统软件设计本项目在软件设计方面主要有三个源程序:PCF8591.C、LCD1602.C和MAIN.C。在此我们主要介绍PCF8591.C源程序的设计。根据对PCF8591芯片的详细分析,PCF8591.C源程序由以下8个子程序构成:1、启动I2C总线子程序void IIC_Start(void) /EA=0; /时钟保持高,数据线从

12、高到低一次跳变,I2C通信开始 SDA = 1; SCL = 1; delay4us(); / 延时5us SDA = 0; delay4us(); SCL = 0;2、停止I2C总线子程序void IIC_Stop(void) SDA = 0; /时钟保持高,数据线从低到高一次跳变,I2C通信停止 SCL = 1; delay4us(); SDA = 1; delay4us(); SCL = 1;3、从机发送应答子程序void Slave_ACK(void) SDA = 0; SCL = 1; delay4us(); SCL = 0; SDA = 1;4、从机发送非应答子程序void Sla

13、ve_NOACK(void) SDA = 1; SCL = 1; delay4us(); SDA = 0; SCL = 0;5、主机应答位检查子程序void check_ACK(void) SDA = 1; / 将p1.0设置成输入,必须先向端口写1 SCL = 1; F0 = 0; if(SDA = 1) / 若SDA=1表明非应答,置位非应答标志F0 F0 = 1; SCL = 0;6、发送一个字节子程序void IIC_SendByte(uchar ch) uchar idata n=8; / 向SDA上发送一位数据字节,共八位 while(n-) if(ch&0x80) = 0x80)

14、 / 若要发送的数据最高位为1则发送位1 SDA = 1; / 传送位1 SCL = 1; delay4us(); SDA = 0; SCL = 0; else SDA = 0; / 否则传送位0 SCL = 1; delay4us(); SCL = 0; ch = ch1; / 数据左移一位 7、接收一个字节子程序uchar IIC_ReceiveByte(void) uchar i,rd = 0x00; for(i=0;i8;i+) SCL = 1; rd = 1; rd |= SDA; delay4us(); SCL = 0; delay4us(); /SCL = 1; delay4us

15、(); return rd; 8、A/D转换子程序void ADC_PCF8591(uchar controlbyte) uchar idata receive_data,i=0; IIC_Start(); IIC_SendByte(PCF8591_WRITE); /控制字 check_ACK(); if(F0 = 1) IIC_Error = 1; return; IIC_SendByte(controlbyte); /控制字 check_ACK(); if(F0 = 1) IIC_Error = 1; return; IIC_Start(); /重新发送开始命令IIC_SendByte(P

16、CF8591_READ); /控制字 check_ACK(); if(F0 = 1) IIC_Error = 1; return; while(i4) receive_data=IIC_ReceiveByte(); receive_bufi+=receive_data; Slave_ACK(); / 收到一个字节后发送一个应答位 Slave_NOACK(); / 收到最后一个字节后发送一个非应答位 IIC_Stop();9、D/A转换子程序void DAC_PCF8591(uchar controlbyte,uchar wdata) IIC_Start(); / 启动I2C IIC_SendB

17、yte(PCF8591_WRITE); / 发送地址位 check_ACK(); / 检查应答位 if(F0 = 1) IIC_Error = 1; return; / 若非应答表明器件错误或已坏,置错误标志位SystemError IIC_SendByte(controlbyte&0x77); /Control byte check_ACK(); / 检查应答位 if(F0 = 1) IIC_Error = 1; return; / 若非应答表明器件错误或已坏,置错误标志位SystemError IIC_SendByte(wdata); /data byte check_ACK(); / 检

18、查应答位 if(F0 = 1) IIC_Error = 1; return; / 若非应答表明器件错误或已坏,置错误标志位SystemError IIC_Stop(); / 全部发完则停止 delay4us(); delay4us(); delay4us(); delay4us();需要注意的是,在PROTEUS7.5仿真条件下无法把4路模拟通道的效果仿真出来,只有AINO通道有效。但在PROTEUS7.8仿真有效。 课堂小结本节课主要详细介绍了pcf8591芯片的有关技术资料和具体用法,重点分析了PCF8591.C源程序的设计。 完整程序代码1、MAIN.C源程序#include #incl

19、ude #define uchar unsigned char#define uint unsigned int uint Disp_Voltage=0,0,0;uchar LCD_Line1=1- . V 2- . v;uchar LCD_Line2=3- . V 4- . v;extern uchar idata receive_buf; / 数据接收缓冲区extern void Initialize_LCD1602(); /液晶初始化函数extern void ADC_PCF8591(uchar controlbyte);/连续读入4路通道的A/D转换结果到receive_bufexte

20、rn void DAC_PCF8591(uchar controlbyte,uchar wdata);extern void LCD_Display(uchar p,uchar *str);/在LCD上显示字符串/函数申明void Convert_To_Voltage(uchar result);/ 将模数转换结果得到的数值分解后放入缓冲数组中void Refesh_LCD(); / 显示刷新函数,把ADC转换结果送入显示缓冲数组/-/ 函数名称: main/ 函数功能: 主程序/-void main() Initialize_LCD1602(); while(1) ADC_PCF8591(0

21、x04); Refesh_LCD(); /液晶2行显示4个通道的转换结果 LCD_Display(0x00,LCD_Line1); LCD_Display(0x40,LCD_Line2); /将0通道模拟转换后的结果重新转换为模拟量并从Aout引脚输出 /结果通过LED的亮度表现出来,在真实的硬件上该函数调用才有效,在Proteus中看不到效果 DAC_PCF8591(0x40,receive_buf0); /-/ 函数名称:Convert_To_Voltage()_/ 将模数转换结果得到的数值分解后放入缓冲数组中/-void Convert_To_Voltage(uchar result)

22、uchar temp; /最大值为255,对应5V,255/5=51 Disp_Voltage2 =result/51+0; /整数部分 temp=result%51*10; /第1位小数 Disp_Voltage1 =temp/51+0; temp=temp%51*10; /第2位小数 Disp_Voltage0 =temp/51+0; /-/ 显示刷新函数,把ADC转换结果送入显示缓冲数组/-void Refesh_LCD() /将4个模拟通道模数转换结果放入LCD显示缓冲LCD_Line1和LCD_Line2 Convert_To_Voltage(receive_buf0); LCD_L

23、ine12=Disp_Voltage2; LCD_Line14=Disp_Voltage1; LCD_Line15=Disp_Voltage0; Convert_To_Voltage(receive_buf1); LCD_Line111=Disp_Voltage2; LCD_Line113=Disp_Voltage1; LCD_Line114=Disp_Voltage0; Convert_To_Voltage(receive_buf2); LCD_Line22=Disp_Voltage2; LCD_Line24=Disp_Voltage1; LCD_Line25=Disp_Voltage0;

24、Convert_To_Voltage(receive_buf3); LCD_Line211=Disp_Voltage2; LCD_Line213=Disp_Voltage1; LCD_Line214=Disp_Voltage0;2、PCF8591.C源程序/-/ pcf8591驱动程序/-函数声明,变量定义-#include #include #define uchar unsigned char#define uint unsigned intsbit SDA=P11; / 将p1.0口设置为模拟数据口sbit SCL=P10; / 将p1.1口设置为模拟时钟口#define delay4u

25、s(); _nop_();_nop_();_nop_();_nop_();_nop_(); bit bdata IIC_Error; / 从机错误标志位/PCF8591专用变量定义-#define PCF8591_WRITE 0x90#define PCF8591_READ 0x91#define NUM 4 / 接收和发送缓存区的深度uchar idata receive_bufNUM; / 数据接收缓冲区/- 具体函数参见本文正文。3、 LCD1602.C源程序/液晶控制与显示驱动程序#include #include #include #define uchar unsigned cha

26、r#define uint unsigned int#define delay4us() _nop_();_nop_();_nop_();_nop_();sbit RS = P20;sbit RW = P21;sbit E = P22;/ 延时void Delay(uint X) uchar i; while(X-)for(i=0;i120;i+)delay4us()/-忙检查-/uchar LCD_Busy_Check() uchar LCD_Status; RS = 0; RW = 1; E = 1; delay4us(); LCD_Status = P0; E = 0; return LCD_Status;/-向LCD写入命令-/void Write_LCD_Command(uchar cmd) while(LCD_Busy_Check()& 0x80)=0x80); /忙等待 RS = 0; RW = 0; E = 0; P0 = cmd; delay4us(); E = 1; delay4us(); E = 0;/-向LCD写入一个字节的数据函数-*/void Write_LCD_Data(uchar dat) while(LCD_Busy_Check()&0

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1