通过PCF8591读取电压值(AD转换)

通过PCF8591读取电压值(AD转换)

A/D的主要指标

1、ADC的位数:n位ADC代表,2的n次方个刻度
2、基准源:ADC的电压参考基准
3、分辨率:两刻度之间的变化量
4、INL(积分非线性度):与真实值误差最大的那个误差值
5、DNL(差分非线性度):两刻度之间最大的那个差值

常用A/D器件 PCF8591

1、PCF8591 是一个单片集成、单独供电、8-bit 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、第六位:AD使能位,为1开启,为0关闭
3、第四位和第五位:单端、差分选择位
4、第二位:自动增量位(一般位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();
}


/*读、写操作*/	
bit iic_SendByte(unsigned char byt)
{	
	bit ack = 0;	
	unsigned char mask;
							   	
	for(mask=0x80;mask!=0;mask>>=1)
	{
		if((byt&mask) == 0) 
			SDA = 0;
		else
			SDA = 1;

		iic_Delay();
		SCL = 1;
		iic_Delay();
		SCL = 0;
	}
		SDA = 1;
		iic_Delay();
		SCL = 1;
		ack = SDA;
		iic_Delay();
		SCL = 0;

	return ack;			
}

/*读数据并且继续下去*/
unsigned char iic_readNAK()
{
	unsigned char mask;
	unsigned char dat;

	SDA = 1;
	SCL = 0;
	for(mask=0x80;mask!=0;mask>>=1)
	{
		iic_Delay();
		SCL = 1;
		if(SDA == 1) dat |= mask;
		else  dat &= (~mask);
		iic_Delay();
		SCL = 0;
	}
	SDA = 1;
	iic_Delay();
	SCL = 1;
	iic_Delay();
	SCL = 0;

	return dat;
}

/*读数据但不再下去*/	
unsigned char iic_readACK()
{
	unsigned char mask;
	unsigned char dat;

	SDA = 1;
	SCL = 0;
	for(mask=0x80;mask!=0;mask>>=1)
	{
		iic_Delay();
		SCL = 1;
		if(SDA == 1) dat |= mask;
		else  dat &= (~mask);
		iic_Delay();
		SCL = 0;
	}
	SDA = 0;
	iic_Delay();
	SCL = 1;
	iic_Delay();
	SCL = 0;

	return dat;
}

主程序

#include "reg52.h"
#include "IIC1.h"
#include "LCD1602.h"

unsigned char shu1[]="IN1:  IN2:  IN3:";
unsigned char shu2[4];

unsigned char val;

unsigned char iic_18b20(unsigned char chn)
{
	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();

	return val; 
}

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%10) + '0';
	shu2[3] = '\0';
}

void main()
{
	InitLcd1602();
	LcdShowStr2(0,0,shu1);

	while(1)
	{
		val = iic_18b20(0x01);		//选择AIN1端作为读取端
		init_val();					//字符转换
		LcdShowStr2(0,1,shu2);		//LCD1602显示函数(没有给出)

		val = iic_18b20(0x02);
		init_val();
		LcdShowStr2(6,1,shu2);

		val = iic_18b20(0x03);
		init_val();
		LcdShowStr2(12,1,shu2);
	}
}
  • 17
    点赞
  • 197
    收藏
    觉得还不错? 一键收藏
  • 11
    评论
PCF8591是一种单片集成电路,用于模拟输入转换和数字输出转换。它具有4个模拟输入通道,可以读取模拟电压大小PCF8591模拟输入通道可以接收来自外部模拟电路的电压信号。这些电压信号可以是来自传感器、电压源或其他模拟电路的输出。PCF8591通过内部参考电压源将这些信号转换为数字信号,以便在微控制器或其他数字电路中进行处理。 PCF8591模拟输入通道的电压范围是0V到Vref(参考电压)之间。通常情况下,Vref可以通过外部电压输入引脚来设置。假设Vref为5V,那么模拟输入通道可以读取0V到5V之间的电压信号。 PCF8591的数字输出通道可以发送数字信号到外部电路。这些数字信号可以控制外部器件的状态或执行其他任务。例如,可以使用数字输出通道来控制LED的亮度或实现PWM(脉宽调制)功能。 为了读取模拟电压大小,我们可以通过初始化PCF8591模拟输入通道,然后使用适当的接口和编程代码来读取来自模拟输入通道的数字。然后,我们可以将该数字转换为实际的电压,通过使用PCF8591的参考电压和分辨率来计算。 总之,PCF8591可以读取模拟电压大小,通过将模拟输入信号转换为数字信号并提供给外部系统进行处理。通过适当的初始化和编程代码,我们可以读取和处理来自PCF8591模拟电压,并采取适当的措施。
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值