一、前言
1.1 項目功能介紹
在現代工業(yè)、農業(yè)和智能家居等領域,對環(huán)境的實時監(jiān)測和控制需求日益增長。其中,光照強度和溫度作為兩個重要的環(huán)境參數,對植物生長、室內舒適度以及設備運行狀態(tài)等具有顯著影響。因此,開發(fā)一種能夠實時、準確地采集光照強度和溫度數據的系統(tǒng)顯得尤為重要。
本項目利用STC90C51單片機控制PCF8591_AD轉換芯片,完成對光敏電阻和熱敏電阻模擬量的采集,進而得到光敏數據和溫度數據。PCF8591是一款單片集成、單獨供電、低功耗的8位CMOS數據獲取器件,具有4個模擬輸入、1個模擬輸出和1個串行I2C總線接口。通過其高精度的模數轉換功能,可以將光敏電阻和熱敏電阻產生的模擬信號轉換為數字信號,便于后續(xù)的數據處理和分析。
光敏電阻是一種基于光電效應的傳感器,其阻值隨光照強度的變化而變化。通過PCF8591的A/D轉換功能,可以實時讀取光敏電阻的阻值變化,進而得到當前的光照強度數據。同樣地,熱敏電阻的阻值隨溫度的變化而變化,通過PCF8591的A/D轉換功能,也可以實時讀取熱敏電阻的阻值變化,得到當前的溫度數據。
在項目實施過程中,STC90C51單片機作為系統(tǒng)的核心控制器,負責協(xié)調各個模塊的工作,包括初始化PCF8591芯片、配置A/D轉換參數、讀取轉換結果等。同時,STC90C51單片機還可以通過I2C總線與上位機進行通信,將采集到的光敏數據和溫度數據實時傳輸給上位機進行顯示、存儲和分析。
本項目的開發(fā)背景體現了對實時環(huán)境監(jiān)測和控制的迫切需求,以及傳感器技術和微控制器技術在現代工業(yè)自動化和智能化發(fā)展中的重要地位。通過本項目的實施,不僅可以提高環(huán)境參數的采集精度和實時性,還可以為后續(xù)的數據處理和分析提供有力的支持,推動相關領域的技術進步和應用發(fā)展。
1.2 PCF8591介紹
PCF8591是一款單片集成、單獨供電、低功耗的8位CMOS數據獲取器件。該芯片具有四個模擬輸入、一個模擬輸出以及一個串行I2C總線接口,使其能夠輕松集成到各種嵌入式系統(tǒng)中。PCF8591的主要功能包括模數轉換(ADC)和數模轉換(DAC),能夠實現8位的分辨率轉換,保證了數據的準確性和精度。
PCF8591的ADC模塊支持四個獨立的模擬輸入通道,這些通道可以配置為單端或差分輸入,以適應不同的應用場景。其內部包含一個8位逐次逼近式A/D轉換器,能夠將模擬信號轉換為數字信號,最大轉換速率取決于I2C總線的速度。此外,PCF8591還內置了一個8位的D/A轉換器(DAC),能夠將數字信號轉換為模擬輸出信號,以控制外部設備。
PCF8591的特性還包括低功耗、高精度、多通道和可編程增益等。其操作電壓范圍在2.5V至6V之間,具有較低的待機電流,適合在電池供電或需要低功耗的場合使用。同時,PCF8591的ADC和DAC模塊提供了8位的分辨率,能夠滿足大多數應用場景對精度的要求。此外,PCF8591還支持通過I2C總線進行串行輸入/輸出,允許在同個I2C總線上接入多達八個PCF8591器件,而無需額外的硬件。
在應用方面,PCF8591廣泛應用于各種控制和測量系統(tǒng)中,如溫度測量、壓力測量、光電傳感控制、音頻處理等。其高精度、低功耗和易于使用的特點使得它成為這些系統(tǒng)中不可或缺的一部分。
PCF8591是一款功能強大、性能穩(wěn)定的數字模擬轉換芯片,其高精度、低功耗和易于使用的特點使得它成為各種嵌入式系統(tǒng)和控制測量系統(tǒng)的理想選擇。
二、代碼實現
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)可變電阻=%drn",(int)ch0);
/*2. 轉換并讀取通道1的AD值: 模塊上通道1默認接光敏電阻*/
ch1=PCF8591_GetADC_CHx(0x01); //模塊上標注是AIN0
printf("(CH1)光敏電阻=%drn",(int)ch1);
/*3. 轉換并讀取通道2的AD值: 模塊上通道2默認接熱敏電阻*/
ch2=PCF8591_GetADC_CHx(0x02);//模塊上標注是AIN1
printf("(CH2)熱敏電阻=%drn",(int)ch2);
/*4. 轉換并讀取通道3的AD值: 模塊上通道3默認懸空沒有接檢測點*/
ch3=PCF8591_GetADC_CHx(0x03);//模塊上標注是AIN2
printf("(CH3)=%drn",(int)ch3);
printf("---------------------rn");
/*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);//發(fā)送設備地址
IIC_GetAck();//獲取應答
IIC_SendOneByte(ch); //發(fā)送控制字節(jié)
IIC_GetAck();//獲取應答
IIC_SendStart();//起始信號
IIC_SendOneByte(PCF8591_READ_ADDR);//發(fā)送設備地址
IIC_GetAck();//獲取應答
dat=IIC_RecvOneByte();//讀取數據
IIC_SendAck(1); //發(fā)送非應答
IIC_SendStop(); //停止信號
return dat;
}
/*
函數功能:設置DAC通道輸出的值
*/
void PCF8591_SetDAC_Data(u8 val)
{
IIC_SendStart();//起始信號
IIC_SendOneByte(PCF8591_WRITE_ADDR);//發(fā)送設備地址
IIC_GetAck();//獲取應答
IIC_SendOneByte(0x40); //發(fā)送控制字節(jié)
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