一、MPX4115型压力传感器介绍

1.1 引脚说明

即:1引脚为模拟量输出,2引脚接地,三引脚接电源,4、5、6引脚空

1.2 输出特性图

选择典型曲线,我们可以得知转换公式:压力值=(电压值/5.1+0.095)/0.009。

二、模拟IIC总线

因为本例子采用的为51单片机,因此需要自己模拟IIC总线协议。

2.1 IIC总线工作时序如下

2.2 根据上图所示IIC总线工作协议进行IIC工作模拟

2.2.1 IIC总线启动

void I2c_start()
{sda=1;scl=1;Delay1(DELAY_TIME);sda=0;Delay1(DELAY_TIME);scl=0;
}

2.2.2 IIC发送一个字节

void I2c_sendbyte(uchar byt)
{uchar i;for(i=0;i<8;i++){scl=0;Delay1(DELAY_TIME);if(byt&0x80){sda=1;}else{sda=0;}Delay1(DELAY_TIME);scl=1;byt <<= 1;Delay1(DELAY_TIME);}scl=0;
}

2.2.3 IIC等待响应

uchar I2c_waitack()
{uchar ackbit;sda=1;//释放数据线Delay1(DELAY_TIME);scl=1;Delay1(DELAY_TIME);ackbit=sda;//获取响应信号,低电平为有效scl=0;Delay1(DELAY_TIME);return sda;
}

2.2.4 IIC接收一个字节

uchar I2c_receivebyte()
{uchar da;uchar i;for(i=0;i<8;i++){scl=1;Delay1(DELAY_TIME);da<<=1;if(sda){da|=0x01;}scl=0;Delay1(DELAY_TIME);}return da;
}

2.2.5 IIC发送响应

void I2c_sendack(uchar ackbit)
{scl=0;sda=ackbit;  //0:发送应答信号;1:发送非应答信号Delay1(DELAY_TIME);scl=1;Delay1(DELAY_TIME);scl=0;sda=1;Delay1(DELAY_TIME);
}

2.2.6 IIC总线结束

void I2c_stop()
{sda=0;scl=1;Delay1(DELAY_TIME);sda=1;Delay1(DELAY_TIME);
}

三、PCF8591型AD介绍

3.1 介绍

PCF8591 是单电源,低功耗8 位CMOS 数据采集器件,具有4 个模拟输入、一个输出和一个串行I2C 总线接口。3 个地址引脚A0、A1 和A2 用于编程硬件地址,允许将最多8 个器件连接至I2C总线而不需要额外硬件。PCF8591由于其使用的简单方便和集成度高,在单片机应用系统中得到了广泛的应用。

3.2 引脚说明

3.3 器件地址说明

每一个IIC器件都有一个器件地址,来区分不同的IIC设备,下面是PCF8591的地址格式

在本例子中,我将A0、A1、A2全部接地,因此写地址为0x90,读地址为0x91。

3.4 控制字说明

在该例子中我们进行的是AD转换,因此第6位为0,不允许模拟电压输出;采用单端输入,因此第5、4位为0、0;该例子中只进行一个模拟输入量的AD转换,因此关闭自动增量使能,即第2位为0;模拟输入通道选择AIN3,因此第1位与第0位为1、1。因此,控制字为0x30。

3.5 输出特性曲线

在该例子中,我们让Vagnd=0V,Vref=5V。因此可得转换公式为:电压值=(5.0/256.0)*AD模块的读数。

四、Proteus仿真电路

五、完整例程(例程均为自己编写且在仿真中测试通过)

使用单片机为AT89C52,工作频率为12MHz

