找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

帖子
查看: 9760|回復(fù): 6
打印 上一主題 下一主題
收起左側(cè)

單片機(jī)+MPX4115氣壓測(cè)量?jī)x的仿真與設(shè)計(jì)含源程序、Proteus圖、文檔

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:443136 發(fā)表于 2018-12-20 20:25 | 只看該作者 |只看大圖 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
壓力測(cè)量?jī)x的仿真與設(shè)計(jì)

  • 設(shè)計(jì)要求:
設(shè)計(jì)一個(gè)數(shù)字氣壓測(cè)量?jī)x,要求測(cè)量范圍為15Kpa~115Kpa,分辨力為0.1Kpa,誤差不超過1.5%。

  • 構(gòu)思:
Protues仿真軟件提供了MPX4115和MPX4250,因此可以采用這兩種芯片進(jìn)行設(shè)計(jì)。壓力傳感器對(duì)于系統(tǒng)至關(guān)重要,需要綜合實(shí)際的需求和各類壓力傳感器的性能參數(shù)加以選擇。一般要選用有溫度補(bǔ)償作用的壓力傳感器,因?yàn)闇囟妊a(bǔ)償特性可以克服半導(dǎo)體壓力傳感器件存在的溫度漂移問題。
本設(shè)計(jì)要實(shí)現(xiàn)的數(shù)字氣壓計(jì)顯示的是絕對(duì)氣壓值,同時(shí)為了簡(jiǎn)化電路,提高穩(wěn)定性和抗干擾能力,要求使用具有溫度補(bǔ)償能力的壓力傳感器。經(jīng)過綜合考慮,選擇使用MPX4115,可以產(chǎn)生高精度模擬輸出電壓。

  • 設(shè)計(jì):
1、設(shè)計(jì)整體思想:
              基于MPX4115的數(shù)字氣壓計(jì)包括軟硬件的設(shè)計(jì)與調(diào)試。軟件部分通過對(duì)C語言的學(xué)習(xí)和對(duì)單片機(jī)知識(shí)的了解,根據(jù)系統(tǒng)的特點(diǎn)編寫出單片機(jī)程序。硬件部分分為四大塊,包括非電信號(hào)數(shù)據(jù)的采集、轉(zhuǎn)換、處理以及顯示:。通過對(duì)設(shè)計(jì)的了解,選擇適合的器件,畫出原理圖。

  • 系統(tǒng)總體設(shè)計(jì)框圖:


  • 硬件設(shè)計(jì):
(1)數(shù)據(jù)采集模塊:
數(shù)據(jù)采集模塊由壓力傳感器MPX4115構(gòu)成。其中1腳是輸出信號(hào)端,輸出的是與氣壓值相對(duì)應(yīng)的模擬電壓信號(hào)。數(shù)據(jù)采集模塊的原理如圖:

MPX4115系列壓電電阻傳感器是一個(gè)硅壓力傳感器。這個(gè)傳感器結(jié)合了高級(jí)的微電機(jī)技術(shù),薄膜鍍金屬。還能為高水準(zhǔn)模擬輸出信號(hào)提供一個(gè)均衡壓力。在0℃-85℃的溫度下誤差不超過1.5%,溫度補(bǔ)償是-40℃-125℃。

  • 單片機(jī)控制模塊
AT89C52 P為40 腳雙列直插封裝的8 位通用微處理器,采用工業(yè)標(biāo)準(zhǔn)的C51內(nèi)核,在內(nèi)部功能及管腳排布上與通用的8xc52 相同,其主要用于會(huì)聚調(diào)整時(shí)的功能控制。功能包括對(duì)會(huì)聚主IC 內(nèi)部寄存器、數(shù)據(jù)RAM及外部接口等功能部件的初始化,會(huì)聚調(diào)整控制,會(huì)聚測(cè)試圖控制,紅外遙控信號(hào)IR的接收解碼及與主板CPU通信等。主要管腳有:XTAL1(19 腳)和XTAL2(18 腳)為振蕩器輸入輸出端口,外接12MHz 晶振。RST/Vpd(9 腳)為復(fù)位輸入端口,外接電阻電容組成的復(fù)位電路。VCC(40 腳)和VSS(20 腳)為供電端口,分別接+5V電源的正負(fù)端。P0~P3 為可編程通用I/O 腳,其功能用途由軟件定義,在本設(shè)計(jì)中,P0 端口(32~39 腳)被定義為N1 功能控制端口,分別與N1的相應(yīng)功能管腳相連接,13 腳定義為IR輸入端,10 腳和11腳定義為I2C總線控制端口,分別連接N1的SDAS(18腳)和SCLS(19腳)端口,12 腳、27 腳及28 腳定義為握手信號(hào)功能端口,連接主板CPU 的相應(yīng)功能端,用于當(dāng)前制式的檢測(cè)及會(huì)聚調(diào)整狀態(tài)進(jìn)入的控制功能。

  • A/D轉(zhuǎn)換模塊
