【蓝桥杯】PCF8591 A/D D/A转换应用

学习内容

  1. 掌握ADC(光敏电阻、滑动变阻器)。
  2. 会DAC输出电压值。

PCF8591 A/D以及24C02存储芯片,底层驱动都是采取IIC协议

点击转送到小蜜蜂老师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

  • 20
    点赞
  • 73
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值