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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 22976|回復: 43
收起左側

基于STC89C52單片機空氣PM2.5系統設計資料(仿真+論文+源碼)

  [復制鏈接]
ID:164009 發表于 2018-3-17 09:18 | 顯示全部樓層 |閱讀模式
這是我之前做的單片機畢業設計,差不多花了我兩個月時間,附件里面包含PM2.5系統的單片機源代碼,用AD畫的原理圖,PCB圖
還有proteus仿真工程文件以及課程設計的文檔,另外還有成品實物圖,請大家多多指教!
單片機按鍵簡介.png IMG_20171217_163136.jpg IMG_20171217_162918.jpg

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

單片機源程序如下:
  1. #include <reg52.h>
  2. #include <intrins.h>
  3. #define uint unsigned int
  4. #define uchar unsigned char //宏定義
  5. sbit RS=P1^6;//液晶接口
  6. sbit EN=P1^7;

  7. sbit LED = P2^0;//粉塵傳感器控制接口

  8. sbit ADCS = P3^7;//AD0832接口
  9. sbit ADCLK =P3^5;
  10. sbit ADDI = P3^6;
  11. sbit ADDO = P3^6;                  

  12. sbit SET= P1^1;//按鍵接口
  13. sbit ADD= P1^2;
  14. sbit DEC= P1^3;

  15. sbit BEEP=P2^1;//蜂鳴器接口

  16. uchar set_st;
  17. uchar tab[5];
  18. uint DUST_SET=150; //固體顆粒的閾值

  19. //bit shanshuo_st; //閃爍間隔標志
  20. bit beep_st; //蜂鳴器間隔標志
  21. uchar x=4; //計數器
  22. //定義標識
  23. uchar FlagStart = 0;
  24. float DUST_Value;
  25. uint DUST;
  26. uchar num=0;
  27. uchar mm;
  28. uchar abc;
  29. uchar ADC_Get[10]={0}; //定義AD采樣數組
  30. uchar str[5]={0};

  31. /*****初始化定時器0*****/
  32. void InitTimer(void)
  33. {
  34.         TMOD = 0x01;
  35.         TL0 = (65536-10000)/256; //定時10ms
  36.         TH0 = (65536-10000)%256;
  37.         TR0 = 1;
  38.         ET0 = 1;
  39.         EA = 1;
  40. }
  41. /*************************lcd1602程序**************************/
  42. void delay1ms(uint ms)//延時1毫秒
  43. {
  44.     uint i,j;
  45.         for(i=0;i<ms;i++)
  46.         for(j=0;j<100;j++);
  47. }

  48. void wr_com(uchar com)//寫指令//
  49. {
  50.     delay1ms(1);
  51.         RS=0;
  52. //        RW=0;
  53.         EN=0;
  54.         P0=com;
  55.         delay1ms(1);
  56.         EN=1;
  57.         delay1ms(1);
  58.         EN=0;
  59. }
  60. void wr_dat(uchar dat)//寫數據//
  61. {
  62.     delay1ms(1);;
  63.         RS=1;
  64. //        RW=0;
  65.         EN=0;
  66.         P0=dat;
  67.         delay1ms(1);
  68.         EN=1;
  69.         delay1ms(1);
  70.         EN=0;
  71. }
  72. /*****************************液晶初始化
  73. *********************************************/
  74. void lcd_init()//初始化設置//
  75. {
  76.         delay1ms(15);
  77.         wr_com(0x38);
  78.         delay1ms(5);
  79.         wr_com(0x01);
  80.         delay1ms(5);
  81.         wr_com(0x06);
  82.         delay1ms(5);
  83.         wr_com(0x0c);
  84.         delay1ms(5);

  85.         wr_com(0x80);
  86.         wr_dat('P');//
  87.         wr_com(0x81);
  88.         wr_dat('M');//:
  89.         wr_com(0x82);
  90.         wr_dat('2');//
  91.         wr_com(0x83);
  92.         wr_dat('.');//:
  93.         wr_com(0x84);
  94.         wr_dat('5');//:
  95.         wr_com(0x85);
  96.         wr_dat(':');


  97.         wr_com(0x8b);
  98.         wr_dat('m');
  99.         wr_com(0x8c);
  100.         wr_dat('g');
  101.         wr_com(0x8d);
  102.         wr_dat('/');
  103.         wr_com(0x8e);
  104.         wr_dat('m');
  105.         wr_com(0x8f);
  106.         wr_dat('3');
  107.        


  108. /////////////////////////////////////

  109.         wr_com(0xc0);
  110.         wr_dat('A');
  111.         wr_com(0xc1);
  112.         wr_dat('l');
  113.         wr_com(0xc2);
  114.         wr_dat('a');
  115.         wr_com(0xc3);
  116.         wr_dat('r');
  117.         wr_com(0xc4);
  118.         wr_dat('m');
  119.         wr_com(0xc5);
  120.         wr_dat(':');

  121.         wr_com(0xcb);
  122.         wr_dat('m');
  123.         wr_com(0xcc);
  124.         wr_dat('g');
  125.         wr_com(0xcd);
  126.         wr_dat('/');
  127.         wr_com(0xce);
  128.         wr_dat('m');
  129.         wr_com(0xcf);
  130.         wr_dat('3');
  131. }
  132. /*****************顯示函數******************************/
  133. void disp(unsigned int Data)//PM2.5值顯示
  134. {
  135.         uint Temp;
  136.         Temp=Data%10000;
  137.         str[0]=Temp/1000+0x30; //千位
  138.         Temp%=1000;
  139.         str[1]='.';
  140.         str[2]=Temp/100+0x30; //百位
  141.         Temp%=100;
  142.         str[3]=Temp/10+0x30; //十位
  143.         str[4]=Temp%10+0x30; //個位
  144.         wr_com(0x86);
  145.         wr_dat(str[0]);
  146.         wr_com(0x87);
  147.         wr_dat(str[1]);
  148.         wr_com(0x88);
  149.         wr_dat(str[2]);
  150.         wr_com(0x89);
  151.         wr_dat(str[3]);
  152.         wr_com(0x8a);
  153.         wr_dat(str[4]);

  154. }
  155. /************************報警值顯示************************************/
  156. void baojing()
  157. {
  158.         wr_com(0xc6);
  159.         wr_dat(tab[0]+0x30);
  160.         wr_com(0xc7);
  161.         wr_dat(tab[1]);
  162.         wr_com(0xc8);
  163.         wr_dat(tab[2]+0x30);
  164.         wr_com(0xc9);
  165.         wr_dat(tab[3]+0x30);
  166.         wr_com(0xca);
  167.         wr_dat(tab[4]+0x30);
  168. }
  169. /*****延時子程序*****/
  170. void Delay(uint num)
  171. {
  172. while( --num );
  173. }
  174. /**************************按鍵檢測
  175. *******************************************/
  176. void checkkey()
  177. {
  178.         if(SET==0)
  179.         {
  180.         Delay(2000);
  181.         do{}while(SET==0);
  182.         set_st++;
  183.         if(set_st>1)set_st=0;
  184.         }
  185.         if(set_st==0)
  186.         {
  187.         }
  188.         else if(set_st==1)
  189.         {
  190.         if(DEC==0)
  191.         {
  192.         Delay(2000);
  193.         do{}while(DEC==0);
  194.         if(DUST_SET>0)DUST_SET--;
  195.         if(DUST_SET==0)DUST_SET=0;
  196.         }
  197.         if(ADD==0)
  198.         {
  199.         Delay(2000);
  200.         do{}while(ADD==0);
  201.         DUST_SET++;
  202.         if(DUST_SET>800)DUST_SET=800;
  203.         }
  204.         }
  205.         tab[0]=DUST_SET/1000;
  206.         tab[1]='.';
  207.         tab[2]=DUST_SET%1000/100;
  208.         tab[3]=DUST_SET%100/10;
  209.         tab[4]=DUST_SET%10;
  210. }
  211. /*****報警子程序*****/
  212. void Alarm()
  213. {
  214.         if(x>=10){beep_st=~beep_st;x=0;}
  215.         if(DUST>DUST_SET&&beep_st==1)BEEP=0;
  216.         else BEEP=1;
  217. //        if(DUST>0&&DUST<100){LED2=0;LED3=1;LED4=1;}
  218. //        if(DUST>=10&&DUST<300){LED2=1;LED3=0;LED4=1;}
  219. //        if(DUST>=300){LED2=1;LED3=1;LED4=0;}
  220.         }
  221. /**************************AD0832轉換程序
  222. ***********************************************/
  223. uchar ADC0832(bit mode,bit channel) //AD轉換,返回結果
  224. {
  225.         uchar i,dat,ndat;
  226.         ADCS = 0;//拉低CS端
  227.         _nop_();
  228.         _nop_();
  229.         ADDI = 1; //第1個下降沿為高電平
  230.         ADCLK = 1;//拉高CLK端
  231.         _nop_();
  232.         _nop_();
  233.         ADCLK = 0;//拉低CLK端,形成下降沿1
  234.         _nop_();
  235.         _nop_();
  236.         ADDI = mode; //低電平為差分模式,高電平為單通道模式。
  237.         ADCLK = 1;//拉高CLK端
  238.         _nop_();
  239.         _nop_();
  240.         ADCLK = 0;//拉低CLK端,形成下降沿2
  241.         _nop_();
  242.         _nop_();
  243.         ADDI = channel; //低電平為CH0,高電平為CH1
  244.         ADCLK = 1;//拉高CLK端
  245.         _nop_();
  246.         _nop_();
  247.         ADCLK = 0;//拉低CLK端,形成下降沿3
  248.         ADDI = 1;//控制命令結束(經試驗必需)
  249.         dat = 0;
  250.         //下面開始讀取轉換后的數據,從最高位開始依次輸出(D7~D0)
  251.         for(i = 0;i < 8;i++)
  252.         {
  253.         dat <<= 1;
  254.         ADCLK=1;//拉高時鐘端
  255.         _nop_();
  256.         _nop_();
  257.         ADCLK=0;//拉低時鐘端形成一次時鐘脈沖
  258.         _nop_();
  259.         _nop_();
  260.         dat |= ADDO;
  261.         }
  262.         ndat = 0; //記錄D0
  263.         if(ADDO == 1)
  264.         ndat |= 0x80;
  265.         //下面開始繼續讀取反序的數據(從D1到D7)
  266.         for(i = 0;i < 7;i++)
  267.         {
  268.         ndat >>= 1;
  269.         ADCLK = 1;//拉高時鐘端
  270.         _nop_();
  271.         _nop_();
  272.         ADCLK=0;//拉低時鐘端形成一次時鐘脈沖
  273.         _nop_();
  274.         _nop_();
  275.         if(ADDO==1)
  276.         ndat |= 0x80;
  277.         }
  278.         ADCS=1;//拉高CS端,結束轉換
  279.         ADCLK=0;//拉低CLK端
  280.         ADDI=1;//拉高數據端,回到初始狀態
  281.         if(dat==ndat)
  282.         return(dat);
  283.         else
  284.         return 0;
  285. }
  286. /*****定時器0中斷服務程序*****/
  287. void timer0(void) interrupt 1
  288. {
  289.         uint j;
  290.         TL0 = (65536-10000)/256; //定時10ms
  291.         TH0 = (65536-10000)%256;
  292.         LED=1; //開啟傳感器的LED
  293.         x++;
  294.         for (j=0;j<30;j++); //0.28ms //延時0.28ms
  295.         abc=ADC0832(1,0); //開啟ADC采集
  296.         FlagStart=1;
  297.         TR0 = 0; //先關閉定時器0
  298.         EA = 0;
  299.         LED=0;//關閉傳感器LED
  300. }
  301. //中值濾波
  302. //算法:先進行排序,然后將數組的中間值作為當前值返回。
  303. uchar Error_Correct(uchar *str,uchar num)
  304. {
  305.         unsigned char i=0;
  306.         unsigned char j=0;
  307.         unsigned char Temp=0;
  308.         //排序
  309.         for(i=0;i<num-1;i++)
  310.         {
  311.         for(j=i+1;j<num;j++)
  312.         {
  313.            if(str[i]<str[j])
  314.                 {
  315.                 Temp=str[i];
  316.                 str[i]=str[j];
  317.                 str[j]=Temp;
  318.                 }
  319.         }
  320. }

  321.         //去除誤差,取中間值
  322.         return str[num/2];
  323. }
  324. /*****主函數*****/
  325. void main(void)
  326. {
  327.         InitTimer(); //初始化定時器
  328.         BEEP=1;
  329.         lcd_init();//初始化顯示
  330.         delay1ms(500);
  331.         while(1)
  332.         {

  333.          checkkey();//按鍵檢測
  334.         if(set_st==0)
  335.         {
  336.                 //wr_com(0x0c);
  337.                 if(FlagStart==1) //1次數據采集完成
  338.                 {
  339.                 num++;
  340.                 ADC_Get[num]=abc;
  341.                 if(num>9)
  342.                 {
  343.                 num=0;
  344. //                DUST=Error_Correct(ADC_Get,10); //求取10次AD采樣的值
  345. //                DUST_Value=(DUST/256.0)*5000; //轉化成電壓值MV
  346. //                DUST_Value=DUST_Value*0.17-100; //固體懸浮顆粒濃度計算 Y=0.17*X-0.1 X--采樣電壓V
  347.        
  348.                 DUST=Error_Correct(ADC_Get,10);
  349.             DUST_Value=(DUST/256.0)*5;//轉化成電壓值
  350.             DUST_Value=(DUST_Value*0.17-0.1)*1000;//固體懸浮顆粒濃度計
  351.        
  352.                 if(DUST_Value<0) DUST_Value=0;
  353.                 if(DUST_Value>760) DUST_Value=760; //限位
  354.                 DUST=(uint)DUST_Value;
  355.                 }
  356.                 TL0 = (65536-10000)/256;
  357.                 TH0 = (65536-10000)%256;
  358.                 TR0 = 1; //開啟定時器0
  359.                 EA = 1;
  360.                 FlagStart=0;
  361.                 }
  362.                 Alarm(); //報警檢測
  363.         }
  364.         disp(DUST);//顯示粉塵濃度值
  365.         baojing();//顯示報警值

  366.                 if(set_st==1)//報警值閃動
  367.                 {
  368.                 wr_com(0xca);
  369.                 wr_com(0x0d);
  370.                 delay1ms(150);
  371.                 }
  372.         }
  373. }
