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

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

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

測(cè)溫芯片DS18B20詳細(xì)解讀

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:210317 發(fā)表于 2017-6-15 15:36 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
第一部分:DS18B20的封裝和管腳定義

      首先,我們來認(rèn)識(shí)一下DS18B20這款芯片的外觀和針腳定義,DS18B20芯片的常見封裝為TO-92,也就是普通直插三極管的樣子,當(dāng)然也可以找到以SO(DS18B20Z)和μSOP(DS18B20U)形式封裝的產(chǎn)品,下面為DS18B20各種封裝的圖示及引腳圖。

  了解了這些該芯片的封裝形式,下面就要說到各個(gè)管腳的定義了,如下表即為該芯片的管腳定義:
  上面的表中提到了一個(gè)“奇怪”的詞——“寄生電源”,那我有必要說明一下了,DS18B20芯片可以工作在“寄生電源模式”下,該模式允許DS18B20工作在無外部電源狀態(tài),當(dāng)總線為高電平時(shí),寄生電源由單總線通過VDD引腳,此時(shí)DS18B20可以從總線“竊取”能量,并將“偷來”的能量?jī)?chǔ)存到寄生電源儲(chǔ)能電容(Cpp)中,當(dāng)總線為低電平時(shí)釋放能量供給器件工作使用。所以,當(dāng)DS18B20工作在寄生電源模式時(shí),VDD引腳必須接地。
第二部分:DS18B20的多種電路連接方式

如下面的兩張圖片所示,分別為外部供電模式下單只和多只DS18B20測(cè)溫系統(tǒng)的典型電路連接圖。

(1)外部供電模式下的單只DS18B20芯片的連接圖



(2)外部供電模式下的多只DS18B20芯片的連接圖



      這里需要說明的是,DS18B20芯片通過達(dá)拉斯公司的單總線協(xié)議依靠一個(gè)單線端口通訊,當(dāng)全部器件經(jīng)由一個(gè)三態(tài)端口或者漏極開路端口與總線連接時(shí),控制線需要連接一個(gè)弱上拉電阻。在多只DS18B20連接時(shí),每個(gè)DS18B20都擁有一個(gè)全球唯一的64位序列號(hào),在這個(gè)總線系統(tǒng)中,微處理器依靠每個(gè)器件獨(dú)有的64位片序列號(hào)辨認(rèn)總線上的器件和記錄總線上的器件地址,從而允許多只DS18B20同時(shí)連接在一條單線總線上,因此,可以很輕松地利用一個(gè)微處理器去控制很多分布在不同區(qū)域的DS18B20,這一特性在環(huán)境控制、探測(cè)建筑物、儀器等溫度以及過程監(jiān)測(cè)和控制等方面都非常有用。

      對(duì)于DS18B20的電路連接,除了上面所說的傳統(tǒng)的外部電源供電時(shí)的電路連接圖,DS18B20也可以工作在“寄生電源模式”,而下圖則表示了DS18B20工作在“寄生電源模式”下的電路連接圖。沒錯(cuò),這樣就可以使DS18B20工作在寄生電源模式下了,不用額外的電源就可以實(shí)時(shí)采集到位于多個(gè)地點(diǎn)的溫度信息了。


      


第三部分:DS18B20內(nèi)部寄存器解析及工作原理

      介紹完DS18B20的封裝、針腳定義和連接方式后,我們有必要了解DS18B20芯片的各個(gè)控制器、存儲(chǔ)器的相關(guān)知識(shí),如下圖所示,為DS18B20內(nèi)部主要寄存器的結(jié)果框圖。



       結(jié)合圖中的內(nèi)部寄存器框圖,我們先簡(jiǎn)單說一下DS18B20芯片的主要寄存器工作流程,而在對(duì)DS18B20工作原理進(jìn)行詳細(xì)說明前,有必要先上幾張相關(guān)圖片:

(1)DS18B20內(nèi)部寄存器結(jié)構(gòu)圖



(2)DS18B20主要寄存器數(shù)據(jù)格式圖示



(3)DS18B20通訊指令圖


