久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 18449|回復: 31
打印 上一主題 下一主題
收起左側

用達特甲醛、攀藤PM2.5傳感器+單片機,制作簡單空氣質量檢測器

  [復制鏈接]
跳轉到指定樓層
樓主
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. #include <stc15.h>
  2. #include <12864.h>
  3. #include <delay.h>
  4. #include <character.h>

  5. unsigned char a[32],b[4];
  6. unsigned char n=0;
  7. unsigned char m=0;
  8. unsigned char numb=6;
  9. unsigned int numb2=0x2c;
  10. bit flag;
  11. unsigned int zong,pm10i,pm25i,pm100i;
  12. void UartInit(void)                //9600bps@11.0592MHz
  13. {
  14.         SCON = 0x50;                //8位數據,可變波特率
  15.         AUXR |= 0x01;                //串口1選擇定時器2為波特率發生器
  16.         AUXR &= 0xFB;                //定時器2時鐘為Fosc/12,即12T
  17.         T2L = 0xE8;                //設定定時初值
  18.         T2H = 0xFF;                //設定定時初值
  19.         
  20.         AUXR |= 0x10;                //啟動定時器2
  21.         EA=1;
  22.         ES=1;
  23. }

  24. //發送一個byte;
  25. void sendonebyte(unsigned char udat)
  26. {
  27.         SBUF=udat;
  28.         while(!TI);
  29.         TI=0;
  30. }
  31. //發送字符串;
  32. void sendstrings(unsigned char *upstr)
  33. {
  34.         while(*upstr)
  35.         {
  36.                 sendonebyte(*upstr++);
  37.                
  38.         
  39.         }
  40. }        
  41. void Delay05s()
  42. {
  43.                 Delay50ms();
  44.                 Delay50ms();
  45.                 Delay50ms();
  46.                 Delay50ms();
  47.                 Delay50ms();
  48.                 Delay50ms();
  49.                 Delay50ms();
  50.                 Delay50ms();
  51.                 Delay50ms();
  52. }
  53. unsigned char receivedat()
  54. {
  55.          unsigned char redatbuf;
  56.         
  57.         if(RI == 1)
  58.         {
  59.         
  60.                 redatbuf=SBUF;
  61.                 RI=0;
  62.         }
  63.         return redatbuf;
  64. }

  65. void countnum(unsigned int num)   //int 65536;
  66. {
  67.         //b[4]=(num/10000)%10;  //萬位;
  68.         b[3]=(num/1000)%10; //千位;
  69.         b[2]=(num/100)%10; //百位;
  70.         b[1]=(num/10)%10; //十位;
  71.         b[0]=(num/1)%10; //個位;
  72. }

  73. void hcho_T()   //flag=1,計算甲醛
  74. {
  75.         
  76.         Delay05s();
  77.         AUXR1 |= 0x40; //串口切換到 P3.6Rxd  P3.7Txd;
  78.         Delay50ms();
  79.         flag=1;
  80.         sendonebyte(0xff);    //FF 01 86 00 00 00 00 00 79   dart wz-s 請求數據命令;
  81.         sendonebyte(0x01);
  82.         sendonebyte(0x86);
  83.         sendonebyte(0x00);
  84.         sendonebyte(0x00);
  85.         sendonebyte(0x00);
  86.         sendonebyte(0x00);
  87.         sendonebyte(0x00);
  88.         sendonebyte(0x79);
  89.                 //
  90. }

  91. void pm25_T()
  92. {
  93.         
  94.         Delay05s();
  95.         AUXR1 &= 0xbf; //串口切換到 P3.0Rxd  P3.1Txd;
  96.         Delay50ms();
  97.         flag=0;
  98.         sendonebyte(0x42);
  99.         _nop_();
  100.         sendonebyte(0x4d);
  101.         _nop_();
  102.         sendonebyte(0xe2);
  103.         _nop_();
  104.         sendonebyte(0x00);
  105.         _nop_();
  106.         sendonebyte(0x00);
  107.         _nop_();
  108.         sendonebyte(0x01);
  109.         _nop_();
  110.         sendonebyte(0x71);
  111.         _nop_();         
  112. }
  113. void pm25_init()
  114. {
  115.         
  116.         Delay05s();
  117.         flag=0;
  118.         sendonebyte(0x42);
  119.         _nop_();
  120.         sendonebyte(0x4d);
  121.         _nop_();
  122.         sendonebyte(0xe1);
  123.         _nop_();
  124.         sendonebyte(0x00);
  125.         _nop_();
  126.         sendonebyte(0x00);
  127.         _nop_();
  128.         sendonebyte(0x01);
  129.         _nop_();
  130.         sendonebyte(0x70);
  131.         _nop_();
  132. }
  133.         
  134. void hcho_R()
  135. {
  136.         if((a[0]==0xff)&&(a[1]==0x86))
  137.                 {
  138.                 zong=((a[2]>>4)*16+(a[2]&0x0f))*256+a[3];
  139.                 countnum(zong);
  140.                 dxzm(b[3]+0x30,48,0);
  141.                 dxzm('.',56,0);
  142.                 dxzm(b[2]+0x30,64,0);
  143.           dxzm(b[1]+0x30,72,0);
  144.                 dxzm(b[0]+0x30,80,0);
  145.                 dxzm('m',88,0);
  146.                 dxzm('g',96,0);
  147.                 dxzm('/',104,0);
  148.                 dxzm('m',112,0);
  149.           location(120,0);
  150.                 dis_num86('3');
  151.                 }
  152. }
  153. void pm25_R()
  154. {
  155.         if((a[0]==0x42)&&(a[1]==0x4d))
  156.         {
  157.                
  158.                 if(a[3]==0x1c)
  159.                 {
  160.                         pm10i=((a[10]>>4)*16+(a[10]&0x0f))*256+a[11];
  161.                         countnum(pm10i);
  162.                         if(b[3]==0)
  163.                         ;else
  164.                         dxzm(b[3]+0x30,48,2);
  165.                         if(b[2]==0)
  166.                         ;else
  167.                         dxzm(b[2]+0x30,56,2);
  168.                         if(b[1]==0)
  169.                         ;else
  170.                         dxzm(b[1]+0x30,64,2);
  171.                         dxzm(b[0]+0x30,72,2);
  172.                         dxzm('u',80,2);
  173.                         dxzm('g',88,2);
  174.                         dxzm('/',96,2);
  175.                         dxzm('m',104,2);
  176.                         location(112,2);
  177.                         dis_num86('3');
  178.                         
  179.                         pm25i=((a[12]>>4)*16+(a[12]&0x0f))*256+a[13];
  180.                         countnum(pm25i);
  181.                         if(b[3]==0)
  182.                         ;else
  183.                         dxzm(b[3]+0x30,48,4);
  184.                         if(b[2]==0)
  185.                         ;else
  186.                         dxzm(b[2]+0x30,56,4);
  187.                         if(b[1]==0)
  188.                         ;else
  189.                         dxzm(b[1]+0x30,64,4);
  190.                         dxzm(b[0]+0x30,72,4);
  191.                         dxzm('u',80,4);
  192.                         dxzm('g',88,4);
  193.                         dxzm('/',96,4);
  194.                         dxzm('m',104,4);
  195.                         location(112,4);
  196.                         dis_num86('3');
  197.                         
  198.                         
  199.                         pm100i=((a[14]>>4)*16+(a[14]&0x0f))*256+a[15];
  200.                         countnum(pm100i);
  201.                         if(b[3]==0)
  202.                         ;else
  203.                         dxzm(b[3]+0x30,48,6);
  204.                         if(b[2]==0)
  205.                         ;else
  206.                         dxzm(b[2]+0x30,56,6);
  207.                         if(b[1]==0)
  208.                         ;else
  209.                         dxzm(b[1]+0x30,64,6);
  210.                         dxzm(b[0]+0x30,72,6);
  211.                         dxzm('u',80,6);
  212.                         dxzm('g',88,6);
  213.                         dxzm('/',96,6);
  214.                         dxzm('m',104,6);
  215.                         location(112,6);
  216.                         dis_num86('3');
  217.                 }
  218.         }
  219. }
  220. void dis_init()
  221. {
  222.         dxzm('H',8,0);
  223.         dxzm('C',16,0);
  224.         dxzm('H',24,0);
  225.         dxzm('O',32,0);
  226.         dxzm(':',40,0);
  227.         
  228.         dxzm('P',0,2);
  229.         dxzm('M',8,2);
  230.         dxzm('1',16,2);
  231.         dxzm('.',24,2);
  232.         dxzm('0',32,2);
  233.         dxzm(':',40,2);
  234.         
  235.         dxzm('P',0,4);
  236.         dxzm('M',8,4);
  237.         dxzm('2',16,4);
  238.         dxzm('.',24,4);
  239.         dxzm('5',32,4);
  240.         dxzm(':',40,4);
  241.         
  242.         
  243.         dxzm('P',0,6);
  244.         dxzm('M',8,6);
  245.         dxzm('1',16,6);
  246.         dxzm('0',24,6);
  247.         dxzm('.',32,6);
  248.         dxzm(':',40,6);
  249. }
  250. void main()
  251. {
  252.         u8 x;
  253.         Initial_12864();
  254.         clear_12864();
  255.         UartInit();
  256.         dis_init();
  257.         
  258.         Delay05s();
  259.         Delay05s();
  260.         
  261.         pm25_init();               
  262.         Delay50ms();
  263.         m=0;
  264.         
  265.                
  266.         while(1)
  267.         {               
  268.                
  269.                 hcho_T();
  270.                 Delay50ms();
  271.                 hcho_R();
  272.                
  273.                 Delay05s();
  274.                
  275.                 pm25_T();
  276.                 Delay50ms();               
  277.                 pm25_R();        
  278.         
  279.                
  280.                 }        
  281. }
  282. void Serial_interrupt() interrupt 4
  283. {
  284.         if((RI==1)&&(flag==1))
  285.         {
  286.                 if(n==9)
  287.                         n=0;
  288.                 a[n]=SBUF; // a為事先定義的接收緩存,可以持續接收,直到你需要串口數據時來取為止
  289.                 RI=0;//接收中斷信號清零,表示將繼續接收
  290.                 n++;
  291.         }
  292.         
  293.         if((RI==1)&&(flag==0))
  294.         {
  295.         
  296.                 a[m]=SBUF; // a為事先定義的接收緩存,可以持續接收,直到你需要串口數據時來取為止
  297.                 RI=0;//接收中斷信號清零,表示將繼續接收
  298.                 m++;
  299.                 if(m==32)
  300.                 m=0;
  301.         }
  302.                
  303. }
  304.                
