PCF8591_AD转换芯片完成光敏、温度模拟量采集
一、前言
1.1 项目功能介绍
在现代工业、农业和智能家居等领域,对环境的实时监测和控制需求日益增长。其中,光照强度和温度作为两个重要的环境参数,对植物生长、室内舒适度以及设备运行状态等具有显著影响。因此,开发一种能够实时、准确地采集光照强度和温度数据的系统显得尤为重要。
本项目利用STC90C51单片机控制PCF8591_AD转换芯片,完成对光敏电阻和热敏电阻模拟量的采集,进而得到光敏数据和温度数据。PCF8591是一款单片集成、单独供电、低功耗的8位CMOS数据获取器件,具有4个模拟输入、1个模拟输出和1个串行I2C总线接口。通过其高精度的模数转换功能,可以将光敏电阻和热敏电阻产生的模拟信号转换为数字信号,便于后续的数据处理和分析。
光敏电阻是一种基于光电效应的传感器,其阻值随光照强度的变化而变化。通过PCF8591的A/D转换功能,可以实时读取光敏电阻的阻值变化,进而得到当前的光照强度数据。同样地,热敏电阻的阻值随温度的变化而变化,通过PCF8591的A/D转换功能,也可以实时读取热敏电阻的阻值变化,得到当前的温度数据。
在项目实施过程中,STC90C51单片机作为系统的核心控制器,负责协调各个模块的工作,包括初始化PCF8591芯片、配置A/D转换参数、读取转换结果等。同时,STC90C51单片机还可以通过I2C总线与上位机进行通信,将采集到的光敏数据和温度数据实时传输给上位机进行显示、存储和分析。
本项目的开发背景体现了对实时环境监测和控制的迫切需求,以及传感器技术和微控制器技术在现代工业自动化和智能化发展中的重要地位。通过本项目的实施,不仅可以提高环境参数的采集精度和实时性,还可以为后续的数据处理和分析提供有力的支持,推动相关领域的技术进步和应用发展。
1.2 PCF8591介绍
PCF8591是一款单片集成、单独供电、低功耗的8位CMOS数据获取器件。该芯片具有四个模拟输入、一个模拟输出以及一个串行I²C总线接口,使其能够轻松集成到各种嵌入式系统中。PCF8591的主要功能包括模数转换(ADC)和数模转换(DAC),能够实现8位的分辨率转换,保证了数据的准确性和精度。
PCF8591的ADC模块支持四个独立的模拟输入通道,这些通道可以配置为单端或差分输入,以适应不同的应用场景。其内部包含一个8位逐次逼近式A/D转换器,能够将模拟信号转换为数字信号,最大转换速率取决于I²C总线的速度。此外,PCF8591还内置了一个8位的D/A转换器(DAC),能够将数字信号转换为模拟输出信号,以控制外部设备。
PCF8591的特性还包括低功耗、高精度、多通道和可编程增益等。其操作电压范围在2.5V至6V之间,具有较低的待机电流,适合在电池供电或需要低功耗的场合使用。同时,PCF8591的ADC和DAC模块提供了8位的分辨率,能够满足大多数应用场景对精度的要求。此外,PCF8591还支持通过I²C总线进行串行输入/输出,允许在同个I²C总线上接入多达八个PCF8591器件,而无需额外的硬件。
在应用方面,PCF8591广泛应用于各种控制和测量系统中,如温度测量、压力测量、光电传感控制、音频处理等。其高精度、低功耗和易于使用的特点使得它成为这些系统中不可或缺的一部分。
PCF8591是一款功能强大、性能稳定的数字模拟转换芯片,其高精度、低功耗和易于使用的特点使得它成为各种嵌入式系统和控制测量系统的理想选择。
二、代码实现
2.1 main.c
#include <reg51.h>
#include "delay.h"
#include "type.h"
#include "uart.h"
#include "ds1302.h"
#include "pcf8591.h"
//#include "key.h"
//#include "led.h"
//#include "timer.h"
//#include "exti.h"
//#include "infrared.h"
//#include "ds18b20.h"
//#include "at24c02.h"
int main()
{
u8 ch0,ch1,ch2,ch3; //存放ADC通道检测的值
u8 dac_val; //存放DAC输出的值
UART_Init(); //初始化串口波特率为4800
while(1)
{
/*1. 转换并读取通道0的AD值: 模块上通道0默认接可调0-5v的可变电阻*/
ch0=PCF8591_GetADC_CHx(0x00);//模块上标注是AIN3
printf("(CH0)可变电阻=%d\r\n",(int)ch0);
/*2. 转换并读取通道1的AD值: 模块上通道1默认接光敏电阻*/
ch1=PCF8591_GetADC_CHx(0x01); //模块上标注是AIN0
printf("(CH1)光敏电阻=%d\r\n",(int)ch1);
/*3. 转换并读取通道2的AD值: 模块上通道2默认接热敏电阻*/
ch2=PCF8591_GetADC_CHx(0x02);//模块上标注是AIN1
printf("(CH2)热敏电阻=%d\r\n",(int)ch2);
/*4. 转换并读取通道3的AD值: 模块上通道3默认悬空没有接检测点*/
ch3=PCF8591_GetADC_CHx(0x03);//模块上标注是AIN2
printf("(CH3)=%d\r\n",(int)ch3);
printf("---------------------\r\n");
/*5. 设置DAC输出值*/
PCF8591_SetDAC_Data(ch0); //使用通道1测量的可变电阻值传给DAC输出
DelayMs(1000); //延时一段时间
}
}
2.2 PCF8591.c
#include "pcf8591.h"
/*
函数功能: 设置ADC转换通道,并返回采集的数据值
ch的范围:0x00 0x01 0x02 0x03 分别代表通道0~3
*/
u8 PCF8591_GetADC_CHx(u8 ch)
{
u8 dat;
IIC_SendStart();//起始信号
IIC_SendOneByte(PCF8591_WRITE_ADDR);//发送设备地址
IIC_GetAck();//获取应答
IIC_SendOneByte(ch); //发送控制字节
IIC_GetAck();//获取应答
IIC_SendStart();//起始信号
IIC_SendOneByte(PCF8591_READ_ADDR);//发送设备地址
IIC_GetAck();//获取应答
dat=IIC_RecvOneByte();//读取数据
IIC_SendAck(1); //发送非应答
IIC_SendStop(); //停止信号
return dat;
}
/*
函数功能:设置DAC通道输出的值
*/
void PCF8591_SetDAC_Data(u8 val)
{
IIC_SendStart();//起始信号
IIC_SendOneByte(PCF8591_WRITE_ADDR);//发送设备地址
IIC_GetAck();//获取应答
IIC_SendOneByte(0x40); //发送控制字节
IIC_GetAck();//获取应答
IIC_SendOneByte(val); //设置AD值
IIC_GetAck();//获取应答
IIC_SendStop();//停止信号
}
2.3 PCF8591.h
#ifndef _PCF8591_H
#define _PCF8591_H
#include "type.h"
#include "iic.h"
#include <reg51.h>
//器件地址
#define PCF8591_WRITE_ADDR 0x90 //1001 0000
#define PCF8591_READ_ADDR 0x91 //1001 0001
void PCF8591_SetDAC_Data(u8 val);
u8 PCF8591_GetADC_CHx(u8 ch);
#endif
- 点赞
- 收藏
- 关注作者
评论(0)