/*******************************************************************************
* 实 验 名 : AD显示试验
* 实验说明 : 使用LCD1602显示AD读取到的各个数值
:
*******************************************************************************/
#include<reg51.h>
#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()
{
unsigned int adNum[5];
float value0;
LcdInit();
while(1)
{
//--显示电位器电压--//
Pcf8591SendByte(0); //发送电位器转换命令
//--由于8591在第一次读取的时候是读取到的上次转换的结果--//
//--所以我们先读一次,只是读到的数据不做处理--(crazybc.com)//
adNum[0]= Pcf8591ReadByte()*2;//将前一次转换结果读走
//--在读走上一次转换结果之后,才开始启动下一次转换,需要一点时间--//
//--为了不浪费单片机的资源,让单片机空着,我们直接发送给我们下次--//
//--要读取的命令,做一些数据处理和显示当做延时--//
LcdWriteCom(0x80+0x46); //发送显示坐标
LcdWriteData('0'+adNum[3]/1000); //发送显示数据
LcdWriteData('0'+adNum[3]%1000/100);
LcdWriteData('0'+adNum[3]%100/10);
LcdWriteData('0'+adNum[3]%10);
Pcf8591SendByte(1); //发送热敏转换命令
adNum[0]= Pcf8591ReadByte()*2;//读取电位器转换结果
//--读取走了,上一次转换结果就是电位器的转换结果之后,热敏的转换开始--//
//--我们继续做一些处理当延时。--//
//--我们8591每读取到一个1就表示5/256V,所以要知道电压值就乘以0.01953--//
value0=adNum[0]/2*0.01953; //转为电压值
adNum[0]=value0*100; //保留两位小数
LcdWriteCom(0x80);
LcdWriteData('0'+adNum[0]%1000/100);
LcdWriteData('.');
LcdWriteData('0'+adNum[0]%100/10);
LcdWriteData('0'+adNum[0]%10);
LcdWriteData('V');
Pcf8591SendByte(2); //发送光敏转换命令
adNum[1]=Pcf8591ReadByte()*2; //ADC1读取热敏
//--一下读取的方式跟上面一样处理--//
//--读光敏--//
LcdWriteCom(0x86);
LcdWriteData('0'+adNum[1]/1000);
LcdWriteData('0'+adNum[1]%1000/100);
LcdWriteData('0'+adNum[1]%100/10);
LcdWriteData('0'+adNum[1]%10);
Pcf8591SendByte(3); //发送外部输入电压转换命令
adNum[2]=Pcf8591ReadByte()*2; //ADC2读取光敏
//--读取外部输入电压--//
LcdWriteCom(0x80+0x40);
LcdWriteData('0');
LcdWriteData('0'+adNum[2]/1000);
LcdWriteData('0'+adNum[2]%1000/100);
LcdWriteData('0'+adNum[2]%100/10);
LcdWriteData('0'+adNum[2]%10);
adNum[3]=Pcf8591ReadByte()*2; //ADC3读取外部输入电压
//--DA输出--//
adNum[4]=adNum[0];
Pcf8591DaConversion(adNum[4]/2); //DAC 数模转换
}
}
/*******************************************************************************
* 函 数 名 : 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(value, 0); //发送转换数值
I2C_Stop();
} |