ADC0832 為8位分辨率A/D轉(zhuǎn)換芯片,其最高分辨可達(dá)256級(jí),可以適應(yīng)一般的模擬量轉(zhuǎn)換要求。其內(nèi)部電源輸入與參考電壓的復(fù)用,使得芯片的模擬電壓輸入在0~5V之間。芯片轉(zhuǎn)換時(shí)間僅為32μS,據(jù)有雙數(shù)據(jù)輸出可作為數(shù)據(jù)校驗(yàn),以減少數(shù)據(jù)誤差,轉(zhuǎn)換速度快且穩(wěn)定性能強(qiáng)。獨(dú)立的芯片使能輸入,使多器件掛接和處理器控制變的更加方便。通過DI 數(shù)據(jù)輸入端,可以輕易的實(shí)現(xiàn)通道功能的選擇。正常情況下ADC0832 與單片機(jī)的接口應(yīng)為4條數(shù)據(jù)線,分別是CS、CLK、DO、DI。但由于DO端與DI端在通信時(shí)并未同時(shí)有效并與單片機(jī)的接口是雙向的,所以電路設(shè)計(jì)時(shí)可以將DO和DI 并聯(lián)在一根數(shù)據(jù)線上使用。當(dāng)ADC0832未工作時(shí)其CS輸入端應(yīng)為高電平,此時(shí)芯片禁用,CLK 和DO/DI 的電平可任意。當(dāng)要進(jìn)行A/D轉(zhuǎn)換時(shí),須先將CS使能端置于低電平并且保持低電平直到轉(zhuǎn)換完全結(jié)束。此時(shí)芯片開始轉(zhuǎn)換工作,同時(shí)由處理器向芯片時(shí)鐘輸入端CLK 輸入時(shí)鐘脈沖,DO/DI端則使用DI端輸入通道功能選擇的數(shù)據(jù)信號(hào)。在第1 個(gè)時(shí)鐘脈沖的下沉之前DI端必須是高電平,表示啟始信號(hào)。
作為單通道模擬信號(hào)輸入時(shí)ADC0832的輸入電壓是0~5V且8位分辨率時(shí)的電壓精度為19.53mV。如果作為由IN+與IN-輸入的輸入時(shí),可是將電壓值設(shè)定在某一個(gè)較大范圍之內(nèi),從而提高轉(zhuǎn)換的寬度。但值得注意的是,在進(jìn)行IN+與IN-的輸入時(shí),如果IN-的電壓大于IN+的電壓則轉(zhuǎn)換后的數(shù)據(jù)結(jié)果始終為00H。

  • 顯示模塊
首先要了解的是此數(shù)碼管為共陽極數(shù)碼管,即三極管Q1、Q2、Q3、Q4導(dǎo)通時(shí)數(shù)碼管才能點(diǎn)亮,亦即相應(yīng)的單片機(jī)P2.3、P2.、P2.、P2.0為低電平。
采用LED動(dòng)態(tài)掃描顯示原理如下:
  • P23、P22、P21、P20輸出高電平,關(guān)閉所有數(shù)碼管;
  • 顯示個(gè)位——把要顯示的數(shù)據(jù)送到P0.0-P0.7,P23送低電平,延時(shí)5毫秒(時(shí)間不能太長(zhǎng),否則數(shù)碼管會(huì)閃爍),P23送高電平;
  • 顯示十位——把要顯示的數(shù)據(jù)送到P0.0-P0.7,P22送低電平,延時(shí)5毫秒(時(shí)間不能太長(zhǎng),否則數(shù)碼管會(huì)閃爍),P22送高電平;
  • 顯示百位——把要顯示的數(shù)據(jù)送到P0.0-P0.7,P21送低電平,延時(shí)5毫秒(時(shí)間不能太長(zhǎng),否則數(shù)碼管會(huì)閃爍),P21送高電平;
  • 顯示千位——把要顯示的數(shù)據(jù)送到P0.0-P0.7,P20送低電平,延時(shí)5毫秒(時(shí)間不能太長(zhǎng),否則數(shù)碼管會(huì)閃爍),P20送高電平。
  • 以此順序循環(huán),把它做成子程序,在主循環(huán)中調(diào)用。

  • 晶振電路