了解了這些內(nèi)部結(jié)構(gòu)和細(xì)節(jié),下面說一下DS18B20芯片的工作原理。

         DS18B20啟動(dòng)后將進(jìn)入低功耗等待狀態(tài),當(dāng)需要執(zhí)行溫度測(cè)量和AD轉(zhuǎn)換時(shí),總線控制器(多為單片機(jī))發(fā)出[44H]指令完成溫度測(cè)量和AD轉(zhuǎn)換(其他功能指令見上面的指令表),DS18B20將產(chǎn)生的溫度數(shù)據(jù)以兩個(gè)字節(jié)的形式存儲(chǔ)到高速暫存器的溫度寄存器中,然后,DS18B20繼續(xù)保持等待狀態(tài)。當(dāng)DS18B20芯片由外部電源供電時(shí),總線控制器在溫度轉(zhuǎn)換指令之后發(fā)起“讀時(shí)隙”(詳見本帖的“DS18B20時(shí)隙圖”),從而讀出測(cè)量到的溫度數(shù)據(jù)通過總線完成與單片機(jī)的數(shù)據(jù)通訊(DS18B20正在溫度轉(zhuǎn)換中由DQ引腳返回0,轉(zhuǎn)換結(jié)束則返回1。如果DS18B20由寄生電源供電,除非在進(jìn)入溫度轉(zhuǎn)換時(shí)總線被一個(gè)強(qiáng)上拉拉高,否則將不會(huì)有返回值)。另外,DS18B20在完成一次溫度轉(zhuǎn)換后,會(huì)將溫度值與存儲(chǔ)在TH(高溫觸發(fā)器)和TL(低溫觸發(fā)器)中各一個(gè)字節(jié)的用戶自定義的報(bào)警預(yù)置值進(jìn)行比較,寄存器中的S標(biāo)志位(詳見寄存器格式圖示中的“TH和TL寄存器格式”圖示)指出溫度值的正負(fù)(S=0時(shí)為正,S=1時(shí)為負(fù)),如果測(cè)得的溫度高于TH或者低于TL數(shù)值,報(bào)警條件成立,DS18B20內(nèi)部將對(duì)一個(gè)報(bào)警標(biāo)識(shí)置位,此時(shí),總線控制器通過發(fā)出報(bào)警搜索命令[ECH]檢測(cè)總線上所有的DS18B20報(bào)警標(biāo)識(shí),然后,對(duì)報(bào)警標(biāo)識(shí)置位的DS18B20將響應(yīng)這條搜索命令。



第四部分:針對(duì)DS18B20的單片機(jī)編程

      針對(duì)DS18B20的編程,可以理解為總線控制器通過相關(guān)指令操作器件或者器件中的相應(yīng)寄存器,從而完成器件也總線控制器的數(shù)據(jù)通信,所以要真正搞定DS18B20的通訊編程,還需要詳細(xì)的了解該芯片的各種寄存器結(jié)構(gòu)、寄存器數(shù)據(jù)格式和相關(guān)的指令系統(tǒng),下面我們就結(jié)合上面圖示,說說DS18B20的內(nèi)部存儲(chǔ)器結(jié)構(gòu)。

      DS18B20的每個(gè)暫存器都有8bit存儲(chǔ)空間,用來存儲(chǔ)相應(yīng)數(shù)據(jù),其中byte0和byte1分別為溫度數(shù)據(jù)的低位和高位,用來儲(chǔ)存測(cè)量到的溫度值,且這兩個(gè)字節(jié)都是只讀的;byte2和byte3為TH、TL告警觸發(fā)值的拷貝,可以在從片內(nèi)的電可擦可編程只讀存儲(chǔ)器EEPROM中讀出,也可以通過總線控制器發(fā)出的[48H]指令將暫存器中TH、TL的值寫入到EEPROM,掉電后EEPROM中的數(shù)據(jù)不會(huì)丟失;byte4的配置寄存器用來配置溫度轉(zhuǎn)換的精確度(最大為12位精度);byte5、6、7為保留位,禁止寫入;byte8亦為只讀存儲(chǔ)器,用來存儲(chǔ)以上8字節(jié)的CRC校驗(yàn)碼。

       參考上面的DS18B20通訊指令圖,即為DS18B20芯片中主要寄存器的數(shù)據(jù)格式和必要的個(gè)別標(biāo)識(shí)位說明,只要做到對(duì)寄存器數(shù)據(jù)精準(zhǔn)的控制,就可以很容易的完成DS18B20的程序編寫,而對(duì)于總線控制器發(fā)出的控制指令,我們需要知道,DS18B20的指令包括ROM指令和功能指令,其中ROM指令用來進(jìn)行ROM的操作,而功能指令則可以控制DS18B20完成溫度轉(zhuǎn)換,寄存器操作等功能性工作。一旦總線控制器檢測(cè)到一個(gè)存在脈沖,它就會(huì)發(fā)出一條ROM指令,如果總線上掛載多只DS18B20,這些指令將利用器件獨(dú)有的64位ROM片序列碼選出特定的要進(jìn)行操作的器件,同樣,這些指令也可以識(shí)別哪些器件符合報(bào)警條件等。在總線控制器發(fā)給要連接的DS18B20一條ROM指令后,就可以發(fā)送一條功能指令完成相關(guān)的工作了,也就是說,總線控制器在發(fā)起一條DS18B20功能指令前,需要首先發(fā)出一條ROM指令。了解了這些功能指令的功能和用法,再對(duì)DS18B20編程就容易多了!~