復制代碼
QQ圖片20180317090208.png
所有資料51hei提供下載:

c程序.zip

44.67 KB, 下載次數: 462, 下載積分: 黑幣 -5

keil寫的源程序

仿真.zip

111.06 KB, 下載次數: 460, 下載積分: 黑幣 -5

proteus仿真工程文件

原理圖PCB圖.pdf

706.98 KB, 下載次數: 394, 下載積分: 黑幣 -5

原理圖及PCB

粉塵傳感器參數.docx

185.15 KB, 下載次數: 271, 下載積分: 黑幣 -5

粉塵傳感器參數

基于單片機的PM2.5空氣質量檢測論文.doc

1.86 MB, 下載次數: 565, 下載積分: 黑幣 -5

論文

評分

參與人數 6黑幣 +30 收起 理由
kljie1000 + 9
Meadors + 5 絕世好帖!
蹬車拽小卡 + 5 很給力!
天才2333333 + 5 很給力!
iamtheflash + 4 很給力!
櫻月櫻詩 + 2 很給力!

查看全部評分

回復

使用道具 舉報

ID:279910 發表于 2018-3-30 19:13 | 顯示全部樓層
兄弟你好,我也在做這個傳感器,我用了你的程序,但是灰塵傳感器沒輸出,你知道是什么原因嗎?
回復

