蓝桥杯模块PCF8591_8位A/D and D/A转换器Part_2

   九层妖塔 起于垒土
在这里插入图片描述

一、原理图

在这里插入图片描述

二、Notes

 ● IIC 即Inter-Integrated Circuit(集成电路总线),一种简单、双向、二进制、同步串行总线。
 ●IIC是一种多向控制总线,即多个芯片可以连接到同一总线结构下,同时每个芯片都可以作为实时数据传输的控制源。这种方式简化了信号传输总线接口。
 ●PCF9591是一个单片集成、单独供电、低功耗、8-bit CMOS数据获取器件。
 ●PCF具有4个模拟输入、1个模拟输出和1个串行I2C总线接口。

三、IIC总线启动和停止条件

1、时序图

在这里插入图片描述

2、Template:

//-------------------------------IIC总线启动条件--------------------------//
void IIC_Start(void) 
{
    SDA = 1;
    SCL = 1;
    Delay6us();
    SDA = 0;
    Delay6us();
    SCL = 0;	
}
//-------------------------------IIC总线停止条件--------------------------//
void IIC_Stop(void) 
{
    SDA = 0;
    SCL = 1;
    Delay6us();
    SDA = 1;
    Delay6us();
}

3、Notes:

 ●仅将官方驱动中的延时改为Delay6us()

四、IIC发送与等待应答

1、Template:

//-------------------------------主机通过IIC发送应答----------------------------//
void IIC_SendAck(bit ackbit)   
{
    SCL = 0;          //在SCL为0时改变SDA
    SDA = ackbit;  	  // 0:应答,1:非应答
    Delay6us();
	
    SCL = 1;
    Delay6us();
    SCL = 0; 
    SDA = 1;
    Delay6us();
}

//-----------------------------IIC等待从机应答-----------------------------//
bit IIC_WaitAck(void) 
{
    bit ackbit;
	
    SCL  = 1;
    Delay6us();
    ackbit = SDA;
    SCL = 0;
    Delay6us();
    return ackbit;
}

2、Notes:

 ●应答过程:
  ①发送器将总线置为高电平
  ②来自主机的SCL也产生与应答有关的额外时钟脉冲。
  ③应答的设备必须在应答时钟脉冲期间拉低SDA线,以使SDA线在应答时钟脉冲的高电平期间稳定为低电平。
  ④将SDA线置为空闲状态-高电平。

五、通过I2C总线发送和接收数据

1、Template:

//-------------------------通过I2C总线发送数据------------------------//
void IIC_SendByte(unsigned char byt)
{
    unsigned char i;

    for(i=0; i<8; i++)
    {
        SCL  = 0;               //在SCL为0时改变SDA
        Delay6us();
        if(byt & 0x80) SDA  = 1;
        else SDA  = 0;
        Delay6us();
        SCL = 1;
        byt <<= 1;
        Delay6us();
    }
    SCL  = 0;  
}

//-----------------------从I2C总线上接收数据-----------------------------//
unsigned char IIC_RecByte(void)
{
    unsigned char i, da;
    for(i=0; i<8; i++)
    {   
    	SCL = 1;          //高电平时进行数据读取
    	Delay6us();
	    da <<= 1;
    	if(SDA) da |= 1;
	    SCL = 0;
	    Delay6us();
    }
    return da;    
}

六、通过IIC总线读取PCF8591_ADC结果

1、Template:

//--------------------------通过IIC总线读取PCF8591_ADC结果----------------//
uchar IIC_PCF8591_ADC(void)  
{
	uchar temp;
	
	IIC_Start();         
	IIC_SendByte(0X90);  //地址字节 1001 0000  向PCF8591写数据
	IIC_WaitAck();       //等待PCF8591应答
	
	IIC_SendByte(0X43);  //控制字节 0100 0011 模拟输出使能—四路单端输入-通道3
	IIC_WaitAck();	     //等待PCF8591应答
	
	IIC_Start();
	IIC_SendByte(0X91);  //地址字节 1001 0001  从PCF8591读取数据
	IIC_WaitAck();       //等待PCF8591应答
	
	temp = IIC_RecByte(); 
	IIC_SendAck(1);    //主控器件应发出一个非应答信号,告知受控器件数据接收完成,不用再发送
	IIC_Stop();
	
	return temp;
}

2、Notes:

 ●在写模式下,通过发送下一个数据传输的停止条件或开始条件来终止数据传输。

七、PCF8591—DAC输出

1、Template:

//--------------------------------PCF8591——DAC输出----------------//
void IIC_PCF8591_DAC(uchar dat)  
{
	IIC_Start();         
	IIC_SendByte(0X90);  //地址字节 1001 0000  向PCF8591写数据
	IIC_WaitAck();       //等待PCF8591应答
	
	IIC_SendByte(0X43);  //控制字节 0100 0011 模拟输出使能—四路单端输入-通道3
	IIC_WaitAck();	    //等待PCF8591应答
	
	IIC_SendByte(dat);   //dat-输出数模转换数据
	IIC_WaitAck();       //等待PCF8591应答
	IIC_Stop();
}
  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

#法外狂徒张三

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值