//PCF8591的使用
//光敏传感器接到AIN1,通道1;控制寄存器应写入:0x01。
//电位器Rb2接到AIN3,通道3;控制寄存器应写入:0x03。
//A是模拟量,D是数字量
// 要引入IIC.h
//通过 PCF8591 的 ADC 通道测量电位器 RB2 的输出电压。
#define uchar unsigned char
#define uint unsigned int
uchar adc_volt=0;//实际温度
uint smg_volt=0;//数码管显示温度
uchar volt_list[3];
void Delay10ms() //@12.000MHz
{
unsigned char i, j;
i = 117;
j = 184;
do
{
while (--j);
} while (--i);
}
//PCF8591,AD转换读取函数
void PF9581_ADC_Read(uchar channel)
{
uchar adc_value=0;
IIC_Start();
IIC_SendByte(0x90); //单片机寻址,写入从机PCF8591的写地址,通信方向:单片机--> PCF8591
if(IIC_WaitAck()) //等待从机应答,1表示不应答,0表示应答
{
IIC_Stop(); //如果不应答,则结束通信
return 0;
}
IIC_SendByte(0x00|channel); //写入控制指令,单端输入,AD转换,选择通道
IIC_WaitAck(); //这一步不能少,否则一直读出来255
IIC_Stop(); //结束此次通信,改变收发方向
IIC_Start();
IIC_SendByte(0x91); //单片机寻址,写入从机PCF8591的读地址,通信方向:PCF8591--> 单片机PCF8591
if(IIC_WaitAck()) //等待从机应答,1表示不应答,0表示应答
{
IIC_Stop(); //如果不应答,则结束通信
return 0;
}
adc_value=IIC_RecByte(); //读出AD转换出的数字量
IIC_SendAck(1); //不应答
//如果后续有数模转换不需要进行数据处理,且题目要求数字量,就直接读出
volt_list[0] = adc_value/100%10; //计算数字量的百位
volt_list[1] = adc_value/10%10; //计算数字量的十位
volt_list[2] = adc_value%10; //计算数字量的各位
adc_volt=adc_value;
/*
dc_volt = adc_value * (5.0 / 255);
smg_volt = adc_volt * 100;
然后再处理
*/
}
void PCF8591_DAC_Deal_Read(uchar dat) //DAC转换函数,dat为输入的数字量
{
IIC_Start();
IIC_SendByte(0X90);
if(IIC_WaitAck()) //等待从机应答,1表示不应答,0表示应答
{
IIC_Stop(); //如果不应答,则结束通信
return 0;
}
IIC_SendByte(0x40); ///写入控制指令,DA转换
IIC_WaitAck();
IIC_SendByte(dat); //写入数字量
IIC_WaitAck(); //等待应答
IIC_Stop(); //写入数字量
}
void PCF8591_DAC_Read(uchar channel ) //单纯从DA通道读出电压
{
uchar adc_value=0;
IIC_Start();
IIC_SendByte(0X90);
if(IIC_WaitAck())
{
IIC_Stop();
return 0;
}
IIC_SendByte(0X40|channel);
IIC_WaitAck();
IIC_Stop();
IIC_Start();
IIC_SendByte(0X91);
if(IIC_WaitAck())
{
IIC_Stop();
return 0;
}
adc_value=IIC_RecByte();
IIC_SendAck(1);
IIC_Stop();
adc_volt=add_value;
}
PCF8591模板
于 2023-03-16 13:51:48 首次发布