第五部分:DS18B20芯片的兩點(diǎn)使用心得

(1)對(duì)TH(高溫觸發(fā)寄存器)和TL(低溫觸發(fā)寄存器)的操作心得

       針對(duì)于DS18B20中TH(高溫觸發(fā)寄存器)和TL(低溫觸發(fā)寄存器),可以找到的代碼資料很少,而如果在某一測(cè)溫系統(tǒng)中需要用到TH和TL寄存器時(shí),其實(shí)不必覺得無從下手,參見本帖中的“DS18B20寄存器結(jié)構(gòu)”,總線控制器的讀操作將從位0開始逐步向下讀取數(shù)據(jù),直到讀完位8,而且TH和TL寄存器的內(nèi)部結(jié)構(gòu)和數(shù)據(jù)格式和片內(nèi)其他寄存器是相同的,當(dāng)然,針對(duì)TH和TL寄存器的讀寫和其他片內(nèi)寄存器的讀寫也是相同的,所以在實(shí)際應(yīng)用中,當(dāng)DS18B20初始化完成后,首先通過總線控制器發(fā)出的[B8H]指令將EEPROM中保存的數(shù)據(jù)召回到暫存器的TH和TL中,然后通過總線控制器發(fā)出的“讀時(shí)隙”對(duì)器件暫存器進(jìn)行讀操作,只要將讀到的每8bit數(shù)據(jù)及時(shí)獲取,就可以很容易地通過總線控制器讀出TH和TL寄存器數(shù)據(jù);總線控制器對(duì)器件的寫操作原理亦然,換句話說,只要掌握了其他寄存器的操作編程,就完全可以很容易地對(duì)TH和TL這兩個(gè)報(bào)警值寄存器進(jìn)行讀寫操作。同時(shí),可以通過[48H]指令將TH和TL寄存器數(shù)據(jù)拷貝到EEPROM中進(jìn)行保存。

