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原理圖 下載:關注公衆號,首頁回覆“氣壓計”獲取資料