【蓝桥杯】—{模块}—{PCF8591_8位A/D and D/A转换器Part_2}

   日期:2020-08-30     浏览:53    评论:0    
核心提示:   九层妖塔 起于垒土一、原理图

   九层妖塔 起于垒土

【蓝桥杯】—{模块}—{PCF8591_8位A/D and D/A转换器Part_2}

  • 一、原理图
  • 二、Notes
  • 三、IIC总线启动和停止条件
    • 1、时序图
    • 2、Template:
    • 3、Notes:
  • 四、IIC发送与等待应答
    • 1、Template:
    • 2、Notes:
  • 五、通过I2C总线发送和接收数据
    • 1、Template:
  • 六、通过IIC总线读取PCF8591_ADC结果
    • 1、Template:
  • 七、PCF8591—DAC输出
    • 1、Template:

一、原理图

二、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();       //等待应答
	
	IIC_SendByte(0x43);  //控制字节 0100 0011 模拟输出使能—四路单端输入-通道3
	IIC_WaitAck();	
	
	IIC_Start();
	IIC_SendByte(0x91);  //地址字节 1001 0001 向PCF8591写数据
	IIC_WaitAck();       //等待应答
	
	temp = IIC_RecByte(); 
	IIC_SendAck(1);
	IIC_Stop();
	
	return temp;
}

七、PCF8591—DAC输出

1、Template:

//--------------------------------PCF8591——DAC输出----------------//
void IIC_PCF8591_DAC(uchar dat)  
{
	IIC_Start();         
	IIC_SendByte(0x90);  //地址字节 1001 0000 向PCF8591写数据
	IIC_WaitAck();       //等待应答
	
	IIC_SendByte(0x43);  //控制字节 0100 0011 模拟输出使能—四路单端输入-通道3
	IIC_WaitAck();	
	
	IIC_SendByte(dat);   //dat-输出数模转换数据
	IIC_WaitAck();
	IIC_Stop();
}
 
打赏
 本文转载自:网络 
所有权利归属于原作者,如文章来源标示错误或侵犯了您的权利请联系微信13520258486
更多>最近资讯中心
更多>最新资讯中心
0相关评论

推荐图文
推荐资讯中心
点击排行
最新信息
新手指南
采购商服务
供应商服务
交易安全
关注我们
手机网站:
新浪微博:
微信关注:

13520258486

周一至周五 9:00-18:00
(其他时间联系在线客服)

24小时在线客服