栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

基于51的MPX4115压力检测仿真

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

基于51的MPX4115压力检测仿真

目录

一、项目描述

二、原理图

三、仿真

四、程序

五、资料清单

资料下载地址:基于51的MPX4115压力检测仿真  

一、项目描述

 基于51的MPX4115压力检测,通过MPX4115压力传感器检测路面上的压力,把检测的值送到ADC0832模数转换器中,结束转换后数据反馈给单片机,单片机读取数据经过软件处理传送到数码管上显示。存储芯片选用的AT24C04,通过I2C协议写入和读取里面的数据。蜂鸣器的控制主要是通过单片机中设定压力报警的阀值,高于阀值再由单片机输出一个信号打开蜂鸣器,数据正常时单片机输出一个信号关闭蜂鸣器停止报警。

二、原理图

三、仿真

 四、程序
void main(void) 
{ 
  unsigned int OverCounter = 0; 
  unsigned char ptemp;
  bit OverFlg = 0;
  unsigned int temp,ppress = 0;
  float  press;	
  while(1)
  {	  
   		  
	  getdata=Adc0832(0);
	  if(14 100)
      {
          if(OverFlg == 1)   
          {
            OverCounter++;
            WIICByte(W24C04ADD,0x01,(OverCounter/0xff));    //低位
            WIICByte(W24C04ADD,0x02,(OverCounter%0xff));    //高位
            OverFlg = 0;    //清除标志
          }
      }

	   }	    
  }
} 


//采集并返回
unsigned int Adc0832(unsigned char channel)     //AD转换,返回结果
{
    unsigned char i=0;
    unsigned char j;
    unsigned int dat=0;
    unsigned char ndat=0;

    if(channel==0)channel=2;
    if(channel==1)channel=3;
    ADDI=1;
    _nop_();
    _nop_();
    ADCS=0;//拉低CS端
    _nop_();
    _nop_();
    ADCLK=1;//拉高CLK端
    _nop_();
    _nop_();
    ADCLK=0;//拉低CLK端,形成下降沿1
    _nop_();
    _nop_();
    ADCLK=1;//拉高CLK端
    ADDI=channel&0x1;
    _nop_();
    _nop_();
    ADCLK=0;//拉低CLK端,形成下降沿2
    _nop_();
    _nop_();
    ADCLK=1;//拉高CLK端
    ADDI=(channel>>1)&0x1;
    _nop_();
    _nop_();
    ADCLK=0;//拉低CLK端,形成下降沿3
    ADDI=1;//控制命令结束 
    _nop_();
    _nop_();
    dat=0;
    for(i=0;i<8;i++)
    {
        dat|=ADDO;//收数据
        ADCLK=1;
        _nop_();
        _nop_();
        ADCLK=0;//形成一次时钟脉冲
        _nop_();
        _nop_();
        dat<<=1;
        if(i==7)dat|=ADDO;
    }  
    for(i=0;i<8;i++)
    {
        j=0;
        j=j|ADDO;//收数据
        ADCLK=1;
        _nop_();
        _nop_();
        ADCLK=0;//形成一次时钟脉冲
        _nop_();
        _nop_();
        j=j<<7;
        ndat=ndat|j;
        if(i<7)ndat>>=1;
    }
    ADCS=1;//拉低CS端
    ADCLK=0;//拉低CLK端
    ADDO=1;//拉高数据端,回到初始状态
    dat<<=8;
    dat|=ndat;
    return(dat);            //return ad k
}

//启动I2C总线,即发送起始条件
void StartI2C()
{
	SDA = 1;	                      //发送起始条件数据信号
	_nop_();
	SCL = 1;
	_nop_();		                    //起始建立时间大于4.7us
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	SDA = 0;	                      //发送起始信号
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	SCL = 0;	                        //时钟操作
	_nop_();
	_nop_();
}
//结束I2C总线,即发送I2C结束条件
void StopI2C()
{
	SDA = 0;	                        //发送结束条件的数据信号
	_nop_();		                      //发送结束条件的时钟信号
	SCL = 1;	                        //结束条件建立时间大于4us
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	SDA = 1;	                        //发送I2C总线结束命令
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();	
}
//发送一个字节的数据
void	SendByte(unsigned char c)
{
	unsigned char BitCnt;
	for(BitCnt = 0;BitCnt < 8;BitCnt++)			          //一个字节
		{
			if((c << BitCnt)& 0x80) SDA = 1;	           //判断发送位
			else	SDA = 0;
			_nop_();
			SCL = 1;	                      //时钟线为高,通知从机开始接收数据
			_nop_();
			_nop_();
			_nop_();
			_nop_();
			_nop_();
			SCL = 0;
		}
	_nop_();
	_nop_();
	SDA = 1;	                                        //释放数据线,准备接受应答位
	_nop_();
	_nop_();
	SCL = 1;
	_nop_();
	_nop_();
	_nop_();
	if(SDA == 1) bAck =0;
	else bAck = 1;		                                //判断是否收到应答信号
	SCL = 0;
	_nop_();
	_nop_();
}
//接收一个字节的数据
unsigned char RevByte()
{
	unsigned char retc;
	unsigned char BitCnt;
	retc = 0;
	SDA = 1;
	for(BitCnt=0;BitCnt<8;BitCnt++)
	{
		_nop_();
		SCL = 0;	                                    //置时钟线为低,准备接收
		_nop_();
		_nop_();
		_nop_();
		_nop_();
		_nop_();
		SCL = 1;	                                    //置时钟线为高使得数据有效
		_nop_();
		_nop_();
		retc = retc << 1;	                            //左移补零
		if (SDA == 1)
		retc = retc + 1;                             	//当数据为1则收到的数据+1
		_nop_();
		_nop_();
	}
	SCL = 0;
	_nop_();
	_nop_();
	return(retc);                                   //返回收到的数据
}


unsigned char WIICByte(unsigned char WChipAdd,unsigned char InterAdd,unsigned char WIICData)
{
	StartI2C();										      //启动总线
	SendByte(WChipAdd);							//发送器件地址以及命令
	if (bAck==1)											  //收到应答
	{
		SendByte(InterAdd);								//发送内部子地址
		if (bAck ==1)
		{
			SendByte(WIICData);							//发送数据
			if(bAck == 1)
			{
				StopI2C();                    //停止总线
				return(0xff);
			}
			else
			{
				return(0x03);
			}			
		}
		else
		{
			return(0x02);
		}
	}
	return(0x01);
}
//读取指定器件的内部指定地址一个字节数据
unsigned char RIICByte(unsigned char WChipAdd,unsigned char RChipAdd,unsigned char InterDataAdd)
{
	unsigned char TempData;	
	TempData = 0;
	StartI2C();								        //启动
	SendByte(WChipAdd);					    	//发送器件地址以及读命令
	if (bAck==1)								    	//收到应答
	{
		SendByte(InterDataAdd);					//发送内部子地址
		if (bAck ==1)
		{
			StartI2C();
			SendByte(RChipAdd);	
			if(bAck == 1)
			{
				TempData = RevByte();       //接收数据
				StopI2C();                  //停止I2C总线
				return(TempData);           //返回数据
			}
			else
			{
				return(0x03);
			}	
		}
		else
		{
			return(0x02);
		}
	}
	else
	{
		return(0x01);
	}
}

五、资料清单

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/913388.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号