找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 8381|回复: 27
收起左侧

雾霾(PM2.5)检测与处理模块proteus仿真与源码

  [复制链接]
ID:217263 发表于 2017-7-12 16:32 | 显示全部楼层 |阅读模式
大学期间第一次经历小学期,真是痛苦.....老师还要求做一个PM2.5检测和处理的仿真,倒腾了两个星期,又参(chao)照(xi)了论坛内诸位大神的仿真图,总算给倒腾出来了,深感单片机学习真是不容易。给各位共享出来,加油学习,与诸君共勉......

仿真原理图如下(proteus仿真工程文件可到本帖附件中下载):

仿真图

仿真图
0.png

单片机源程序如下:
  1. #include<reg51.h>
  2. #include<intrins.h>
  3. #define uchar unsigned char
  4. #define uint unsigned int
  5. #define LCD P0                                      //
  6. sbit PM2_5 = P2^1;  //PM2.5模块PWM输入口
  7. sbit busy=P0^7;     // "忙"标志位
  8. sbit add=P1^0;
  9. sbit jian=P1^1;
  10. sbit ledred=P1^2;
  11. sbit ledgreen=P1^3;
  12. sbit sanji=P2^2;
  13. sbit erji=P2^3;
  14. sbit yiji=P2^4;
  15. sbit guolvwang=P2^0;
  16. sbit warning=P1^7;  
  17. uint ji=120;  
  18. uint LowPulseTime_30s = 0; //30秒内低电平的时间,单位为ms
  19. uint LowPulseTime_3s = 0; //3秒内低电平的时间,单位为ms
  20. uint TotalTime_3s = 0;//总时间,3秒计数器
  21. uint TotalTime_30s = 0;//总时间,30秒计数器*
  22. uint LowperTotal = 0; //30秒内的低脉冲率,就是30秒内的低脉冲时间除以30秒的总时间,范围为5%~25%
  23. uint Concen = 0;//浓度值,整数
  24. uint pulseTime[10] = {0};  //每隔3秒的低电平时间数组,10项刚好就是30秒
  25. uchar Index = 0; //上述数组的索引
  26. bit bFreshDis = 0; //显示值刷新标志位,每隔3秒刷新一次显示
  27. bit bStartDis = 0; //开始显示浓度值标志位,因为上电后要等30秒的预热时间才能计算浓度值
  28. #define INT_CLOCK 1 //INT_CLOCK为定时值,单位为ms ,此处定义为1ms
  29. #define CRY_FREQUENCY 11059200 //CRY_FREQUENCY为晶振频率,单位为,Hz
  30. uchar TL0_temp;         //暂存TL0的初值 中断值
  31. uchar TH0_temp;         //暂存TH0的初值
  32. unsigned char fuhao;       
  33. //代码表
  34. uchar dat=0x00;
  35. uchar CH;
  36. uchar dis[]={0x01,0x02,0x03,0x04};
  37. unsigned char code hutab[10]={"0123456789"};
  38. uchar  code tablewe[]={0xfd,0xfb,0xf7,0xf0,0xdf,0xfe};
  39. unsigned char code TAB1[]={ 0x0c,0x12,0x12,0x0c,
  40.                             0x00,0x00,0x00,0x00,
  41.                           };
  42. //字符表
  43. unsigned char code digit[20]={"0123456789"};     //定义字符数组显示数字                                         
  44. /*************************
  45. LCD相关变量
  46. *************************/
  47. sbit RS=P2^5;
  48. sbit RW=P2^6;
  49. sbit EN=P2^7;
  50. //------------------------------------  延时函数  -------------------------------------------
  51. void delay(unsigned int t)                      //延时若干微秒
  52. {
  53.    while(t--);
  54. }
  55. //定时器
  56. void Timer0_init()
  57. {
  58.         unsigned long T0_temp;                                     //暂存T0的初始值       
  59.         T0_temp = 65536-((INT_CLOCK *CRY_FREQUENCY /1000)/12);    //T0初始值计算公式,参考教科书
  60.         TL0_temp = T0_temp & 0xff;
  61.         TH0_temp = T0_temp >> 8;
  62.         TL0 = TL0_temp;
  63.         TH0 = TH0_temp;
  64.         TMOD = 0x11;
  65.         TR0 = 1;  
  66.         ET0 = 1;
  67.     CH=0x00;                     
  68. }

  69. /************************************************
  70. 1602相关函数定义
  71. ************************************************/
  72. //----------------------------------
  73. void CHECK_BF()                                      //判断是否忙碌
  74. {
  75.   do
  76.    {
  77.     LCD=0xff;   
  78.     RS=0;                                       // RS=0,选择指令寄存器
  79.     RW=1;                                       // RW=1,选择读模式
  80.     EN=0;                                       // 执行显示命令
  81.     EN=1;                                       // 允许读/写
  82.    }  
  83.   while(busy);                                  //busy为高电平表示忙,循环等待
  84. }

  85. void WR_COMM()//写指令//
  86. {
  87.    RS=0;
  88.    RW=0;
  89.    EN=0;
  90.   CHECK_BF();
  91.    EN=1;
  92. }

  93. void WR_DATA()//写数据//
  94. {
  95.    RS=1;
  96.    RW=0;
  97.    EN=0;
  98.    CHECK_BF();
  99.    EN=1;
  100. }

  101. //1602初始化
  102. void INIT_LCD()                                       
  103. {
  104.    unsigned char i=200;
  105.     {
  106.       while(--i);
  107.       LCD=0x01;                                 //清屏并光标复位
  108.       WR_COMM();                                //写入命令
  109.       LCD=0x38;                                 //设置显示模式:8位2行5x7点阵
  110.       WR_COMM();
  111.       LCD=0x0c;                                 //开显示屏
  112.           WR_COMM();
  113.       LCD=0x06;                                 //文字不动,光标自动右移
  114.       WR_COMM();                                //写入命令
  115.     }
  116. }




  117. //显示模块
  118. void DISP_YUJING()//显示浓度
  119. {       
  120.           LCD=0xc0;
  121.           WR_COMM();
  122.           LCD=('P');
  123.           WR_DATA();

  124.           LCD=0xc1;
  125.           WR_COMM();
  126.           LCD=('M');
  127.           WR_DATA();

  128.           LCD=0xc2;
  129.           WR_COMM();
  130.           LCD=('2');
  131.           WR_DATA();

  132.           LCD=0xc3;
  133.           WR_COMM();
  134.           LCD=('.');
  135.           WR_DATA();

  136.           LCD=0xc4;
  137.           WR_COMM();
  138.           LCD=('5');
  139.           WR_DATA();

  140.           LCD=0xc5;
  141.           WR_COMM();
  142.           LCD=('y');
  143.           WR_DATA();

  144.            LCD=0xc6;
  145.           WR_COMM();
  146.           LCD=('u');
  147.           WR_DATA();
  148.                     
  149.           LCD=0xc7;
  150.           WR_COMM();
  151.           LCD=('j');
  152.           WR_DATA();

  153.           LCD=0xc8;
  154.           WR_COMM();
  155.           LCD=('i');
  156.           WR_DATA();

  157.            LCD=0xc9;
  158.           WR_COMM();
  159.           LCD=('n');
  160.           WR_DATA();
  161.                     
  162.           LCD=0xca;
  163.           WR_COMM();
  164.           LCD=('g');
  165.           WR_DATA();

  166.           LCD=0xcb;
  167.           WR_COMM();
  168.           LCD=(':');
  169.           WR_DATA();

  170.           LCD=0xcc;
  171.           WR_COMM();
  172.           LCD=ji/100+0x30;
  173.           WR_DATA();

  174.           LCD=0xcd;
  175.           WR_COMM();
  176.           LCD=(ji%100)/10+0x30;
  177.           WR_DATA();


  178.           LCD=0xce;
  179.           WR_COMM();
  180.           LCD=(ji%10)+0x30;
  181.           WR_DATA();
  182.           


  183.           
  184. }



  185. void DISP_CONCE()//显示浓度
  186. {       
  187.           LCD=0x80;
  188.           WR_COMM();
  189.           LCD=('P');
  190.           WR_DATA();

  191.           LCD=0x81;
  192.           WR_COMM();
  193.           LCD=('M');
  194.           WR_DATA();

  195.           LCD=0x82;
  196.           WR_COMM();
  197.           LCD=('2');
  198.           WR_DATA();

  199.           LCD=0x83;
  200.           WR_COMM();
  201.           LCD=('.');
  202.           WR_DATA();

  203.           LCD=0x84;
  204.           WR_COMM();
  205.           LCD=('5');
  206.           WR_DATA();

  207.           LCD=0x85;
  208.           WR_COMM();
  209.           LCD=('j');
  210.           WR_DATA();

  211.            LCD=0x86;
  212.           WR_COMM();
  213.           LCD=('i');
  214.           WR_DATA();
  215.                     
  216.           LCD=0x87;
  217.           WR_COMM();
  218.           LCD=('a');
  219.           WR_DATA();

  220.           LCD=0x88;
  221.           WR_COMM();
  222.           LCD=('n');
  223.           WR_DATA();

  224.            LCD=0x89;
  225.           WR_COMM();
  226.           LCD=('c');
  227.           WR_DATA();
  228.                     
  229.           LCD=0x8a;
  230.           WR_COMM();
  231.           LCD=('e');
  232.           WR_DATA();

  233.           LCD=0x8b;
  234.           WR_COMM();
  235.           LCD=(':');
  236.           WR_DATA();

  237.           LCD=0x8c;
  238.           WR_COMM();
  239.           LCD=Concen/100+0x30;
  240.           WR_DATA();

  241.           LCD=0x8d;
  242.           WR_COMM();
  243.           LCD=(Concen%100)/10+0x30;
  244.           WR_DATA();


  245.           LCD=0x8e;
  246.           WR_COMM();
  247.           LCD=(Concen%10)+0x30;
  248.           WR_DATA();
  249.           
  250. }

  251. void DISP_WAIT()//显示等待
  252. {
  253.                    LCD=0x80;
  254.           WR_COMM();
  255.           LCD=('P');
  256.           WR_DATA();

  257.           LCD=0x81;
  258.           WR_COMM();
  259.           LCD=('M');
  260.           WR_DATA();

  261.           LCD=0x82;
  262.           WR_COMM();
  263.           LCD=('2');
  264.           WR_DATA();

  265.           LCD=0x83;
  266.           WR_COMM();
  267.           LCD=('.');
  268.           WR_DATA();

  269.           LCD=0x84;
  270.           WR_COMM();
  271.           LCD=('5');
  272.           WR_DATA();

  273.           LCD=0x85;
  274.           WR_COMM();
  275.           LCD=('j');
  276.           WR_DATA();

  277.            LCD=0x86;
  278.           WR_COMM();
  279.           LCD=('i');
  280.           WR_DATA();
  281.                     
  282.           LCD=0x87;
  283.           WR_COMM();
  284.           LCD=('a');
  285.           WR_DATA();

  286.           LCD=0x88;
  287.           WR_COMM();
  288.           LCD=('n');
  289.           WR_DATA();

  290.            LCD=0x89;
  291.           WR_COMM();
  292.           LCD=('c');
  293.           WR_DATA();
  294.                     
  295.           LCD=0x8a;
  296.           WR_COMM();
  297.           LCD=('e');
  298.           WR_DATA();

  299.           LCD=0x8b;
  300.           WR_COMM();
  301.           LCD=('w');
  302.           WR_DATA();

  303.           LCD=0x8c;
  304.           WR_COMM();
  305.           LCD=('a');
  306.           WR_DATA();

  307.           LCD=0x8d;
  308.           WR_COMM();
  309.           LCD=('i');
  310.           WR_DATA();


  311.           LCD=0x8e;
  312.           WR_COMM();
  313.           LCD=('t');
  314.           WR_DATA();
  315.           
  316.          
  317. }   
  318. void PM2_5SHUAXIN()
  319.    {
  320.    uchar i;
  321.            if(bStartDis)  
  322.                 {
  323.                         if(bFreshDis)        /*开始刷新*/
  324.                         {
  325.                                  bFreshDis = 0;
  326.                                  LowPulseTime_30s = 0;
  327.                                  for(i = 0;i < 10;i++)
  328.                                  LowPulseTime_30s += pulseTime[i];  /**统计30秒内的低电平时间**/
  329.                         }
  330.                         LowperTotal =  LowPulseTime_30s/30; //低脉冲率本来是小数,但这里将其变成整数,便于单片机处理,假如脉冲率为25%,那么经过此公式计算得到的值为25
  331.                         Concen = (LowperTotal*10)/2; //浓度值 = 低脉冲率/2 ;将浓度值放大十倍,变整数方便显示*/
  332.                         DISP_CONCE();  //显示
  333.        
  334.                 }
  335.                 else        /*预热过程*/
  336.                 {
  337.                         DISP_WAIT();   /*显示预热*/
  338.                 }        }
  339. /*************************************
  340. 主程序

  341. **************************************/
  342. //main
  343. void main()
  344. {
  345.     uint ji2;
  346.         uint ji3;
  347.         Timer0_init();        //中断初始化
  348.         INIT_LCD();                  //1602初始化
  349.         EA = 1;                          //开中断
  350.     delay(100);
  351.          
  352.         while(1)
  353.         {                
  354.              ji2=ji+50;
  355.              ji3=ji+100;

  356.                   if(guolvwang==1)
  357.                   warning=1;
  358.                   else
  359.                   warning=0;

  360.              if(add==0)
  361.                  {
  362.                  delay(20000);
  363.              ji++;
  364.                  }
  365.              if(jian==0)
  366.                  {
  367.                  delay(20000);
  368.              ji--;
  369.                  }
  370.                  if(Concen>=ji)
  371.                  {
  372.                  ledgreen=0;
  373.                  ledred=1;
  374.                  }
  375.                  else
  376.                  {
  377.                  ledred=0;
  378.                  ledgreen=1;
  379.                  }
  380.                  //报警部分

  381.                  if(Concen>=ji3)
  382.                  sanji=1;
  383.                  else
  384.                  sanji=0;

  385.                  if(Concen>=ji2)
  386.                  {
  387.                  if(Concen<ji3)
  388.                  erji=1;
  389.                  else
  390.                  erji=0;
  391.                  }
  392.                  else
  393.                  erji=0;

  394.                  if(Concen>=ji)
  395.                  {
  396.                  if(Concen<ji2)
  397. ……………………

  398. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
雾霾检测及处理仿真.zip (103.03 KB, 下载次数: 301)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:1 发表于 2017-7-12 22:41 | 显示全部楼层
好资料,51黑有你更精彩!!!
回复

使用道具 举报

ID:228850 发表于 2017-8-22 20:22 | 显示全部楼层
没有黑币下载不了,楼主可不可以发我邮箱178270365@qq.com,谢谢
回复

使用道具 举报

ID:270790 发表于 2018-1-3 14:49 | 显示全部楼层
没有黑币,能不能发一份到我的邮箱啊?谢谢!
zphpinganye@qq.com
回复

使用道具 举报

ID:296519 发表于 2018-3-24 21:47 | 显示全部楼层
兄弟,能发到849737908@qq.com这个邮箱上吗?毕设要用,非常感谢
回复

使用道具 举报

ID:217263 发表于 2018-3-29 16:07 | 显示全部楼层
lfs 发表于 2018-3-24 21:47
兄弟,能发到这个邮箱上吗?毕设要用,非常感谢

发了,记得查收
回复

使用道具 举报

ID:279195 发表于 2018-4-17 22:53 | 显示全部楼层
请问为什么要加转机啊,过滤吗?hhh~
回复

使用道具 举报

ID:310863 发表于 2018-4-18 15:24 | 显示全部楼层
大哥,我毕设也是做这个类似的题,希望能够参考你的资料。能发一份给我吗?
邮箱1119289934@qq.com
万分感谢!!!
回复

使用道具 举报

ID:311749 发表于 2018-4-19 16:19 | 显示全部楼层
大哥,同求一份可以吗发我邮箱355093004@qq.com
回复

使用道具 举报

ID:312201 发表于 2018-4-20 09:35 | 显示全部楼层
楼主发我一份可以吗。。562183720@qq.com
回复

使用道具 举报

ID:323262 发表于 2018-5-6 09:57 | 显示全部楼层
能也发我一份吗 真的谢谢啦 997664796@qq.com
回复

使用道具 举报

ID:268143 发表于 2018-6-4 10:20 | 显示全部楼层
谢谢楼主分享
回复

使用道具 举报

ID:268143 发表于 2018-6-4 10:21 | 显示全部楼层
谢谢楼主分享
回复

使用道具 举报

ID:381195 发表于 2018-7-31 14:07 | 显示全部楼层
好东西,谢谢楼主分享
回复

使用道具 举报

ID:426494 发表于 2018-11-14 16:59 | 显示全部楼层
没有黑币,能麻烦楼主发到1474816504@qq.com上吗,感谢
回复

使用道具 举报

ID:433473 发表于 2018-12-6 13:19 | 显示全部楼层
没有黑币下载不了,楼主能不能发我邮箱1508264922@qq.com,谢谢
回复

使用道具 举报

ID:480151 发表于 2019-3-11 09:07 | 显示全部楼层
好东西 感谢楼主分享呀
回复

使用道具 举报

ID:451009 发表于 2019-4-9 23:24 | 显示全部楼层
楼主 可以发一份在我邮箱么  没有黑币  下载不了呢  773016577@qq.com
回复

使用道具 举报

ID:508693 发表于 2019-4-11 13:24 | 显示全部楼层
学习学习
回复

使用道具 举报

ID:509729 发表于 2019-4-11 16:11 来自手机 | 显示全部楼层
楼主可以发一下邮箱893012866@qq.com吗?万分感谢
回复

使用道具 举报

ID:516023 发表于 2019-4-19 01:46 来自手机 | 显示全部楼层
楼主麻烦发一下邮箱765372215@qq.com
回复

使用道具 举报

ID:517935 发表于 2019-4-21 17:16 | 显示全部楼层
大哥  救救孩子吧   可以给我发一份么 1073628329@qq.om
回复

使用道具 举报

ID:517641 发表于 2019-4-25 01:03 | 显示全部楼层
大神可以发我一份吗?946669199@qq.com
回复

使用道具 举报

ID:20793 发表于 2019-5-8 16:15 | 显示全部楼层
不错, 支持一下
回复

使用道具 举报

ID:529538 发表于 2019-5-9 09:35 | 显示全部楼层
需要什么材料啊
回复

使用道具 举报

ID:564035 发表于 2019-6-16 23:35 | 显示全部楼层
这是一份好资料,51黑因为有你更精彩!!!
回复

使用道具 举报

ID:581300 发表于 2019-7-10 08:13 来自手机 | 显示全部楼层
楼主可以发一下邮箱1696871590@qq.com么?感谢感谢
回复

使用道具 举报

ID:585455 发表于 2019-7-18 17:03 | 显示全部楼层
感謝無私分享
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表