MCS-51系列單片機(jī)的時(shí)鐘信號(hào)通常用兩種電路形式得到,即內(nèi)部震蕩方式和外部振蕩方式,本設(shè)計(jì)才用內(nèi)部震蕩方式。在引腳XTAL1和XTAL2外接晶體振蕩器,就構(gòu)成了內(nèi)部振蕩電路,如上圖所示,圖中C1 、C2起穩(wěn)定震蕩頻率、快速起振的作用,電容值一般在5PF到30PF。晶體常選用6MHz 、12MHz 或24MHz采用串口時(shí)常使用11.0592MHz。內(nèi)部震蕩方式所得到的時(shí)鐘信號(hào)比較穩(wěn)定。

  • 復(fù)位電路
復(fù)位操作通常有兩種形式:上電復(fù)位和按鈕復(fù)位,本設(shè)計(jì)采用的是上電復(fù)位,如右圖所示。其工作原理為:上電瞬間RC電路充電,RST引腳端出現(xiàn)正脈沖,只要RST端保持在兩個(gè)時(shí)鐘周期以上的高電平,就能使單片機(jī)有效復(fù)位。

  •   原理圖
  • 仿真
仿真結(jié)果如下,順利完成實(shí)驗(yàn):


  • 心得體會(huì)
1、選擇芯片和傳感器時(shí),夠用易用就可以,綜合考慮選擇性價(jià)比最好的。
2、在進(jìn)行電路實(shí)際制作之前,應(yīng)該用仿真軟件進(jìn)行仿真,可以使開發(fā)進(jìn)程加快。
3、在實(shí)際制作電路時(shí),需要注意電源端和地端要檢測(cè)過不導(dǎo)通后才能通電檢測(cè),防止燒壞芯片。

