找回密码
 立即注册

QQ登录

只需一步,快速开始

帖子
查看: 2227|回复: 1
打印 上一主题 下一主题
收起左侧

激光PM2.5传感器C51单片机程序

[复制链接]
跳转到指定楼层
楼主
ID:422529 发表于 2018-11-7 18:54 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
某宝PM2.5激光传感器,串口通信,LCD1602显示PM2.5浓度调试通过。

单片机源程序如下:

  1. #include<reg52.h>
  2. #define uchar unsigned char
  3. #define uint unsigned int
  4. typedef unsigned char  U8;       // ???8????
  5. typedef signed   char  S8;       // ???8????
  6. typedef unsigned int   U16;      // ???16???
  7. typedef signed   int   S16;      // ???16???
  8. typedef unsigned long  U32;      // ???32???
  9. typedef signed   long  S32;      // ???32???
  10. typedef float          F32;      // ??????32?
  11. typedef double         F64;      // ??????64?






  12. uchar Uart_Con=0;
  13. uchar Uart_Change=0;
  14. uint  PM25_Data=0;
  15. uint  PM25_Data_L=0;
  16. uint  PM25_Data_H=0;
  17. uchar PM25_View_Data=0;
  18. uchar PM25_Set=100;
  19. uchar PM25_View_change=0;


  20. uchar num;
  21. uchar buf;
  22. uchar PM25set=205;

  23. //#define   Data_0_time    4
  24. sbit lcdrs=P2^5;
  25. sbit lcdrw=P2^6;
  26. sbit lcden=P2^7;

  27. sbit deng=P1^1;
  28. sbit BEEP=P1^0;
  29. sbit A=P2^0;




  30. uchar table1[]={" PM25= ---ug/m3 "};                                        //        uchar code table[]={" 2016-5-7 sat "};
  31. uchar table2[]={"   PM25_set=200 "};                                                        //        uchar code table1[]={" 00:00:00 "};                                                                                                                                                                                                                                       
  32. uchar PM25,shidu;
  33. uint n;


  34. int i=0;
  35. float v0;

  36. void delay_1ms(uint t)
  37. {
  38.         uint i,j;
  39.         for(i=0;i<t;i++)
  40.                         for(j=0;j<123;j++)
  41.                         {;}
  42.         }

  43. void Delay(U16 j)
  44. {  U8 i;
  45.          for(;j>0;j--)
  46.                   for(i=0;i<27;i++);         
  47. }

  48. void DelayMS(uint x)
  49. {   uchar t;
  50.                 while(x--)
  51.     for(t=0;t<80;t++);
  52. }

  53. void ddelay(uint z)
  54. {
  55.         uint x,y;
  56.         for(x=z;x>0;x--)
  57.            for(y=110;y>0;y--);       
  58. }

  59. void InitUART(void)
  60. {
  61.     TMOD |= 0x20;
  62.     SCON = 0x50;
  63.     TH1 = 0xFD;
  64.     TL1 = TH1;
  65.     PCON = 0x00;
  66.                 TR1 = 1;
  67.                 ES = 1;
  68.     EA = 1;
  69.    
  70.    
  71. }
  72.        
  73. void UARTInterrupt(void) interrupt 4   //pm2.5读取部分
  74. {
  75.         uchar Uart_Data=0;
  76.         if(RI)
  77.   {
  78.        
  79.                
  80.         RI = 0;
  81.         Uart_Data=SBUF;
  82.                
  83.                         switch(Uart_Con)
  84.                         {
  85.                                 case 0:
  86.                                 {
  87.                                        
  88.                                         if(Uart_Data==0xaa)
  89.                                         {
  90.                                                 Uart_Con++;        A=1;A=1;A=1;A=1;A=1;
  91.                                         }
  92.                                         else
  93.                                         Uart_Con=0;       
  94.                                         break;
  95.                                 }
  96.                                 case 1:
  97.                                 {
  98.                                         if(Uart_Data==0xc0)
  99.                                         Uart_Con++;
  100.                                         else
  101.                                         Uart_Con=0;       
  102.                                         break;
  103.                                 }
  104.                                 case 2:
  105.                                 {
  106.                                         PM25_Data_L=Uart_Data;
  107.                                         Uart_Con++;
  108.                                         break;
  109.                                 }
  110.                                 case 3:
  111.                                 {
  112.                                         PM25_Data_H=Uart_Data;
  113.                                         Uart_Con=0;
  114.                                         break;
  115.                                 }
  116.                                 default:Uart_Con = 0;
  117.                         }
  118.                         A=0;
  119.                 PM25_Data=PM25_Data_H*256+PM25_Data_L;
  120.                 Uart_Change=1;
  121.         }
  122.         else
  123.                 TI = 0;
  124. }

  125. void PM25_disword()
  126. {       
  127.         uchar PM25bai,PM25shi,PM25ge;
  128.         if(Uart_Change==1)
  129.         {
  130.                 Uart_Change=0;
  131.                 PM25bai=PM25_Data/100+0x30;
  132.                 PM25shi=PM25_Data/10%10+0x30;
  133.                 PM25ge=PM25_Data%10+0x30;
  134.                 table1[7]=PM25bai;
  135.                 table1[8]=PM25shi;
  136.                 table1[9]=PM25ge;
  137.                 PM25_View_change=1;
  138.         }
  139. }

  140. void LCD_WriteCom(uchar com)   
  141. {
  142.         lcdrs=0;
  143.         lcdrw=0;
  144.         P0=com;
  145.         ddelay(5);
  146.         lcden=1;
  147.         ddelay(5);
  148.         lcden=0;
  149. }

  150. void LCD_WriteData(uchar dat)     
  151. {
  152.         lcdrs=1;
  153.         lcdrw=0;
  154.         P0=dat;
  155.         ddelay(5);
  156.         lcden=1;
  157.         ddelay(5);
  158.         lcden=0;
  159. }

  160. void Initlcd()               
  161. {
  162.         ddelay(100);
  163.         LCD_WriteCom(0x38);   
  164.         LCD_WriteCom(0x38);  
  165.         LCD_WriteCom(0x38);   
  166.         LCD_WriteCom(0x0c);
  167.         LCD_WriteCom(0x06);      
  168.         LCD_WriteCom(0x01);
  169.         ddelay(100);
  170. }       


  171. void Lcd_write(uchar Adress_Com,uchar *Adress_Data)
  172. {
  173. uchar i;
  174. uchar Data_Word;
  175. LCD_WriteCom(Adress_Com);//写入字符的显示位置
  176. for(i=0;i<16;i++)  //写入字符
  177.   {
  178.    Data_Word=*Adress_Data;
  179.    LCD_WriteData(Data_Word);
  180.    Adress_Data++;
  181.   }

  182. }

  183. void main()
  184. {
  185.         BEEP=0;
  186.         Initlcd();
  187.         InitUART();
  188.         while(1)
  189.         {       
  190.                 PM25_disword();
  191.                 Lcd_write(0x80,table1);
  192.                 Lcd_write(0xc0,table2);
  193.                 if(PM25_Data>=PM25set)
  194.                 {
  195.                         BEEP=1;
  196.                         deng=0;
  197.                         delay_1ms(500);
  198.                         BEEP=0;
  199.                         deng=1;
  200.                         delay_1ms(500);
  201.                 }
  202.                 else
  203.                 {
  204.                         BEEP=0;
  205.                         deng=1;
  206.                         Lcd_write(0x80,table1);
  207.                         Lcd_write(0xc0,table2);
  208.                 }
  209.                        
  210.                
  211.        
  212.         }   
  213.        


  214.                
  215.                
  216. }
复制代码

所有资料51hei提供下载:
PM25.rar (53.71 KB, 下载次数: 31)


评分

参与人数 1黑币 +9 收起 理由
kljie1000 + 9

查看全部评分

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

举报

沙发
ID:1 发表于 2018-11-8 03:15 | 只看该作者
补全原理图或者详细说明一下电路连接即可获得100+黑币
回复

举报

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

本版积分规则

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

Powered by 单片机教程网

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