(2)對(duì)DS18B20通訊時(shí)隙的掌握心得
       在由DS18B20芯片構(gòu)建的溫度檢測(cè)系統(tǒng)中,采用達(dá)拉斯公司獨(dú)特的單總線數(shù)據(jù)通訊方式,允許在一條總線上掛載多個(gè)DS18B20,那么,在對(duì)DS18B20的操作和控制中,由總線控制器發(fā)出的時(shí)隙信號(hào)就顯得尤為重要。如下圖所示,分別為DS18B20芯片的上電初始化時(shí)隙、總線控制器從DS18B20讀取數(shù)據(jù)時(shí)隙、總線控制器向DS18B20寫入數(shù)據(jù)時(shí)隙的示意圖,在系統(tǒng)編程時(shí),一定要嚴(yán)格參照時(shí)隙圖中的時(shí)間數(shù)據(jù),做到精確的把握總線電平隨時(shí)間(微秒級(jí))的變化,才能夠順利地控制和操作DS18B20。另外,需要注意到不同單片機(jī)的機(jī)器周期是不盡相同的,所以,程序中的延時(shí)函數(shù)并不是完全一樣,要根據(jù)單片機(jī)不同的機(jī)器周期有所改動(dòng)。在平常的DS18B20程序調(diào)試中,若發(fā)現(xiàn)諸如溫度顯示錯(cuò)誤等故障,基本上都是由于時(shí)隙的誤差較大甚至?xí)r隙錯(cuò)誤導(dǎo)致的,在對(duì)DS18B20編程時(shí)需要格外注意。

上電初始化時(shí)隙圖



數(shù)據(jù)讀取時(shí)通訊總線的時(shí)隙圖


數(shù)據(jù)寫入時(shí)通訊總線的時(shí)隙圖


DS18B20測(cè)溫芯片做的數(shù)碼管顯示溫度計(jì)程序
下列程序也是用網(wǎng)上的程序進(jìn)行修改,主要改動(dòng)部分是顯示輸出部分,而溫度轉(zhuǎn)換是采用的查表法(具體原理還沒有看懂),但該程序經(jīng)過編譯,100%通過。STC12C5A60S2.h頭文件下載:http://www.zg4o1577.cn/mcu/2564.html
#include < STC12C5A60S2.h >
#include < intrins.h >

#define uchar unsigned char
#define uint   unsigned int
bit presence   ;
//***************************************************************************************************//
sbit DQ = P1^6 ;             //定義DS18B20端口DQ  
sbit   LED_A      =P4 ^ 4; //設(shè)置LED點(diǎn)陣屏連接的I/O
sbit   LED_B      =P0 ^ 6; //設(shè)置LED點(diǎn)陣屏連接的I/O
sbit   LED_C       =P3 ^ 0; //設(shè)置LED點(diǎn)陣屏連接的I/O
sbit   LED_D      =P3 ^ 2; //設(shè)置LED點(diǎn)陣屏連接的I/O
sbit   LED_E       =P3 ^ 3; //設(shè)置LED點(diǎn)陣屏連接的I/O
sbit   LED_F       =P4 ^ 5; //設(shè)置LED點(diǎn)陣屏連接的I/O
sbit   LED_G      =P4 ^ 7; //設(shè)置LED點(diǎn)陣屏連接的I/O
sbit   LED_DP    =P3 ^ 1; //設(shè)置LED點(diǎn)陣屏連接的I/O
sbit LED1= P2^7 ;            //定義LED數(shù)碼管位腳
sbit LED2= P4^6 ;
sbit LED3= P0^7 ;
sbit LED4= P1^7 ;
//***************************************************************************************************//
unsigned char data   temp_data[2] = {0x00,0x00} ;
unsigned char data   display[5] =    {0x00,0x00,0x00,0x00,0x00} ;
unsigned char code   ditab[16] =     {0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,
                                                        0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09} ;
unsigned char code   mytab[4] = {0xF9,0xB0,0x92,0x99} ;//純粹用來測(cè)試,可刪除
//***************************************************************************************************//
const uchar tab[]={             /* 根據(jù)共陰極字型編碼表獲取0~9,A~B字型代碼 */
         0x3f,0x06,0x5b,0x4f,//0~3
         0x66,0x6D,0x7D,0x07,//4~7
         0x7F,0x6F,0x77,0x7C,//8~b
         0x39,0x5E,0x79,0x71,//c~f
         0x00//mie
};
//***************************************************************************************************//
const uchar tab1[]={             /* 根據(jù)共陽極字型編碼表獲取0~9A~B字型代碼 */
         0xC0,0xF9,0xA4,0xB0,//0~3
         0x99,0x92,0x82,0xF8,//4~7
         0x80,0x90,0x88,0x83,//8~b
         0xC6,0xA1,0x86,0x8E,//c~f
         0xff//mie
};
#define delayNOP() ; {_nop_() ;_nop_();_nop_() ;_nop_() ;} ;

