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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2521|回復: 1
打印 上一主題 下一主題
收起左側

STM32F1的DS18B20驅動源碼.c/.h文件

[復制鏈接]
跳轉到指定樓層
樓主
基于標準庫,只要帶有標準庫的gpio的庫即可使用。經測試可用。和其他人的驅動不一樣!帶濾波!


單片機源程序如下:
  1. #include "ds18b20.h"
  2. /*
  3. 以下配置函數基于stm32f1標準庫,如使用其他庫或非f1的請修改3個函數(有標注)。
  4. */

  5. typedef struct
  6. {
  7.         char firstdatacheckokflag;
  8.         char firstenterndatacheckflag;
  9.         char firstdatacheckerrflag;
  10.         char firstdataCnt;
  11.         float firstdata;
  12.                
  13.         char firstEnterFlag;
  14.         float Temperature1Last;
  15.        
  16.         unsigned int Avgcounter;
  17.         unsigned int AvgAwscounter;
  18.         unsigned char ValAvgReset;      //=0 重置ValAvg統計
  19. }volatile TEMPDS18B;
  20. TEMPDS18B FisrtDs18b[DS18B20_NUM];

  21. struct DS18B20_SORT
  22. {
  23.         uint8_t NUM;
  24.         GPIO_TypeDef* GPIO[DS18B20_NUM];
  25.   uint16_t      Pin[DS18B20_NUM];
  26. }DS18B20_Sort={0,0,0};

  27. GPIO_TypeDef* DS18B20_PORT_GPIO;
  28. uint16_t      DS18B20_PORT_Pin;

  29. DS18B20 Ds18b20;
  30. void DS18B20_GPIO_Config(GPIO_TypeDef* GPIOx,uint16_t GPIO_Pin_x);
  31. void DS18B20_Mode_IPU(GPIO_TypeDef* GPIOx,uint16_t GPIO_Pin_x);
  32. void DS18B20_Mode_Out(GPIO_TypeDef* GPIOx,uint16_t GPIO_Pin_x);
  33. void DS18B20_Write_Byte(GPIO_TypeDef* GPIOx,uint16_t GPIO_Pin_x,u8 dat);//寫入一個字節
  34. u8 DS18B20_Read_Byte(GPIO_TypeDef* GPIOx,uint16_t GPIO_Pin_x);//讀出一個字節
  35. u8 DS18B20_Read_Bit(GPIO_TypeDef* GPIOx,uint16_t GPIO_Pin_x);//讀出一個位
  36. u8 DS18B20_Answer_Check(GPIO_TypeDef* GPIOx,uint16_t GPIO_Pin_x);//檢測是否存在DS18B20
  37. void DS18B20_Rst(GPIO_TypeDef* GPIOx,uint16_t GPIO_Pin_x);//復位DS18B20  

  38. u8 DNumGet(GPIO_TypeDef* GPIOx,uint16_t GPIO_Pin_x)
  39. {
  40.         u8 i=0,j=0,Dnum=0;
  41.         while(i<DS18B20_NUM)
  42.         {
  43.                 if(GPIOx==DS18B20_Sort.GPIO[i]){
  44.                 j=0;
  45.                 while(j<DS18B20_NUM){
  46.                 if(GPIO_Pin_x==DS18B20_Sort.Pin[j]){
  47.                 if(i==j) {
  48.                 Dnum=i;
  49.                 break; }}
  50.                 j++;}
  51.                 i++;}
  52.         }
  53.         return Dnum;
  54. }
  55. void DS18B20_ValAvgReset(GPIO_TypeDef* GPIOx,uint16_t GPIO_Pin_x)
  56. {
  57.   u8 Dnum;
  58.         Dnum=DNumGet(GPIOx,GPIO_Pin_x);       
  59.   FisrtDs18b[Dnum].ValAvgReset=0;
  60. }
  61. u8 DS18B20_FirstReadStateGet(GPIO_TypeDef* GPIOx,uint16_t GPIO_Pin_x)
  62. {
  63.   u8 Dnum;
  64.         Dnum=DNumGet(GPIOx,GPIO_Pin_x);
  65.   if(FisrtDs18b[Dnum].firstdatacheckokflag==1) return 1;
  66.         else return 0;       
  67. }

  68. void FirstReadDataCorrectCheck(GPIO_TypeDef* GPIOx,uint16_t GPIO_Pin_x)//檢測第一次讀取數的正確性
  69. {
  70.   int i;
  71.         u8 Dnum;
  72.         Dnum=DS18B20_Sort.NUM;
  73.        
  74.         FisrtDs18b[Dnum].firstdatacheckokflag=0;
  75.         FisrtDs18b[Dnum].firstenterndatacheckflag=0;
  76.         FisrtDs18b[Dnum].firstdatacheckerrflag=0;
  77.         FisrtDs18b[Dnum].firstdataCnt=0;
  78.         FisrtDs18b[Dnum].firstdata=0;
  79.         FisrtDs18b[Dnum].firstEnterFlag=0;
  80.         FisrtDs18b[Dnum].Temperature1Last=0;
  81.         FisrtDs18b[Dnum].ValAvgReset=1;
  82.         FisrtDs18b[Dnum].Avgcounter=2;
  83.         FisrtDs18b[Dnum].AvgAwscounter=2;
  84.         delay_us(1000*500);
  85.         for(i=0;i<10*C_Time;i++)
  86.         {
  87.                 if(FisrtDs18b[Dnum].firstdatacheckokflag==1) break;
  88.           DS18B20_Update(GPIOx,GPIO_Pin_x);
  89.                 delay_us(1000);
  90.         }
  91. }
  92. /*
  93. * 函數名:DS18B20_GPIO_Config
  94. * 描述  :配置DS18B20用到的I/O口
  95. * 輸入  :無
  96. * 輸出  :無
  97. */
  98. void DS18B20_GPIO_Config(GPIO_TypeDef* GPIOx,uint16_t GPIO_Pin_x) //非stm32f1_STD庫需要修改的函數 1
  99. {
  100.         GPIO_InitTypeDef GPIO_InitStructure;       
  101.        
  102.         DS18B20_Sort.GPIO[DS18B20_Sort.NUM]=GPIOx;
  103.         DS18B20_Sort.Pin[DS18B20_Sort.NUM]=GPIO_Pin_x;
  104.         DS18B20_PORT_GPIO=GPIOx;
  105.         DS18B20_PORT_Pin=GPIO_Pin_x;
  106.         if(GPIOx==GPIOA)      RCC_APB2PeriphClockCmd(        RCC_APB2Periph_GPIOA, ENABLE );         //使能PORTA口時鐘  
  107.         else if(GPIOx==GPIOB) RCC_APB2PeriphClockCmd(        RCC_APB2Periph_GPIOB, ENABLE );         //使能PORTB口時鐘  
  108.         else if(GPIOx==GPIOC) RCC_APB2PeriphClockCmd(        RCC_APB2Periph_GPIOC, ENABLE );         //使能PORTC口時鐘  
  109.         else if(GPIOx==GPIOD) RCC_APB2PeriphClockCmd(        RCC_APB2Periph_GPIOD, ENABLE );         //使能PORTD口時鐘  
  110.         else if(GPIOx==GPIOE) RCC_APB2PeriphClockCmd(        RCC_APB2Periph_GPIOE, ENABLE );         //使能PORTE口時鐘  
  111.         else if(GPIOx==GPIOF) RCC_APB2PeriphClockCmd(        RCC_APB2Periph_GPIOF, ENABLE );         //使能PORTF口時鐘  
  112.         else if(GPIOx==GPIOG) RCC_APB2PeriphClockCmd(        RCC_APB2Periph_GPIOG, ENABLE );         //使能PORTG口時鐘  

  113.         GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_x;
  114.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;  //復用推挽輸出
  115.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  116.         GPIO_Init(GPIOx, &GPIO_InitStructure);

  117.         GPIO_SetBits(GPIOx,GPIO_Pin_x); //引腳輸出高
  118.        
  119.         FirstReadDataCorrectCheck(GPIOx,GPIO_Pin_x);//檢測第一次讀取數的正確性
  120.        
  121.         DS18B20_Sort.NUM++;
  122. }
  123. /*
  124. * 函數名:DS18B20_Mode_IPU
  125. * 描述  :使DS18B20-DATA引腳變為輸入模式
  126. * 輸入  :無
  127. * 輸出  :無
  128. */
  129. void DS18B20_Mode_IPU(GPIO_TypeDef* GPIOx,uint16_t GPIO_Pin_x)//非stm32f1_STD庫需要修改的函數 2
  130. {
  131.         GPIO_InitTypeDef GPIO_InitStructure;       
  132.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_x;  
  133.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;  //上拉輸入
  134.         GPIO_Init(GPIOx, &GPIO_InitStructure);
  135. }
  136. /*
  137. * 函數名:DS18B20_Mode_Out
  138. * 描述  :使DS18B20-DATA引腳變為輸出模式
  139. * 輸入  :無
  140. * 輸出  :無
  141. */
  142. void DS18B20_Mode_Out(GPIO_TypeDef* GPIOx,uint16_t GPIO_Pin_x)//非stm32f1_STD庫需要修改的函數 3
  143. {
  144.         GPIO_InitTypeDef GPIO_InitStructure;       
  145.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_x;
  146.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;  //復用推挽輸出
  147.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  148.         GPIO_Init(GPIOx, &GPIO_InitStructure);

  149. }



  150. /*
  151. *主機給從機發送復位脈沖
  152. */
  153. void DS18B20_Rst(GPIO_TypeDef* GPIOx,uint16_t GPIO_Pin_x)          
  154. {        
  155.     /* IO設置為推挽輸出*/       
  156.           DS18B20_Mode_Out(GPIOx,GPIO_Pin_x);
  157.           /*產生至少480us的低電平復位信號 */
  158.     GPIO_ResetBits(GPIOx,GPIO_Pin_x);  
  159.                 delay_us(480);  
  160.     /* 在產生復位信號后,需將總線拉高 */       
  161.     GPIO_SetBits(GPIOx,GPIO_Pin_x);
  162.           delay_us(15);   
  163. }

  164. /*
  165. * 檢測從機給主機返回的應答脈沖
  166. *從機接收到主機的復位信號后,會在15~60us后給主機發一個應答脈沖
  167. * 0:成功
  168. * 1:失敗
  169. */
  170. u8 DS18B20_Answer_Check(GPIO_TypeDef* GPIOx,uint16_t GPIO_Pin_x)           
  171. {   
  172.         u8 delay=0;
  173.         /* 主機設置為上拉輸入 */
  174.         DS18B20_Mode_IPU(GPIOx,GPIO_Pin_x);
  175.         /* 等待應答脈沖(一個60~240us的低電平信號 )的到來
  176.          * 如果100us內,沒有應答脈沖,退出函數,注意:從機接收到主機的復位信號后,會在15~60us后給主機發一個存在脈沖
  177.          */
  178.         while(GPIO_ReadInputDataBit(GPIOx,GPIO_Pin_x)&&delay<100)
  179.         {
  180.                 delay++;
  181.                 delay_us(1);
  182.         }         
  183.         /*經過100us后,如果沒有應答脈沖,退出函數*/       
  184.         if(delay>=100)
  185.                 return 1;
  186.         else
  187.                 delay=0;
  188.         /*有應答脈沖,且存在時間不超過240us */
  189.         while (!GPIO_ReadInputDataBit(GPIOx,GPIO_Pin_x)&&delay<240)
  190.         {
  191.                 delay++;
  192.                 delay_us(1);
  193.         }
  194.         if(delay>=240)
  195.                 return 1;            
  196.           return 0;
  197. }

  198. //從DS18B20讀取一個位
  199. //返回值:1/0
  200. u8 DS18B20_Read_Bit(GPIO_TypeDef* GPIOx,uint16_t GPIO_Pin_x)                          // read one bit
  201. {
  202.   u8 data;
  203.         DS18B20_Mode_Out(GPIOx,GPIO_Pin_x);
  204.         /* 讀時間的起始:必須由主機產生 >1us <15us 的低電平信號 */
  205.   GPIO_ResetBits(GPIOx,GPIO_Pin_x);
  206.         delay_us(2);
  207.         GPIO_SetBits(GPIOx,GPIO_Pin_x);
  208.         delay_us(12);
  209.         /* 設置成輸入,釋放總線,由外部上拉電阻將總線拉高 */
  210.         DS18B20_Mode_IPU(GPIOx,GPIO_Pin_x);

  211.         if(GPIO_ReadInputDataBit(GPIOx,GPIO_Pin_x))
  212.                 data=1;
  213.   else
  214.                 data=0;         
  215.   delay_us(50);           
  216.   return data;
  217. }
  218. //從DS18B20讀取一個字節
  219. //返回值:讀到的數據
  220. u8 DS18B20_Read_Byte(GPIO_TypeDef* GPIOx,uint16_t GPIO_Pin_x)    // read one byte
  221. {        
  222.     u8 i,j,dat;
  223.     dat=0;
  224.         for(i=0; i<8; i++)
  225.         {
  226.                 j = DS18B20_Read_Bit(GPIOx,GPIO_Pin_x);               
  227.                 dat = (dat) | (j<<i);
  228.         }                                            
  229.     return dat;
  230. }
  231. /*
  232. * 寫一個字節到DS18B20
  233. */
  234. void DS18B20_Write_Byte(GPIO_TypeDef* GPIOx,uint16_t GPIO_Pin_x,u8 dat)     
  235. {            
  236.   u8 j;
  237.   u8 testb;
  238.        
  239.         OSEnterDriver();
  240.        
  241.         DS18B20_Mode_Out(GPIOx,GPIO_Pin_x);//SET PA0 OUTPUT;
  242.   for (j=1;j<=8;j++)
  243.         {
  244.         testb=dat&0x01;
  245.         dat=dat>>1;
  246.         if (testb)
  247.         {
  248.             GPIO_ResetBits(GPIOx,GPIO_Pin_x);// Write 1
  249.             delay_us(10);                           
  250.             GPIO_SetBits(GPIOx,GPIO_Pin_x);
  251.             delay_us(50);            
  252.         }
  253.         else
  254.         {
  255.             GPIO_ResetBits(GPIOx,GPIO_Pin_x);// Write 0
  256.             delay_us(60);            
  257.             GPIO_SetBits(GPIOx,GPIO_Pin_x);   ///釋放總線
  258.             delay_us(2);                          
  259.         }
  260.     }
  261. }

  262. //初始化DS18B20的IO口 DQ 同時檢測DS的存在
  263. //返回1:不存在
  264. //返回0:存在             
  265. u8 DS18B20_Config(GPIO_TypeDef* GPIOx,uint16_t GPIO_Pin_x)
  266. {
  267.         u8 i=0;
  268.        
  269.         while(i<DS18B20_NUM)
  270.         {
  271.                 Ds18b20.ValMax[i]=-300; //不可修改
  272.                 Ds18b20.ValMin[i]=1000; //不可修改
  273.                 Ds18b20.ValMaxWarn[i]=WarnTemperatureMax;
  274.                 Ds18b20.ValMinWarn[i]=WarnTemperatureMin;
  275.                 i++;
  276.         }
  277.   DS18B20_GPIO_Config(GPIOx, GPIO_Pin_x);
  278.         DS18B20_Rst(GPIOx,GPIO_Pin_x);
  279.         return DS18B20_Answer_Check(GPIOx,GPIO_Pin_x);
  280. }  
  281. //從ds18b20得到溫度值
  282. //精度:0.1C
  283. //返回值:溫度值 (-550~1250)
  284. float DS18B20_Update(GPIO_TypeDef* GPIOx,uint16_t GPIO_Pin_x)
  285. {   
  286.     u8 TL,TH,Dnum=0;
  287.        
  288.           short Temperature;
  289.           float Temperature1;
  290.           float temp;
  291.           Dnum=DNumGet(GPIOx,GPIO_Pin_x);
  292.     DS18B20_Rst(GPIOx,GPIO_Pin_x);          
  293.           DS18B20_Answer_Check(GPIOx,GPIO_Pin_x);         
  294.     DS18B20_Write_Byte(GPIOx,GPIO_Pin_x,0xcc);// skip rom
  295.     DS18B20_Write_Byte(GPIOx,GPIO_Pin_x,0x44);// convert                 // ds1820 start convert
  296.     DS18B20_Rst(GPIOx,GPIO_Pin_x);
  297.     DS18B20_Answer_Check(GPIOx,GPIO_Pin_x);         
  298.     DS18B20_Write_Byte(GPIOx,GPIO_Pin_x,0xcc);// skip rom
  299.     DS18B20_Write_Byte(GPIOx,GPIO_Pin_x,0xbe);// convert            
  300.     TL=DS18B20_Read_Byte(GPIOx,GPIO_Pin_x); // LSB   
  301.     TH=DS18B20_Read_Byte(GPIOx,GPIO_Pin_x); // MSB  
  302.                 if( TH&0xfc)
  303.                 {
  304.                         Temperature=(TH<<8)|TL;
  305.                         Temperature1=(~ Temperature)+1;
  306.                         Temperature1*=0.0625;
  307.                 }
  308.                 else
  309.                 {
  310.                         Temperature1=((TH<<8)|TL)*0.0625;
  311.                 }
  312.                 Temperature1+=Deviatvalue;//校正
  313. /*-------------------------------判斷第一次讀取的數的正確性---------------------------------*/               
  314.                 if((Temperature1>TempMin)&&(Temperature1<TempMax))
  315.                 {
  316.                         if(FisrtDs18b[Dnum].firstdatacheckokflag==0)//第一次數據校驗(保證用作第一次讀取的數的正確性,如果第一次讀取出的值是錯誤值將引起后面的誤差)
  317.                         {
  318.                                 if(FisrtDs18b[Dnum].firstdatacheckerrflag==1)//判斷是否讀取錯誤(只要邊續差值大于預定值則視為錯誤)
  319.                                 {
  320.                                   FisrtDs18b[Dnum].firstdataCnt=0;           //錯誤則重新開始計數
  321.                                         FisrtDs18b[Dnum].firstenterndatacheckflag=0;//錯誤則重新開始判斷
  322.                                 }
  323.                           if(FisrtDs18b[Dnum].firstenterndatacheckflag==0)//保存第一個讀取的數
  324.                                 {
  325.                                         FisrtDs18b[Dnum].firstenterndatacheckflag=1;//鎖存第一個數
  326.                                   FisrtDs18b[Dnum].firstdata=Temperature1;//保存第一個數
  327.                                 }
  328.                                 else //從第二個數開始判斷
  329.                                 {
  330.                                   if(Temperature1-FisrtDs18b[Dnum].firstdata<=D_Value)//如果本次值和上次值誤差<=D_Value
  331.                                         {
  332.                                                 FisrtDs18b[Dnum].firstdata=Temperature1;//本次數賦值給上次值變量
  333.                                           FisrtDs18b[Dnum].firstdataCnt++;//計數+1
  334.                                         }
  335.                                         else //只要任何一次讀數誤差大于D_Value則置位失敗,則重新判斷,重新計數
  336.                                         {
  337.                                           FisrtDs18b[Dnum].firstdatacheckerrflag=1;
  338.                                         }
  339.                                 }
  340.                                 if(FisrtDs18b[Dnum].firstdataCnt>=C_Time) //連續讀取的C_Time個數值之間的差值均<=D_Value則認為是正確值
  341.                                 {
  342.                                   FisrtDs18b[Dnum].firstdatacheckokflag=1;//置1表示本次檢查的第一次值為正確值,予以通過
  343.                                 }
  344.                         }
  345. /*-----------------------------------------------------------------------------------------------*/                       
  346.                         if(FisrtDs18b[Dnum].firstdatacheckokflag==1)//在保證第一次的讀出的數是正確的情況下,開始進行讀取數值
  347.                         {
  348.                                 if(FisrtDs18b[Dnum].firstEnterFlag==0)//第一次讀取溫度檢測
  349.                                 {
  350.                                         FisrtDs18b[Dnum].firstEnterFlag=1;
  351.                                         FisrtDs18b[Dnum].Temperature1Last=Temperature1;
  352.                                         Ds18b20.ValAvg[Dnum]=Temperature1;
  353.                                         Ds18b20.ValAvgAws[Dnum]=Temperature1;
  354.                                 }
  355.                                 else
  356.                                 {
  357.                                         if(Temperature1>=FisrtDs18b[Dnum].Temperature1Last) temp=Temperature1-FisrtDs18b[Dnum].Temperature1Last;
  358.                                         else temp=FisrtDs18b[Dnum].Temperature1Last-Temperature1;//求絕對值差值
  359.                                         if(temp>D_Value)//兩次讀取差值如果大于1,則認為是非正常值,返回上次的值
  360.                                         {
  361.                                                  Temperature1=FisrtDs18b[Dnum].Temperature1Last;
  362.                                         }
  363.                                         else
  364.                                         {
  365.                                                 FisrtDs18b[Dnum].Temperature1Last=Temperature1;//更新歷史值
  366.                                         }
  367.                                 }
  368.                                 Ds18b20.Val[Dnum]=Temperature1;
  369.                                 if(FisrtDs18b[Dnum].ValAvgReset==0)
  370.                                 {
  371.                                         FisrtDs18b[Dnum].ValAvgReset=1;
  372.                                         FisrtDs18b[Dnum].Avgcounter=2;
  373.                                         Ds18b20.ValAvg[Dnum]=Ds18b20.Val[Dnum];
  374.                                 }
  375.                                 if(Ds18b20.Val[Dnum]>Ds18b20.ValAvg[Dnum]) Ds18b20.ValAvg[Dnum]+=(Ds18b20.Val[Dnum]-Ds18b20.ValAvg[Dnum])/FisrtDs18b[Dnum].Avgcounter;//計算臨時平均值
  376.                                 else Ds18b20.ValAvg[Dnum]-=(Ds18b20.ValAvg[Dnum]-Ds18b20.Val[Dnum])/FisrtDs18b[Dnum].Avgcounter;//計算臨時平均值       
  377.                                 if(Ds18b20.Val[Dnum]>Ds18b20.ValAvgAws[Dnum]) Ds18b20.ValAvgAws[Dnum]+=(Ds18b20.Val[Dnum]-Ds18b20.ValAvgAws[Dnum])/FisrtDs18b[Dnum].AvgAwscounter;//計算永久平均值
  378.                                 else Ds18b20.ValAvgAws[Dnum]-=(Ds18b20.ValAvgAws[Dnum]-Ds18b20.Val[Dnum])/FisrtDs18b[Dnum].AvgAwscounter;//計算永久平均值
  379.                                 if((FisrtDs18b[Dnum].Avgcounter+1)!=0)  FisrtDs18b[Dnum].Avgcounter++;//臨時平均值計算次數
  380.                                 if((FisrtDs18b[Dnum].AvgAwscounter+1)!=0)  FisrtDs18b[Dnum].AvgAwscounter++;//永久平均值計算次數
  381.                                 if(Ds18b20.Val[Dnum]>Ds18b20.ValMax[Dnum]) Ds18b20.ValMax[Dnum]=Ds18b20.Val[Dnum];
  382.                                 if(Ds18b20.Val[Dnum]<Ds18b20.ValMin[Dnum]) Ds18b20.ValMin[Dnum]=Ds18b20.Val[Dnum];
  383.                         }
  384.                 }
  385.                
  386.                 OSExitDriver();
  387.                
  388.                 return Temperature1;        
  389. }
