12864顯示;
adc采集bandgap電壓顯示;
使用100K NTC測溫顯示;
家里的新房交付,自帶簡單裝修,添置了些家具草草入住,同時考慮室外空氣質量也比較差勁,更換了凈化器的濾芯、添置了壁掛新風,考慮囊中羞澀,決定自己買傳感器,拿51和12864來DIY個檢測器;說在前面:
這個東西個人感覺沒法定性也沒必要,有個參考就可以了。
傳感器: 淘寶找得基本最便宜的:國產達特WZ-S-K,帶引腳的;PMS5003,不帶溫濕度、不帶甲醛款;
其他配置:
玩蘿麗控陸續攢的STC15w408AS、IIC接口的12864白色OLED屏;
原理:
兩個傳感器都是串口,均支持主動、被動通信;收發地一連,MCU接收傳感器發來的數據,做個數據解析并給12864顯示就完工了。
遇到的問題:
STC15W408AS自帶1個串口,要與2個設備通信;
解決方法1:
按照網上的方法直連,經測試,估計引腳的輸出能力偏弱,攀藤就被干掉了;失;
解決方法2:
翻看STC的手冊,這貨可以分時的方式切換串口到第二、第三組引腳;16pin的stc15引腳比較少,但也有2組可用,滿足要求。
程序主要思路:
通過設定flag的0、1狀態,同時配合切換串口位置,分時發送命令給傳感器,分時接收數據并做簡單判斷、解析并在12864上作出顯示。
存在的問題:
未做數據的校驗及錯誤情況的判斷及軟件重置。反正跑死了,手動重啟就好啦。。。
補充說明:
1,PMS5003默認主動發送數據,掉電會自動恢復默認主動的發送情形,因此程序在每次上電時主動發送命令,使其工作在被動模式;
甲醛傳感器貌似沒啥影響,串口切到被動后,沒注意掉電會不會恢復主動,測試顯示數據沒發現異常就沒管它。發帖此時傳感器沒在手上,因此就不做測試,后續再議了。
2,PMS5003的官網手冊,最后一些關于校驗的協議,像是沒寫完,沒有句號,也沒明確2個校驗字節的具體內容,因此通過官方要來了基本協議的解釋,再次感謝熱情的攀藤小姐姐。分享以下:
0x42 0x4D 0xE1 0x00 0x00 0x01 0x70 - passive mode return:42 4D 00 04 E1 00 01 74 0x42 0x4D 0xE1 0x00 0x01 0x01 0x71 - active mode. return:42 4D 00 04 E1 01 01 750x42 0x4D 0xE2 0x00 0x00 0x01 0x71 - Passive mode read instruction 0x42 0x4D 0xE4 0x00 0x00 0x01 0x73 - standby mode return::42 4D 00 04 E4 00 01 77 0x42 0x4D 0xE4 0x00 0x01 0x01 0x74 -Standby wakeup
傳感器真身:
1.jpg (218.83 KB, 下載次數: 132)
下載附件
2019-1-18 11:16 上傳
檢測顯示:
4.jpg (213.55 KB, 下載次數: 127)
下載附件
2019-1-18 11:17 上傳
2.jpg (181.39 KB, 下載次數: 131)
下載附件
2019-1-18 11:17 上傳
雜亂的全家福:
3.jpg (234.68 KB, 下載次數: 139)
下載附件
2019-1-18 11:17 上傳
單片機源程序如下:
- #include <stc15.h>
- #include <12864.h>
- #include <delay.h>
- #include <character.h>
- unsigned char a[32],b[4];
- unsigned char n=0;
- unsigned char m=0;
- unsigned char numb=6;
- unsigned int numb2=0x2c;
- bit flag;
- unsigned int zong,pm10i,pm25i,pm100i;
- void UartInit(void) //9600bps@11.0592MHz
- {
- SCON = 0x50; //8位數據,可變波特率
- AUXR |= 0x01; //串口1選擇定時器2為波特率發生器
- AUXR &= 0xFB; //定時器2時鐘為Fosc/12,即12T
- T2L = 0xE8; //設定定時初值
- T2H = 0xFF; //設定定時初值
-
- AUXR |= 0x10; //啟動定時器2
- EA=1;
- ES=1;
- }
- //發送一個byte;
- void sendonebyte(unsigned char udat)
- {
- SBUF=udat;
- while(!TI);
- TI=0;
- }
- //發送字符串;
- void sendstrings(unsigned char *upstr)
- {
- while(*upstr)
- {
- sendonebyte(*upstr++);
-
-
- }
- }
- void Delay05s()
- {
- Delay50ms();
- Delay50ms();
- Delay50ms();
- Delay50ms();
- Delay50ms();
- Delay50ms();
- Delay50ms();
- Delay50ms();
- Delay50ms();
- }
- unsigned char receivedat()
- {
- unsigned char redatbuf;
-
- if(RI == 1)
- {
-
- redatbuf=SBUF;
- RI=0;
- }
- return redatbuf;
- }
- void countnum(unsigned int num) //int 65536;
- {
- //b[4]=(num/10000)%10; //萬位;
- b[3]=(num/1000)%10; //千位;
- b[2]=(num/100)%10; //百位;
- b[1]=(num/10)%10; //十位;
- b[0]=(num/1)%10; //個位;
- }
- void hcho_T() //flag=1,計算甲醛
- {
-
- Delay05s();
- AUXR1 |= 0x40; //串口切換到 P3.6Rxd P3.7Txd;
- Delay50ms();
- flag=1;
- sendonebyte(0xff); //FF 01 86 00 00 00 00 00 79 dart wz-s 請求數據命令;
- sendonebyte(0x01);
- sendonebyte(0x86);
- sendonebyte(0x00);
- sendonebyte(0x00);
- sendonebyte(0x00);
- sendonebyte(0x00);
- sendonebyte(0x00);
- sendonebyte(0x79);
- //
- }
- void pm25_T()
- {
-
- Delay05s();
- AUXR1 &= 0xbf; //串口切換到 P3.0Rxd P3.1Txd;
- Delay50ms();
- flag=0;
- sendonebyte(0x42);
- _nop_();
- sendonebyte(0x4d);
- _nop_();
- sendonebyte(0xe2);
- _nop_();
- sendonebyte(0x00);
- _nop_();
- sendonebyte(0x00);
- _nop_();
- sendonebyte(0x01);
- _nop_();
- sendonebyte(0x71);
- _nop_();
- }
- void pm25_init()
- {
-
- Delay05s();
- flag=0;
- sendonebyte(0x42);
- _nop_();
- sendonebyte(0x4d);
- _nop_();
- sendonebyte(0xe1);
- _nop_();
- sendonebyte(0x00);
- _nop_();
- sendonebyte(0x00);
- _nop_();
- sendonebyte(0x01);
- _nop_();
- sendonebyte(0x70);
- _nop_();
- }
-
- void hcho_R()
- {
- if((a[0]==0xff)&&(a[1]==0x86))
- {
- zong=((a[2]>>4)*16+(a[2]&0x0f))*256+a[3];
- countnum(zong);
- dxzm(b[3]+0x30,48,0);
- dxzm('.',56,0);
- dxzm(b[2]+0x30,64,0);
- dxzm(b[1]+0x30,72,0);
- dxzm(b[0]+0x30,80,0);
- dxzm('m',88,0);
- dxzm('g',96,0);
- dxzm('/',104,0);
- dxzm('m',112,0);
- location(120,0);
- dis_num86('3');
- }
- }
- void pm25_R()
- {
- if((a[0]==0x42)&&(a[1]==0x4d))
- {
-
- if(a[3]==0x1c)
- {
- pm10i=((a[10]>>4)*16+(a[10]&0x0f))*256+a[11];
- countnum(pm10i);
- if(b[3]==0)
- ;else
- dxzm(b[3]+0x30,48,2);
- if(b[2]==0)
- ;else
- dxzm(b[2]+0x30,56,2);
- if(b[1]==0)
- ;else
- dxzm(b[1]+0x30,64,2);
- dxzm(b[0]+0x30,72,2);
- dxzm('u',80,2);
- dxzm('g',88,2);
- dxzm('/',96,2);
- dxzm('m',104,2);
- location(112,2);
- dis_num86('3');
-
- pm25i=((a[12]>>4)*16+(a[12]&0x0f))*256+a[13];
- countnum(pm25i);
- if(b[3]==0)
- ;else
- dxzm(b[3]+0x30,48,4);
- if(b[2]==0)
- ;else
- dxzm(b[2]+0x30,56,4);
- if(b[1]==0)
- ;else
- dxzm(b[1]+0x30,64,4);
- dxzm(b[0]+0x30,72,4);
- dxzm('u',80,4);
- dxzm('g',88,4);
- dxzm('/',96,4);
- dxzm('m',104,4);
- location(112,4);
- dis_num86('3');
-
-
- pm100i=((a[14]>>4)*16+(a[14]&0x0f))*256+a[15];
- countnum(pm100i);
- if(b[3]==0)
- ;else
- dxzm(b[3]+0x30,48,6);
- if(b[2]==0)
- ;else
- dxzm(b[2]+0x30,56,6);
- if(b[1]==0)
- ;else
- dxzm(b[1]+0x30,64,6);
- dxzm(b[0]+0x30,72,6);
- dxzm('u',80,6);
- dxzm('g',88,6);
- dxzm('/',96,6);
- dxzm('m',104,6);
- location(112,6);
- dis_num86('3');
- }
- }
- }
- void dis_init()
- {
- dxzm('H',8,0);
- dxzm('C',16,0);
- dxzm('H',24,0);
- dxzm('O',32,0);
- dxzm(':',40,0);
-
- dxzm('P',0,2);
- dxzm('M',8,2);
- dxzm('1',16,2);
- dxzm('.',24,2);
- dxzm('0',32,2);
- dxzm(':',40,2);
-
- dxzm('P',0,4);
- dxzm('M',8,4);
- dxzm('2',16,4);
- dxzm('.',24,4);
- dxzm('5',32,4);
- dxzm(':',40,4);
-
-
- dxzm('P',0,6);
- dxzm('M',8,6);
- dxzm('1',16,6);
- dxzm('0',24,6);
- dxzm('.',32,6);
- dxzm(':',40,6);
- }
- void main()
- {
- u8 x;
- Initial_12864();
- clear_12864();
- UartInit();
- dis_init();
-
- Delay05s();
- Delay05s();
-
- pm25_init();
- Delay50ms();
- m=0;
-
-
- while(1)
- {
-
- hcho_T();
- Delay50ms();
- hcho_R();
-
- Delay05s();
-
- pm25_T();
- Delay50ms();
- pm25_R();
-
-
- }
- }
- void Serial_interrupt() interrupt 4
- {
- if((RI==1)&&(flag==1))
- {
- if(n==9)
- n=0;
- a[n]=SBUF; // a為事先定義的接收緩存,可以持續接收,直到你需要串口數據時來取為止
- RI=0;//接收中斷信號清零,表示將繼續接收
- n++;
- }
-
- if((RI==1)&&(flag==0))
- {
-
- a[m]=SBUF; // a為事先定義的接收緩存,可以持續接收,直到你需要串口數據時來取為止
- RI=0;//接收中斷信號清零,表示將繼續接收
- m++;
- if(m==32)
- m=0;
- }
-
- }
-
復制代碼
0.png (5.72 KB, 下載次數: 127)
下載附件
2019-1-19 02:08 上傳
所有資料51hei提供下載:
12864_ser2019pm.zip
(155.89 KB, 下載次數: 138)
2019-1-18 11:34 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|