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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 8314|回復: 7
收起左側

單片機DHT11溫濕度設計 程序帶詳細注釋

  [復制鏈接]
ID:237813 發表于 2017-10-8 16:00 | 顯示全部樓層 |閱讀模式
這是我的一個51單片機課程設計單片機型號STC89C52,采集模塊是DHT11
謝謝!!!

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

單片機源程序如下(帶有詳細的注釋):
  1. #include <reg52.h>                                   // 頭文件包含
  2. #include <intrins.h>

  3. #define uchar unsigned char        // 以后unsigned char就可以用uchar代替
  4. #define uint  unsigned int        // 以后unsigned int 就可以用uint 代替

  5. sfr ISP_DATA  = 0xe2;                        // 數據寄存器
  6. sfr ISP_ADDRH = 0xe3;                        // 地址寄存器高八位
  7. sfr ISP_ADDRL = 0xe4;                        // 地址寄存器低八位
  8. sfr ISP_CMD   = 0xe5;                        // 命令寄存器
  9. sfr ISP_TRIG  = 0xe6;                        // 命令觸發寄存器
  10. sfr ISP_CONTR = 0xe7;                        // 命令寄存器

  11. sbit Buzzer_P  = P1^0;    // 蜂鳴器
  12. sbit DHT11_P   = P1^1;                 // 溫濕度傳感器DHT11數據接入
  13. sbit LcdRs_P   = P1^2;    // 1602液晶的RS管腳      
  14. sbit LcdRw_P   = P1^3;    // 1602液晶的RW管腳
  15. sbit LcdEn_P   = P1^4;    // 1602液晶的EN管腳
  16. sbit KeySet_P  = P1^5;                // “設置”按鍵的管腳
  17. sbit KeyDown_P = P1^6;                // “減”按鍵的管腳
  18. sbit KeyUp_P   = P1^7;                // “加”按鍵的管腳
  19. sbit LedTL_P   = P3^4;                // 溫度過低報警指示燈
  20. sbit LedTH_P   = P3^5;                // 溫度過高報警指示燈
  21. sbit LedHL_P   = P3^6;                // 濕度過低報警指示燈
  22. sbit LedHH_P   = P3^7;                // 濕度過高報警指示燈

  23. uchar temp;                                        // 保存溫度
  24. uchar humi;                                        // 保存濕度

  25. uchar AlarmTL;                        // 溫度下限報警值
  26. uchar AlarmTH;                        // 溫度上限報警值
  27. uchar AlarmHL;                        // 濕度下限報警值
  28. uchar AlarmHH;                        // 濕度上限報警值



  29. /*********************************************************/
  30. // 單片機內部EEPROM不使能
  31. /*********************************************************/
  32. void ISP_Disable()
  33. {
  34.         ISP_CONTR = 0;
  35.         ISP_ADDRH = 0;
  36.         ISP_ADDRL = 0;
  37. }


  38. /*********************************************************/
  39. // 從單片機內部EEPROM讀一個字節,從0x2000地址開始
  40. /*********************************************************/
  41. unsigned char EEPROM_Read(unsigned int add)
  42. {
  43.         ISP_DATA  = 0x00;
  44.         ISP_CONTR = 0x83;
  45.         ISP_CMD   = 0x01;
  46.         ISP_ADDRH = (unsigned char)(add>>8);
  47.         ISP_ADDRL = (unsigned char)(add&0xff);
  48.         // 對STC89C51系列來說,每次要寫入0x46,再寫入0xB9,ISP/IAP才會生效
  49.         ISP_TRIG  = 0x46;           
  50.         ISP_TRIG  = 0xB9;
  51.         _nop_();
  52.         ISP_Disable();
  53.         return (ISP_DATA);
  54. }


  55. /*********************************************************/
  56. // 往單片機內部EEPROM寫一個字節,從0x2000地址開始
  57. /*********************************************************/
  58. void EEPROM_Write(unsigned int add,unsigned char ch)
  59. {
  60.         ISP_CONTR = 0x83;
  61.         ISP_CMD   = 0x02;
  62.         ISP_ADDRH = (unsigned char)(add>>8);
  63.         ISP_ADDRL = (unsigned char)(add&0xff);
  64.         ISP_DATA  = ch;
  65.         ISP_TRIG  = 0x46;
  66.         ISP_TRIG  = 0xB9;
  67.         _nop_();
  68.         ISP_Disable();
  69. }


  70. /*********************************************************/
  71. // 擦除單片機內部EEPROM的一個扇區
  72. // 寫8個扇區中隨便一個的地址,便擦除該扇區,寫入前要先擦除
  73. /*********************************************************/
  74. void Sector_Erase(unsigned int add)         
  75. {
  76.         ISP_CONTR = 0x83;
  77.         ISP_CMD   = 0x03;
  78.         ISP_ADDRH = (unsigned char)(add>>8);
  79.         ISP_ADDRL = (unsigned char)(add&0xff);
  80.         ISP_TRIG  = 0x46;
  81.         ISP_TRIG  = 0xB9;
  82.         _nop_();
  83.         ISP_Disable();
  84. }


  85. /*********************************************************/
  86. // 毫秒級的延時函數,time是要延時的毫秒數
  87. /*********************************************************/
  88. void DelayMs(uint time)
  89. {
  90.         uint i,j;
  91.         for(i=0;i<time;i++)
  92.                 for(j=0;j<112;j++);
  93. }


  94. /*********************************************************/
  95. // 1602液晶寫命令函數,cmd就是要寫入的命令
  96. /*********************************************************/
  97. void LcdWriteCmd(uchar cmd)
  98. {
  99.         LcdRs_P = 0;
  100.         LcdRw_P = 0;
  101.         LcdEn_P = 0;
  102.         P0=cmd;
  103.         DelayMs(2);
  104.         LcdEn_P = 1;   
  105.         DelayMs(2);
  106.         LcdEn_P = 0;        
  107. }


  108. /*********************************************************/
  109. // 1602液晶寫數據函數,dat就是要寫入的數據
  110. /*********************************************************/
  111. void LcdWriteData(uchar dat)
  112. {
  113.         LcdRs_P = 1;
  114.         LcdRw_P = 0;
  115.         LcdEn_P = 0;
  116.         P0=dat;
  117.         DelayMs(2);
  118.         LcdEn_P = 1;   
  119.         DelayMs(2);
  120.         LcdEn_P = 0;
  121. }


  122. /*********************************************************/
  123. // 1602液晶初始化函數
  124. /*********************************************************/
  125. void LcdInit()
  126. {
  127.         LcdWriteCmd(0x38);        // 16*2顯示,5*7點陣,8位數據口
  128.         LcdWriteCmd(0x0C);        // 開顯示,不顯示光標
  129.         LcdWriteCmd(0x06);        // 地址加1,當寫入數據后光標右移
  130.         LcdWriteCmd(0x01);        // 清屏
  131. }


  132. /*********************************************************/
  133. // 液晶光標定位函數
  134. /*********************************************************/
  135. void LcdGotoXY(uchar line,uchar column)
  136. {
  137.         // 第一行
  138.         if(line==0)        
  139.                 LcdWriteCmd(0x80+column);
  140.         // 第二行
  141.         if(line==1)        
  142.                 LcdWriteCmd(0x80+0x40+column);
  143. }


  144. /*********************************************************/
  145. // 液晶輸出字符串函數
  146. /*********************************************************/
  147. void LcdPrintStr(uchar *str)
  148. {
  149.         while(*str!='\0')                         // 判斷是否到字符串的盡頭了
  150.                 LcdWriteData(*str++);
  151. }


  152. /*********************************************************/
  153. // 液晶輸出數字
  154. /*********************************************************/
  155. void LcdPrintNum(uchar num)
  156. {
  157.         LcdWriteData(num/10+48);        // 十位
  158.         LcdWriteData(num%10+48);         // 個位
  159. }


  160. /*********************************************************/
  161. // 液晶顯示內容的初始化
  162. /*********************************************************/
  163. void LcdShowInit()
  164. {
  165.         LcdGotoXY(0,0);                                                                // 第0行的顯示內容
  166.         LcdPrintStr("  DHT11 System  ");
  167.         LcdGotoXY(1,0);                                                           // 第1行的顯示內容
  168.         LcdPrintStr("T:  30 C   H: 25 %RH");
  169.         LcdGotoXY(1,4);                                                                // 溫度單位攝氏度上面的圓圈符號
  170.         LcdWriteData(0xdf);        
  171. }



  172. /*********************************************************/
  173. // 10us級延時程序
  174. /*********************************************************/
  175. void Delay10us()
  176. {
  177.         _nop_();        // 執行一條指令,延時1微秒
  178.         _nop_();
  179.         _nop_();
  180.         _nop_();
  181.         _nop_();
  182.         _nop_();
  183.         _nop_();
  184.         _nop_();
  185.         _nop_();
  186.         _nop_();
  187. }


  188. /*********************************************************/
  189. // 讀取DHT11單總線上的一個字節
  190. /*********************************************************/
  191. uchar DhtReadByte(void)
  192. {   
  193.         bit bit_i;
  194.         uchar j;
  195.         uchar dat=0;

  196.         for(j=0;j<8;j++)   
  197.         {
  198.                 while(!DHT11_P);        // 等待低電平結束        
  199.                 Delay10us();                        // 延時
  200.                 Delay10us();
  201.                 Delay10us();
  202.                 if(DHT11_P==1)                // 判斷數據線是高電平還是低電平
  203.                 {
  204.                         bit_i=1;
  205.                         while(DHT11_P);
  206.                 }
  207.                 else
  208.                 {
  209.                         bit_i=0;
  210.                 }
  211.                 dat<<=1;                                   // 將該位移位保存到dat變量中
  212.                 dat|=bit_i;   
  213.         }
  214.         return(dat);  
  215. }


  216. /*********************************************************/
  217. // 讀取DHT11的一幀數據,濕高、濕低(0)、溫高、溫低(0)、校驗碼
  218. /*********************************************************/
  219. void ReadDhtData()
  220. {            
  221.         uchar HumiHig;                // 濕度高檢測值
  222.         uchar HumiLow;                // 濕度低檢測值
  223.         uchar TemHig;                        // 溫度高檢測值
  224.         uchar TemLow;                        // 溫度低檢測值
  225.         uchar check;                        // 校驗字節
  226.         
  227.         DHT11_P=0;                                // 主機拉低
  228.         DelayMs(20);                        // 保持20毫秒
  229.         DHT11_P=1;                                // DATA總線由上拉電阻拉高

  230.         Delay10us();                         // 延時等待30us
  231.         Delay10us();
  232.         Delay10us();

  233.         while(!DHT11_P);        // 等待DHT的低電平結束
  234.         while(DHT11_P);                // 等待DHT的高電平結束

  235.         //進入數據接收狀態
  236.         HumiHig = DhtReadByte();         // 濕度高8位
  237.         HumiLow = DhtReadByte();         // 濕度低8為,總為0
  238.         TemHig  = DhtReadByte();         // 溫度高8位
  239.         TemLow  = DhtReadByte();         // 溫度低8為,總為0
  240.         check   = DhtReadByte();        // 8位校驗碼,其值等于讀出的四個字節相加之和的低8位

  241.         DHT11_P=1;                                // 拉高總線

  242.         if(check==HumiHig + HumiLow + TemHig + TemLow)                 // 如果收到的數據無誤
  243.         {
  244.                 temp=TemHig;                         // 將溫度的檢測結果賦值給全局變量temp
  245.                 humi=HumiHig;                        // 將濕度的檢測結果賦值給全局變量humi
  246.         }
  247. }


  248. /*********************************************************/
  249. // 是否需要報警判斷
  250. /*********************************************************/
  251. void AlarmJudge(void)
  252. {
  253.         uchar i;

  254.         if(temp>AlarmTH)                                // 溫度是否過高
  255.         {
  256.                 LedTH_P=0;
  257.                 LedTL_P=1;
  258.         }
  259.         else if(temp<AlarmTL)                // 溫度是否過低
  260.         {
  261.                 LedTL_P=0;
  262.                 LedTH_P=1;
  263.         }
  264.         else                                                                                // 溫度正常
  265.         {
  266.                 LedTH_P=1;
  267.                 LedTL_P=1;
  268.         }

  269.         if(humi>AlarmHH)                           // 濕度是否過高
  270.         {
  271.                 LedHH_P=0;
  272.           LedHL_P=1;
  273.         }
  274.         else if(humi<AlarmHL)                // 濕度是否過低
  275.         {
  276.                 LedHL_P=0;
  277.                 LedHH_P=1;
  278.         }
  279.         else                                                                           // 濕度正常
  280.         {
  281.                 LedHH_P=1;
  282.                 LedHL_P=1;
  283.         }

  284.         if((LedHH_P==0)||(LedHL_P==0)||(LedTH_P==0)||(LedTL_P==0))         // 蜂鳴器判斷,只要至少1個報警燈亮,蜂鳴器就報警
  285.         {
  286.                 for(i=0;i<3;i++)
  287.                 {
  288.                         Buzzer_P=0;
  289.                         DelayMs(100);
  290.                         Buzzer_P=1;
  291.                         DelayMs(100);
  292.                 }
  293.         }
  294. }


  295. /*********************************************************/
  296. // 按鍵掃描,用于設置溫濕度報警范圍
  297. /*********************************************************/
  298. void KeyScanf()
  299. {
  300.         if(KeySet_P==0)                // 判斷設置按鍵是否被按下
  301.         {
  302.                 /*將液晶顯示改為設置頁面的*******************************************************/

  303.                 LcdWriteCmd(0x01);                                // 設置界面的顯示框架
  304.                 LcdGotoXY(0,0);
  305.                 LcdPrintStr("Temp: 20-40");
  306.                 LcdGotoXY(1,0);
  307.                 LcdPrintStr("Humi: 10-30");
  308.                
  309.                 LcdGotoXY(0,6);                                                 // 在液晶上填充溫度的下限值        
  310.                 LcdPrintNum(AlarmTL);        
  311.                 LcdGotoXY(0,9);                                                 // 在液晶上填充溫度的上限值
  312.                 LcdPrintNum(AlarmTH);

  313.                 LcdGotoXY(1,6);                                                 // 在液晶上填充濕度的下限值
  314.                 LcdPrintNum(AlarmHL);        
  315.                 LcdGotoXY(1,9);                                                  // 在液晶上填充濕度的上限值
  316.                 LcdPrintNum(AlarmHH);

  317.                 LcdGotoXY(0,7);                                                 // 光標定位到第0行第7列
  318.                 LcdWriteCmd(0x0F);                                // 光標閃爍
  319.                
  320.                 DelayMs(10);                                                  // 去除按鍵按下的抖動
  321.                 while(!KeySet_P);                                         // 等待按鍵釋放
  322.                 DelayMs(10);                                                  // 去除按鍵松開的抖動

  323.                 /*設置溫度的下限值****************************************************************/

  324.                 while(KeySet_P)                                                // “設置鍵”沒有被按下,則一直處于溫度下限的設置
  325.                 {
  326.                         if(KeyDown_P==0)                                // 判斷 “減按鍵“ 是否被按下               
  327.                         {
  328.                                 if(AlarmTL>0)                                        // 只有當溫度下限值大于0時,才能減1
  329.                                         AlarmTL--;
  330.                                 LcdGotoXY(0,6);                                 // 重新刷新顯示更改后的溫度下限值        
  331.                                 LcdPrintNum(AlarmTL);                  
  332.                                 LcdGotoXY(0,7);                                // 重新定位閃爍的光標位置
  333.                                 DelayMs(350);                                        // 延時
  334.                         }
  335.                         if(KeyUp_P==0)                                  // 判斷 “加按鍵“ 是否被按下
  336.                         {
  337.                                 if(AlarmTL<99)                          // 只有當溫度下限值小于99時,才能加1
  338.                                         AlarmTL++;
  339.                                 LcdGotoXY(0,6);                                  // 重新刷新顯示更改后的溫度下限值
  340.                                 LcdPrintNum(AlarmTL);
  341.                                 LcdGotoXY(0,7);                                // 重新定位閃爍的光標位置
  342.                                 DelayMs(350);                                        // 延時
  343.                         }        
  344.                 }

  345.                 LcdGotoXY(0,10);
  346.                 DelayMs(10);                                                  // 去除按鍵按下的抖動
  347.                 while(!KeySet_P);                                         // 等待按鍵釋放
  348.                 DelayMs(10);                                                  // 去除按鍵松開的抖動

  349.                 /*設置溫度的上限值****************************************************************/
  350.                                 
  351.                 while(KeySet_P)                                          // “設置鍵”沒有被按下,則一直處于溫度上限的設置
  352.                 {
  353.                         if(KeyDown_P==0)                                // 判斷 “減按鍵“ 是否被按下
  354.                         {
  355.                                 if(AlarmTH>0)                                  // 只有當溫度上限值大于0時,才能減1                        
  356.                                         AlarmTH--;
  357.                                 LcdGotoXY(0,9);                           // 重新刷新顯示更改后的溫度上限值
  358.                                 LcdPrintNum(AlarmTH);
  359.                                 LcdGotoXY(0,10);                        // 重新定位閃爍的光標位置
  360.                                 DelayMs(350);                                        // 延時
  361.                         }
  362.                         if(KeyUp_P==0)                                   // 判斷 “加按鍵“ 是否被按下
  363.                         {
  364.                                 if(AlarmTH<99)                                 // 只有當溫度上限值小于99時,才能加1
  365.                                         AlarmTH++;
  366.                                 LcdGotoXY(0,9);                                // 重新刷新顯示更改后的溫度上限值         
  367.                                 LcdPrintNum(AlarmTH);
  368.                                 LcdGotoXY(0,10);                        // 重新定位閃爍的光標位置
  369.                                 DelayMs(350);                                        // 延時
  370.                         }                                                                 
  371.                 }

  372.                 LcdGotoXY(1,7);
  373.                 DelayMs(10);                                                  // 去除按鍵按下的抖動
  374.                 while(!KeySet_P);                                         // 等待按鍵釋放
  375.                 DelayMs(10);                                                  // 去除按鍵松開的抖動
  376.                
  377.                 /*設置濕度的下限值****************************************************************/

  378.                 while(KeySet_P)                                                 // “設置鍵”沒有被按下,則一直處于濕度下限的設置
  379.                 {
  380.                         if(KeyDown_P==0)                                // 判斷 “減按鍵“ 是否被按下
  381.                         {
  382.                                 if(AlarmHL>0)                                         // 只有當濕度下限值大于0時,才能減1
  383.                                         AlarmHL--;
  384.                                 LcdGotoXY(1,6);                                // 重新刷新顯示更改后的濕度下限值         
  385.                                 LcdPrintNum(AlarmHL);
  386.                                 LcdGotoXY(1,7);                                // 重新定位閃爍的光標位置
  387.                                 DelayMs(350);
  388.                         }
  389.                         if(KeyUp_P==0)                                         // 判斷 “加按鍵“ 是否被按下
  390.                         {
  391.                                 if(AlarmHL<99)                          // 只有當濕度下限值小于99時,才能加1
  392.                                         AlarmHL++;
  393.                                 LcdGotoXY(1,6);                                  // 重新刷新顯示更改后的濕度下限值
  394.                                 LcdPrintNum(AlarmHL);
  395.                                 LcdGotoXY(1,7);                          // 重新定位閃爍的光標位置
  396.                                 DelayMs(350);                                        // 延時
  397.                         }        
  398.                 }

  399.                 LcdGotoXY(1,10);
  400.                 DelayMs(10);                                                  // 去除按鍵按下的抖動
  401.                 while(!KeySet_P);                                         // 等待按鍵釋放
  402.                 DelayMs(10);                                                  // 去除按鍵松開的抖動
  403.                
  404.                 /*設置濕度的上限值****************************************************************/

  405.                 while(KeySet_P)                                                 // “設置鍵”沒有被按下,則一直處于濕度上限的設置
  406.                 {
  407.                         if(KeyDown_P==0)                                 // 判斷 “減按鍵“ 是否被按下
  408.                         {
  409.                                 if(AlarmHH>0)                                  // 只有當濕度上限值大于0時,才能減1
  410.                                         AlarmHH--;
  411.                                 LcdGotoXY(1,9);                                  // 重新刷新顯示更改后的濕度上限值
  412.                                 LcdPrintNum(AlarmHH);
  413.                                 LcdGotoXY(1,10);                        // 重新定位閃爍的光標位置
  414.                                 DelayMs(350);
  415.                         }
  416.                         if(KeyUp_P==0)                                         // 判斷 “加按鍵“ 是否被按下
  417.                         {
  418.                                 if(AlarmHH<99)                                // 只有當濕度上限值小于99時,才能加1
  419.                                         AlarmHH++;
  420.                                 LcdGotoXY(1,9);                                 // 重新刷新顯示更改后的濕度上限值        
  421.                                 LcdPrintNum(AlarmHH);
  422.                                 LcdGotoXY(1,10);                         // 重新定位閃爍的光標位置
  423.                                 DelayMs(350);                                        // 延時
  424.                         }        
  425.                 }

  426.                 LcdWriteCmd(0x0C);                          // 取消光標閃爍
  427.                 LcdShowInit();                                                // 液晶顯示為檢測界面的

  428.                 DelayMs(10);                                                  // 去除按鍵按下的抖動
  429.                 while(!KeySet_P);                                         // 等待按鍵釋放
  430.                 DelayMs(10);                                                  // 去除按鍵松開的抖動

  431.                 Sector_Erase(0x2000);                                                 // 存儲之前必須先擦除
  432.                 EEPROM_Write(0x2000,AlarmTL);                // 把溫度下限存入到EEPROM的0x2000這個地址
  433.                 EEPROM_Write(0x2001,AlarmTH);                // 把溫度上限存入到EEPROM的0x2001這個地址
  434.                 EEPROM_Write(0x2002,AlarmHL);                // 把濕度下限存入到EEPROM的0x2002這個地址
  435.                 EEPROM_Write(0x2003,AlarmHH);                // 把濕度上限存入到EEPROM的0x2003這個地址
  436.         }        
  437. }


  438. /*********************************************************/
  439. // 主函數
  440. /*********************************************************/
  441. void main()
  442. {
  443.         uchar i;

  444.         LcdInit();                                                        // 液晶功能的初始化                        
  445.         LcdShowInit();                                         // 液晶顯示的初始化

  446.         AlarmTL=EEPROM_Read(0x2000);        // 從EEPROM的0x2000這個地址讀取溫度的報警下限
  447.         AlarmTH=EEPROM_Read(0x2001);        // 從EEPROM的0x2001這個地址讀取溫度的報警上限
  448.         AlarmHL=EEPROM_Read(0x2002);        // 從EEPROM的0x2002這個地址讀取濕度的報警下限        
  449.         AlarmHH=EEPROM_Read(0x2003);        // 從EEPROM的0x2003這個地址讀取濕度的報警上限

  450.         if((AlarmTL==0)||(AlarmTL>100))        // 如果溫度下限報警值讀出來異常(等于0或大于100),則重新賦值
  451.                 AlarmTL=20;
  452.         if((AlarmTH==0)||(AlarmTH>100))        // 如果溫度上限報警值讀出來異常(等于0或大于100),則重新賦值
  453.                 AlarmTH=35;
  454.         if((AlarmHL==0)||(AlarmHL>100))        // 如果溫度下限報警值讀出來異常(等于0或大于100),則重新賦值
  455.                 AlarmHL=40;
  456.         if((AlarmHH==0)||(AlarmHH>100))        // 如果溫度上限報警值讀出來異常(等于0或大于100),則重新賦值
  457.                 AlarmHH=85;
  458.                
  459.         
  460.         while(1)
  461.         {
  462.                 ReadDhtData();                                 // 檢測溫濕度數據

  463.                 LcdGotoXY(1,2);                                 // 定位到要顯示溫度的地方
  464.                 LcdPrintNum(temp);                // 顯示溫度值
  465.                 LcdGotoXY(1,11);                        // 定位到要顯示濕度的地方
  466.                 LcdPrintNum(humi);                // 顯示濕度值
  467.                
  468.                 AlarmJudge();                                        // 判斷并根據需要報警

  469.                 for(i=0;i<25;i++)
  470.                 {
  471.                         KeyScanf();                                        // 按鍵掃描
  472.                         DelayMs(20);                                // 延時        
  473.                 }
  474.         }

  475. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
0.png
所有資料51hei提供下載:
基于單片機的溫濕度設計.rar (108.14 KB, 下載次數: 135)



回復

使用道具 舉報

ID:146436 發表于 2017-10-12 15:53 | 顯示全部樓層
謝謝,我已經下載,學習學習
回復

使用道具 舉報

ID:89286 發表于 2017-10-12 20:19 | 顯示全部樓層
Thanaks for sharing
回復

使用道具 舉報

ID:231270 發表于 2017-10-13 08:18 來自觸屏版 | 顯示全部樓層
學習
回復

使用道具 舉報

ID:436629 發表于 2018-11-30 16:24 來自觸屏版 | 顯示全部樓層
樓主大大,可以加個qq好友嗎
回復

使用道具 舉報

ID:252029 發表于 2018-12-3 17:34 | 顯示全部樓層
謝謝你的程序 學習一下
回復

使用道具 舉報

ID:39982 發表于 2019-4-12 13:16 | 顯示全部樓層
學習學習,謝謝
回復

使用道具 舉報

ID:510967 發表于 2019-4-13 11:04 | 顯示全部樓層
感謝樓主,幫助很大。
回復

使用道具 舉報

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

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美精品一区在线 | 国产欧美精品在线观看 | 成人h电影在线观看 | 五月花丁香婷婷 | 精品日韩欧美一区二区 | 91久久精品一区二区三区 | 久久伊 | 婷婷丁香综合网 | 玖玖综合网 | 国产日韩一区二区三区 | 免费久久久 | 天堂一区在线 | 一区二区三区在线看 | 精品国产视频 | 成人影院在线视频 | 精品国产不卡一区二区三区 | 91av在线电影 | 美女视频黄色片 | 国产日韩久久 | 国产不卡一区在线观看 | 国产色在线 | 成人影院av | 天天天堂 | 伊人在线 | 亚洲美女视频 | 99视频精品 | 91文字幕巨乱亚洲香蕉 | 紧缚调教一区二区三区视频 | 亚洲国产一区二区三区四区 | 国产精品亚洲成在人线 | 亚洲欧洲日韩精品 中文字幕 | 国产黄色大片在线免费观看 | 嫩草懂你的影院入口 | 91n成人| 亚洲精品www. | 欧美性成人 | 啪啪毛片| 亚洲综合区 | 噜久寡妇噜噜久久寡妇 | 免费一区二区 | 中文字幕一区二区三区在线观看 |