国产免费AV|泡泡玛特欧洲总部将设在伦敦|中文天堂网www新版资源在线|一本久道综合在线中文|国精产品一二三产区的使用方法|香蕉鱼在线观看|www.27eee

ELEOK

標題: 51單片機+MPX4115+MCP3204氣壓監測系統源程序(Proteus模擬仿真) [打印本頁]

作者: eng    時間: 2021-7-12 22:12
標題: 51單片機+MPX4115+MCP3204氣壓監測系統源程序(Proteus模擬仿真)
做了Protues仿真的氣壓監測系統,通過對氣壓監測系統設計與仿真的學習與動手得出結論:通過以52單片機為主控芯片,MPX4115作為氣壓監測原件,以MCP3204作為AD數模轉換芯片,并配以時鐘芯片以及虛擬串口等,可成功實現氣壓監測系統設計與仿真,并實現以MPX4115為探測元件,結合單片機擴展電路組成氣壓監測系統,完成定時氣壓數據監測記錄、顯示遠傳等功能的硬件設計及軟件編程。并配合上位機實現與PC機進行通信,對于實際工業生產具有實用價值。此種方式價格低廉其易于測試,實用價值大,經過技術升級和精度提升,可以用于實現氣壓監測報警。此系統有點延時,因為沒用中斷。中斷一加上就不好使了,是自己技術問題。哈哈
需要學習的小伙伴可以下載學習。壓縮包中第一個文件夾是KEIL工程,第2個文件是Protues8.11工程文件。虛擬串口軟件可以百度下載。
本系統還有很多不足,功能也較為簡陋,有問題可以留言交流,系統中有一個按鍵,可以切換時間顯示還是氣壓顯示,但需要摁多一點時間才能切換。

仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)

