学习内容:
- 掌握ADC(光敏电阻、滑动变阻器)。
- 会DAC输出电压值。
PCF8591 A/D以及24C02存储芯片,底层驱动都是采取IIC协议
IIC总线只有2根信号线,一根是数据线SDA,一根是时钟线SCL,记住PCF8591物理地址0x90(写);24C02存储物理地址0xA0(写)
iic.c一共可以考三个地方,分别是ADC(光敏电阻、RB2模拟电压值) 、DAC输出电压、AT24C02中EEPROM存储器
通道控制寄存器,图片引自小蜜蜂老师PCF8591的基本原理与A/D转换应用
这里的ADC数字是8位的,也就是说转换器通过采集转换得到的最大值是256“111111111”=256;二进制的8位可表示0-256个数,转换电压0~5v,也就是会把0v-5v平均分成256份
PCF8591 A/D 这里需要记住写入PCF8591的控制字节有 光敏:0x01 滑动变阻器:0x03
// iic.c
/*
使用芯片:PCF8591
光敏:0x01
滑动变阻器:0x03
main使用 : 定义某个 char型值,赋值给它,然后数码管上显示出来
例如:unsigned char ADC;
ADC=AIN2_read();
*/
unsigned char AIN_read()//ADC 输出都是返回一个值
{
unsigned char temp;//定义一个char型值
IIC_Start();//IIC总线起始信号
IIC_SendByte(0x90);//PCF8591的写设备地址(找到PCF8591写地址0x90)(AT24C02写地址是0xa0)
IIC_WaitAck();//等待从机应答
IIC_SendByte(0x03);//通道 写入PCF8591的控制字节 光敏:0x01 滑动变阻器:0x03
IIC_WaitAck();//等待从机应答
IIC_Stop();//IIC总线停止信号
IIC_Start();//IIC总线起始信号
IIC_SendByte(0x91);//PCF8591的读设备地址(找到PCF8591读地址0x91)(AT24C02读地址是0xa1)
IIC_WaitAck();//等待从机应答
temp=IIC_RecByte();//读取PCF8591通道的数据
IIC_WaitAck();//等待从机应答
IIC_Stop();//IIC总线停止信号
return temp;//返回型的函数 都带个return
}
笔记:(前找写地址,后读地址)
前找写地址
(1)起始信号
(2)写PCF8591芯片设备地址
(3)每执行一个读写都有等待从机应答(类似延时让它读写完)
(4)找到光敏或者滑动变阻器通道
(5)每执行一个读写都有等待从机应答(类似延时让它读写完)
(6)停止写信号指令
后读地址
(1)起始信号
(2)读PCF8591芯片设备地址
(3)每执行一个读写都有等待从机应答(类似延时让它读写完)
(4)把数读出来赋值给变量
(5)每执行一个读写都有等待从机应答(类似延时让它读写完)
(6)停止写信号指令
(7)返回变量temp
主函数使用main.c
//-----------------数码管显示-------------
unsigned char adc;
void ADC_SMG()
{
lnti_SMG(5,Tab[adc/100%10]);Delay1ms();
lnti_SMG(6,Tab[adc/10%10]);Delay1ms();
lnti_SMG(7,Tab[adc1%10]);Delay1ms();
}
void mian()
{
while(1)
{
adc=AIN_read();//读取,出来的结果是0~256
ADC_SMG();
}
}
如果需要显示的是0-5vAD采样电压,只需要将读出来的adc值相应转换,例如adc*(5/256)
DAC输出电压
/*
DAC输出的电压值,可用万用表测(D/C)
main使用:需要输出指定值时,可以写死
例如:
输出5V :DAC_read(255);//0~255 对应 0~5V 相当于51左右就是1v
输出1V :DAC_read(51);
输出0V :DAC_read(0);
数码管显示:可直接显示,如输出5v
SMG(5,tab[5]); Delay1ms();
SMG(6,tabm[0]); Delay1ms();//tabm[] 是带小数点的
SMG(7,tab[0]); Delay1ms();
*/
//-------------------------DAC输出-----------------
void DAC_read(unsigned char ad)
{
IIC_Start();//IIC总线起始信号
IIC_SendByte(0x90);//PCF8591的写设备地址
IIC_WaitAck();//等待从机应答
IIC_SendByte(0x40);//通道 写入DAC输出电压通道
IIC_WaitAck();//等待从机应答
IIC_SendByte(ad);// 数据值 0~255 对应 0~5V 相当于51左右就是1v
IIC_WaitAck();//等待从机应答
IIC_Stop();//IIC总线停止信号
}
例如我们要输出1V电压,即 DAC_read(51),51相当是1V
void mian()
{
while(1)
{
DAC_read(51);//输出近1V电压
}
}
笔记:比ADC区别,例程多写了一个IIC_SendByte()数据;通道是0x40
主函数使用main.c