目录
一、项目描述
二、原理图
三、仿真
四、程序
五、资料清单
资料下载地址:基于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; //清除标志
}
}
}
}
}
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);
}
}