使用道具 舉報

ID:300185 發表于 2018-4-2 18:35 | 顯示全部樓層
論文重復率多少?
回復

使用道具 舉報

ID:192893 發表于 2018-4-14 20:32 | 顯示全部樓層
感謝樓主分享
回復

使用道具 舉報

ID:288901 發表于 2018-4-17 14:42 | 顯示全部樓層
固體懸浮顆粒濃度計算公式怎么來的
回復

使用道具 舉報

ID:297008 發表于 2018-5-3 14:16 | 顯示全部樓層
這個需要用到藍牙模塊嗎?
回復

使用道具 舉報

ID:297008 發表于 2018-5-6 19:29 | 顯示全部樓層
很不錯的分享。
回復

使用道具 舉報

ID:297008 發表于 2018-5-6 19:40 | 顯示全部樓層
很不錯的分享。
回復

使用道具 舉報

ID:151567 發表于 2018-5-8 15:59 | 顯示全部樓層
感謝大兄弟的分享,正在找這方面的材料。
回復

使用道具 舉報

ID:325403 發表于 2018-5-8 20:33 | 顯示全部樓層
感謝分享,很有用
回復

使用道具 舉報

ID:333671 發表于 2018-5-27 16:10 | 顯示全部樓層
樓主,能加好友聊嘛
回復