單片機(jī)源程序如下:
  1. #include<reg52.h>
  2. #include "intrins.h"
  3. #define uint unsigned int
  4. #define uchar unsigned char

  5. //ADC0832的引腳
  6. sbit ADCS =P3^1;  //ADC0832 chip seclect
  7. sbit ADDI =P3^2;  //ADC0832 k in
  8. sbit ADDO =P3^2;  //ADC0832 k out
  9. sbit ADCLK =P3^0;  //ADC0832 clock signal080307208

  10. unsigned char dispbitcode[8]={
  11.         0xf1,0xf2,0xf4,0xf8,0xef,0xdf,0xbf,0x7f
  12.         };  //位掃描
  13. unsigned char dispcode[11]={
  14.         0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xff
  15.         };  //共陽數(shù)碼管字段碼
  16. unsigned char dispbuf[4];
  17. uint temp;
  18. uchar getdata; //獲取ADC轉(zhuǎn)換回來的值

  19. void delay_1ms(void)  //12mhz delay 1.01ms
  20. {
  21.         unsigned char x,y;   
  22.         x=3;
  23.         while(x--)
  24.         {
  25.         y=40;
  26.         while(y--);
  27.         }
  28. }

  29. void display(void)  //數(shù)碼管顯示函數(shù)
  30. {
  31.         char k;
  32.         for(k=0;k<4;k++)
  33.         {
  34.                 P2 = dispbitcode[k];
  35.                 P0 = dispcode[dispbuf[k]];
  36.                 if(k==1)      //加上數(shù)碼管的dp小數(shù)點(diǎn)
  37.                 P0&=0x7f;
  38.                 delay_1ms();      
  39.         }
  40. }

  41. /*讀ADC0832函數(shù)*/
  42. //采集并返回
  43. unsigned int Adc0832(unsigned char channel)     //AD轉(zhuǎn)換,返回結(jié)果
  44. {
  45.         uchar i=0;
  46.         uchar j;
  47.         uint dat=0;
  48.         uchar ndat=0;
  49.         if(channel==0)channel=2;
  50.         if(channel==1)channel=3;
  51.         ADDI=1;
  52.         _nop_();
  53.         _nop_();
  54.         ADCS=0;//拉低CS端
  55.         _nop_();
  56.         _nop_();
  57.         ADCLK=1;//拉高CLK端
  58.         _nop_();
  59.         _nop_();
  60.         ADCLK=0;//拉低CLK端,形成下降沿1
  61.         _nop_();
  62.         _nop_();
  63.         ADCLK=1;//拉高CLK端
  64.         ADDI=channel&0x1;
  65.         _nop_();
  66.         _nop_();
  67.         ADCLK=0;//拉低CLK端,形成下降沿2
  68.         _nop_();
  69.         _nop_();
  70.         ADCLK=1;//拉高CLK端
  71.         ADDI=(channel>>1)&0x1;
  72.         _nop_();
  73.         _nop_();
  74.         ADCLK=0;//拉低CLK端,形成下降沿3
  75.         ADDI=1;//控制命令結(jié)束
  76.         _nop_();
  77.         _nop_();
  78.         dat=0;
  79.         for(i=0;i<8;i++)
  80.         {
  81.                 dat|=ADDO;//收數(shù)據(jù)
  82.                 ADCLK=1;
  83.                 _nop_();
  84.                 _nop_();
  85.                 ADCLK=0;//形成一次時(shí)鐘脈沖
  86.                 _nop_();
  87.                 _nop_();
  88.                 dat<<=1;
  89.                 if(i==7)dat|=ADDO;
  90.         }  
  91.         for(i=0;i<8;i++)
  92.         {
  93.         j=0;
  94.         ADDO=1;//收數(shù)據(jù)
  95.         ADCLK=1;
  96.         _nop_();
  97.         _nop_();
  98.         ADCLK=0;//形成一次時(shí)鐘脈沖
  99.         _nop_();
  100.         _nop_();
  101.         j=j<<7;
  102.         ndat=ndat|j;
  103.         if(i<7)ndat>>=1;
  104.         }
  105.         ADCS=1;//拉低CS端
  106.         ADCLK=0;//拉低CLK端
  107.         ADDO=1;//拉高數(shù)據(jù)端,回到初始狀態(tài)
  108.         dat<<=8;
  109.         dat|=ndat;
  110.         return(dat);            //return ad k
  111. }

  112. /*主程序*/
  113. void main(void)
  114. {  
  115.         while(1)
  116.         {      unsigned int temp;
  117.                 float  press;                 
  118.                 getdata=Adc0832(0);
  119.                 if(14<getdata<243)                           //當(dāng)壓力值介于15kpa到115kpa之間時(shí),遵循線性變換
  120.                 {               
  121.                         int vary=getdata;                        //y=(115-15)/(243-13)*X+15kpa            
  122.                         press=((10.0/23.0)*vary)+9.3;            //測(cè)試時(shí)補(bǔ)償值為9.3
  123.                         temp=(int)(press*10);                    //放大10倍,便于后面的計(jì)算
  124.                         dispbuf[3]=temp/1000;                     //取壓力值百位
  125.                         dispbuf[2]=(temp%1000)/100;                //取壓力值十位
  126.                         dispbuf[1]=((temp%1000)%100)/10;            //取壓力值個(gè)位

  127. ……………………

  128. …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼

所有資料51hei提供下載:
壓力測(cè)量?jī)x的仿真與設(shè)計(jì).rar (672.72 KB, 下載次數(shù): 201)

評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏4 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:236336 發(fā)表于 2019-3-25 10:38 | 只看該作者
有用,幫大忙了
回復(fù)

使用道具 舉報(bào)

板凳
ID:513208 發(fā)表于 2019-5-17 10:25 | 只看該作者
挺有幫助的,謝謝樓主大大
回復(fù)

使用道具 舉報(bào)

地板
ID:544477 發(fā)表于 2019-5-22 15:51 | 只看該作者
MPX4250和4115在使用上有沒有區(qū)別誒 就是代碼和電路連線上
回復(fù)

使用道具 舉報(bào)

5#
ID:707851 發(fā)表于 2020-3-13 19:25 | 只看該作者
為什么我把程序?qū)牒�,顯示器不工作呢
回復(fù)

使用道具 舉報(bào)

6#
ID:413568 發(fā)表于 2020-3-26 14:01 | 只看該作者
第四個(gè)三極管為什么和前三個(gè)不一樣
回復(fù)

使用道具 舉報(bào)

7#
ID:733895 發(fā)表于 2020-5-2 15:36 | 只看該作者
感謝樓主
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表