#include<reg52.h>
#include<intrins.h>typedef unsigned char uchar;
typedef unsigned int  uint;#define DELAY_TIME 5sbit scl = P2^0;//时钟总线接口
sbit sda = P2^1;//数据总线接口
sbit w2=P2^2;//位选2
sbit w3=P2^3;//位选3
sbit w4=P2^4;//位选4 void I2c_start(void);//IIC总线启动条件
void I2c_stop(void);//IIC总线结束条件
void I2c_sendbyte(uchar byt);//IIC总线发送一个字节
uchar I2c_receivebyte(void);//IIC总线接收一个字节
void I2c_sendack(uchar ackbit);//IIC总线发送应答
void Delay1(uchar t);//读写操作中的延时
void Delay2(uchar t);//等待初始化子函数
void Init_pcf8591(void);//PCF8951初始化
uchar I2c_waitack(void);//IIC等待回应子函数
uchar Read_value(void);//读取AD值
void Show(uchar Out);//显示压力值void main()
{uchar G_value;//AD值float V_value,P_value;//电压值,压力值uchar Out;//对压力值进行四舍五入后的输出值 Read_value();G_value=Read_value();V_value=(5.0/256.0)*G_value;P_value=(V_value/5.1+0.095)/0.009;Out=P_value;//进行四舍五入if(P_value-Out>=0.5){Out+=1;}Show(Out);
}
/****************************读取AD值******************************************/
uchar Read_value(void)
{uchar result;Init_pcf8591();I2c_start();I2c_sendbyte(0x91);//进行读操作(A0、A1、A2均接地)I2c_waitack();result=I2c_receivebyte();I2c_sendack(1);I2c_stop();    return result;
}
/**********************PCF8591初始化函数*************************************/
void Init_pcf8591(void)
{I2c_start();I2c_sendbyte(0x90);//进行写操作(A0、A1、A2均接地)I2c_waitack();I2c_sendbyte(0x03); //选择通道AIN3进行转化I2c_waitack();I2c_stop();Delay2(10);
}
/**********************IIC总线启动*************************************/
void I2c_start()
{sda=1;scl=1;Delay1(DELAY_TIME);sda=0;Delay1(DELAY_TIME);scl=0;
}
/********************IIC发送一个字节***********************************/
void I2c_sendbyte(uchar byt)
{uchar i;for(i=0;i<8;i++){scl=0;Delay1(DELAY_TIME);if(byt&0x80){sda=1;}else{sda=0;}Delay1(DELAY_TIME);scl=1;byt <<= 1;Delay1(DELAY_TIME);}scl=0;
}
/********************IIC等待回应***********************************/
uchar I2c_waitack()
{uchar ackbit;sda=1;//释放数据线Delay1(DELAY_TIME);scl=1;Delay1(DELAY_TIME);ackbit=sda;//获取响应信号,低电平为有效scl=0;Delay1(DELAY_TIME);return sda;
}
/********************IIC接收一个字节******************************/
uchar I2c_receivebyte()
{uchar da;uchar i;for(i=0;i<8;i++){scl=1;Delay1(DELAY_TIME);da<<=1;if(sda){da|=0x01;}scl=0;Delay1(DELAY_TIME);}return da;
}
/********************IIC发送回应***********************************/
void I2c_sendack(uchar ackbit)
{scl=0;sda=ackbit;  //0:发送应答信号;1:发送非应答信号Delay1(DELAY_TIME);scl=1;Delay1(DELAY_TIME);scl=0;sda=1;Delay1(DELAY_TIME);
}
/**********************IIC总线结束*************************************/
void I2c_stop()
{sda=0;scl=1;Delay1(DELAY_TIME);sda=1;Delay1(DELAY_TIME);
}
/**********************IIC中延时函数*************************************/
void Delay1(uchar t)
{do{_nop_();}while(t--);
}
/**************************等待初始化延时***************************************/
void Delay2(uchar t)
{unsigned char i;while(t--){for(i=0; i<112; i++);}
}/**********************显示函数*************************************/
void Show(uchar Out)
{char code duan[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//段码while(1){w4=0;//显示第百位w3=0;w2=1;Delay2(5);P1=duan[(Out/100)%10];Delay2(15);P1=0xff;w4=0;//显示第十位w3=1;w2=0;Delay2(5);P1=duan[(Out/10)%10];Delay2(15);P1=0xff;w4=1;//显示第个位w3=0;w2=0;Delay2(5);P1=duan[Out%10];Delay2(15);P1=0xff;}
}

左肩理想,右肩担当。君子不怨永远不会停下脚步!

“MPX4115型压力传感器+PCF8591型AD+模拟IIC总线”的Proteus仿真相关推荐

  1. 基于51单片机实现模拟IIC总线时序

    最近用到测量光线的模块BH1750FVI时需要用到IIC总线操作, 于是就又费功夫学习了下, 基本上算是了解了, 所以呢, 就用51的IO口, 模拟出了总线时序, 并能正确操纵需要用IIC总线访问地一 ...

  2. STM32F103模拟IIC总线驱动四个VL53L0

    2020-11-29晚更新 最近有私信说代码用不了的问题,上传的第一个版本确实有一些优化的缺陷,但是绝对是可以用的,在笔者之前的使用过程中是可以满足需求的,下载了代码的小伙伴不要有拿来即用的想法,可能 ...

  3. 【ESP32】10.PCF8591数模转换器实验(IIC总线/wire库)

    上一篇: [ESP32]9.无源蜂鸣器(PWM第二篇) 前言: 先放电路连接图: PCF8591是一款单芯片,单电源和低功耗的8位CMOS数据采集模块,具有4个模拟输入,一个模拟输出和一个串行IIC总 ...

  4. adurnio 单片机_单片机20~200A大电流检测电路设计 用AD实现 带原理图,源代码,proteus仿真文件...

    //------------------------------51单片机头文件 #include //各数字的数码管段码(共阴) unsigned char code DSY_CODE[]={0x3 ...

  5. STM32F103C6T6 | 模拟IIC主机读取AHT20温湿度传感器数据

    关于STM32的IIC 一开始是用硬件内置的IIC来读取数据的,没有什么问题,但是不知道为什么后续断电上电之后一直没有数据,仿真看的话发现卡死在这些循环里面,我才反应过来网上一直说的硬件IIC有问题是 ...

  6. GP2Y0A21YK0F距离传感器输出特性分析及其使用(IIC总线与PCF8591AD转换)+Proteus仿真(附源码)

    一.GP2Y0A21YK0F距离传感器分析 1.1 传感器介绍 GP2Y0A21YK0F是一款距离测量传感模块.它由PSD(position sensitive detector)和IRED(infr ...

  7. Chapter007-FPGA学习之IIC总线EEPROM读取

    IIC总线是嵌入式领域较为重要的器件间通信总线,同样,FPGA也能通过模块的形式实现IIC的功能,其原理和STM32的模拟IIC总线一致,就是控制每个时间点的SCL.SDA总线电平. IIC总线需要对 ...

  8. 以C语言的方式理解IIC总线

    为了加深对I2C总线的理解,用C语言模拟IIC总线,边看源代码边读波形: 如下图所示的写操作的时序图: 读时序的理解同理.对于时序不理解的朋友请参考"I2C总线之(二)-时序" 完 ...

  9. BW型、CB I型、CB II型和椭圆模拟低通滤波器设计的Matlab仿真

    [题目要求] 设计满足下列指标的模拟低通滤波器. fp=1kHz, fs=3kHz, Ap<=1dB, As>=50dB. [分析]Matlab信号处理工具提供了常用的设计模拟低通滤波器的 ...

最新文章

  1. 平面设计现在行业发展如何?
  2. UBI系统原理分析【转】
  3. CornerNet-Lite测试
  4. asp net code
  5. python调用接口实例化_python 类静态方法实例化另一个类对象的问题?
  6. MFC中SQLite数据库的使用
  7. java.io.IOException 权限不够
  8. Bailian3260 赛手查询【排序】
  9. 【笔记】android 系统常用user id列表
  10. EBS开发_创建销售人员API
  11. easybcd 无法添加linux条目,easybcd无法添加条目怎么办-easybcd无法添加条目的解决办法...
  12. 搭建ARM交叉编译环境
  13. 十六进制与ascii码的互转(c语言),十六进制与ASCII码转换
  14. 也谈企业文化—执行力
  15. 判断一个序列是否为栈的有效输出序列
  16. IJCAI2021会议论文列表(可下载)
  17. sentinel 实时监控服务
  18. JVM虚拟机的理解(上)
  19. 揭开虚拟主机供应商的面纱(转)
  20. 766C - Mahmoud and a Message(dp)

热门文章

  1. 互联网卷王花落谁家?
  2. numpy中的ndarray方法和属性
  3. 节点重要度 matlab,复杂网络节点重要度常用指标及其计算
  4. 拉结尔派遣任务辅助介绍 拉结尔快速升级脚本挂机工具
  5. git -- git emoji列表(github commit 前面的小icon)
  6. 'chromedriver' executable needs to be in PATH. Please see https://sites.google.com/a/chromium.org/ch
  7. Android中从视频中提取音频
  8. 经验模态分解与Python调用实例
  9. FPGA驱动千兆以太网PHY但电脑只显示百兆
  10. Trimmomatic、bowtie2、samtools和bedtools安装过程全记录(已全部安装成功)