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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3393|回復(fù): 1
打印 上一主題 下一主題
收起左側(cè)

單片機(jī)+DSL-08模塊PM2.5_10檢測LCD1602顯示+DS1302時鐘 源程序

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:224782 發(fā)表于 2020-3-18 13:52 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
一款以DSL-08PM2.5/10檢測模塊為主的檢測裝置,控制器為STC89C52RC,顯示屏為LCD1602。主要可顯示PM2.5和PM10濃度,有報警功能,且報警閾值可通過按鍵設(shè)置。硬件包含DS1302,可按鍵切換顯示時間。附件包含傳感器資料、源程序、PCB工程文件及操作說明供參考。

制作出來的實物圖如下:


1.    模塊上電默認(rèn)顯示PM2.5/10數(shù)據(jù),按一下“顯示切換”鍵可切換至PM2.5/10報警值設(shè)置界面;再按一次則進(jìn)入時間顯示界面,顯示北京時間;再按可返回初始界面。
2.    在PM2.5/10報警值設(shè)置界面時,按“M“鍵開始設(shè)置數(shù)據(jù)。按下“M”鍵后首位數(shù)據(jù)光標(biāo)閃爍,此時可以按“▲”修改數(shù)值,該位可在0~9內(nèi)遞增變換。“ ”鍵可切換數(shù)據(jù)位,切換到哪一位,該位的光標(biāo)閃爍。
3.    在設(shè)置過程中(即光標(biāo)閃爍時)“顯示切換”鍵不可用,所有數(shù)據(jù)設(shè)置完后再按一次“M“鍵可確認(rèn)數(shù)據(jù),此時“顯示切換”鍵恢復(fù)功能。
4.    在設(shè)置過程中(即光標(biāo)閃爍時)報警功能暫停,所有數(shù)據(jù)設(shè)置完后再按一次“M“鍵可確認(rèn)數(shù)據(jù),此時報警功能恢復(fù)。

Altium Designer畫的原理圖和PCB圖如下:(51hei附件中可下載工程文件)


