C文件
#include "reg52.H"
#include "stdio.h"
#include "intrins.h"
#include
#define DB P0//液晶并行數(shù)據(jù)接口
sbit RS = P2^0;//液晶指令數(shù)據(jù)信號(hào)
sbit RW = P2^1;//液晶讀寫信號(hào)
sbit E = P2^2;//液晶使能信號(hào)
unsigned char key_value;//獲取到按鍵的值
sbit Sck_P = P1^1; // SHT11傳感器的時(shí)鐘管腳
sbit Data_P = P1^0; // SHT11傳感器的數(shù)據(jù)管腳
unsigned char temp; // 保存溫度
unsigned char humi; // 保存濕度
enum { TEMP,HUMI };
typedef union //定義共用同類型
{
unsigned int i;
float f;
}value;
//是否應(yīng)答
#define NACK 0
#define ACK 1
//SHT75傳感器命令集 地址 命令 讀/寫
#define MEASURE_TEMP 0x03 //000 0001 1
#define MEASURE_HUMI 0x05 //000 0010 1
#define STATUS_REG_W 0x06 //000 0011 0
#define STATUS_REG_R 0x07 //000 0011 1
#define RESET 0x1E //000 1111 0
unsigned char now_window;//當(dāng)前顯示窗口
unsigned char curr_menu;
#define normal_mode 0x10//輸入密碼狀態(tài)
#define set_mode 0x20//輸入密碼狀態(tài)
signed char AlarmTL=10; // 溫度下限報(bào)警值
signed char AlarmTH=30; // 溫度上限報(bào)警值
signed char AlarmHL=40; // 濕度下限報(bào)警值
signed char AlarmHH=80; // 濕度上限報(bào)警值
unsigned char i;
unsigned char cnt_100ms;
unsigned char time_100ms_flag;
unsigned char open_del;//開(kāi)鎖成功延時(shí)計(jì)數(shù)
unsigned char open_flag;//鎖狀態(tài)標(biāo)志
sbit beep = P1^2;
sbit LedTL_P = P1^3; // 溫度過(guò)低報(bào)警指示燈
sbit LedTH_P = P1^4; // 溫度過(guò)高報(bào)警指示燈
sbit LedHL_P = P1^5; // 濕度過(guò)低報(bào)警指示燈
sbit LedHH_P = P1^6; // 濕度過(guò)高報(bào)警指示燈
/*******************************************************************************
* 函 數(shù) 名 : delay_ms
* 函數(shù)功能 : 延時(shí)函數(shù),延時(shí)1ms
* 輸 入 : cnt
* 輸 出 : 無(wú)
* 說(shuō) 名 : 該函數(shù)是在12MHZ晶振下,12分頻單片機(jī)的延時(shí)。
*******************************************************************************/
void delay_ms(unsigned int cnt) //
{
unsigned int x;
for( ; cnt>0; cnt--)
{
for(x=110; x>0; x--);//軟件延時(shí)為1MS
}
}
#if 0
void delay_us(unsigned int cnt) //
{
while(cnt--);
}
#endif
/******************************************************
** 函數(shù)名:time_init
** 描述 :定時(shí)器初始化
** 輸入 :無(wú)
** 輸出 :無(wú)
******************************************************/
void time_init(void)
{
TMOD |= 0x01;//time0 工作方式為1
TH0 = 0xf8;//裝載初值
TL0 = 0x2f;//裝載初值,為2ms(65535-63535)
TR0 = 1;//開(kāi)啟定時(shí)器
ET0 = 1;//打開(kāi)中斷
EA=1;
}
/******************************************************
** 函數(shù)名:key_scan
** 描述 :按鍵掃描
** 輸入 :無(wú)
** 輸出 :無(wú)
******************************************************/
void key_scan(void)
{
static unsigned char key_in_flag = 0;//按鍵按下標(biāo)志
unsigned char key_l;//存儲(chǔ)掃描到行列值。
key_value = 20;//按鍵值清除
if((P3 & 0x0f) != 0x0f)//按鍵按下
{
delay_ms(1);//按鍵消抖動(dòng)
if(((P3 & 0x0f) != 0x0f) && (key_in_flag == 1))
{
key_in_flag = 0;//松手檢測(cè)防止一直觸發(fā)
P3 = 0x0f;
//delay_ms(1);//按鍵消抖動(dòng)
key_l = P3;//掃描得到按鍵值
switch(key_l)
{
//獲取按鍵值
case 0x0e:
{
key_value = 1;
}
break;
case 0x0d:
{
key_value = 2;
}
break;
case 0x0b:
{
key_value = 3;
}
break;
//case 0x70:
//break;
}
}
}
else
{
key_in_flag = 1;//(按鍵松開(kāi)標(biāo)志)
}
}
/*******************************************************************************
* 函 數(shù) 名 : LcdWriteCom
* 函數(shù)功能 : 向LCD寫入一個(gè)字節(jié)的命令
* 輸 入 : u8com
* 輸 出 : 無(wú)
*******************************************************************************/
void lcd_wri_com(unsigned char com) //寫入命令
{
E = 0; //使能清零
RS = 0; //選擇寫入命令
RW = 0; //選擇寫入
DB = com;
delay_ms(1);
E = 1; //寫入時(shí)序
delay_ms(5);
E = 0;
}
/*******************************************************************************
* 函 數(shù) 名 : LcdWriteData
* 函數(shù)功能 : 向LCD寫入一個(gè)字節(jié)的數(shù)據(jù)
* 輸 入 : u8dat
* 輸 出 : 無(wú)
*******************************************************************************/
void lcd_wri_data(unsigned char dat)//寫入數(shù)據(jù)
{
E = 0; //使能清零
RS = 1; //選擇寫入數(shù)據(jù)
RW = 0; //選擇寫入
DB = dat;
delay_ms(1);
E = 1; //寫入時(shí)序
delay_ms(5);
E = 0;
}
/*******************************************************************************
* 函 數(shù) 名 : WriString
* 函數(shù)功能 : 刷新屏幕顯示
* 輸 入 : hang,add,*p
* 輸 出 : 無(wú)
*******************************************************************************/
void wri_string(unsigned char y,unsigned char x,unsigned char *p)
{
if(y==1)//如果選擇第一行
lcd_wri_com(0x80+x);//選中地址
else
lcd_wri_com(0xc0+x);//選中地址
while(*p)
{
lcd_wri_data(*p);//寫入數(shù)據(jù)
p++;
}
}
/*******************************************************************************
* 函 數(shù) 名 : lcd_write_char
* 函數(shù)功能 :
* 輸 入 :
* 輸 出 : 無(wú)
*******************************************************************************/
void lcd_write_char(unsigned char y, unsigned char x, unsigned char dat) //列x=0~15,行y=0,1
{
unsigned char temp_l, temp_h;
if(y==1)//如果選擇第一行
lcd_wri_com(0x80+x);//選中地址
else
lcd_wri_com(0xc0+x);//選中地址
temp_l = dat % 10;
temp_h = dat / 10;
lcd_wri_data(temp_h + 0x30); //convert to ascii
lcd_wri_data(temp_l + 0x30);
}
/*********************光標(biāo)控制***********************/
void lcd1602_guanbiao(unsigned char y, unsigned char x,unsigned char on_off)
{
if(on_off == 1) //開(kāi)光標(biāo)
{
if(y==1)//如果選擇第一行
lcd_wri_com(0x80+x);
else
lcd_wri_com(0xc0+x);//將光標(biāo)移動(dòng)到秒個(gè)位
lcd_wri_com(0x0f);//顯示光標(biāo)并且閃爍
}
else
{
if(y==1)//如果選擇第一行
lcd_wri_com(0x80+x);
else
lcd_wri_com(0xc0+x);//將光標(biāo)移動(dòng)到秒個(gè)位
lcd_wri_com(0x0c); //關(guān)光標(biāo)
}
}
/*******************************************************************************
* 函 數(shù) 名 : LcdInit()
* 函數(shù)功能 : 初始化LCD屏
* 輸 入 : 無(wú)
* 輸 出 : 無(wú)
*******************************************************************************/
void lcd_init(void) //LCD初始化子程序
{
lcd_wri_com(0x38);//置功能8位雙行
lcd_wri_com(0x0c);//顯示開(kāi)關(guān)光標(biāo)
lcd_wri_com(0x06);//字符進(jìn)入模式屏幕不動(dòng)字符后移
delay_ms(5);//延時(shí)5ms
lcd_wri_com(0x01); //清屏
wri_string(1,0,"welcome user DHT");//初始化顯示
wri_string(2,0,"H: %RH T: C ");//初始化顯示
}
/*********************************************************/
// 往SHT11寫入一個(gè)字節(jié)
/*********************************************************/
char ShtWriteByte(unsigned char value)
{
unsigned char i,error=0;
for(i=128;i>0;i>>=1) // 高位為1,循環(huán)右移
{
if (i&value)
Data_P=1; // 和要發(fā)送的數(shù)相與,結(jié)果為發(fā)送的位
else
Data_P=0;
Sck_P=1;
_nop_(); // 延時(shí)3us
_nop_();
_nop_();
Sck_P=0;
}
Data_P=1; // 釋放數(shù)據(jù)線
Sck_P=1;
error=Data_P; // 檢查應(yīng)答信號(hào),確認(rèn)通訊正常
_nop_();
_nop_();
_nop_();
Sck_P=0;
Data_P=1;
return error; // error=1 通訊錯(cuò)誤
}
/*********************************************************/
// 從SHT11讀出一個(gè)字節(jié)
/*********************************************************/
char ShtReadByte(unsigned char ack)
{
unsigned char i,val=0;
Data_P=1; // 釋放數(shù)據(jù)線
for(i=0x80;i>0;i>>=1) // 高位為1,循環(huán)右移
{
Sck_P=1;
if(Data_P)
val=(val|i); // 讀一位數(shù)據(jù)線的值
Sck_P=0;
}
Data_P=!ack; // 如果是校驗(yàn),讀取完后結(jié)束通訊
Sck_P=1;
_nop_(); // 延時(shí)3us
_nop_();
_nop_();
Sck_P=0;
_nop_();
_nop_();
_nop_();
Data_P=1; // 釋放數(shù)據(jù)線
return val;
}
/*********************************************************/
// SHT11啟動(dòng)傳輸
/*********************************************************/
void ShtTransStart(void)
{
Data_P=1;
Sck_P=0;
_nop_();
Sck_P=1;
_nop_();
Data_P=0;
_nop_();
Sck_P=0;
_nop_();
_nop_();
_nop_();
Sck_P=1;
_nop_();
Data_P=1;
_nop_();
Sck_P=0;
}
/*********************************************************/
// SHT11連接復(fù)位
/*********************************************************/
void ShtConnectReset(void)
{
unsigned char i;
Data_P=1; //準(zhǔn)備
Sck_P=0;
for(i=0;i9;i++) //DATA保持高,SCK時(shí)鐘觸發(fā)9次,發(fā)送啟動(dòng)傳輸,通迅即復(fù)位
{
Sck_P=1;
Sck_P=0;
}
ShtTransStart(); //啟動(dòng)傳輸
}
/*********************************************************/
// SHT11溫濕度檢測(cè)
/*********************************************************/
char ShtMeasure(unsigned char *p_value, unsigned char *p_checksum, unsigned char mode)
{
unsigned error=0;
unsigned int i;
ShtTransStart(); // 啟動(dòng)傳輸
switch(mode) // 選擇發(fā)送命令
{
case 1 : // 測(cè)量溫度
error+=ShtWriteByte(0x03);
break;
case 2 : // 測(cè)量濕度
error+=ShtWriteByte(0x05);
break;
default:
break;
}
for(i=0;i65535;i++)
if(Data_P==0)
break; // 等待測(cè)量結(jié)束
if(Data_P)
error+=1; // 如果長(zhǎng)時(shí)間數(shù)據(jù)線沒(méi)有拉低,說(shuō)明測(cè)量錯(cuò)誤
*(p_value) =ShtReadByte(1); // 讀第一個(gè)字節(jié),高字節(jié) (MSB)
*(p_value+1)=ShtReadByte(1); // 讀第二個(gè)字節(jié),低字節(jié) (LSB)
*p_checksum =ShtReadByte(0); // read CRC校驗(yàn)碼
return error; // error=1 通訊錯(cuò)誤
}
/*********************************************************/
// SHT11溫濕度值標(biāo)度變換及溫度補(bǔ)償
/*********************************************************/
void CalcSHT11(float *p_humidity ,float *p_temperature)
{
const float C1=-4.0; // 12位濕度精度 修正公式
const float C2=+0.0405; // 12位濕度精度 修正公式
const float C3=-0.0000028; // 12位濕度精度 修正公式
const float T1=+0.01; // 14位溫度精度 5V條件 修正公式
const float T2=+0.00008; // 14位溫度精度 5V條件 修正公式
float rh=*p_humidity; // rh: 12位 濕度
float t=*p_temperature; // t: 14位 溫度
float rh_lin; // rh_lin: 濕度 linear值
float rh_true; // rh_true: 濕度 ture值
float t_C; // t_C : 溫度 ℃
t_C=t*0.01 - 40; //補(bǔ)償溫度
rh_lin=C3*rh*rh + C2*rh + C1; //相對(duì)濕度非線性補(bǔ)償
rh_true=(t_C-25)*(T1+T2*rh)+rh_lin; //相對(duì)濕度對(duì)于溫度依賴性補(bǔ)償
*p_temperature=t_C; //返回溫度結(jié)果
*p_humidity=rh_true; //返回濕度結(jié)果
}
/*********************************************************/
// 溫度校正
/*********************************************************/
unsigned char TempCorrect(int temp)
{
if(temp0) temp=0;
if(temp?>970) temp=970;
if(temp>235) temp=temp+10;
if(temp>555) temp=temp+10;
if(temp>875) temp=temp+10;
temp=(temp%1000)/10;
return temp;
}
/*********************************************************/
// 濕度校正
/*********************************************************/
unsigned char HumiCorrect(unsigned int humi)
{
if(humi>999) humi=999;
if((humi>490)&&(humi951)) humi=humi-10;
humi=(humi%1000)/10;
return humi+4;
}
/*********************************************************/
// 讀取SHT11的溫濕度數(shù)據(jù)
/*********************************************************/
void ReadShtData()
{
value humi_val,temp_val; // 定義兩個(gè)共同體,一個(gè)用于濕度,一個(gè)用于溫度
unsigned char error; // 用于檢驗(yàn)是否出現(xiàn)錯(cuò)誤
unsigned char checksum; // CRC
unsigned int temp1,humi1; // 臨時(shí)讀取到的溫濕度數(shù)據(jù)
error=0; //初始化error=0,即沒(méi)有錯(cuò)誤
error+=ShtMeasure((unsigned char*)&temp_val.i,&checksum,1); //溫度測(cè)量
error+=ShtMeasure((unsigned char*)&humi_val.i,&checksum,2); //濕度測(cè)量
if(error!=0) //如果發(fā)生錯(cuò)誤,系統(tǒng)復(fù)位
ShtConnectReset();
else
{
humi_val.f=(float)humi_val.i; //轉(zhuǎn)換為浮點(diǎn)數(shù)
temp_val.f=(float)temp_val.i; //轉(zhuǎn)換為浮點(diǎn)數(shù)
CalcSHT11(&humi_val.f,&temp_val.f); //修正相對(duì)濕度及溫度
temp1=temp_val.f*10;
temp=TempCorrect(temp1);
humi1=humi_val.f*10-50;
humi=HumiCorrect(humi1);
humi = humi + 2;
}
}
void AlarmJudge(void)
{
if(temp?>AlarmTH) // 溫度是否過(guò)高
{
LedTH_P=0;
LedTL_P=1;
}
else if(tempAlarmHH) // 濕度是否過(guò)高
{
LedHH_P=0;
LedHL_P=1;
}
else if(humi3)
{
curr_menu = 0;
lcd1602_guanbiao(2,7,0);
now_window = normal_mode;
wri_string(1,0,"welcome user DHT");//初始化顯示
wri_string(2,0,"H: %RH T: C ");//初始化顯示
lcd_write_char(2,2,humi);
lcd_write_char(2,11,temp);
lcd_wri_com(0xcd);
lcd_wri_data(0xdf);
}
}
if (key_value == 2)
{
if(curr_menu==0)
{
if(++AlarmTL>99)
{
AlarmTL = 0;
}
lcd_write_char(1,2,AlarmTL);
lcd1602_guanbiao(1,3,1);
}
else if (curr_menu==1)
{
if(++AlarmTH>99)
{
AlarmTH = 0;
}
lcd_write_char(1,6,AlarmTH);
lcd1602_guanbiao(1,7,1);
}
else if(curr_menu==2)
{
if(++AlarmHL>99)
{
AlarmHL = 0;
}
lcd_write_char(2,2,AlarmHL);
lcd1602_guanbiao(2,3,1);
}
else if(curr_menu==3)
{
if(++AlarmHH>99)
{
AlarmHH = 0;
}
lcd_write_char(2,6,AlarmHH);
lcd1602_guanbiao(2,7,1);
}
}
if (key_value == 3)
{
if(curr_menu==0)
{
if(--AlarmTL0)
{
AlarmTL = 99;
}
lcd_write_char(1,2,AlarmTL);
lcd1602_guanbiao(1,3,1);
}
else if (curr_menu==1)
{
if(--AlarmTH0)
{
AlarmTH = 99;
}
lcd_write_char(1,6,AlarmTH);
lcd1602_guanbiao(1,7,1);
}
else if(curr_menu==2)
{
if(--AlarmHL0)
{
AlarmHL = 99;
}
lcd_write_char(2,2,AlarmHL);
lcd1602_guanbiao(2,3,1);
}
else if(curr_menu==3)
{
if(--AlarmHH0)
{
AlarmHH = 99;
}
lcd_write_char(2,6,AlarmHH);
lcd1602_guanbiao(2,7,1);
}
}
}
break;
}
}
/******************************************************
** 函數(shù)名:alm
** 描述 :定時(shí)閃爍函數(shù)
** 輸入 : 無(wú)
** 輸出 :無(wú)
** 調(diào)用 :中斷調(diào)用
******************************************************/
void time_service(void)
{
if(time_100ms_flag)
{
time_100ms_flag = 0;
if(now_window == normal_mode)
{
ReadShtData();
lcd_write_char(2,2,humi);
lcd_write_char(2,11,temp);
AlarmJudge();//報(bào)警函數(shù)
}
}
}
/******************************************************
** 函數(shù)名:init_all_hardware
** 描述 :初始化所有硬件,及其變量參數(shù)。
** 輸入 :無(wú)
** 輸出 :無(wú)
** 調(diào)用 :主程序
******************************************************/
void init_all_hardware(void)
{
delay_ms(100);
time_init();//定時(shí)器初始化
ShtConnectReset();
ReadShtData();
lcd_init();
lcd_write_char(2,2,humi);
lcd_write_char(2,11,temp);
lcd_wri_com(0xcd);
lcd_wri_data(0xdf);
key_value = 20;
now_window = normal_mode;
cnt_100ms = 0;
time_100ms_flag = 0;
curr_menu = 0;
}
void main(void)
{
init_all_hardware();//初始化硬件,IO和定時(shí)器
while(1)
{
key_scan();//按鍵掃描
key_service();//按鍵服務(wù)處理函數(shù)
time_service();//時(shí)間處理函數(shù)
}
}
/******************************************************
** 函數(shù)名:time0_interrupt
** 描述 :按鍵掃描函數(shù)
** 輸入 :無(wú)
** 輸出 :無(wú)
******************************************************/
void time0_interrupt() interrupt 1
{
TF0 = 0;//清除標(biāo)志
TR0 = 0;
if (++cnt_100ms?>50)
{
cnt_100ms = 0;
time_100ms_flag = 1;
}
TR0 = 1;
TH0 = 0xf8;
TL0 = 0x2f;//裝載初值2ms(65535-63535)
}
審核編輯:湯梓紅
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。
舉報(bào)投訴
-
傳感器
+關(guān)注
關(guān)注
2548文章
50740瀏覽量
752137 -
驅(qū)動(dòng)
+關(guān)注
關(guān)注
12文章
1827瀏覽量
85186 -
時(shí)鐘
+關(guān)注
關(guān)注
10文章
1721瀏覽量
131377 -
C文件
+關(guān)注
關(guān)注
0文章
12瀏覽量
2834
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
濕度檢測(cè)SHT11代碼
哪位大師幫忙寫下sht11濕度檢測(cè)的代碼 只要濕度檢測(cè) 并驅(qū)動(dòng)4位74ls164 led數(shù)碼管 萬(wàn)分感謝 奉上全部金幣
發(fā)表于 05-02 22:52
如何使用SHT11測(cè)溫度濕度
本人使用SHT11測(cè)溫度濕度,哪位大蝦幫幫我啊?急!!!可以加本人qq342271847,再細(xì)說(shuō)。
發(fā)表于 05-03 19:20
基于單片機(jī)的SHT11的溫濕度監(jiān)測(cè)
我做的一個(gè)基于單片機(jī)的溫濕度控制 傳感器使用的是SHT11我自己找不出程序的錯(cuò)誤 可是仿真確無(wú)法成功,望大俠指點(diǎn)一二啊 用液晶顯示所測(cè)溫濕度 接的是單片機(jī)P1口,由于只需要向其寫數(shù)據(jù) 所以R/W接地
發(fā)表于 05-13 19:55
多路sht11檢測(cè)電路請(qǐng)給點(diǎn)建議
本人已經(jīng)做好了單路sht11檢測(cè)電路,現(xiàn)要擴(kuò)展四路的檢測(cè)電路。大伙給小弟點(diǎn)建議,先謝了
發(fā)表于 05-14 10:26
SHT21和SHT11有啥區(qū)別,各位大神誰(shuí)有SHT21的源代碼沒(méi)。。
網(wǎng)上看到大部分是溫濕度傳感器SHT11的源程序,SHT21和HTU21D的源代碼很少見(jiàn)到。不知道11和21有什么區(qū)別,求大神幫忙。
發(fā)表于 07-21 16:17
請(qǐng)問(wèn)SHT11測(cè)到的溫濕度如何在數(shù)碼管上顯示?SHT11的程序用的官方的,如何增加數(shù)碼管顯示?
請(qǐng)問(wèn)SHT11測(cè)到的溫濕度如何在數(shù)碼管上顯示?SHT11的程序用的官方的,如何增加數(shù)碼管顯示?采用四位數(shù)碼管顯示溫度,四位數(shù)碼管顯示濕度。
發(fā)表于 05-22 22:44
數(shù)字溫濕度傳感器SHT11與CC2430應(yīng)用接口電路
數(shù)字溫濕度傳感器SHT11與CC2430應(yīng)用接口電路
設(shè)計(jì)中采用了數(shù)字溫濕度傳感器SHT11,該傳感器通過(guò)無(wú)線網(wǎng)絡(luò)對(duì)監(jiān)測(cè)區(qū)域內(nèi)溫度和濕度進(jìn)行
發(fā)表于 02-16 12:02
?1770次閱讀
基于CXA1191和SHT11的無(wú)線溫濕度監(jiān)測(cè)系統(tǒng)
為降低設(shè)計(jì)成本,利用CXA1191和SHT11實(shí)現(xiàn)了一個(gè)無(wú)線溫濕度監(jiān)測(cè)系統(tǒng)。在CXA1191原有的廣播接收功能的基礎(chǔ)上,巧妙結(jié)合編碼技術(shù),成功實(shí)現(xiàn)了數(shù)據(jù)無(wú)線傳輸功能,并選擇SHT11實(shí)現(xiàn)高性能的
發(fā)表于 04-12 17:57
?118次下載
sht11采集與顯示有仿真圖
用SHT11進(jìn)行溫濕度采集與顯示
用SHT11進(jìn)行溫度與濕度的采集,結(jié)果讀到單片機(jī),經(jīng)過(guò)計(jì)算變?yōu)闇囟?-100和濕度0-99%,進(jìn)行LCD或數(shù)碼管顯示。
發(fā)表于 07-12 15:29
?43次下載
sht11和dht11有什么區(qū)別_dht22可以替換dht11嗎
本文介紹了SHT11特點(diǎn)、SHT11引腳及功能說(shuō)明與DHT22封裝信息,其次介紹了SHT11的內(nèi)部結(jié)構(gòu)和工作原理及應(yīng)用領(lǐng)域的介紹,對(duì)dht11引腳與功能與封裝信息進(jìn)行了詳解,最后介紹了
發(fā)表于 01-26 13:54
?8.5w次閱讀
評(píng)論