做了Protues仿真的氣壓監測系統,通過對氣壓監測系統設計與仿真的學習與動手得出結論:通過以52單片機為主控芯片,MPX4115作為氣壓監測原件,以MCP3204作為AD數模轉換芯片,并配以時鐘芯片以及虛擬串口等,可成功實現氣壓監測系統設計與仿真,并實現以MPX4115為探測元件,結合單片機擴展電路組成氣壓監測系統,完成定時氣壓數據監測記錄、顯示遠傳等功能的硬件設計及軟件編程。并配合上位機實現與PC機進行通信,對于實際工業生產具有實用價值。此種方式價格低廉其易于測試,實用價值大,經過技術升級和精度提升,可以用于實現氣壓監測報警。此系統有點延時,因為沒用中斷。中斷一加上就不好使了,是自己技術問題。哈哈
需要學習的小伙伴可以下載學習。壓縮包中第一個文件夾是KEIL工程,第2個文件是Protues8.11工程文件。虛擬串口軟件可以百度下載。
本系統還有很多不足,功能也較為簡陋,有問題可以留言交流,系統中有一個按鍵,可以切換時間顯示還是氣壓顯示,但需要摁多一點時間才能切換。
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
1.png (51.22 KB)
下載附件
2021-7-12 22:03 上傳
部分源碼:完整源碼見附件
- #include<reg52.h>
- #include<INTRINS.H>
- #define uchar unsigned char //8bit 0~255
- #define schar signed char //8bit -128~127
- #define uint unsigned int //16bit 0~65536
- #define sint signed int //16bit -32768~32767
- #define slong signed long //32bit -214783648~2147483647
- #define delay1us _nop_();_nop_();_nop_(); // delay 1 us(for fos=12M)
- unsigned char dispbuf[]="0123456789";
- unsigned char code Pre[]="Pressure:";
- unsigned char code Dat[]="Date:20";
- unsigned char code Warml[]="Warm:Too Low";
- unsigned char code Warmh[]="Warm:Too High";
- unsigned char code Normal[]="Normal";
- unsigned char code Time[]="Time:";
- unsigned int A[]={ 48,49,50,51,52,53,54,55,56,57 } ;
- unsigned char code digit[10]={"0123456789"}; //定義字符數組顯示數字
- int i, yue,ri;shi,fen, miao,zs;
- unsigned char second,minute,hour,day,month,year; //分別儲存苗、分、小時,日,月,年
- unsigned char ReadValue;
- sbit clk = P1^4; // clock signel
- sbit dout = P1^5; // data get out
- sbit din = P1^6 ; // data put in
- sbit cs = P1^7; // cs selt
- sbit RS = P2^5; //寄存器選擇, “1” 數據;“0” 指令
- sbit RW = P2^6; //讀寫選擇 “1”讀;“0” 寫
- sbit EN = P2^7;
- sbit button=P2^0; //使能 給個下降沿時執行命令
- sbit Q= P2^1;
- sbit blue=P2^2;
- sbit red=P2^3;
- sbit green=P2^4;
-
- sbit DATA=P1^1; //位定義1302芯片的接口,數據輸出端定義在P1.1引腳
- sbit RST=P1^2; //位定義1302芯片的接口,復位端口定義在P1.1引腳
- sbit SCLK=P1^0; //位定義1302芯片的接口,時鐘輸出端口定義在P1.1引腳
- //sfr DBPort = 0xb0; //數據端口 在此選P3
- float fun (float h )//注意區分C語言中double和float類型所占存儲空間
- {
- int t; //存儲中間變量
- t = (int)(h*100+5);//h乘以10的保留位數加一次方,再加5,如果大于10會有進位產生 除以10確保保留2位小數
- return h = (float)t/100.0;//注意 此處和前行代碼 都運用了強制轉化
- }
- void delay_50us(unsigned int t)
- {
- unsigned int j,k;
- for (;t>0;t--)
- {
- for(j=10;j>0;j--)
- {
- for(k=1;k>0;k--);
- }
- }
- }
- void delay2s(void) //誤差 -0.000000000455us
- {
- unsigned char a,b,c;
- for(c=23;c>0;c--)
- for(b=216;b>0;b--)
- for(a=184;a>0;a--);
- }
- /*****************************************************
- 函數功能:延時若干微秒
- 入口參數:n
- ***************************************************/
- void delaynus(unsigned char n)
- {
- unsigned char i;
- for(i=0;i<n;i++)
- ;
- }
- /*****************************************************
- 函數功能:向1302寫一個字節數據
- 入口參數:x
- ***************************************************/
- void Write1302(unsigned char dat)
- {
- unsigned char i;
- SCLK=0; //拉低SCLK,為脈沖上升沿寫入數據做好準備
- delaynus(2); //稍微等待,使硬件做好準備
- for(i=0;i<8;i++) //連續寫8個二進制位數據
- {
- DATA=dat&0x01; //取出dat的第0位數據寫入1302
- delaynus(2); //稍微等待,使硬件做好準備
- SCLK=1; //上升沿寫入數據
- delaynus(2); //稍微等待,使硬件做好準備
- SCLK=0; //重新拉低SCLK,形成脈沖
- dat>>=1; //將dat的各數據位右移1位,準備寫入下一個數據位
- }
-
- }
- /*****************************************************
- 函數功能:根據命令字,向1302寫一個字節數據
- 入口參數:Cmd,儲存命令字;dat,儲存待寫的數據
- ***************************************************/
- void WriteSet1302(unsigned char Cmd,unsigned char dat)
- {
- RST=0; //禁止數據傳遞
- SCLK=0; //確保寫數居前SCLK被拉低
- RST=1; //啟動數據傳輸
- delaynus(2); //稍微等待,使硬件做好準備
- Write1302(Cmd); //寫入命令字
- Write1302(dat); //寫數據
- SCLK=1; //將時鐘電平置于已知狀態
- RST=0; //禁止數據傳遞
- }
- /*****************************************************
- 函數功能:從1302讀一個字節數據
- 入口參數:x
- ***************************************************/
- unsigned char Read1302(void)
- {
- unsigned char i,dat;
- delaynus(2); //稍微等待,使硬件做好準備
- for(i=0;i<8;i++) //連續讀8個二進制位數據
- {
- dat>>=1; //將dat的各數據位右移1位,因為先讀出的是字節的最低位
- if(DATA==1) //如果讀出的數據是1
- dat|=0x80; //將1取出,寫在dat的最高位
- SCLK=1; //將SCLK置于高電平,為下降沿讀出
- delaynus(2); //稍微等待
- SCLK=0; //拉低SCLK,形成脈沖下降沿
- delaynus(2); //稍微等待
- }
- return dat; //將讀出的數據返回
- }
- /*****************************************************
- 函數功能:根據命令字,從1302讀取一個字節數據
- 入口參數:Cmd
- ***************************************************/
- unsigned char ReadSet1302(unsigned char Cmd)
- {
- unsigned char dat;
- RST=0; //拉低RST
- SCLK=0; //確保寫數居前SCLK被拉低
- RST=1; //啟動數據傳輸
- Write1302(Cmd); //寫入命令字
- dat=Read1302(); //讀出數據
- SCLK=1; //將時鐘電平置于已知狀態
- RST=0; //禁止數據傳遞
- return dat; //將讀出的數據返回
- }
- /*****************************************************
- 函數功能: 1302進行初始化設置
- ***************************************************/
- void Init_DS1302(void)
- {
- yue=5;
- ri=24;
- shi=20;fen=15;
- miao=26;
- WriteSet1302(0x8E,0x00); //根據寫狀態寄存器命令字,寫入不保護指令
- WriteSet1302(0x80,((miao/10)<<4|(miao%10))); //根據寫秒寄存器命令字,寫入秒的初始值
- WriteSet1302(0x82,((fen/10)<<4|(fen%10))); //根據寫分寄存器命令字,寫入分的初始值
- WriteSet1302(0x84,((shi/10)<<4|(shi%10))); //根據寫小時寄存器命令字,寫入小時的初始值
- WriteSet1302(0x86,((ri/10)<<4|(ri%10))); //根據寫日寄存器命令字,寫入日的初始值
- WriteSet1302(0x88,((yue/10)<<4|(yue%10))); //根據寫月寄存器命令字,寫入月的初始值
- WriteSet1302(0x8c,((21/10)<<4|(21%10))); //根據寫小時寄存器命令字,寫入小時的初始值
- ++++++++++++以上是部分源碼,完整源碼在附件++++++++++++++
復制代碼 完整單片機代碼和proteus仿真文件:
氣壓監測.zip
(68.39 KB, 售價: 3 E幣)
2021-7-12 22:11 上傳
點擊文件名下載附件
售價: 3 E幣 [記錄]
[ 購買]
【必讀】版權免責聲明
1、本主題所有言論和內容純屬會員個人意見,與本論壇立場無關。2、本站對所發內容真實性、客觀性、可用性不做任何保證也不負任何責任,網友之間僅出于學習目的進行交流。3、對提供的數字內容不擁有任何權利,其版權歸原著者擁有。請勿將該數字內容進行商業交易、轉載等行為,該內容只為學習所提供,使用后發生的一切問題與本站無關。 4、本網站不保證本站提供的下載資源的準確性、安全性和完整性;同時本網站也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的損失或傷害。 5、本網站所有軟件和資料均為網友推薦收集整理而來,僅供學習用途使用,請務必下載后兩小時內刪除,禁止商用。6、如有侵犯你版權的,請及時聯系我們(電子郵箱1370723259@qq.com)指出,本站將立即改正。
|
|