單片機(jī)源程序如下:
  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;              //實時時鐘數(shù)據(jù)線引腳
  9. sbit  DS1302_RST = P3 ^ 5;              //實時時鐘復(fù)位線引腳  
  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)                      // 轉(zhuǎn)成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;//數(shù)碼管PM2.5循環(huán)計數(shù)
  37. uchar R_data = 0;//讀數(shù)據(jù)標(biāo)志

  38. uchar USART_RX_STB = 0;      
  39. uchar complete_flag = 0;
  40. uchar USART_RX_BUF[32];//接收緩沖,最大32個字節(jié).
  41. uchar time_js = 0;//判斷串口一幀數(shù)據(jù)是否接收完成的計數(shù)變量
  42. uchar PM25_data[2] = {0};
  43. uchar PM10_data[2] = {0};
  44. uchar PM_ASC[8];//數(shù)據(jù)分解后的存儲數(shù)組

  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. //-------開機(jī)、讀數(shù)據(jù)、關(guān)機(jī)指令----------------------------------
  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延時函數(shù),含有輸入?yún)?shù) 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延時函數(shù),含有輸入?yún)?shù) 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.               判忙函數(shù)
  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.               寫入命令函數(shù)
  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. //=======數(shù)據(jù)解析===========
  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( )//設(shè)置數(shù)值
  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)//修改數(shù)據(jù)值按鍵
  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初始化函數(shù)******/
  253. void Timer2_Init( )                        //初始化子函數(shù)
  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)         //實時時鐘寫入一字節(jié)(內(nèi)部函數(shù))
  266. {
  267.     unsigned char i;
  268.     ACC = d;
  269.     for(i=8; i>0; i--)
  270.     {
  271.         DS1302_IO = ACC0;                   //相當(dāng)于匯編中的 RRC
  272.         DS1302_CLK = 1;
  273.         DS1302_CLK = 0;
  274.         ACC = ACC >> 1;
  275.     }
  276. }

  277. unsigned char DS1302OutputByte(void)         //實時時鐘讀取一字節(jié)(內(nèi)部函數(shù))
  278. {
  279.     unsigned char i;
  280.     for(i=8; i>0; i--)
  281.     {
  282.         ACC = ACC >>1;                                 //相當(dāng)于匯編中的 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: 要寫的數(shù)據(jù)
  290. {
  291.     DS1302_RST = 0;
  292.     DS1302_CLK = 0;
  293.     DS1302_RST = 1;
  294.     DS1302InputByte(ucAddr);               // 地址,命令
  295.     DS1302InputByte(ucDa);               // 寫1Byte數(shù)據(jù)
  296. //    DS1302_CLK = 1;
  297.     DS1302_RST = 0;
  298. }

  299. unsigned char Read1302(unsigned char ucAddr)        //讀取DS1302某地址的數(shù)據(jù)
  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數(shù)據(jù)
  307. //    DS1302_CLK = 1;
  308.     DS1302_RST = 0;
  309.     return(ucData);
  310. }

  311. void DS1302_SetProtect(bit flag)        //是否寫保護(hù)
  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)        // 設(shè)置時間函數(shù)
  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);        //八進(jìn)制轉(zhuǎn)換成十進(jìn)制
  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);        //設(shè)置時間
  390. //        DS1302_SetTime(DS1302_MONTH, 03);
  391. //        DS1302_SetTime(DS1302_DAY, 15);
  392. //        DS1302_SetTime(DS1302_HOUR, 18);        //設(shè)置時間
  393. //        DS1302_SetTime(DS1302_MINUTE, 42);
  394. //        DS1302_SetTime(DS1302_SECOND, 30);
  395.         
  396.         Delay_1ms(100);
  397.         //---------開機(jī)指令--------------------
  398.         for(i = 0; i < 9; i ++)
  399.         {
  400.                 Serial_send(open[i]);
  401.                 Delay_1ms(1);
  402.         }
  403.         Delay_1ms(10);
  404.         //---------將傳感器改為自動發(fā)送模式--------
  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.                 //   在接收一幀數(shù)據(jù)后,首先檢驗接收數(shù)據(jù)是否正確
  437.                 //   若正確,將數(shù)據(jù)分解,然后顯示        */
  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)) //判斷接收的數(shù)據(jù)是否正確
  450.                         {        
  451.                                 //------------數(shù)據(jù)解析-------------------
  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( ); //將檢測數(shù)值由十六進(jìn)制轉(zhuǎn)成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)//光標(biāo)閃爍
  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);    /*顯示開及光標(biāo)設(shè)置*/
  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黑下載附件…………
復(fù)制代碼

所有資料51hei提供下載:
pcb+源程序.7z (1.71 MB, 下載次數(shù): 48)

評分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏6 分享淘帖 頂1 踩
回復(fù)

使用道具 舉報

沙發(fā)
ID:517951 發(fā)表于 2020-11-15 16:33 | 只看該作者
不錯,值得學(xué)習(xí)。51hei有你更精彩!!
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 日韩精品一区二区三区视频播放 | 一区在线视频 | 一区二区三区高清在线观看 | 国产伦一区二区三区久久 | 在线视频亚洲 | 久久99精品久久久久久秒播九色 | 免费看a | 日韩美女一区二区三区在线观看 | 国外成人免费视频 | 国产永久免费 | 日韩精品久久久久 | 免费在线成人 | 亚洲视频在线看 | 日日干日日操 | 日韩一级在线 | 成人欧美一区二区三区 | 欧美三级久久久 | 久久丝袜 | 国产精品久久久久久久久免费高清 | 亚洲国产成人精品女人久久久野战 | 91在线视频网址 | 欧美精品日韩精品国产精品 | 久久伊人免费视频 | 欧美日韩在线一区二区三区 | 99免费精品视频 | av电影手机在线看 | 国产精品乱码一区二三区小蝌蚪 | hdfreexxxx中国妞 | 中文字幕av网站 | 一区二区免费看 | www.99re| 91天堂网 | 亚洲精品一区二区三区中文字幕 | 美女视频三区 | 成人一级视频在线观看 | 蜜桃视频在线观看免费视频网站www | 亚洲精选一区二区 | 国产在线精品一区 | 美女久久久久 | 男人天堂网av | 国产精品视频网站 |