找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2755|回复: 1
收起左侧

单片机+DSL-08模块PM2.5_10检测LCD1602显示+DS1302时钟 源程序

[复制链接]
ID:224782 发表于 2020-3-18 13:52 | 显示全部楼层 |阅读模式
一款以DSL-08PM2.5/10检测模块为主的检测装置,控制器为STC89C52RC,显示屏为LCD1602。主要可显示PM2.5和PM10浓度,有报警功能,且报警阈值可通过按键设置。硬件包含DS1302,可按键切换显示时间。附件包含传感器资料、源程序、PCB工程文件及操作说明供参考。

制作出来的实物图如下:
IMG_20200317_122410.jpg IMG_20200315_135359.jpg

1.    模块上电默认显示PM2.5/10数据,按一下“显示切换”键可切换至PM2.5/10报警值设置界面;再按一次则进入时间显示界面,显示北京时间;再按可返回初始界面。
2.    在PM2.5/10报警值设置界面时,按“M“键开始设置数据。按下“M”键后首位数据光标闪烁,此时可以按“▲”修改数值,该位可在0~9内递增变换。“ ”键可切换数据位,切换到哪一位,该位的光标闪烁。
3.    在设置过程中(即光标闪烁时)“显示切换”键不可用,所有数据设置完后再按一次“M“键可确认数据,此时“显示切换”键恢复功能。
4.    在设置过程中(即光标闪烁时)报警功能暂停,所有数据设置完后再按一次“M“键可确认数据,此时报警功能恢复。

Altium Designer画的原理图和PCB图如下:(51hei附件中可下载工程文件)
0.jpg

