首页 > 编程知识 正文

pcf8591ad转换实例,模拟电压转换为数字电压

时间:2023-05-05 11:45:16 阅读:154814 作者:2593

用PCF8591读取电压值(AD转换) A/D主要指标是A/D设备PCF8591、PCF8591的控制字节

A/D的主要指标

1、ADC位数: n位的ADC代表,2的n次方个刻度

2、基准来源: ADC的电压基准

3、分辨率:两刻度间的变化量

4、与INL (积分非线性度)真值误差最大的误差值

5、DNL )差分非线性度)两刻度间的最大差

常用A/D设备PCF8591、PCF8591是单片集成、单独供电、8位CMOS数据获取设备。

2、AIN0、AIN1、AIN2、AIN3为模拟输入引脚

3、AOUT为模拟输出端

4、在EXT为低电平时使用内部时钟,在高电平时使用外部时钟

5、A0、A1、A2为地址引脚

6、OCS、VREF、AGND直接连接相应级别即可

PCF8591的控制字节上一篇已经以PCF8591为例说了IIC的寻址,这是说PCF8591的控制字节

1、顶层和底层默认为0

2、第6位: AD使能、1开、0关

3、第4位和第5位:单端、差分选择位

4、第2位:自动增量位(通常位0 ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) )。

5、读取未选定位:例如读取AIN0或读取AIN2

IIC.h

#include 'intrins.h'//总线引脚定义sbit SDA=P3^6; /*数据线*/sbit SCL=P3^7; /*时钟线*/void iic_Delay () {_nop_ ); _nop_ (); _nop_ (); _nop_ (); _nop_ (); _nop_ (); }void iic_Start () { SCL=1; SDA=1; iic_Delay (; SDA=0; iic_Delay (; SCL=0; }void iic_Stop () {SCL=0; SDA=0; iic_Delay (; SCL=1; iic_Delay (; SDA=1; iic_Delay (; (/)读取、写入操作(/bitIIC_sendbyte ) unsignedcharbyt ) {bit ack=0; unsigned char mask; for(mask=0x80; 马克!=0; mask=1() if ) ) bytmask )==0) SDA=0; elseSDA=1; iic_Delay (; SCL=1; iic_Delay (; SCL=0; }SDA=1; iic_Delay (; SCL=1; ack=SDA; iic_Delay (; SCL=0; 返回确认; (/)读取数据(*/unsigned char iic_readNAK ) ) {unsigned char mask; 无符号字符数据; SDA=1; SCL=0; for(mask=0x80; 马克!=0; mask=1({IIC_Delay ); SCL=1; if(sda==1) dat |=mask; elsedat=(~mask ); iic_Delay (; SCL=0; }SDA=1; iic_Delay (; SCL=1; iic_Delay (; SCL=0; 返回日期; (/)读取数据,但不继续(*/unsigned char iic_readACK ) {unsigned char mask; 无符号字符数据; SDA=1; SCL=0; for(mask=0x80; 马克!=0; mask=1({IIC_Delay ); SCL=1; if(sda==1) dat |=mask; elsedat=(~mask ); iic_Delay (; SCL=0; }SDA=0; iic_Delay (; SCL=1; iic_Delay (; SCL=0; 返回日期; }主程序

# include ' reg 52.h ' # include ' ii C1.h ' # include ' LCD 1602.h ' unsignedcharshu1[ ]=' in 1: in 23360 in 3360 in 3360 '; unsigned char shu2[4]; unsigned char val; unsignedchariic _ 18b 20 (unsignedcharchn ) {unsigned char val; iic_Start (; //启动信号if(IIC_sendbyte(0x90 )=1) )/)写入:判断是否存在该器件地址({iic_Stop ); //停止信号return 0; //否则返回}IIC_sendbyte(0x40|CHN ); //控制字节iic_Start (; IIC_sendbyte(0x91; //读取操作val=iic_readNAK (; //数据读取:读取电压值,不继续读取iic_Stop (); 返回值; }void init_val () {val=50*val/255; //8位ADC,因此基准源为5V (这里放大为10倍)//50/255 ) 5V分割为255份; //原因:从PCF到shu2[0]=(val/10 ) '0'; shu2[1]='.'; shu2[2]=(val ) '0'; shu2[3]=' '; }void main () {InitLcd1602 ); LCD showstr2(0,0,shu1 ); while(1) val=IIC_18b20(0x01 ); //读取侧init_val (选择AIN1侧作为; //字符转换LCD showstr2(0,1,shu2); //LCD1602显示函数(未给定) val=IIC_18b20 )0x02 ); init_val (; LCD showstr2(6,1,shu2); val=IIC_18b20(0x03; init_val (; LCD showstr2(12,1,shu2); }

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。