/*******************************************************************/
void delay1(int ms)
{
unsigned char y ;
  while(ms--)
{
  for(y = 0 ; y<250 ; y++)
   {
   _nop_() ;
   _nop_() ;
   _nop_() ;
   _nop_() ;
   }
}
}

/******************************************************************/
/*us級(jí)延時(shí)函數(shù)                                         */
/*******************************************************************/
void Delay(unsigned int num)   //延時(shí)6us,誤差 0us
{
   unsigned char a;
         while(num--!=0)
   {for(a=15;a>0;a--);}
}

/*void Delay(unsigned int num)
{
  while( --num ) ;
}
*/

/*********************************************************************************************/
void PUTLED (unsigned char d){ //LED段輸入
         unsignedchar i;
         i= d & 0x01;
         if(i== 0x00){              LED_A = 0;}
         i= d & 0x02;
         if(i== 0x00){              LED_B = 0;}
         i= d & 0x04;
         if(i== 0x00){              LED_C = 0;}
         i= d & 0x08;
         if(i== 0x00){              LED_D = 0;}
         i= d & 0x10;
         if(i== 0x00){              LED_E = 0;}
         i= d & 0x20;
         if(i== 0x00){              LED_F = 0;}
         i= d & 0x40;
         if(i== 0x00){              LED_G = 0;}
         i= d & 0x80;
         if(i== 0x00){              LED_DP = 0;}
}
/*******************************************************************/
void dis_off(void){
LED_A      =1;//設(shè)置LED點(diǎn)陣屏連接的I/O
LED_B      =1;//設(shè)置LED點(diǎn)陣屏連接的I/O
LED_C       =1;//設(shè)置LED點(diǎn)陣屏連接的I/O
LED_D      =1;//設(shè)置LED點(diǎn)陣屏連接的I/O
LED_E       =1;//設(shè)置LED點(diǎn)陣屏連接的I/O
LED_F       =1;//設(shè)置LED點(diǎn)陣屏連接的I/O
LED_G      =1;//設(shè)置LED點(diǎn)陣屏連接的I/O
LED_DP    =1;//設(shè)置LED點(diǎn)陣屏連接的I/O
LED1= 0 ;           
LED2= 0;
LED3=0 ;
LED4= 0 ;   
}
/*******************************************************************/
void displayLED(void){
dis_off();
PUTLED(tab1[display[3]]);//顯示百位
LED1=1;
Delay(150);
dis_off();
PUTLED(tab1[display[2]]);//顯示十位
LED2=1;
Delay(150);
dis_off();
PUTLED(0x7f&tab1[display[1]]);//顯示個(gè)位和小數(shù)點(diǎn)
LED3=1;
Delay(150);
dis_off();
PUTLED(tab1[display[0]]);//顯示小數(shù)位
LED4=1;
Delay(150);
dis_off();
}

/*******************************************************************/
/*初始化ds1820                                                    */
/*******************************************************************/
Init_DS18B20(void)
{  
     DQ = 1 ;       //DQ復(fù)位
     Delay(8) ;     //稍做延時(shí)

     DQ = 0 ;       //單片機(jī)將DQ拉低
     Delay(90) ;    //精確延時(shí)大于 480us

     DQ = 1 ;        //拉高總線
     Delay(8) ;

     presence = DQ ;     //如果=0則初始化成功 =1則初始化失敗
     Delay(100) ;
     DQ = 1 ;

     return(presence) ; //返回信號(hào),0=presence,1=no presence
}


/* 讀一個(gè)字節(jié)                      */
/*******************************************************************/
ReadOneChar(void)
{
unsigned char i = 0 ;
unsigned char dat = 0 ;

for (i = 8 ; i > 0 ; i--)
   {
    DQ = 0 ; // 給脈沖信號(hào)
    dat >>= 1 ;
    DQ = 1 ; // 給脈沖信號(hào)

    if(DQ)
     dat |= 0x80 ;
    Delay(4) ;
   }

    return (dat) ;
}