復制代碼

所有資料51hei提供下載:
12864_ser2019pm.zip (155.89 KB, 下載次數: 138)


評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏14 分享淘帖 頂1 踩
回復

使用道具 舉報

沙發
ID:205015 發表于 2019-1-18 13:35 | 只看該作者
本帖最后由 omer 于 2019-1-25 09:27 編輯

鏈接:https://pan.baidu.com/s/18WKYwQf4Pm848L8Imv1ZVQ
提取碼:7pbn

增加簡單校驗,防止程序解析跑死,對齊HCHO使顯示一致,修改顯示的幾個小錯誤。重傳全部代碼如下:
鏈接:https://pan.baidu.com/s/1PEFm2YTODLFywM6pLOD11g
提取碼:qi8z


回復

使用道具 舉報

板凳
ID:205015 發表于 2019-1-23 15:36 | 只看該作者
跑了幾天發現顆粒物的數值會有超出正常很高的情況(數據解析出錯),修改了主程序,避免無校驗導致的程序跑死。跑幾天看看。貼出主程序。
  1. #include <stc15.h>
  2. #include <12864.h>
  3. #include <delay.h>
  4. #include <character.h>

  5. unsigned char a[32],b[4];
  6. unsigned char n=0;
  7. unsigned char m=0;
  8. unsigned char numb=6;
  9. unsigned int numb2=0x2c;
  10. bit flag;
  11. bit stat;
  12. unsigned char conts=0;
  13. unsigned int zong,pm10i,pm25i,pm100i;
  14. void UartInit(void)                //9600bps@11.0592MHz
  15. {
  16.         SCON = 0x50;                //8位數據,可變波特率
  17.         AUXR |= 0x01;                //串口1選擇定時器2為波特率發生器
  18.         AUXR &= 0xFB;                //定時器2時鐘為Fosc/12,即12T
  19.         T2L = 0xE8;                //設定定時初值
  20.         T2H = 0xFF;                //設定定時初值
  21.        
  22.         AUXR |= 0x10;                //啟動定時器2
  23.         EA=1;
  24.         ES=1;
  25. }

  26. //發送一個byte;
  27. void sendonebyte(unsigned char udat)
  28. {
  29.         SBUF=udat;
  30.         while(!TI);
  31.         TI=0;
  32. }
  33. //發送字符串;
  34. void sendstrings(unsigned char *upstr)
  35. {
  36.         while(*upstr)
  37.         {
  38.                 sendonebyte(*upstr++);
  39.                
  40.        
  41.         }
  42. }       
  43. void Delay05s()
  44. {
  45.                 Delay50ms();
  46.                 Delay50ms();
  47.                 Delay50ms();
  48.                 Delay50ms();
  49.                 Delay50ms();
  50.                 Delay50ms();
  51.                 Delay50ms();
  52.                 Delay50ms();
  53.                 Delay50ms();
  54. }
  55. unsigned char receivedat()
  56. {
  57.          unsigned char redatbuf;
  58.        
  59.         if(RI == 1)
  60.         {
  61.        
  62.                 redatbuf=SBUF;
  63.                 RI=0;
  64.         }
  65.         return redatbuf;
  66. }

  67. void countnum(unsigned int num)   //int 65536;
  68. {
  69.         //b[4]=(num/10000)%10;  //萬位;
  70.         b[3]=(num/1000)%10; //千位;
  71.         b[2]=(num/100)%10; //百位;
  72.         b[1]=(num/10)%10; //十位;
  73.         b[0]=(num/1)%10; //個位;
  74. }

  75. void hcho_T()   //flag=1,計算甲醛
  76. {
  77.        
  78.         Delay05s();
  79.         AUXR1 |= 0x40; //串口切換到 P3.6Rxd  P3.7Txd;
  80.         Delay50ms();
  81.         flag=1;
  82.         sendonebyte(0xff);    //FF 01 86 00 00 00 00 00 79   dart wz-s 請求數據命令;
  83.         sendonebyte(0x01);
  84.         sendonebyte(0x86);
  85.         sendonebyte(0x00);
  86.         sendonebyte(0x00);
  87.         sendonebyte(0x00);
  88.         sendonebyte(0x00);
  89.         sendonebyte(0x00);
  90.         sendonebyte(0x79);
  91.                 //
  92. }

  93. void pm25_T()
  94. {
  95.        
  96.         Delay05s();
  97.         AUXR1 &= 0xbf; //串口切換到 P3.0Rxd  P3.1Txd;
  98.         Delay50ms();
  99.         flag=0;
  100.         sendonebyte(0x42);
  101.         _nop_();
  102.         sendonebyte(0x4d);
  103.         _nop_();
  104.         sendonebyte(0xe2);
  105.         _nop_();
  106.         sendonebyte(0x00);
  107.         _nop_();
  108.         sendonebyte(0x00);
  109.         _nop_();
  110.         sendonebyte(0x01);
  111.         _nop_();
  112.         sendonebyte(0x71);
  113.         _nop_();         
  114. }
  115. void pm25_init()   //上電 轉化pm5003位被動模式;
  116. {
  117.        
  118.         Delay05s();
  119.         flag=0;
  120.         sendonebyte(0x42);
  121.         _nop_();
  122.         sendonebyte(0x4d);
  123.         _nop_();
  124.         sendonebyte(0xe1);
  125.         _nop_();
  126.         sendonebyte(0x00);
  127.         _nop_();
  128.         sendonebyte(0x00);
  129.         _nop_();
  130.         sendonebyte(0x01);
  131.         _nop_();
  132.         sendonebyte(0x70);
  133.         _nop_();
  134. }
  135.        
  136. void hcho_R()
  137. {
  138.         if((a[0]==0xff)&&(a[1]==0x86))
  139.                 {
  140.                 zong=((a[2]>>4)*16+(a[2]&0x0f))*256+a[3];
  141.                 countnum(zong);
  142.                 dxzm(b[3]+0x30,48,0);
  143.                 dxzm('.',56,0);
  144.                 dxzm(b[2]+0x30,64,0);
  145.           dxzm(b[1]+0x30,72,0);
  146.                 dxzm(b[0]+0x30,80,0);
  147.                 dxzm('m',88,0);
  148.                 dxzm('g',96,0);
  149.                 dxzm('/',104,0);
  150.                 dxzm('m',112,0);
  151.           location(120,0);
  152.                 dis_num86('3');
  153.                 }else
  154.                 {
  155.                         stat=1;
  156.                         n=0;
  157.                         m=0;
  158.                 }
  159. }
  160. void pm25_R()
  161. {
  162.         if((a[0]==0x42)&&(a[1]==0x4d))
  163.         {
  164.                
  165.                 if(a[3]==0x1c)
  166.                 {
  167.                         pm10i=((a[10]>>4)*16+(a[10]&0x0f))*256+a[11];
  168.                         countnum(pm10i);
  169.                         if(b[3]==0)
  170.                         ;else
  171.                         dxzm(b[3]+0x30,48,2);
  172.                         if(b[2]==0)
  173.                         ;else
  174.                         dxzm(b[2]+0x30,56,2);
  175.                         if(b[1]==0)
  176.                         ;else
  177.                         dxzm(b[1]+0x30,64,2);
  178.                         dxzm(b[0]+0x30,72,2);
  179.                         dxzm('u',80,2);
  180.                         dxzm('g',88,2);
  181.                         dxzm('/',96,2);
  182.                         dxzm('m',104,2);
  183.                         location(112,2);
  184.                         dis_num86('3');
  185.                        
  186.                         pm25i=((a[12]>>4)*16+(a[12]&0x0f))*256+a[13];
  187.                         countnum(pm25i);
  188.                         if(b[3]==0)
  189.                         ;else
  190.                         dxzm(b[3]+0x30,48,4);
  191.                         if(b[2]==0)
  192.                         ;else
  193.                         dxzm(b[2]+0x30,56,4);
  194.                         if(b[1]==0)
  195.                         ;else
  196.                         dxzm(b[1]+0x30,64,4);
  197.                         dxzm(b[0]+0x30,72,4);
  198.                         dxzm('u',80,4);
  199.                         dxzm('g',88,4);
  200.                         dxzm('/',96,4);
  201.                         dxzm('m',104,4);
  202.                         location(112,4);
  203.                         dis_num86('3');
  204.                        
  205.                        
  206.                         pm100i=((a[14]>>4)*16+(a[14]&0x0f))*256+a[15];
  207.                         countnum(pm100i);
  208.                         if(b[3]==0)
  209.                         ;else
  210.                         dxzm(b[3]+0x30,48,6);
  211.                         if(b[2]==0)
  212.                         ;else
  213.                         dxzm(b[2]+0x30,56,6);
  214.                         if(b[1]==0)
  215.                         ;else
  216.                         dxzm(b[1]+0x30,64,6);
  217.                         dxzm(b[0]+0x30,72,6);
  218.                         dxzm('u',80,6);
  219.                         dxzm('g',88,6);
  220.                         dxzm('/',96,6);
  221.                         dxzm('m',104,6);
  222.                         location(112,6);
  223.                         dis_num86('3');
  224.                 }
  225.         }else
  226.                 {
  227.                         stat=1;
  228.                         n=0;
  229.                         m=0;
  230.                 }
  231. }
  232. void dis_init()
  233. {
  234.         dxzm('H',8,0);
  235.         dxzm('C',16,0);
  236.         dxzm('H',24,0);
  237.         dxzm('O',32,0);
  238.         dxzm(':',40,0);
  239.        
  240.         dxzm('P',0,2);
  241.         dxzm('M',8,2);
  242.         dxzm('1',16,2);
  243.         dxzm('.',24,2);
  244.         dxzm('0',32,2);
  245.         dxzm(':',40,2);
  246.        
  247.         dxzm('P',0,4);
  248.         dxzm('M',8,4);
  249.         dxzm('2',16,4);
  250.         dxzm('.',24,4);
  251.         dxzm('5',32,4);
  252.         dxzm(':',40,4);
  253.        
  254.        
  255.         dxzm('P',0,6);
  256.         dxzm('M',8,6);
  257.         dxzm('1',16,6);
  258.         dxzm('0',24,6);
  259.         dxzm('.',32,6);
  260.         dxzm(':',40,6);
  261. }
  262. void main()
  263. {
  264.         u8 x;
  265.         Initial_12864();
  266.         clear_12864();
  267.         UartInit();
  268.         dis_init();
  269.        
  270.         Delay05s();
  271.         Delay05s();
  272.        
  273.         pm25_init();               
  274.         Delay50ms();
  275.         m=0;
  276.        
  277.                
  278.         while(1)
  279.         {               
  280.                 Delay50ms();
  281.                 if(stat==1)
  282.                 {
  283.                         conts++;
  284.                         if(conts==3)
  285.                         stat=0;
  286.                 }else
  287.                 {
  288.                         hcho_T();
  289.                         Delay50ms();
  290.                         hcho_R();
  291.                        
  292.                         Delay05s();
  293.                         Delay05s();
  294.                        
  295.                         pm25_T();
  296.                         Delay50ms();               
  297.                         pm25_R();       
  298.        
  299.                 }
  300.                 }       
  301. }
  302. void Serial_interrupt() interrupt 4
  303. {
  304.         if((RI==1)&&(flag==1))
  305.         {
  306.                 if(n==9)
  307.                         n=0;
  308.                 a[n]=SBUF; // a為事先定義的接收緩存,可以持續接收,直到你需要串口數據時來取為止
  309.                 RI=0;//接收中斷信號清零,表示將繼續接收
  310.                 n++;
  311.         }
  312.        
  313.         if((RI==1)&&(flag==0))
  314.         {
  315.        
  316.                 a[m]=SBUF; // a為事先定義的接收緩存,可以持續接收,直到你需要串口數據時來取為止
  317.                 RI=0;//接收中斷信號清零,表示將繼續接收
  318.                 m++;
  319.                 if(m==32)
  320.                 m=0;
  321.         }
  322.                
  323. }
  324.                
