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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4625|回復: 2
收起左側

MQ-7一氧化碳傳感器檢測如何加入到這個單片機程序中?

[復制鏈接]
ID:503160 發表于 2019-4-16 11:43 | 顯示全部樓層 |閱讀模式
100黑幣
目前能實現的功能是顯示溫濕度 然后按鍵能設置上下限并報警。
求個大佬修改一下 把MQ-7一氧化碳傳感器加進去  就是在第一頁Temp&Humi那里顯示CO濃度  然后能設置CO上限      感激不盡。
123.png
求分享一個檢測溫濕度與CO濃度并報警的程序

單片機源程序如下:
  1. #include <reg52.h>                                   // 頭文件包含
  2. #include <intrins.h>

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

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

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


  21. uchar temp;                                        // 保存溫度
  22. uchar humi;                                        // 保存濕度

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



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


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


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


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


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


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


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


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


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


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


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


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



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


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

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


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

  228.         Delay10us();                         // 延時等待30us
  229.         Delay10us();
  230.         Delay10us();

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

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

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

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


  246. /*********************************************************/
  247. // 是否需要報警判斷
  248. /*********************************************************/

  249. void AlarmJudge(void)    //報警處理
  250. {
  251.         uchar i;

  252.     if(temp>AlarmTH||humi>AlarmHH)     //檢測溫度或者濕度高于設定上限值 降溫濕
  253.     {
  254.         LedH=0;
  255.         LedL=1;
  256.     }
  257.     if(temp<AlarmTL||humi<AlarmHL)    //檢測溫度或者濕度低于設定下限值  升溫濕
  258.     {
  259.         LedH=1;
  260.                 LedL=0;//升高溫濕指示燈
  261.     }
  262.     if((temp>=AlarmTL&&temp<=AlarmTH)&&(humi>=AlarmHL&&humi<=AlarmHH))
  263.     {
  264.         LedL=1;
  265.         LedH=1;   
  266.     }
  267.          if((LedH==0)||(LedL==0))         // 蜂鳴器判斷,只要至少1個報警燈亮,蜂鳴器就報警
  268.         {
  269.                 for(i=0;i<2;i++)
  270.                 {
  271.                         Buzzer_P=0;
  272.                                                 DelayMs(100);
  273.                         DelayMs(500);
  274.                         Buzzer_P=1;
  275.                         DelayMs(500);
  276.                 }
  277.         }
  278. }

  279. /*********************************************************/
  280. // 按鍵掃描,用于設置溫濕度報警范圍
  281. /*********************************************************/
  282. void KeyScanf()
  283. {
  284.         if(KeySet_P==0)                // 判斷設置按鍵是否被按下
  285.         {
  286.                 /*將液晶顯示改為設置頁面的*******************************************************/

  287.                 LcdWriteCmd(0x01);                                // 設置界面的顯示框架
  288.                 LcdGotoXY(0,0);
  289.                 LcdPrintStr("Temp: 20-40");
  290.                 LcdGotoXY(1,0);
  291.                 LcdPrintStr("Humi: 20-30");
  292.                
  293.                 LcdGotoXY(0,6);                                                 // 在液晶上填充溫度的下限值        
  294.                 LcdPrintNum(AlarmTL);        
  295.                 LcdGotoXY(0,9);                                                 // 在液晶上填充溫度的上限值
  296.                 LcdPrintNum(AlarmTH);

  297.                 LcdGotoXY(1,6);                                                 // 在液晶上填充濕度的下限值
  298.                 LcdPrintNum(AlarmHL);        
  299.                 LcdGotoXY(1,9);                                                  // 在液晶上填充濕度的上限值
  300.                 LcdPrintNum(AlarmHH);

  301.                 LcdGotoXY(0,7);                                                 // 光標定位到第0行第7列
  302.                 LcdWriteCmd(0x0F);                                // 光標閃爍
  303.                
  304.                 DelayMs(10);                                                  // 去除按鍵按下的抖動
  305.                 while(!KeySet_P);                                         // 等待按鍵釋放
  306.                 DelayMs(10);                                                  // 去除按鍵松開的抖動

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

  308.                 while(KeySet_P)                                                // “設置鍵”沒有被按下,則一直處于溫度下限的設置
  309.                 {
  310.                         if(KeyDown_P==0)                                // 判斷 “減按鍵“ 是否被按下               
  311.                         {
  312.                                 if(AlarmTL>0)                                        // 只有當溫度下限值大于0時,才能減1
  313.                                         AlarmTL--;
  314.                                 LcdGotoXY(0,6);                                 // 重新刷新顯示更改后的溫度下限值        
  315.                                 LcdPrintNum(AlarmTL);                  
  316.                                 LcdGotoXY(0,7);                                // 重新定位閃爍的光標位置
  317.                                 DelayMs(350);                                        // 延時
  318.                         }
  319.                         if(KeyUp_P==0)                                  // 判斷 “加按鍵“ 是否被按下
  320.                         {
  321.                                 if(AlarmTL<99)                          // 只有當溫度下限值小于99時,才能加1
  322.                                         AlarmTL++;
  323.                                 LcdGotoXY(0,6);                                  // 重新刷新顯示更改后的溫度下限值
  324.                                 LcdPrintNum(AlarmTL);
  325.                                 LcdGotoXY(0,7);                                // 重新定位閃爍的光標位置
  326.                                 DelayMs(350);                                        // 延時
  327.                         }        
  328.                 }

  329.                 LcdGotoXY(0,10);
  330.                 DelayMs(10);                                                  // 去除按鍵按下的抖動
  331.                 while(!KeySet_P);                                         // 等待按鍵釋放
  332.                 DelayMs(10);                                                  // 去除按鍵松開的抖動

  333.                 /*設置溫度的上限值****************************************************************/
  334.                                 
  335.                 while(KeySet_P)                                          // “設置鍵”沒有被按下,則一直處于溫度上限的設置
  336.                 {
  337.                         if(KeyDown_P==0)                                // 判斷 “減按鍵“ 是否被按下
  338.                         {
  339.                                 if(AlarmTH>0)                                  // 只有當溫度上限值大于0時,才能減1                        
  340.                                         AlarmTH--;
  341.                                 LcdGotoXY(0,9);                           // 重新刷新顯示更改后的溫度上限值
  342.                                 LcdPrintNum(AlarmTH);
  343.                                 LcdGotoXY(0,10);                        // 重新定位閃爍的光標位置
  344.                                 DelayMs(350);                                        // 延時
  345.                         }
  346.                         if(KeyUp_P==0)                                   // 判斷 “加按鍵“ 是否被按下
  347.                         {
  348.                                 if(AlarmTH<99)                                 // 只有當溫度上限值小于99時,才能加1
  349.                                         AlarmTH++;
  350.                                 LcdGotoXY(0,9);                                // 重新刷新顯示更改后的溫度上限值         
  351.                                 LcdPrintNum(AlarmTH);
  352.                                 LcdGotoXY(0,10);                        // 重新定位閃爍的光標位置
  353.                                 DelayMs(350);                                        // 延時
  354.                         }                                                                 
  355.                 }

  356.                 LcdGotoXY(1,7);
  357.                 DelayMs(10);                                                  // 去除按鍵按下的抖動
  358.                 while(!KeySet_P);                                         // 等待按鍵釋放
  359.                 DelayMs(10);                                                  // 去除按鍵松開的抖動
  360.                
  361.                 /*設置濕度的下限值****************************************************************/

  362.                 while(KeySet_P)                                                 // “設置鍵”沒有被按下,則一直處于濕度下限的設置
  363.                 {
  364.                         if(KeyDown_P==0)                                // 判斷 “減按鍵“ 是否被按下
  365.                         {
  366.                                 if(AlarmHL>0)                                         // 只有當濕度下限值大于0時,才能減1
  367.                                         AlarmHL--;
  368.                                 LcdGotoXY(1,6);                                // 重新刷新顯示更改后的濕度下限值         
  369.                                 LcdPrintNum(AlarmHL);
  370.                                 LcdGotoXY(1,7);                                // 重新定位閃爍的光標位置
  371.                                 DelayMs(350);
  372.                         }
  373.                         if(KeyUp_P==0)                                         // 判斷 “加按鍵“ 是否被按下
  374.                         {
  375.                                 if(AlarmHL<99)                          // 只有當濕度下限值小于99時,才能加1
  376.                                         AlarmHL++;
  377.                                 LcdGotoXY(1,6);                                  // 重新刷新顯示更改后的濕度下限值
  378.                                 LcdPrintNum(AlarmHL);
  379.                                 LcdGotoXY(1,7);                          // 重新定位閃爍的光標位置
  380.                                 DelayMs(350);                                        // 延時
  381.                         }        
  382.                 }

  383.                 LcdGotoXY(1,10);
  384.                 DelayMs(10);                                                  // 去除按鍵按下的抖動
  385.                 while(!KeySet_P);                                         // 等待按鍵釋放
  386.                 DelayMs(10);                                                  // 去除按鍵松開的抖動
  387.                
  388.                 /*設置濕度的上限值****************************************************************/

  389.                 while(KeySet_P)                                                 // “設置鍵”沒有被按下,則一直處于濕度上限的設置
  390.                 {
  391.                         if(KeyDown_P==0)                                 // 判斷 “減按鍵“ 是否被按下
  392.                         {
  393.                                 if(AlarmHH>0)                                  // 只有當濕度上限值大于0時,才能減1
  394.                                         AlarmHH--;
  395.                                 LcdGotoXY(1,9);                                  // 重新刷新顯示更改后的濕度上限值
  396.                                 LcdPrintNum(AlarmHH);
  397.                                 LcdGotoXY(1,10);                        // 重新定位閃爍的光標位置
  398.                                 DelayMs(350);
  399.                         }
  400.                         if(KeyUp_P==0)                                         // 判斷 “加按鍵“ 是否被按下
  401.                         {
  402.                                 if(AlarmHH<99)                                // 只有當濕度上限值小于99時,才能加1
  403.                                         AlarmHH++;
  404.                                 LcdGotoXY(1,9);                                 // 重新刷新顯示更改后的濕度上限值        
  405.                                 LcdPrintNum(AlarmHH);
  406.                                 LcdGotoXY(1,10);                         // 重新定位閃爍的光標位置
  407.                                 DelayMs(350);                                        // 延時
  408.                         }        
  409.                 }

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

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

  415.                 Sector_Erase(0x2000);                                                 // 存儲之前必須先擦除
  416.                 EEPROM_Write(0x2000,AlarmTL);                // 把溫度下限存入到EEPROM的0x2000這個地址
  417.                 EEPROM_Write(0x2001,AlarmTH);                // 把溫度上限存入到EEPROM的0x2001這個地址
  418.                 EEPROM_Write(0x2002,AlarmHL);                // 把濕度下限存入到EEPROM的0x2002這個地址
  419.                 EEPROM_Write(0x2003,AlarmHH);                // 把濕度上限存入到EEPROM的0x2003這個地址
  420.         }        
  421. }


  422. /*********************************************************/
  423. // 主函數
  424. /*********************************************************/
  425. void main()
  426. {
  427.         uchar i;

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

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

  434.         if((AlarmTL==0)||(AlarmTL>100))        // 如果溫度下限報警值讀出來異常(等于0或大于100),則重新賦值
  435.                 AlarmTL=20;
  436.         if((AlarmTH==0)||(AlarmTH>100))        // 如果溫度上限報警值讀出來異常(等于0或大于100),則重新賦值
  437.                 AlarmTH=28;
  438.         if((AlarmHL==0)||(AlarmHL>100))        // 如果溫度下限報警值讀出來異常(等于0或大于100),則重新賦值
  439.                 AlarmHL=40;
  440.         if((AlarmHH==0)||(AlarmHH>100))        // 如果溫度上限報警值讀出來異常(等于0或大于100),則重新賦值
  441.                 AlarmHH=70;
  442.                
  443.         
  444.         while(1)
  445.         {
  446.                 ReadDhtData();                                 // 檢測溫濕度數據

  447.                 LcdGotoXY(1,2);                                 // 定位到要顯示溫度的地方
  448.                 LcdPrintNum(temp);                // 顯示溫度值
  449.                 LcdGotoXY(1,11);                        // 定位到要顯示濕度的地方
  450.                 LcdPrintNum(humi);                // 顯示濕度值
  451.                
  452.                 AlarmJudge();                                        // 判斷并根據需要報警

  453.                 for(i=0;i<25;i++)
  454.                 {
  455.                         KeyScanf();                                        // 按鍵掃描
  456.                         DelayMs(20);                                // 延時        
  457.                 }
  458.         }
  459. }
