PCF8591的A/D识别

PCF8691

原理图

在这里插入图片描述
1、PCF8591 是一个单片集成、单独供电、8-bit CMOS数据获取器件。
2、AIN0、AIN1、AIN2、AIN3为模拟输入端
3、AOUT为模拟输出端
4、EXT为低电平时使用内部时钟,为高电平时使用外部时钟
5、A0、A1、A2为地址引脚
6、OCS、VREF、AGND照着接相应电平就行

控制字节

在这里插入图片描述

在CT107D开发板上通道1连接光明电阻,通道3连接电位器
这两个通道可以直接用
在这里插入图片描述

代码部分

IIC

iic.c

#include "iic.h"
//总线启动条件
void IIC_Start(void)
{
    SDA = 1;
    SCL = 1;
    somenop;
    SDA = 0;
    somenop;
    SCL = 0;    
}
 
//总线停止条件
void IIC_Stop(void)
{
    SDA = 0;
    SCL = 1;
    somenop;
    SDA = 1;
}
 
//应答位控制
void IIC_Ack(unsigned char ackbit)
{
    if(ackbit) 
    {    
        SDA = 0;
    }
    else 
    {
        SDA = 1;
    }
    somenop;
    SCL = 1;
    somenop;
    SCL = 0;
    SDA = 1; 
    somenop;
}
 
//等待应答
bit IIC_WaitAck(void)
{
    SDA = 1;
    somenop;
    SCL = 1;
    somenop;
    if(SDA)    
    {   
        SCL = 0;
        IIC_Stop();
        return 0;
    }
    else  
    { 
        SCL = 0;
        return 1;
    }
}
 
//通过I2C总线发送数据
void IIC_SendByte(unsigned char byt)
{
    unsigned char i;
    for(i=0;i<8;i++)
    {   
        if(byt&0x80) 
        {    
            SDA = 1;
        }
        else 
        {
            SDA = 0;
        }
        somenop;
        SCL = 1;
        byt <<= 1;
        somenop;
        SCL = 0;
    }
}
 
//从I2C总线上接收数据
unsigned char IIC_RecByte(void)
{
    unsigned char da;
    unsigned char i;
    
    for(i=0;i<8;i++)
    {   
        SCL = 1;
        somenop;
        da <<= 1;
        if(SDA) 
        da |= 0x01;
        SCL = 0;
        somenop;
    }
    return da;
}

在开发板原理图上IIC连接的是P20与P21
iic.h

#ifndef _IIC_H
#define _IIC_H
 
#include "reg52.h"
#include "intrins.h"
 
#define somenop {_nop_();_nop_();_nop_();_nop_();_nop_();}
#define SlaveAddrW 0xA0
#define SlaveAddrR 0xA1
 
//总线引脚定义
sbit SDA = P2^1;  /* 数据线 */
sbit SCL = P2^0;  /* 时钟线 */
 
//函数声明
void IIC_Start(void); 
void IIC_Stop(void);  
void IIC_Ack(unsigned char ackbit); 
void IIC_SendByte(unsigned char byt); 
bit IIC_WaitAck(void);  
unsigned char IIC_RecByte(void); 
 
#endif

PCF8951

PCF8991.c(这里我们用通道1来检测光敏电阻的电压值)

#include "pcf8951.h"

unsigned char Pcf8591_Init()
{
	static unsigned char ad_value = 0;
	IIC_Start();//打开iic
	IIC_SendByte(0x90);//器件寻址,方向上是写(写命令)
	IIC_WaitAck();
	
	IIC_SendByte(0x41);//允许DAC ADC通道1
	IIC_WaitAck();
	
	IIC_Start();
	IIC_SendByte(0x91);
	IIC_WaitAck();
	
	ad_value = IIC_RecByte();
	IIC_Ack(1);
	IIC_Stop();
	return ad_value;
}


pcf8951.h

#ifndef __PCF8951_H__
#define __PCF8951_H__

#include "reg52.h"
#include "iic.h"

unsigned char Pcf8591_Init();

#endif

在main函数里调用pcf8951读取相应的ad值就好了

版权声明:本文为CSDN博主「<Proton>」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_51116533/article/details/122409358

PCF8691

原理图

在这里插入图片描述
1、PCF8591 是一个单片集成、单独供电、8-bit CMOS数据获取器件。
2、AIN0、AIN1、AIN2、AIN3为模拟输入端
3、AOUT为模拟输出端
4、EXT为低电平时使用内部时钟,为高电平时使用外部时钟
5、A0、A1、A2为地址引脚
6、OCS、VREF、AGND照着接相应电平就行

