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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 10279|回復: 0
收起左側

DHT11的原理圖及單片機程序(帶中文注釋,1602液晶顯示)

[復制鏈接]
ID:473179 發表于 2019-1-26 18:21 | 顯示全部樓層 |閱讀模式
電路原理圖如下:

DHT11原理圖

DHT11原理圖

  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 LcdRs_P   = P1^2;        //1602液晶的RS管腳      
  12. sbit LcdRw_P   = P1^3;      //1602液晶的RW管腳
  13. sbit LcdEn_P   = P1^4;       //1602液晶的EN管腳
  14. sbit DHT11_P   = P1^0;       //溫濕度傳感器DHT11數據接入
  15. sbit LedTL_P   = P3^4;        //溫度過低報警指示燈
  16. sbit LedTH_P   = P3^5;       //溫度過高報警指示燈
  17. sbit LedHL_P   = P3^6;        //濕度過低報警指示燈
  18. sbit LedHH_P   = P3^7;       //濕度過高報警指示燈
  19. sbit Buzzer_P  = P1^1;     // 蜂鳴器
  20. sbit KeySet_P  = P1^5;         // “設置”按鍵的管腳
  21. sbit KeyDown_P = P1^6;       // “減”按鍵的管腳
  22. sbit KeyUp_P   = P1^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,unsignedchar 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.         uinti,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:   C  H:  %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.         bitbit_i;
  194.         ucharj;
  195.         uchardat=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.         ucharHumiHig;              // 濕度高檢測值
  222.         ucharHumiLow;          // 濕度低檢測值
  223.         ucharTemHig;                        // 溫度高檢測值
  224.         ucharTemLow;               // 溫度低檢測值
  225.    uchar check;                    //校驗字節
  226.         
  227.         DHT11_P=0;                  // 主機拉低20ms
  228.         DelayMs(20);
  229.         DHT11_P=1;                  // DATA總線由上拉電阻拉高主機延時40us           
  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.         uchari;
  254.         if(temp>AlarmTH)                 // 溫度是否過高
  255.         {
  256.                 LedTH_P=0;
  257.                 LedTL_P=1;
  258.         }
  259.         elseif(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.         elseif(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:   -      ");
  306.                 LcdGotoXY(1,0);
  307.                 LcdPrintStr("Humi:   -      ");
  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.         uchari;
  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.         while(1)
  451.         {
  452.                 ReadDhtData();                              //檢測溫濕度數據
  453.                 LcdGotoXY(1,2);                          //定位到要顯示溫度的地方
  454.                 LcdPrintNum(temp);                    // 顯示溫度值
  455.                 LcdGotoXY(1,11);                 // 定位到要顯示濕度的地方
  456.                 LcdPrintNum(humi);                      // 顯示濕度值
  457.                
  458.                 AlarmJudge();                         // 判斷并根據需要報警
  459.                 for(i=0;i<25;i++)
  460.                 {
  461.                         KeyScanf();                                     // 按鍵掃描
  462.                         DelayMs(20);                          //延時   
  463.                 }
  464.         }
  465. }
復制代碼


評分

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

查看全部評分

回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 看av片网站| 国产精品www | 免费观看一级特黄欧美大片 | 一级片免费视频 | 一级aaaaaa毛片免费同男同女 | 欧美国产免费 | 欧美午夜一区二区三区免费大片 | 欧美一卡二卡在线观看 | 日韩福利在线 | 91av在线免费观看 | 精品国产三级 | 亚洲视频免费观看 | 日韩成人免费av | 看毛片网站 | 成人一区二 | www国产精品 | 久久久精品一区二区 | 热久久国产 | 狠狠干狠狠插 | av一二三区 | 欧美日韩亚洲一区 | 精品一区二区久久 | 国产乱码久久久久久 | 国产一区二区三区色淫影院 | 国产精品精品视频一区二区三区 | 成人蜜桃av | 成人av网页 | 国产一区二区三区四区在线观看 | 视频在线观看亚洲 | 美国av毛片 | 欧美性猛交 | 全免费a级毛片免费看视频免费下 | 99精品亚洲国产精品久久不卡 | 激情综合五月 | 中文字幕一区二区三区四区五区 | 日韩三级在线观看 | 亚洲精品一区二区三区中文字幕 | 亚洲一区二区电影网 | 黄色毛片在线观看 | 亚洲精品一区中文字幕乱码 | 婷婷色成人|