找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2997|回复: 0
上一主题 下一主题
收起左侧

51单片机空气质量检测程序+仿真,过了警戒值能报警

[复制链接]
跳转到指定楼层
楼主
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)


单片机源程序如下:
  1. #include"reg51.h"
  2. #include"intrins.h"
  3. #include"absacc.h"
  4. //设定adc0832的引脚
  5. sbit RS=P1^4;
  6. sbit RW=P1^5;
  7. sbit E=P1^6;
  8. //设定三个按钮的引脚
  9. sbit jian=P1^7;
  10. sbit jia=P3^0;
  11. sbit fuwei=P3^1;
  12. //设定adc0832的引脚
  13. sbit baojing=P1^3;
  14. sbit cs=P1^2;
  15. sbit di=P1^0;
  16. sbit clk=P1^1;
  17. //定义(方便写程序)
  18. #define busy 0x80
  19. #define uchar unsigned char
  20. #define uint unsigned int
  21. //把要用的字符串写出来
  22. uchar code table[]="PM2.5:";
  23. uchar code table1[]="ALARM:";
  24. uchar code table2[]="ug/m3";
  25. uchar code table3[]="0123456789ABCDEF";
  26. uchar num, set, now, a, b;
  27. //延时函数
  28. void delay(uint i)
  29. { uint j;
  30.   for(j=0;j<i;j++);
  31. }
  32. //查询adc0832是否在忙
  33. void test_1602busy()
  34. { uchar P0DATA;
  35.   RW=1;
  36.   RS=0;
  37.   loop: P0=0xff;
  38.   E=1;
  39.   P0DATA=P0;
  40.   E=0;
  41.   if(P0DATA&busy)
  42.   { goto loop;
  43.   }
  44. }
  45. //写命令
  46. void writecom(uchar co)
  47. { test_1602busy();
  48.   RS=0;
  49.   RW=0;
  50.   E=0;
  51.   P0=co;
  52.   E=1;
  53.   E=0;
  54. }
  55. //写数据
  56. void writedata(uchar Data)
  57. { test_1602busy();
  58.   RS=1;
  59.   RW=0;
  60.   E=0;
  61.   P0=Data;
  62.   E=1;
  63.   E=0;
  64. }
  65. void init()
  66. { writecom(0x38);   //设置16X2显示,5X7点阵,8位数据接口
  67.   writecom(0x0c);   //设置开显示,不显示光标
  68.   writecom(0x06);   //写一个字符后地址指针加1
  69.   writecom(0x01);   //显示清零,数据指针清零
  70. }
  71. void sound()
  72. {  uchar z=100;  
  73.    while(z--)
  74.   {  baojing=~baojing;
  75.      delay(500);
  76.   }
  77. }
  78. //从adc0832获取数据
  79. uchar get()
  80. {  uchar Dat1=0,Dat2=0;
  81.    clk=0; di=1; cs=0;
  82.    clk=1; clk=0; di=1; //第一脉冲,开始位
  83.    clk=1; clk=0; di=1; //第二脉冲,模式选择
  84.    clk=1; clk=0; di=1; //第三脉冲,通道选择
  85.    for(b=0;b<8;b++)         //从高到低取一次数
  86.    {clk=1;
  87.     clk=0;
  88.         if(di) Dat1|=0x80>>b;
  89.         }
  90.    for(b=0;b<8;b++)          //从诋到高取一次数
  91.    {if(di) Dat2|=0x80<<b;
  92.     clk=1;
  93.     clk=0;
  94.         }
  95.         cs=1; di=1; clk=1;
  96.         if(Dat1==Dat2) return Dat1;         //校验两次读数
  97. }  
  98. void main()
  99. { init();
  100.   writecom(0x80+0x00);
  101.   for(num=0;num<6;num++)
  102.   { writedata(table[num]);
  103.   }
  104.   num=0;
  105.   writecom(0x80+0x0b);
  106.   for(num=0;num<5;num++)
  107.   {writedata(table2[num]);
  108.   }
  109.   writecom(0x80+0x4b);
  110.   for(num=0;num<5;num++)
  111.   {writedata(table2[num]);
  112.   }
  113.   writecom(0x80+0x40);
  114.   for(num=0;num<6;num++)
  115.   {writedata(table1[num]);
  116.   }
  117.   set=80;
  118.   while(1)
  119.   {if(jia==0)
  120.     {delay(5900);
  121.           if(jia==0)
  122.            {set++;
  123.             delay(5900);
  124.                 }
  125.         }
  126. if(jian==0)
  127.     {delay(5900);
  128.           if(jian==0)
  129.            {set--;
  130.             delay(5900);
  131.                 }
  132.         }
  133.    now=get()/2.55;   //因为255个数分成100份所以除2.55
  134.    writecom(0x80+0x09);
  135.    writedata(table3[now/10]);
  136.    writecom(0x80+0x0a);
  137.    writedata(table3[now%10]);
  138.    writecom(0x80+0x49);
  139.    writedata(table3[set/10]);
  140.    writecom(0x80+0x4a);
  141.    writedata(table3[set%10]);
  142.    if(now>set)
  143.    sound();
  144.   }
  145. }                          

复制代码

所有资料51hei提供下载:
123.rar (44.22 KB, 下载次数: 82)


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏2 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:102963 发表于 2019-3-25 21:20
压缩包只有仿真,没有程序。

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

本版积分规则

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

Powered by 单片机教程网

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