一、传感器设计思路和编程样式
1.编程思路
设计思路:传感器搭配信号转换电路最终以电压的方式输出,搭配FPC8591芯片,将模拟量转换为数字量,传递给单片机。
使用单片机:AT89S52。
晶振22.1184。
2.参考程序
#include
#include"i2c.h"
#include"lcd.h"
//--定义PCF8591的读写地址--//
#define WRITEADDR 0x90//写地址
#define READADDR 0x91//读地址
//--声明全局函数--//
void Pcf8591SendByte(unsigned char channel);
unsigned char Pcf8591ReadByte();
void Pcf8591DaConversion(unsigned char value);
/*******************************************************************************
*函 数 名: main
*函数功能:主函数
*输 入:无
*输 出:无
*******************************************************************************/
void main()
{
u16 gas_concentration; //气体浓度变量
u16 calibration; //校准值
u16 Zero_value; //零点值
unsigned int adNum[5];
float value0;
LcdInit();
while(1)
{
Pcf8591SendByte(0); //发送电位器转换命令
//--由于8591在第一次读取的时候是读取到的上次转换的结果--//
//--所以我们先读一次,只是读到的数据不做处理--//
adNum[0]=Pcf8591ReadByte()*2;//将前一次转换结果读走
//--在读走上一次转换结果之后,才开始启动下一次转换,需要一点时间--//
//--要读取的命令,做一些数据处理和显示当做延时--//
Pcf8591SendByte(1); //发送读取指令
adNum[0]=Pcf8591ReadByte()*2;//读取电位器转换结果
//--读取走了,上一次转换结果就是电位器的转换结果之后,热敏的转换开始--//
//--我们继续做一些处理当延时。--//
//--我们8591每读取到一个1就表示5/256V,所以要知道电压值就乘以0.01953--//
value0=adNum[0]/2*0.01953; //转为电压值
adNum[0]=value0*100; //保留两位小数
/***********************标定************************/
//探头信号输出为线性输出,分正极性和负极性探头
/****正极性****/
gas_concentration=(adNum[0]-Zero_value)*calibration;
// calibration:校准值,通过标气进行标定
/****负极性****/
gas_concentration=(Zero_value-adNum[0])*calibration;
// calibration:校准值,通过标气进行标定
}
}
/*******************************************************************************
*函 数 名: Pcf8591SendByte
*函数功能:写入一个控制命令
*输 入: channel(转换通道)
*输 出:无
*******************************************************************************/
void Pcf8591SendByte(unsigned char channel)
{
I2C_Start();
I2C_SendByte(WRITEADDR, 1); //发送写器件地址
I2C_SendByte(0x40|channel, 0); //发送控制寄存器
I2C_Stop();
}
/*******************************************************************************
*函 数 名: Pcf8591ReadByte
*函数功能:读取一个转换值
*输 入:无
*输 出: dat
*******************************************************************************/
unsigned char Pcf8591ReadByte()
{
unsigned char dat;
I2C_Start();
I2C_SendByte(READADDR, 1);//发送读器件地址
dat=I2C_ReadByte(); //读取数据
I2C_Stop(); //结束总线
return dat;
}
/*******************************************************************************
*函 数 名: Pcf8591DaConversion
*函数功能: PCF8591的输出端输出模拟量
*输 入: value(转换的数值)
*输 出:无
*******************************************************************************/
void Pcf8591DaConversion(unsigned char value)
{
I2C_Start();
I2C_SendByte(WRITEADDR, 1);//发送写器件地址
I2C_SendByte(0x40, 1); //开启DA写到控制寄存器
I2C_SendByte(value, 0); //发送转换数值
I2C_Stop();
}