本系统是以MCS-51单片机为检测中心的大气压检测系统。其总体设计是围绕低成本、模块化、微型化的特点展开的。在硬件选择方面, 选择性价比高的AT89系列单片机、MPX4115压力传感器、ADC0832模数转换器、四位一体共阳七段式数码管显示器;在软件方面, 采用了功能模块化;源程序由C语言编写,经过KeilμVision软件编译,将hex文件烧录到芯片中。为了降低整个系统的成本, 在满足性能要求的前提下, 选择低成本元器件, 简化系统设计。同时,抗干扰能力强、微型化、微功耗等特点。
完整版 电路图和程序代码 下载地址
https://pan.baidu.com/s/11y-Xr5V7itAN8gn0CHGI_w?pwd=8888
部分代码展示
#include<reg52.h>
#include "intrins.h"
#define uint unsigned int
#define uchar unsigned char
//ADC0832的引脚
sbit ADCS =P3^1; //ADC0832 chip seclect
sbit ADDI =P3^2; //ADC0832 k in
sbit ADDO =P3^2; //ADC0832 k out
sbit ADCLK =P3^0; //ADC0832 clock signal080307208
unsigned char dispbitcode[8]={
0xf1,0xf2,0xf4,0xf8,0xef,0xdf,0xbf,0x7f
}; //位扫描
unsigned char dispcode[11]={
0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xff
}; //共阳数码管字段码
unsigned char dispbuf[4];
uint temp;
uchar getdata; //获取ADC转换回来的值
void delay_1ms(void) //12mhz delay 1.01ms
{
unsigned char x,y;
x=3;
while(x--)
{
y=40;
while(y--);
}
}
void display(void) //数码管显示函数
{
char k;
for(k=0;k<4;k++)
{
P2 = dispbitcode[k];
P0 = dispcode[dispbuf[k]];
if(k==1) //加上数码管的dp小数点
P0&=0x7f;
delay_1ms();
}
}
/*读ADC0832函数*/
//采集并返回
unsigned int Adc0832(unsigned char channel) //AD转换,返回结果
{
uchar i=0;
uchar j;
uint dat=0;
uchar 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;
ADDO=1;//收数据
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
}
/*主程序*/
void main(void)
{
while(1)
{ unsigned int temp;
float press;
getdata=Adc0832(0);
if(14<getdata<243) //当压力值介于15kpa到115kpa之间时,遵循线性变换
{
int vary=getdata; //y=(115-15)/(243-13)*X+15kpa
press=((10.0/23.0)*vary)+9.3; //测试时补偿值为9.3
temp=(int)(press*10); //放大10倍,便于后面的计算
dispbuf[3]=temp/1000; //取压力值百位
dispbuf[2]=(temp%1000)/100; //取压力值十位
dispbuf[1]=((temp%1000)%100)/10; //取压力值个位
dispbuf[0]=((temp%1000)%100)%10; //取压力值十分位
display();
}
}
}