使用道具 舉報

ID:333671 發表于 2018-5-27 16:12 | 顯示全部樓層
樓主,我現在在做這個 作為課程的創新設計(買了HTU21D溫濕度傳感器和YW-51GJ PM2.5的傳感器)能加qq好友 嘛,想請教您幾個問題
回復

使用道具 舉報

ID:344153 發表于 2018-6-3 20:17 | 顯示全部樓層
感謝分享
回復

使用道具 舉報

ID:297080 發表于 2018-6-12 02:59 | 顯示全部樓層
謝謝你,很好用
回復

使用道具 舉報

ID:372442 發表于 2018-7-18 10:38 | 顯示全部樓層
好文章 頂起來
回復

使用道具 舉報

ID:424055 發表于 2018-11-10 15:34 | 顯示全部樓層
yc123 發表于 2018-3-30 19:13
兄弟你好,我也在做這個傳感器,我用了你的程序,但是灰塵傳感器沒輸出,你知道是什么原因嗎?

我下載了程序 無法運行  是什么原因呢   reg52.h這個顯示錯誤 什么意思呢  我是小白  還不太懂
回復

使用道具 舉報

ID:380141 發表于 2018-11-14 09:51 | 顯示全部樓層
正在做這個項目,用的傳感器也是這個夏普的GP2Y1014
回復

