PCF8591 dac
void dac_pcf8591(unsigned char dat)
{
IIC_Start();
IIC_SendByte(0x90);
IIC_WaitAck();
IIC_SendByte(0x40); //DAC输出模式
IIC_WaitAck();
IIC_SendByte(dat);
IIC_WaitAck();
IIC_Stop();
}
adc
unsigned char pcf8591_adc(){
unsigned char dat;
I2CStart();
I2CSendByte(0x90);
I2CWaitAck();
I2CSendByte(0x03);
I2CWaitAck();
I2CStart();
I2CSendByte(0x91);
I2CWaitAck();
I2CReceiveByte();
I2CSendAck(0);
dat = I2CReceiveByte();
I2CSendAck(1);
I2CStop();
return dat;
}
主函数
adc_value = (float)adread() /255.0f * 500.0f;//3为RB2 1为光敏电阻
Delay10ms();
pcf_8591[1] = t_display[volt / 100 + 32];
pcf_8591[2] = t_display[volt / 10 % 10];
pcf_8591[3] = t_display[volt % 10];
终极版
/* ------------------pcf8591----------------- */
uint8_t control_byte = 0x04;
uint8_t dac_level = 0; //当前dac输出的等级,输出前先修改这个值再调用输出函数
uint8_t adc_level[4] = { 0 };
void dac_out(void)
{
control_byte |= 0x40; //开启dac输出
I2CStart();
I2CSendByte(0x90);
I2CWaitAck();
I2CSendByte(control_byte);
I2CWaitAck();
I2CSendByte(dac_level);
I2CWaitAck();
I2CStop();
}
void dac_stop(void)
{
control_byte &= ~0x40; //关闭dac输出
I2CStart();
I2CSendByte(0x90);
I2CWaitAck();
I2CSendByte(control_byte);
I2CWaitAck();
I2CStop();
}
void adc_read(void)
{
I2CStart();
I2CSendByte(0x90);
I2CWaitAck();
I2CSendByte(control_byte);
I2CWaitAck();
I2CStart();
I2CSendByte(0x91);
I2CWaitAck();
I2CReceiveByte(); //第一次读取的数据不要使用
I2CSendAck(0); //发送应答
adc_level[0] = I2CReceiveByte();
I2CSendAck(0); //发送应答
adc_level[1] = I2CReceiveByte();
I2CSendAck(0); //发送应答
adc_level[2] = I2CReceiveByte();
I2CSendAck(0); //发送应答
adc_level[3] = I2CReceiveByte();
I2CSendAck(1); //发送非应答
I2CStop();
}