控制字节

在这里插入图片描述

在CT107D开发板上通道1连接光明电阻,通道3连接电位器
这两个通道可以直接用
在这里插入图片描述

代码部分

IIC

iic.c

#include "iic.h"
//总线启动条件
void IIC_Start(void)
{
    SDA = 1;
    SCL = 1;
    somenop;
    SDA = 0;
    somenop;
    SCL = 0;    
}
 
//总线停止条件
void IIC_Stop(void)
{
    SDA = 0;
    SCL = 1;
    somenop;
    SDA = 1;
}
 
//应答位控制
void IIC_Ack(unsigned char ackbit)
{
    if(ackbit) 
    {    
        SDA = 0;
    }
    else 
    {
        SDA = 1;
    }
    somenop;
    SCL = 1;
    somenop;
    SCL = 0;
    SDA = 1; 
    somenop;
}
 
//等待应答
bit IIC_WaitAck(void)
{
    SDA = 1;
    somenop;
    SCL = 1;
    somenop;
    if(SDA)    
    {   
        SCL = 0;
        IIC_Stop();
        return 0;
    }
    else  
    { 
        SCL = 0;
        return 1;
    }
}
 
//通过I2C总线发送数据
void IIC_SendByte(unsigned char byt)
{
    unsigned char i;
    for(i=0;i<8;i++)
    {   
        if(byt&0x80) 
        {    
            SDA = 1;
        }
        else 
        {
            SDA = 0;
        }
        somenop;
        SCL = 1;
        byt <<= 1;
        somenop;
        SCL = 0;
    }
}
 
//从I2C总线上接收数据
unsigned char IIC_RecByte(void)
{
    unsigned char da;
    unsigned char i;
    
    for(i=0;i<8;i++)
    {   
        SCL = 1;
        somenop;
        da <<= 1;
        if(SDA) 
        da |= 0x01;
        SCL = 0;
        somenop;
    }
    return da;
}

在开发板原理图上IIC连接的是P20与P21
iic.h

#ifndef _IIC_H
#define _IIC_H
 
#include "reg52.h"
#include "intrins.h"
 
#define somenop {_nop_();_nop_();_nop_();_nop_();_nop_();}
#define SlaveAddrW 0xA0
#define SlaveAddrR 0xA1
 
//总线引脚定义
sbit SDA = P2^1;  /* 数据线 */
sbit SCL = P2^0;  /* 时钟线 */
 
//函数声明
void IIC_Start(void); 
void IIC_Stop(void);  
void IIC_Ack(unsigned char ackbit); 
void IIC_SendByte(unsigned char byt); 
bit IIC_WaitAck(void);  
unsigned char IIC_RecByte(void); 
 
#endif

PCF8951

PCF8991.c(这里我们用通道1来检测光敏电阻的电压值)

#include "pcf8951.h"

unsigned char Pcf8591_Init()
{
	static unsigned char ad_value = 0;
	IIC_Start();//打开iic
	IIC_SendByte(0x90);//器件寻址,方向上是写(写命令)
	IIC_WaitAck();
	
	IIC_SendByte(0x41);//允许DAC ADC通道1
	IIC_WaitAck();
	
	IIC_Start();
	IIC_SendByte(0x91);
	IIC_WaitAck();
	
	ad_value = IIC_RecByte();
	IIC_Ack(1);
	IIC_Stop();
	return ad_value;
}


pcf8951.h

#ifndef __PCF8951_H__
#define __PCF8951_H__

#include "reg52.h"
#include "iic.h"

unsigned char Pcf8591_Init();

#endif

在main函数里调用pcf8951读取相应的ad值就好了

版权声明:本文为CSDN博主「<Proton>」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_51116533/article/details/122409358

生成海报
点赞 0

<Proton>

我还没有学会写个人说明!

暂无评论

发表评论

相关推荐

PCA9555详细学习

2022.01.27 控制寄存器和命令寄存器,及英文理解 一般8位作为地址,其中前四位时固定的,中间三位为地址配置,最后一位是读写位,即读是1,写是0 当地址

Arduino 水滴检测

实物连接图: 电路图: 代码: void setup() {pinMode(3, OUTPUT);pinMode(2, INPUT); }void loop() {bool va2 digitalR