復制代碼

評分

參與人數 1黑幣 +80 收起 理由
admin + 80 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

地板
ID:328014 發表于 2019-1-25 02:47 | 只看該作者
和夏普的傳感器想必哪個更好呢?
回復

使用道具 舉報

5#
ID:446113 發表于 2019-1-25 08:12 | 只看該作者
omer 發表于 2019-1-18 13:35
鏈接:https://pan.baidu.com/s/18WKYwQf4Pm848L8Imv1ZVQ
提取碼:7pbn

感謝樓主的無私奉獻,樓主萬歲萬歲萬萬歲。
回復

使用道具 舉報

6#
ID:446113 發表于 2019-1-25 08:18 | 只看該作者
可否提供一下電器原理圖呢?
回復

使用道具 舉報

7#
ID:205015 發表于 2019-1-25 09:14 | 只看該作者
主程序pm數值的顯示有幾個錯誤,修正一下錯誤;調整HCHO對其左側0位置,請替換下。
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)
                        dxzm(32,48,2);       
                        else
                        dxzm(b[3]+0x30,48,2);
                        if((b[2]==0)&&(b[3]==0))
                                        dxzm(32,56,2);       
                        else
                        dxzm(b[2]+0x30,56,2);
                        if((b[1]==0)&&(b[2]==0)&&(b[3]==0))
                                        dxzm(32,64,2);       
                        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)
                                        dxzm(32,48,4);       
                        else
                        dxzm(b[3]+0x30,48,4);
                        if((b[2]==0)&&(b[3]==0))
                                dxzm(32,56,4);       
                        else
                        dxzm(b[2]+0x30,56,4);
                        if((b[1]==0)&&(b[2]==0)&&(b[3]==0))
                                dxzm(32,64,4);       
                        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)
                        dxzm(32,48,6);
                        else
                        dxzm(b[3]+0x30,48,6);
                        if((b[2]==0)&&(b[3]==0))
                        dxzm(32,56,6);
                        else
                        dxzm(b[2]+0x30,56,6);
                        if((b[1]==0)&&(b[2]==0)&&(b[3]==0))
                        dxzm(32,64,6);
                        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');
                }
        }else
                {
                        stat=1;
                        n=0;
                        m=0;
                }
}
void dis_init()
{
        dxzm('H',0,0);
        dxzm('C',8,0);
        dxzm('H',16,0);
        dxzm('O',24,0);
        dxzm(':',32,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);
}
回復

