基于51单片机的数字气压计

1.概述
本设计是基于MPX4115的数字气压计,硬件处理电路为大气压传感器模拟信号的采集、转换、处理和显示,并根据相应的软件需求设计控制程序。

2.硬件设计
(1)硬件总体框图
气压计的硬件主要由四部分组成,分别为单片机最小系统、气压信号采集电路、ADC转换电路和数码管电路。
在这里插入图片描述
(2)气压信号采集转换电路
a.气压信号采集
数据采集模块由压力传感器MPX4115构成,其类型是硅压力传感器。这个传感器结合了高级的微电机技术,薄膜镀金属。还能为高水准模拟输出信号提供一个均衡压力。在0℃-85℃的温度下误差不超过1.5%,温度补偿是-40℃-125℃。

b.AD转换
ADC0832 为8位分辨率A/D转换芯片,其最高分辨可达256级,可以适应一般的模拟量转换要求。其作用是将气压信号采集的模拟信号转换为8位数字信号,并将结果传给单片机处理。
正常情况下ADC0832 与单片机的接口应为4条数据线,分别是CS、CLK、DO、DI。但由于DO端与DI端在通信时并未同时有效并与单片机的接口是双向的,所以电路设计时可以将DO和DI 并联在一根数据线上使用。当ADC0832未工作时其CS输入端应为高电平,此时芯片禁用,CLK 和DO/DI 的电平可任意。当要进行A/D转换时,须先将CS使能端置于低电平并且保持低电平直到转换完全结束。此时芯片开始转换工作,同时由处理器向芯片时钟输入端CLK 输入时钟脉冲,DO/DI端则使用DI端输入通道功能选择的数据信号。在第1 个时钟脉冲的下沉之前DI端必须是高电平,表示启始信号。
在这里插入图片描述
(3)硬件原理图
在这里插入图片描述
3.软件设计
(1)ADC0832驱动程序

//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

/*读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
}

(2)数码管显示程序

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];

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();      
	}
}

(3)主程序

/*主程序*/
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();
		}        
	}
}

源码+仿真+AD原理图 下载:关注公众号,首页回复“气压计”获取资料
在这里插入图片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章