51单片机AD转换之PCF8591

PCF8591是一个单片集成、单独供电、低功耗、8-bit CMOS数据获取器件。

AD转换即(模拟量)Analog 转换成 (数字量)Digital

1.引脚分析

这里写图片描述

PCF8591具有4个模拟输入(AIN0~AIN3)、1个模拟输出(AOUT)和1个串行I²C总线接口(SDA、SCL)。
PCF8591的3个地址引脚A0, A1和A2可用于硬件地址编程,允许在同个I2C总线上接入8个PCF8591器件,而无需额外的硬件。在PCF8591器件上输入输出的地址、控制和数据信号都是通过双线双向I2C总线以串行的方式进行传输。
OSC:外部时钟输入端,内部时钟
EXT:内部、外部时钟选择线,使用内部时钟时 EXT 接地。
VDD、VSS:电源端。
AGND:模拟信号地。
VREF:基准电源端。

2.应用分析

AD转换部分电路图:

这里写图片描述

要求:使用LCD1602将电压值显示出来,调节变阻器改变电压值

说明:以下代码中用到了LCD1602驱动程序和I2C总线驱动程序,请参考博主51单片机栏目下的博客。

#define uint unsigned int
#define uchar unsigned char
/*查阅pcf8591的资料可知它的都写地址如下*/
#define  WRITEADDR 0x90    //写地址
#define  READADDR  0x91    //读地址
uchar dat[6];

void Pcf8591SendByte(uchar channel)
{   
    I2C_Start();    //关于I2C总线,请参照博主博文:51单片机I2C总线驱动程序
    I2C_SendByte(WRITEADDR);        //发送写器件地址
    I2C_SendByte(0x40|channel);     //发送控制寄存器
    I2C_Stop();
}

uchar Pcf8591ReadByte()
{
    uchar num;
    I2C_Start();
    I2C_SendByte(READADDR);      //发送读器件地址
    dat=I2C_ReadByte();          //读取数据
    I2C_Stop();                  //结束总线
    return num;
}

void main()
{
    uint adNum,i;
    float value;
    Lcd1602_init();   //关于lcd1602,请参照博主博文:51单片机LCD1602程序详解
    while(1)
    {
            Pcf8591SendByte(0);      //使用通道0
            /*adNum一定是0到255之间的一个数,因为pcf8591是8位的AD/DA芯片,所以输出的范围为00000000到11111111,即0到255*/
            adNum=Pcf8591ReadByte();   //读出数值
            /*将adNum转换成电压值,单片机的电压为5V,则电位器的电压为0到5V,用0到255表示0到5V,则每一个1代表5/255V,即0.01953V*/
            value=adNum*0.01953;  //转为电压值
            adNum=value*100;        //保留两位小数,以便显示出来

            dat[0]=adNum/1000+'0';      //加上'0'是表示数字转换成字符,1602只能显示字符
            dat[1]=adNum%1000/100+'0';
            dat[2]='.';
            dat[3]=adNum%100/10+'0';
            dat[4]=adNum%10+'0';
            dat[5]='V';
            Lcd1602_WriteCom(0x80);    
            for(i=0;i<6;i++)
            {
               Lcd1602_WriteData(dat[i]);
            }
    }
}
  • 37
    点赞
  • 218
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值