/* 寫一個(gè)字節(jié)                                          */
/*******************************************************************/
WriteOneChar(unsigned char dat)
{
  unsigned char i = 0 ;
  for (i = 8 ; i > 0 ; i--)
   {
    DQ = 0 ;
    DQ = dat&0x01 ;
    Delay(5) ;

    DQ = 1 ;
    dat>>=1 ;
   }
}

/* 讀取溫度                            */
/*******************************************************************/
Read_Temperature(void)
{
     Init_DS18B20() ;

     WriteOneChar(0xCC) ;   // 跳過讀序號(hào)列號(hào)的操作
     WriteOneChar(0x44) ;   // 啟動(dòng)溫度轉(zhuǎn)換

     Init_DS18B20() ;
     WriteOneChar(0xCC) ;   //跳過讀序號(hào)列號(hào)的操作
     WriteOneChar(0xBE) ;   //讀取溫度寄存器

     temp_data[0] = ReadOneChar() ;   //溫度低8
     temp_data[1] = ReadOneChar() ;   //溫度高8
}

/* 數(shù)據(jù)轉(zhuǎn)換與溫度顯示                                              */
/*******************************************************************/
Disp_Temperature()
{
  display[4]=temp_data[0]&0x0f ;
  display[0]=ditab[display[4]] ;     //查表得小數(shù)位的值

  display[4]=((temp_data[0]&0xf0)>>4)|((temp_data[1]&0x0f)<<4);
  display[3]=display[4]/100 ;
  display[1]=display[4]%100 ;
  display[2]=display[1]/10 ;
  display[1]=display[1]%10 ;
    if(display[3]==0x00)         //高位為0,不顯示
    {
     display[3]=16 ;              
     if(display[2]==0x00)       //次高位為0,不顯示
     display[2]=16 ;
    }
         }


/* 主函數(shù)      */
/************************************/
void main()
{  P0M1=0x00;
   P0M0=0x80;
         P1M1=0x00;
   P1M0=0x80;
   P2M1=0x00;
   P2M0=0x80;

         P4M1=0x00;
   P4M0=0x40;
         P4SW= 0xff; //啟動(dòng)P4接口
     while(1)
   {
   Read_Temperature() ;
   Disp_Temperature() ;
         displayLED();
    }
}
       好了,帖子寫到這里,基本上算是告一段落了,我們描述了DS18B20測(cè)溫芯片的封裝、管腳定義、電路連接方式、內(nèi)部寄存器的結(jié)構(gòu)和數(shù)據(jù)格式、通信時(shí)隙和功能/控制指令,最后希望這篇帖子可以幫助到正在或者將要使用到DS18B20測(cè)溫芯片的壇友,謝謝大家!





評(píng)分

參與人數(shù) 1黑幣 +27 收起 理由
小麥草 + 27

查看全部評(píng)分

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

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 国产精品日韩欧美一区二区三区 | 亚洲一区二区三区四区五区午夜 | 久久九九免费 | 欧美激情精品久久久久 | 日韩欧美高清dvd碟片 | www.yw193.com| 国产精品免费高清 | 国产91av视频 | 中文字幕在线看 | 久久精品国产99国产精品 | 精品综合久久久 | 日韩在线播放视频 | 91新视频| 精品毛片视频 | 久久99国产精品 | 亚洲欧美激情国产综合久久久 | 一区二区三区在线播放视频 | 欧美日韩专区 | 亚洲精品字幕 | 亚洲国产福利视频 | 在线播放国产一区二区三区 | 在线视频 欧美日韩 | 久久久久久久综合 | 一本久久a久久精品亚洲 | 久久草视频 | 国产黄视频在线播放 | 国产精品久久久久久久久久久久 | 91精品导航 | 麻豆久久久9性大片 | 日本黄色免费大片 | 久久不卡 | 国产精品成人一区二区三区 | 精品伊人| 美女在线视频一区二区三区 | 在线视频91 | 日本视频在线 | www.日日操| 成年人的视频免费观看 | 精品乱子伦一区二区三区 | 在线视频日韩精品 | 亚洲精品一区二区 |