使用道具 舉報

ID:63317 發表于 2019-1-8 17:01 | 顯示全部樓層
謝謝分享資料
回復

使用道具 舉報

ID:465026 發表于 2019-1-9 08:56 | 顯示全部樓層
很nice
回復

使用道具 舉報

ID:465533 發表于 2019-1-10 08:53 | 顯示全部樓層

謝謝分享資料
回復

使用道具 舉報

ID:479427 發表于 2019-3-17 22:36 | 顯示全部樓層
感謝樓主發表資料
回復

使用道具 舉報

ID:480232 發表于 2019-3-25 08:12 | 顯示全部樓層
感謝ganxie
回復

使用道具 舉報

ID:204748 發表于 2019-3-25 12:53 | 顯示全部樓層
這個可以,看看
回復

使用道具 舉報

ID:497867 發表于 2019-3-25 14:07 | 顯示全部樓層
太棒了
回復

使用道具 舉報

ID:412607 發表于 2019-3-26 23:50 | 顯示全部樓層
樓主厲害啊
回復

使用道具 舉報

ID:500244 發表于 2019-3-29 08:19 | 顯示全部樓層
有參考文獻嗎親
回復

使用道具 舉報

ID:503807 發表于 2019-4-3 09:19 | 顯示全部樓層

我是大神蔡越帆,能加裝wifi模塊,上傳到云,實現多點分布遠距離查看,更好
回復