单片机源程序如下:
  1. #include<reg52.h>
  2. #include<intrins.h>

  3. #define uint  unsigned int
  4. #define uchar unsigned char

  5. #define FOSC 11059200L
  6. #define T1MS (65536 - FOSC / 12 / 500)  

  7. sbit  DS1302_CLK = P3 ^ 7;              //实时时钟时钟线引脚
  8. sbit  DS1302_IO  = P3 ^ 6;              //实时时钟数据线引脚
  9. sbit  DS1302_RST = P3 ^ 5;              //实时时钟复位线引脚  
  10. sbit  ACC0 = ACC^0;
  11. sbit  ACC7 = ACC^7;
  12. unsigned char t0,t1,t2,t3,t4,t5;
  13. unsigned char d0,d1,d2,d3,d4,d5;

  14. typedef struct __SYSTEMTIME__
  15. {
  16.         unsigned char Second;
  17.         unsigned char Minute;
  18.         unsigned char Hour;
  19.         unsigned char Week;
  20.         unsigned char Day;
  21.         unsigned char Month;
  22.         unsigned char  Year;
  23.         unsigned char DateString[9];
  24.         unsigned char TimeString[9];
  25. }SYSTEMTIME;        //定义的时间类型

  26. #define AM(X)        X
  27. #define PM(X)        (X+12)                      // 转成24小时制
  28. #define DS1302_SECOND        0x80
  29. #define DS1302_MINUTE        0x82
  30. #define DS1302_HOUR                0x84
  31. #define DS1302_WEEK                0x8A
  32. #define DS1302_DAY                0x86
  33. #define DS1302_MONTH        0x88
  34. #define DS1302_YEAR                0x8C
  35. #define DS1302_RAM(X)        (0xC0+(X)*2)           //用于计算 DS1302_RAM 地址的宏

  36. uchar cnt_PM25 = 0;//数码管PM2.5循环计数
  37. uchar R_data = 0;//读数据标志

  38. uchar USART_RX_STB = 0;      
  39. uchar complete_flag = 0;
  40. uchar USART_RX_BUF[32];//接收缓冲,最大32个字节.
  41. uchar time_js = 0;//判断串口一帧数据是否接收完成的计数变量
  42. uchar PM25_data[2] = {0};
  43. uchar PM10_data[2] = {0};
  44. uchar PM_ASC[8];//数据分解后的存储数组

  45. uint PM25_1, PM25_2, PM10_1, PM10_2;

  46. sbit RS = P2 ^ 5;   //定义端口
  47. sbit RW = P2 ^ 6;
  48. sbit EN = P2 ^ 7;

  49. #define RS_CLR RS = 0
  50. #define RS_SET RS = 1

  51. #define RW_CLR RW = 0
  52. #define RW_SET RW = 1

  53. #define EN_CLR EN = 0
  54. #define EN_SET EN = 1

  55. #define DataPort P0

  56. uchar key_temp, key_num, display_num = 0, KKK = 0;
  57. uchar mode_flag = 0;
  58. uchar bit_select_counter;

  59. uchar PM_data_buf[8] = {0, 2, 0, 0, 0, 2, 0, 0};

  60. //-------开机、读数据、关机指令----------------------------------
  61. uchar code open[9] = {0xAA, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x66, 0xBB};
  62. uchar code autodata[9] = {0xAA, 0x06, 0x00, 0x00, 0x00, 0x00, 0x01, 0x6B, 0xBB};

  63. //void Delay500ms( )                //@11.0592MHz
  64. //{
  65. //        unsigned char i, j, k;

  66. //        _nop_( );
  67. //        i = 4;
  68. //        j = 129;
  69. //        k = 119;
  70. //        do
  71. //        {
  72. //                do
  73. //                {
  74. //                        while (--k);
  75. //                } while (--j);
  76. //        } while (--i);
  77. //}

  78. /*------------------------------------------------
  79. uS延时函数,含有输入参数 unsigned char t,无返回值
  80. unsigned char 是定义无符号字符变量,其值的范围是
  81. 0~255 这里使用晶振12M,精确延时请使用汇编,大致延时
  82. 长度如下 T=tx2+5 uS
  83. ------------------------------------------------*/
  84. void DelayUs2x(unsigned int t)
  85. {   
  86.         while(-- t);
  87. }
  88. /*------------------------------------------------
  89. mS延时函数,含有输入参数 unsigned char t,无返回值
  90. unsigned char 是定义无符号字符变量,其值的范围是
  91. 0~255 这里使用晶振12M,精确延时请使用汇编
  92. ------------------------------------------------*/
  93. void DelayMs(unsigned char t)
  94. {
  95.         while(t --)
  96.         {
  97.                 //大致延时1mS
  98.                 DelayUs2x(245);
  99.                 DelayUs2x(245);
  100.         }
  101. }
  102. /*------------------------------------------------
  103.               判忙函数
  104. ------------------------------------------------*/
  105. bit LCD_Check_Busy(void)
  106. {
  107.         DataPort= 0xFF;
  108.         RS_CLR;
  109.         RW_SET;
  110.         EN_CLR;
  111.         _nop_( );
  112.         EN_SET;
  113.         return (bit)(DataPort & 0x80);
  114. }
  115. /*------------------------------------------------
  116.               写入命令函数
  117. ------------------------------------------------*/
  118. void LCD_Write_Com(unsigned char com)
  119. {  
  120.         while(LCD_Check_Busy( )); //忙则等待
  121.         RS_CLR;
  122.         RW_CLR;
  123.         EN_SET;
  124.         DataPort = com;
  125.         _nop_( );
  126.         EN_CLR;
  127. }


  128. //=======数据解析===========
  129. void shuju_jiexi(void)
  130. {
  131.         uint PM25, PM10;
  132.         uint sss;

  133.         PM25 = (((uint)PM25_data[0]) << 8) + PM25_data[1];
  134.         PM10 = (((uint)PM10_data[0]) << 8) + PM10_data[1];
  135.         //------------------------
  136.         if(PM25 > 999)
  137.         PM25 = 999;
  138.         if(PM10 > 1500)
  139.         PM10 = 1500;
  140.         
  141.         PM25_1 = PM25;
  142.         PM10_1 = PM10;

  143.         //===========分解PM2.5的值=========================
  144.         sss = PM25;
  145.         PM_ASC[0] = sss / 1000;
  146.         sss = sss % 1000;
  147.         PM_ASC[1] = sss / 100;
  148.         sss = sss % 100;
  149.         PM_ASC[2] = sss / 10;
  150.         PM_ASC[3] = sss % 10;        
  151.         //
  152.         //============分解PM10的值=========================
  153.         sss = PM10;               
  154.         PM_ASC[4] = sss / 1000;
  155.         sss = sss % 1000;
  156.         PM_ASC[5] = sss / 100;
  157.         sss = sss % 100;
  158.         PM_ASC[6] = sss / 10;
  159.         PM_ASC[7] = sss % 10;        
  160. }

  161. void Display_cal( )//显示切换
  162. {
  163.         if(P45 == 0)
  164.         {
  165.                 Delay_1ms(100);
  166.                 if(P45 == 0 && mode_flag == 0)
  167.                 {
  168.                         LCD_Clear( );//清屏
  169.                         display_num ++;
  170.                         
  171.                         if(display_num > 2)
  172.                         {
  173.                                 display_num = 0;
  174.                         }
  175.                 }
  176.         }
  177.         else
  178.         {
  179.                 display_num = display_num;
  180.         }
  181. }        

  182. uchar Key_Drive( )//键值读取
  183. {
  184.         if(P20 == 0)
  185.         {
  186.                 Delay_1ms(100);
  187.                 if(P20 == 0)
  188.                 {
  189.                         key_temp = 1;
  190.                 }
  191.         }
  192.         if(P21 == 0)
  193.         {
  194.                 Delay_1ms(100);
  195.                 if(P21 == 0)
  196.                 {
  197.                         key_temp = 2;
  198.                 }
  199.         }
  200.         if(P22 == 0)
  201.         {
  202.                 Delay_1ms(100);
  203.                 if(P22 == 0)
  204.                 {
  205.                         key_temp = 3;
  206.                 }
  207.         }
  208.         return key_temp;
  209. }

  210. void Set_Drive( )//设置数值
  211. {
  212.         uchar temp;

  213.         temp = Key_Drive( );
  214.         key_temp = 0;
  215.         
  216.         if(temp == 2)//选择修改位置
  217.         {
  218.                 if(mode_flag != 0)
  219.                 {
  220.                         bit_select_counter ++;
  221.                         if(bit_select_counter > 7)
  222.                         {
  223.                                 bit_select_counter = 0;        
  224.                         }
  225.                 }
  226.         }
  227.         
  228.         if(temp == 3)//修改数据值按键
  229.         {
  230.                 if(mode_flag != 0)
  231.                 {
  232.                         PM_data_buf[bit_select_counter] += 1;
  233.                         if(PM_data_buf[bit_select_counter] > 9)
  234.                         {
  235.                                 PM_data_buf[bit_select_counter] = 0;
  236.                         }
  237.                 }
  238.         }
  239.         
  240.         if(temp == 1)//M
  241.         {
  242.                 bit_select_counter = 0;
  243.                 mode_flag ++;
  244.                
  245.                 if(mode_flag > 1)
  246.                 {
  247.                         mode_flag = 0;
  248.                 }
  249.         }
  250. }

  251. //定时器T2,用于显示, 70ms刷新一次
  252. /******定时器2初始化函数******/
  253. void Timer2_Init( )                        //初始化子函数
  254. {
  255.         T2MOD = 0;//T2定时器,16位自动重装
  256.         T2CON = 0;
  257.         TL2 = 0x00;
  258.         TH2 = 0x04;
  259.         RCAP2L = 0x00;
  260.         RCAP2H = 0x04;
  261.         TR2 = 1;
  262.         EA = 1;
  263.         ET2 = 1;
  264. }

  265. void DS1302InputByte(unsigned char d)         //实时时钟写入一字节(内部函数)
  266. {
  267.     unsigned char i;
  268.     ACC = d;
  269.     for(i=8; i>0; i--)
  270.     {
  271.         DS1302_IO = ACC0;                   //相当于汇编中的 RRC
  272.         DS1302_CLK = 1;
  273.         DS1302_CLK = 0;
  274.         ACC = ACC >> 1;
  275.     }
  276. }

  277. unsigned char DS1302OutputByte(void)         //实时时钟读取一字节(内部函数)
  278. {
  279.     unsigned char i;
  280.     for(i=8; i>0; i--)
  281.     {
  282.         ACC = ACC >>1;                                 //相当于汇编中的 RRC
  283.         ACC7 = DS1302_IO;
  284.         DS1302_CLK = 1;
  285.         DS1302_CLK = 0;
  286.     }
  287.     return(ACC);
  288. }

  289. void Write1302(unsigned char ucAddr, unsigned char ucDa)        //ucAddr: DS1302地址, ucData: 要写的数据
  290. {
  291.     DS1302_RST = 0;
  292.     DS1302_CLK = 0;
  293.     DS1302_RST = 1;
  294.     DS1302InputByte(ucAddr);               // 地址,命令
  295.     DS1302InputByte(ucDa);               // 写1Byte数据
  296. //    DS1302_CLK = 1;
  297.     DS1302_RST = 0;
  298. }

  299. unsigned char Read1302(unsigned char ucAddr)        //读取DS1302某地址的数据
  300. {
  301.     unsigned char ucData;
  302.     DS1302_RST = 0;
  303.     DS1302_CLK = 0;
  304.     DS1302_RST = 1;
  305.     DS1302InputByte(ucAddr|0x01);        // 地址,命令
  306.     ucData = DS1302OutputByte();         // 读1Byte数据
  307. //    DS1302_CLK = 1;
  308.     DS1302_RST = 0;
  309.     return(ucData);
  310. }

  311. void DS1302_SetProtect(bit flag)        //是否写保护
  312. {
  313.         if(flag)
  314.                 Write1302(0x8E,0x10);
  315.         else
  316.                 Write1302(0x8E,0x00);
  317. }

  318. void DS1302_SetTime(unsigned char Address, unsigned char Value)        // 设置时间函数
  319. {
  320.         DS1302_SetProtect(0);
  321.         Write1302(Address, ((Value/10)<<4 | (Value%10)));
  322. }

  323. void DS1302_GetTime(SYSTEMTIME *Time)
  324. {
  325.         unsigned char ReadValue;
  326.         ReadValue = Read1302(DS1302_SECOND);
  327.         Time->Second = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);        //八进制转换成十进制
  328.         ReadValue = Read1302(DS1302_MINUTE);
  329.         Time->Minute = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
  330.         ReadValue = Read1302(DS1302_HOUR);
  331.         Time->Hour = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
  332.         ReadValue = Read1302(DS1302_DAY);
  333.         Time->Day = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);        
  334.         ReadValue = Read1302(DS1302_WEEK);
  335.         Time->Week = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
  336.         ReadValue = Read1302(DS1302_MONTH);
  337.         Time->Month = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
  338.         ReadValue = Read1302(DS1302_YEAR);
  339.         Time->Year = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);        
  340. }

  341. void DateToStr(SYSTEMTIME *Time)         //
  342. {
  343.         Time->DateString[0] = Time->Year/10 ;         //分离出个位和十位
  344.         Time->DateString[1] = Time->Year%10 ;
  345.         Time->DateString[2] = '-';
  346.         Time->DateString[3] = Time->Month/10;
  347.         Time->DateString[4] = Time->Month%10 ;
  348.         Time->DateString[5] = '-';
  349.         Time->DateString[6] = Time->Day/10 ;
  350.         Time->DateString[7] = Time->Day%10 ;
  351.         Time->DateString[8] = '\0';
  352. }

  353. void TimeToStr(SYSTEMTIME *Time)
  354. {
  355.         Time->TimeString[0] = Time->Hour/10 ;
  356.         Time->TimeString[1] = Time->Hour%10 ;
  357.         Time->TimeString[2] = ':';
  358.         Time->TimeString[3] = Time->Minute/10 ;
  359.         Time->TimeString[4] = Time->Minute%10 ;
  360.         Time->TimeString[5] = ':';
  361.         Time->TimeString[6] = Time->Second/10;
  362.         Time->TimeString[7] = Time->Second%10 ;
  363.         Time->DateString[8] = '\0';
  364. }

  365. void Initial_DS1302(void)
  366. {
  367.         unsigned char Second=Read1302(DS1302_SECOND);
  368.         if(Second&0x80)                  
  369.                 DS1302_SetTime(DS1302_SECOND,0);
  370. }

  371. void main( )
  372. {
  373.         uchar i;
  374.         uint HR_crc = 0;
  375.         uint check = 0;
  376.         
  377.         SYSTEMTIME CurrentTime;
  378.         
  379.         P44 = 0;
  380.         display_num = 0;
  381.         mode_flag = 0;
  382.         Serial_Init( );         //串口初始化
  383.         Timer0_Init( );         //T0 初始化
  384.         LCD_Init( );
  385.         LCD_Clear( );//清屏
  386.         Initial_DS1302( );        
  387.         Timer2_Init( );
  388.         
  389. //        DS1302_SetTime(DS1302_YEAR, 20);        //设置时间
  390. //        DS1302_SetTime(DS1302_MONTH, 03);
  391. //        DS1302_SetTime(DS1302_DAY, 15);
  392. //        DS1302_SetTime(DS1302_HOUR, 18);        //设置时间
  393. //        DS1302_SetTime(DS1302_MINUTE, 42);
  394. //        DS1302_SetTime(DS1302_SECOND, 30);
  395.         
  396.         Delay_1ms(100);
  397.         //---------开机指令--------------------
  398.         for(i = 0; i < 9; i ++)
  399.         {
  400.                 Serial_send(open[i]);
  401.                 Delay_1ms(1);
  402.         }
  403.         Delay_1ms(10);
  404.         //---------将传感器改为自动发送模式--------
  405.         for(i = 0; i < 9; i ++)
  406.         {
  407.                 Serial_send(autodata[i]);
  408.                 Delay_1ms(1);
  409.         }        
  410.         Delay_1ms(10);
  411.          
  412.         while(1)
  413.         {
  414.                 Display_cal( );
  415.                
  416.                 DS1302_GetTime(&CurrentTime);
  417.                 DateToStr(&CurrentTime);
  418.                 TimeToStr(&CurrentTime);
  419.                
  420.                 d0=CurrentTime.DateString[0];
  421.                 d1=CurrentTime.DateString[1];
  422.                 d2=CurrentTime.DateString[3];
  423.                 d3=CurrentTime.DateString[4];
  424.                 d4=CurrentTime.DateString[6];
  425.                 d5=CurrentTime.DateString[7];
  426.                
  427.                 t0=CurrentTime.TimeString[0];
  428.                 t1=CurrentTime.TimeString[1];
  429.                 t2=CurrentTime.TimeString[3];
  430.                 t3=CurrentTime.TimeString[4];
  431.                 t4=CurrentTime.TimeString[6];
  432.                 t5=CurrentTime.TimeString[7];
  433.                
  434.                 R_data = 1;                  
  435.                 /*------------------------------------------------
  436.                 //   在接收一帧数据后,首先检验接收数据是否正确
  437.                 //   若正确,将数据分解,然后显示        */
  438.                 if(complete_flag == 1)
  439.                 {
  440.                         //--------------计算校验和-------------------         
  441.                         HR_crc = 0;
  442.                         check = 0;

  443.                         for(i = 0; i < 30; i ++)
  444.                         {
  445.                                 HR_crc += USART_RX_BUF[i];
  446.                         }
  447.                         check = (((uint)USART_RX_BUF[30]) << 8) + USART_RX_BUF[31];
  448.                         //---------------------------------------------               
  449.                         if((HR_crc == check)) //判断接收的数据是否正确
  450.                         {        
  451.                                 //------------数据解析-------------------
  452.                                 PM10_data[0] = USART_RX_BUF[8];
  453.                                 PM10_data[1] = USART_RX_BUF[9];
  454.                                 PM25_data[0] = USART_RX_BUF[6];
  455.                                 PM25_data[1] = USART_RX_BUF[7];        
  456.                                 shuju_jiexi( ); //将检测数值由十六进制转成ASCII码
  457.                         }        
  458.                         complete_flag = 0;
  459.                 }        
  460.                
  461.                 if(display_num == 0)
  462.                 {
  463.                         LCD_Write_String(0, 0, "PM2.5:");
  464.                         LCD_Write_Char(6, 0, PM_ASC[0] + '0');
  465.                         LCD_Write_Char(7, 0, PM_ASC[1] + '0');
  466.                         LCD_Write_Char(8, 0, PM_ASC[2] + '0');
  467.                         LCD_Write_Char(9, 0, PM_ASC[3] + '0');
  468.                         LCD_Write_String(10, 0, "ug/m3");
  469.                         
  470.                         LCD_Write_String(0, 1, "PM10:");
  471.                         LCD_Write_Char(5, 1, PM_ASC[4] + '0');
  472.                         LCD_Write_Char(6, 1, PM_ASC[5] + '0');
  473.                         LCD_Write_Char(7, 1, PM_ASC[6] + '0');
  474.                         LCD_Write_Char(8, 1, PM_ASC[7] + '0');
  475.                         LCD_Write_String(9, 1, "ug/m3");
  476.                 }
  477.                 else if(display_num == 1)
  478.                 {
  479.                         Set_Drive( );
  480.                         
  481.                         LCD_Write_String(0, 0, "SET  PM2.5:");
  482.                         LCD_Write_String(5, 1, "PM10:");
  483.                         
  484.                         LCD_Write_Char(11, 0, PM_data_buf[0] + '0');
  485.                         LCD_Write_Char(12, 0, PM_data_buf[1] + '0');
  486.                         LCD_Write_Char(13, 0, PM_data_buf[2] + '0');
  487.                         LCD_Write_Char(14, 0, PM_data_buf[3] + '0');
  488.                         
  489.                         LCD_Write_Char(10, 1, PM_data_buf[4] + '0');
  490.                         LCD_Write_Char(11, 1, PM_data_buf[5] + '0');
  491.                         LCD_Write_Char(12, 1, PM_data_buf[6] + '0');
  492.                         LCD_Write_Char(13, 1, PM_data_buf[7] + '0');
  493.                 }
  494.                 else
  495.                 {
  496.                         LCD_Write_String(3, 0, "20");
  497.                         LCD_Write_Char(5, 0, d0 + '0');
  498.                         LCD_Write_Char(6, 0, d1 + '0');
  499.                         LCD_Write_Char(7, 0, '-');
  500.                         LCD_Write_Char(8, 0, d2 + '0');
  501.                         LCD_Write_Char(9, 0, d3 + '0');
  502.                         LCD_Write_Char(10, 0, '-');
  503.                         LCD_Write_Char(11, 0, d4 + '0');
  504.                         LCD_Write_Char(12, 0, d5 + '0');
  505.                         
  506.                         LCD_Write_Char(4, 1, t0 + '0');
  507.                         LCD_Write_Char(5, 1, t1 + '0');
  508.                         LCD_Write_Char(6, 1, ':');
  509.                         LCD_Write_Char(7, 1, t2 + '0');
  510.                         LCD_Write_Char(8, 1, t3 + '0');
  511.                         LCD_Write_Char(9, 1, ':');
  512.                         LCD_Write_Char(10, 1, t4 + '0');
  513.                         LCD_Write_Char(11, 1, t5 + '0');
  514.                 }
  515.                
  516.                 if(mode_flag == 1)//光标闪烁
  517.                 {
  518.                         switch(bit_select_counter)
  519.                         {
  520.                                 case 0:
  521.                                         LCD_Write_Com(0x80 + 11);
  522.                                         LCD_Write_Com(0x0f);
  523.                                 break;
  524.                                 case 1:
  525.                                         LCD_Write_Com(0x80 + 12);
  526.                                         LCD_Write_Com(0x0f);
  527.                                 break;
  528.                                 case 2:
  529.                                         LCD_Write_Com(0x80 + 13);
  530.                                         LCD_Write_Com(0x0f);
  531.                                 break;
  532.                                 case 3:
  533.                                         LCD_Write_Com(0x80 + 14);
  534.                                         LCD_Write_Com(0x0f);
  535.                                 break;
  536.                                 case 4:
  537.                                         LCD_Write_Com(0xC0 + 10);
  538.                                         LCD_Write_Com(0x0f);
  539.                                 break;
  540.                                 case 5:
  541.                                         LCD_Write_Com(0xC0 + 11);
  542.                                         LCD_Write_Com(0x0f);
  543.                                 break;
  544.                                 case 6:
  545.                                         LCD_Write_Com(0xC0 + 12);
  546.                                         LCD_Write_Com(0x0f);
  547.                                 break;
  548.                                 case 7:
  549.                                         LCD_Write_Com(0xC0 + 13);
  550.                                         LCD_Write_Com(0x0f);
  551.                                 break;
  552.                         }
  553.                 }
  554.                 if(mode_flag == 0)
  555.                 {                                
  556.                         LCD_Write_Com(0x0C);    /*显示开及光标设置*/
  557.                         
  558.                         PM25_2 = PM_data_buf[0] * 1000 + PM_data_buf[1] * 100 + PM_data_buf[2] * 10 + PM_data_buf[3];
  559.                         PM10_2 = PM_data_buf[4] * 1000 + PM_data_buf[5] * 100 + PM_data_buf[6] * 10 + PM_data_buf[7];
  560.                         
  561.                         if(PM25_1 >= PM25_2 || PM10_1 >= PM10_2)
  562.                         {
  563.                                 P44 = 1;
  564.                                 KKK = 1;
  565.                         }
  566.                         else
  567.                         {
  568.                                 P44 = 0;
  569.                                 KKK = 0;
  570.                         }
  571.                         if(KKK == 1)
  572.                         {
  573.                                 if(PM25_1 >= PM25_2)
  574.                                 {
  575.                                         P24 = 0;
  576.                                         Delay_1ms(20);
  577.                                         P24 = 1;
  578.                                         Delay_1ms(20);
  579.                                 }
  580.                                 else
  581.                                 {
  582.                                         P24 = 1;
  583. ……………………

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

所有资料51hei提供下载:
pcb+源程序.7z (1.71 MB, 下载次数: 47)

评分

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

查看全部评分

回复

使用道具 举报

ID:517951 发表于 2020-11-15 16:33 | 显示全部楼层
不错,值得学习。51hei有你更精彩!!
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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