基於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原理圖 下載:關注公衆號,首頁回覆“氣壓計”獲取資料
在這裏插入圖片描述

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