PCF8591模板

//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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值