復制代碼



回復

使用道具 舉報

ID:543049 發表于 2019-5-30 10:03 | 顯示全部樓層
電路圖什么樣子啊
回復

使用道具 舉報

ID:555338 發表于 2019-6-5 10:21 | 顯示全部樓層
這個是用STM32 的嗎
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 精品国产91乱码一区二区三区 | 国产精品久久国产精品久久 | 久久福利电影 | 欧美四虎| 亚洲精久 | 69福利影院 | 国产91久久久久蜜臀青青天草二 | 日韩欧美中文字幕在线观看 | 在线观看国产视频 | 99pao成人国产永久免费视频 | 中文字幕av高清 | 精品美女 | 一区二区不卡高清 | 3级毛片| 国产精品爱久久久久久久 | 久久久久国产精品一区二区 | 国产精品久久久久久妇女6080 | 中文字幕日韩欧美一区二区三区 | 亚洲国产欧美精品 | 成人av在线播放 | 特级做a爱片免费69 精品国产鲁一鲁一区二区张丽 | 天天干天天想 | 欧美成人一区二区三区片免费 | 国产日韩精品在线 | 国产精品视频久久久 | 日韩精品在线看 | 国产麻豆一区二区三区 | 亚洲成人免费视频 | 国产精品久久久久久久久久 | 国产一区二区三区色淫影院 | 日韩三级电影一区二区 | 黄色大片免费播放 | 日韩精品一区二区三区久久 | 伊人网在线播放 | 欧美日韩亚洲在线 | www免费视频 | 视频一区二区三区四区五区 | 欧美久久久久 | av黄色网 | 丁香综合 | www.99热这里只有精品 |