使用道具 舉報

ID:519626 發表于 2019-4-23 15:41 | 顯示全部樓層
沒有黑幣,我要開會員
回復

使用道具 舉報

ID:420836 發表于 2019-4-25 08:25 | 顯示全部樓層
謝謝分享
回復

使用道具 舉報

ID:511102 發表于 2019-4-26 12:01 | 顯示全部樓層
謝謝樓主分享,先拿來試試,我之前寫的0832的讀取數據一直沒有數據輸出
回復

使用道具 舉報

ID:540914 發表于 2019-5-17 19:07 | 顯示全部樓層
set_st沒有賦初值 怎么執行set_st++
回復

使用道具 舉報

ID:540914 發表于 2019-5-17 19:09 | 顯示全部樓層
set_st沒有賦初值 怎么執行set_st++

這個按鍵設定上下限 掉電 再上電能保存么?怎么實現的?
回復

使用道具 舉報

ID:541985 發表于 2019-5-19 12:38 | 顯示全部樓層
謝謝分享!
回復

使用道具 舉報

ID:327071 發表于 2019-5-19 15:48 | 顯示全部樓層
好東西學習學習
回復

使用道具 舉報

ID:542218 發表于 2019-5-19 17:56 | 顯示全部樓層
太棒了,要了
回復

使用道具 舉報

ID:618469 發表于 2019-10-23 22:52 | 顯示全部樓層
再走一波,很好的,ADASADF23423.,,XCC23423??.,.,.,,.,.
回復

使用道具 舉報

ID:386663 發表于 2019-11-3 16:50 | 顯示全部樓層
原理圖有原版的么
回復

使用道具 舉報

ID:634898 發表于 2019-11-3 18:48 | 顯示全部樓層
絕世好帖子  很受啟發
回復

使用道具 舉報

ID:667281 發表于 2019-12-18 13:43 | 顯示全部樓層
很棒 值得學習 課設有了
回復

使用道具 舉報

ID:686752 發表于 2020-9-3 14:30 | 顯示全部樓層
你好,我想問一下,這里PM2.5傳感器你用電阻替代了,那么做實物的時候我直接把PM2.5傳感器的電壓輸出引腳接到AD連接滑動變阻器的引腳是不是就行了。PM2.5還用另外的檢測程序嗎?
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产精品久久福利 | 成人精品免费视频 | 中文字幕三区 | 精品伊人 | 午夜视频一区二区 | 久久成人av电影 | 成人久久久久 | 精品久久久久久久久久久久 | 欧美视频区| 日韩欧美视频 | 成人黄色电影免费 | 欧美精品一区二区蜜桃 | 小川阿佐美pgd-606在线 | 不用播放器看的av | 国产九九av | 国产精品美女 | 97国产精品 | 久草热视频 | 亚洲第一网站 | 精品一区二区av | 99精品视频在线观看免费播放 | 激情影院久久 | 欧美专区在线 | 91久久电影 | 天天爽天天干 | 精品在线一区二区 | 中文字幕成人在线 | 久久久久久成人 | 成人av播放 | 天天噜天天干 | 国产精品美女久久久久久免费 | 影音先锋久久 | 黄色一级毛片 | 在线一级片 | 中文字幕视频在线观看 | 国产精品久久久久久久久久东京 | 日本成人中文字幕 | 欧美在线资源 | 亚洲国产日韩欧美 | 秋霞电影一区二区 | 成人国产免费视频 |