51单片机第六讲(AD/DA转换)

1.计算机系统是一个数字系统、离散系统,而我们生活的外部世界是一个模拟系统。为使计算机系统能够了解外部世界,对外部事物进行处理,就必须有一个将模拟量转换为数字量,将数字量转换为模拟量的接口,这就是常说的 A/D和 D/A。

2.PCF8591t芯片
PCF8591 特性
• 单独供电
• PCF8591 的操作电压范围2.5V-6V
• 低待机电流
• 通过I²C 总线串行输入/输出
• PCF8591 通过3 个硬件地址引脚寻址
• PCF8591 的采样率由I²C 总线速率决定
• 4 个模拟输入可编程为单端型或差分输入
• 自动增量频道选择
• PCF8591 的模拟电压范围从VSS 到VDD
• PCF8591 内置跟踪保持电路
• 8-bit 逐次逼近A/D 转换器

步骤:
初始化 :
1.start
2.器件地址
3.寄存器值

51单片机第六讲(AD/DA转换)_第1张图片
AD采样步骤
1.start
2.地址 /rd
3.读取数据 nack(last byte)
4.stop

//AD转换
unsigned char ReadAdc(unsigned char ch1)
{
     unsigned char value;
     //1.start
     i2c_Start();
     //2.器件地址 -0x90 0x91
     i2c_SendByte(PCFADDR | 0x00);    //PCFADDR是IIC总线的接的设备的地址PCF8591即为0x90
     if(i2c_WaitAck() != 0)           //如果没有产生应该信号则终止
     {
        i2c_Stop();
        return 0;
     }
     //3.寄存器 -0x40(通道0,4个独立通道)
     i2c_SendByte(0x40 | ch1);
     if(i2c_WaitAck() != 0)
     {
        i2c_Stop();
        return 0;
     }

     //读取AD采样值
     //1.Start
     i2c_Start();
     //2.地址 /rd
     i2c_SendByte(PCFADDR | 0x01); //1的时候是读,0的时候是写
     if(i2c_WaitAck() != 0)
     {
        i2c_Stop();
        return 0;
     }
     //3.读取数据nack(last byte)
     value = i2c_ReadByte();
     i2c_NAck();//最后一位数据给它一个非应答信号
     //4.stop
     i2c_Stop();

     return value;
}

DA转换:
51单片机第六讲(AD/DA转换)_第2张图片
步骤:
1.start
2.地址 wr
3.control byte
4.发送数据(DA转换值)
5.stop

//DA转换
unsigned char SetDac(unsigned char dacvalue)
{
    //1.start
    i2c_Start();
    //2.地址 wr
    i2c_SendByte(PCFADDR | 0x00);//0的时候代表写
     if(i2c_WaitAck() != 0)
     {
        i2c_Stop();
        return 0;
     }
     //3.control byte
     i2c_SendByte(0x40);
     if(i2c_WaitAck() != 0)
     {
        i2c_Stop();
        return 0;
     }
     //4.发送数据(DA转换值)
     i2c_SendByte(dacvalue);
     if(i2c_WaitAck() != 0)
     {
        i2c_Stop();
        return 0;
     }
     //5.stop
     i2c_Stop();

     return 1;
} 

你可能感兴趣的:(51单片机)