使用道具 舉報

8#
ID:205015 發表于 2019-1-25 09:16 | 只看該作者
GodWorks 發表于 2019-1-25 08:18
可否提供一下電器原理圖呢?

IIC的12864,除了電地外2路數據,2個傳感器的鏈接就是stc15w408as的2組串口引腳,沒多復雜,程序內部有對應的引腳定義,讀下程序就能找到了。有不懂得可以提問。
回復

使用道具 舉報

9#
ID:205015 發表于 2019-1-25 09:19 | 只看該作者
51hei團團 發表于 2019-1-25 02:47
和夏普的傳感器想必哪個更好呢?

沒有夏普傳感器,同時不明確型號,沒法作出比較。家里有某訊的M1,顆粒物傳感器一個廠家,數值幾乎一致;
回復

使用道具 舉報

10#
ID:205015 發表于 2019-1-25 09:44 | 只看該作者
更新集成后的圖片。








回復

使用道具 舉報

11#
ID:446113 發表于 2019-1-25 14:48 | 只看該作者
omer 發表于 2019-1-25 09:19
沒有夏普傳感器,同時不明確型號,沒法作出比較。家里有某訊的M1,顆粒物傳感器一個廠家,數值幾乎一致; ...

好的那我在認真看多幾遍程序,真的太感謝了
回復

