国产免费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.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幣
[記錄]
[
購買
]
歡迎光臨 ELEOK (http://m.afoofa.cn/)
Powered by Discuz! X5.0