復制代碼

所有資料51hei提供下載:
DS18B2多IO驅動(帶濾波)—STM32.zip (5.75 KB, 下載次數: 25)

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

使用道具 舉報

沙發
ID:91165 發表于 2020-2-25 09:01 | 只看該作者
樓主辛苦了
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 男人的天堂久久 | 欧美一区二区三区久久精品 | 午夜免费视频 | 日韩久久久久 | 精品国产乱码久久久久久图片 | 亚洲小视频在线观看 | av在线二区 | 国产露脸对白88av | 国产欧美三区 | 性视频网 | 国产福利网站 | 99视频免费播放 | 91中文字幕在线观看 | 国产精品久久久久久久久婷婷 | 欧美日韩亚洲系列 | 久久天天躁狠狠躁夜夜躁2014 | 亚洲精品一区二区三区丝袜 | 一区二区免费在线观看 | 欧美中文字幕一区二区三区亚洲 | 成人日韩 | 中文字幕乱码亚洲精品一区 | 国产精品久久久久久中文字 | 国产二区av| 国产午夜精品一区二区三区嫩草 | 久草在线高清 | 69堂永久69tangcom | 国产精品国产三级国产aⅴ无密码 | 一本久久a久久精品亚洲 | 日韩在线精品视频 | 亚洲精品久久久蜜桃网站 | 亚洲精品在线视频 | 久久av一区二区三区 | 欧美成年视频 | 国产成人免费在线观看 | 人人叉| 日韩成年人视频在线 | 国产成人av一区二区三区 | 国产成人一区 | 中文字幕a√| 精品欧美一区二区三区久久久小说 | 国产精品视频一区二区三区, |