部分源碼:完整源碼見附件
  1. #include<reg52.h>
  2. #include<INTRINS.H>

  3. #define  uchar  unsigned char      //8bit  0~255
  4. #define  schar  signed char        //8bit  -128~127
  5. #define  uint   unsigned int       //16bit 0~65536
  6. #define  sint   signed int         //16bit -32768~32767
  7. #define  slong   signed long         //32bit -214783648~2147483647         

  8. #define  delay1us  _nop_();_nop_();_nop_();            // delay 1 us(for fos=12M)
  9. unsigned char dispbuf[]="0123456789";
  10. unsigned char code Pre[]="Pressure:";
  11. unsigned char code Dat[]="Date:20";
  12. unsigned char code Warml[]="Warm:Too Low";
  13. unsigned char code Warmh[]="Warm:Too High";
  14. unsigned char code Normal[]="Normal";
  15.   unsigned char code Time[]="Time:";
  16. unsigned int A[]={ 48,49,50,51,52,53,54,55,56,57 } ;
  17. unsigned char code digit[10]={"0123456789"};   //定義字符數組顯示數字
  18. int i, yue,ri;shi,fen, miao,zs;
  19.    unsigned char second,minute,hour,day,month,year;      //分別儲存苗、分、小時,日,月,年
  20.   unsigned char ReadValue;

  21. sbit clk = P1^4;   // clock signel
  22. sbit dout = P1^5;  // data get out
  23. sbit din = P1^6 ;   // data put in
  24. sbit cs = P1^7;    // cs selt
  25. sbit RS  = P2^5;        //寄存器選擇, “1” 數據;“0” 指令
  26. sbit RW  = P2^6;        //讀寫選擇    “1”讀;“0” 寫
  27. sbit EN  = P2^7;
  28. sbit button=P2^0;       //使能    給個下降沿時執行命令
  29. sbit Q=          P2^1;
  30. sbit blue=P2^2;
  31. sbit red=P2^3;
  32. sbit green=P2^4;

  33.                                          
  34. sbit DATA=P1^1;   //位定義1302芯片的接口,數據輸出端定義在P1.1引腳
  35. sbit RST=P1^2;    //位定義1302芯片的接口,復位端口定義在P1.1引腳
  36. sbit SCLK=P1^0;   //位定義1302芯片的接口,時鐘輸出端口定義在P1.1引腳
  37. //sfr  DBPort  = 0xb0;    //數據端口   在此選P3

  38.                         float fun (float h )//注意區分C語言中double和float類型所占存儲空間
  39. {
  40.     int t;  //存儲中間變量
  41.         t = (int)(h*100+5);//h乘以10的保留位數加一次方,再加5,如果大于10會有進位產生 除以10確保保留2位小數
  42.         return h = (float)t/100.0;//注意 此處和前行代碼 都運用了強制轉化
  43. }



  44.                 void delay_50us(unsigned int t)         
  45. {
  46. unsigned int j,k;
  47. for (;t>0;t--)
  48. {
  49.   for(j=10;j>0;j--)
  50.   {
  51.    for(k=1;k>0;k--);
  52.   }
  53. }
  54. }

  55.            void delay2s(void)   //誤差 -0.000000000455us
  56. {
  57.     unsigned char a,b,c;
  58.     for(c=23;c>0;c--)
  59.         for(b=216;b>0;b--)
  60.             for(a=184;a>0;a--);
  61. }
  62. /*****************************************************
  63. 函數功能:延時若干微秒
  64. 入口參數:n
  65. ***************************************************/
  66. void delaynus(unsigned char n)
  67. {
  68. unsigned char i;
  69. for(i=0;i<n;i++)
  70.       ;
  71. }

  72. /*****************************************************
  73. 函數功能:向1302寫一個字節數據
  74. 入口參數:x
  75. ***************************************************/
  76. void Write1302(unsigned char dat)
  77. {
  78.   unsigned char i;
  79.   SCLK=0;            //拉低SCLK,為脈沖上升沿寫入數據做好準備
  80.   delaynus(2);       //稍微等待,使硬件做好準備
  81.   for(i=0;i<8;i++)      //連續寫8個二進制位數據
  82.     {
  83.             DATA=dat&0x01;    //取出dat的第0位數據寫入1302
  84.                 delaynus(2);       //稍微等待,使硬件做好準備
  85.                  SCLK=1;           //上升沿寫入數據
  86.                  delaynus(2);      //稍微等待,使硬件做好準備
  87.                  SCLK=0;           //重新拉低SCLK,形成脈沖
  88.                  dat>>=1;          //將dat的各數據位右移1位,準備寫入下一個數據位
  89.           }
  90.         
  91. }
  92. /*****************************************************
  93. 函數功能:根據命令字,向1302寫一個字節數據
  94. 入口參數:Cmd,儲存命令字;dat,儲存待寫的數據
  95. ***************************************************/
  96. void WriteSet1302(unsigned char Cmd,unsigned char dat)
  97. {
  98.    RST=0;           //禁止數據傳遞
  99.    SCLK=0;          //確保寫數居前SCLK被拉低
  100.         RST=1;           //啟動數據傳輸
  101.         delaynus(2);     //稍微等待,使硬件做好準備
  102.         Write1302(Cmd);  //寫入命令字
  103.         Write1302(dat);  //寫數據
  104.         SCLK=1;          //將時鐘電平置于已知狀態
  105.         RST=0;           //禁止數據傳遞
  106. }
  107. /*****************************************************
  108. 函數功能:從1302讀一個字節數據
  109. 入口參數:x
  110. ***************************************************/
  111. unsigned char Read1302(void)
  112. {
  113.    unsigned char i,dat;
  114.         delaynus(2);       //稍微等待,使硬件做好準備
  115.         for(i=0;i<8;i++)   //連續讀8個二進制位數據
  116.          {
  117.            dat>>=1;       //將dat的各數據位右移1位,因為先讀出的是字節的最低位
  118.                 if(DATA==1)    //如果讀出的數據是1
  119.                  dat|=0x80;    //將1取出,寫在dat的最高位
  120.                  SCLK=1;       //將SCLK置于高電平,為下降沿讀出
  121.                  delaynus(2);  //稍微等待
  122.                  SCLK=0;       //拉低SCLK,形成脈沖下降沿
  123.                  delaynus(2);  //稍微等待
  124.           }         
  125.   return dat;        //將讀出的數據返回
  126. }  
  127. /*****************************************************
  128. 函數功能:根據命令字,從1302讀取一個字節數據
  129. 入口參數:Cmd
  130. ***************************************************/
  131. unsigned char  ReadSet1302(unsigned char Cmd)
  132. {
  133.   unsigned char dat;
  134.   RST=0;                 //拉低RST
  135.   SCLK=0;                //確保寫數居前SCLK被拉低
  136.   RST=1;                 //啟動數據傳輸
  137.   Write1302(Cmd);       //寫入命令字
  138.   dat=Read1302();       //讀出數據
  139.   SCLK=1;              //將時鐘電平置于已知狀態
  140.   RST=0;               //禁止數據傳遞
  141.   return dat;          //將讀出的數據返回
  142. }
  143. /*****************************************************
  144. 函數功能: 1302進行初始化設置
  145. ***************************************************/
  146. void Init_DS1302(void)
  147. {        

  148.           yue=5;
  149.           ri=24;
  150.           shi=20;fen=15;
  151.           miao=26;
  152.    WriteSet1302(0x8E,0x00);                 //根據寫狀態寄存器命令字,寫入不保護指令
  153.    WriteSet1302(0x80,((miao/10)<<4|(miao%10)));   //根據寫秒寄存器命令字,寫入秒的初始值
  154.         WriteSet1302(0x82,((fen/10)<<4|(fen%10)));   //根據寫分寄存器命令字,寫入分的初始值
  155.         WriteSet1302(0x84,((shi/10)<<4|(shi%10))); //根據寫小時寄存器命令字,寫入小時的初始值
  156.         WriteSet1302(0x86,((ri/10)<<4|(ri%10))); //根據寫日寄存器命令字,寫入日的初始值
  157.         WriteSet1302(0x88,((yue/10)<<4|(yue%10))); //根據寫月寄存器命令字,寫入月的初始值
  158.         WriteSet1302(0x8c,((21/10)<<4|(21%10)));   //根據寫小時寄存器命令字,寫入小時的初始值

  159. ++++++++++++以上是部分源碼,完整源碼在附件++++++++++++++
復制代碼
完整單片機代碼和proteus仿真文件: 氣壓監測.zip (68.39 KB, 售價: 3 E幣)






歡迎光臨 ELEOK (http://m.afoofa.cn/) Powered by Discuz! X5.0