使用道具 舉報

12#
ID:446113 發表于 2019-1-25 15:06 | 只看該作者
omer 發表于 2019-1-25 09:16
IIC的12864,除了電地外2路數據,2個傳感器的鏈接就是stc15w408as的2組串口引腳,沒多復雜,程序內部有對 ...

Void main()
{
   u8 x;
}
這一段出現警告,說x未被引用。
回復

使用道具 舉報

13#
ID:205015 發表于 2019-1-26 14:08 | 只看該作者
GodWorks 發表于 2019-1-25 15:06
Void main()
{
   u8 x;

沒用到的,可以干掉。應該是做別功能的時候用到的,警告可以忽略。
回復

使用道具 舉報

14#
ID:576501 發表于 2019-7-2 16:14 | 只看該作者
樓主我想請教你,怎么加你呢
回復

使用道具 舉報

15#
ID:575119 發表于 2019-7-20 20:00 | 只看該作者
樓主,如果方便,麻煩你發下Proteus 的仿真DSN文件唄,謝謝
回復

使用道具 舉報

16#
ID:136083 發表于 2019-7-22 09:54 | 只看該作者
這個創意很好,圍觀中。
回復

使用道具 舉報

17#
ID:421308 發表于 2019-7-22 10:56 | 只看該作者
學習中
回復

使用道具 舉報

18#
ID:589925 發表于 2019-7-24 19:57 | 只看該作者
感謝樓主,準備弄個,可惜小白,不會
回復

使用道具 舉報

19#
ID:342663 發表于 2019-10-26 12:28 | 只看該作者
請問樓主有沒有元器件清單啊
回復

使用道具 舉報

20#
ID:526058 發表于 2019-11-10 20:43 | 只看該作者
我也在做一個甲醛和PM2.5的測試儀,和你用的傳感器一模一樣。
回復

使用道具 舉報

21#
ID:526058 發表于 2019-11-10 20:47 | 只看該作者
攀縢pm7003和達特WZ-S.差不多都是70+ rmb/個。
回復

使用道具 舉報

22#
ID:665054 發表于 2019-12-16 13:07 | 只看該作者
你好, 按照您的 做出來啦。PM2.5的都能顯示但是甲醛的不顯示數據  不知道怎么回事
回復

使用道具 舉報

23#
ID:136485 發表于 2020-3-5 12:02 | 只看該作者
學習下,多謝分享
回復

使用道具 舉報

24#
ID:626079 發表于 2020-3-10 17:03 | 只看該作者
不明白為什么樓主要取消云盤分享? 怕別人學習到了?理解你,但個人覺得沒有必要,既然分享出來就大家看你的程序,對各自的學習進行提高,不是每個人都要做出這個玩意,說實話網上這也就一兩百塊的事。好點的也是300塊左右。 為什么我們的技術在國際上這么落后? 你既然學到,我相信也是學習了很多別人分享的東西,逛這個論壇的,我相信學生是很大部分,希望他們多學習,多進步,為國家的發展做真正的貢獻,逛這個論壇的我相信一定比那些所謂的看啥演唱會,追星的師兄要值得肯定,至少說明他們有上進的心。
個人所言。不喜請忽略。
回復

使用道具 舉報

25#
ID:136485 發表于 2020-3-13 11:45 | 只看該作者
本帖最后由 kxcuser 于 2020-3-17 16:17 編輯

請教一下這句能詳細講解下嗎zong=((d[2]>>4)*16+(d[2]&0x0f))*256+d[3];這是把16進制轉換成十進制嗎,還有傳感器計算公式嗎
回復

使用道具 舉報

26#
ID:205015 發表于 2020-3-29 09:26 | 只看該作者
kxcuser 發表于 2020-3-13 11:45
請教一下這句能詳細講解下嗎zong=((d[2]>>4)*16+(d[2]&0x0f))*256+d[3];這是把16進制轉換成十進制嗎,還有 ...

是十六進制到十進制轉換的過程。不過這個公式是否正確,我現在再來看,有些糊涂了。。。
傳感器的數據格式可以看官方提供的手冊。
回復

使用道具 舉報

27#
ID:205015 發表于 2020-3-29 09:29 | 只看該作者
f516411213 發表于 2019-12-16 13:07
你好, 按照您的 做出來啦。PM2.5的都能顯示但是甲醛的不顯示數據  不知道怎么回事

2個傳感器直接接在串口助手下看下數據,記得有一個是需要先發數據把它改成被動模式。
可以考慮在程序中上電時執行一次把主動轉被動。
回復

使用道具 舉報

28#
ID:205015 發表于 2020-3-29 09:30 | 只看該作者
xmfjfhcel 發表于 2020-3-10 17:03
不明白為什么樓主要取消云盤分享? 怕別人學習到了?理解你,但個人覺得沒有必要,既然分享出來就大家看你 ...

估計是到期了。。。沒主動操作過。
回復

使用道具 舉報

29#
ID:235017 發表于 2020-4-26 19:36 | 只看該作者
樓主大大,可以再發一下整個文件嗎?
回復

使用道具 舉報

30#
ID:235017 發表于 2020-4-26 19:42 | 只看該作者
樓主,我也買了個這個傳感器,請問您的作品中達特傳感器只接了VCC,GND,TX,Rx嗎?期待回復
回復

使用道具 舉報

31#
ID:205015 發表于 2020-8-12 08:53 | 只看該作者
ico_葉子 發表于 2020-4-26 19:42
樓主,我也買了個這個傳感器,請問您的作品中達特傳感器只接了VCC,GND,TX,Rx嗎?期待回復

是的,串口通信只需要收發電地。如果使用攀藤的休眠功能,可以接個set引接。
回復

使用道具 舉報

32#
ID:624444 發表于 2020-8-24 11:50 | 只看該作者
雖然我不玩,但是能共享資源,還為大家解答疑問,這個必須支持,贊一個
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 韩国av一区二区 | 天堂男人av | 国产视频中文字幕 | 一级毛片高清 | 久久不卡 | 综合色久| 亚洲国产精品久久久久久 | 久色激情| 最新国产精品精品视频 | a中文在线视频 | 欧美色性| 6996成人影院网在线播放 | 亚洲精品乱码久久久久久按摩观 | 91av免费观看 | 日韩精品 电影一区 亚洲 | 亚洲福利 | 亚洲日本中文字幕在线 | 国产精品日韩欧美一区二区三区 | 91精品国产美女在线观看 | 国产一区二区在线播放 | 一区二区三区中文字幕 | 波多野结衣中文视频 | 伊人久操 | 久久精品亚洲欧美日韩精品中文字幕 | 久久99精品久久久久久国产越南 | 一级做a | 国产黄色网址在线观看 | 欧美精品成人影院 | 91毛片在线观看 | 国产一区免费 | 精品一区二区三区视频在线观看 | 成人激情视频免费在线观看 | 国产精品久久国产精品久久 | 国产一区二区电影 | 午夜国产羞羞视频免费网站 | 怡红院怡春院一级毛片 | 久久久久国产一区二区三区 | 女人牲交视频一级毛片 | 亚洲一页| 精品视频一区二区 | 亚洲欧美男人天堂 |