單片機C語言程序設計入門課程,說起來容易,說起來難。學習單片機C語言,首先要了解這兩個東西是什麼。單片機入門編程主要是學習C語言,其次是電路和編程語言。單片機C語言程序設計學習中必讀的模擬電、數字電、電路三本書,為接下來的學習做鋪墊。看書的目的是因為網上教程太多,容易出現偏差。其實只要能懂電路原理,就能開發單片機軟體。簡介單片機又稱單片微控制器,不是執行某種邏輯功能的晶元,而是將一個計算機系統集成到一個晶元中。相當於一台微型計算機,與計算機相比,單片機只是缺少I/O設備。綜上所述,晶元變成了電腦。它體積小、重量輕、價格低,為研究、應用和開發提供了便利條件。同時,學習使用單片機是了解計算機原理和結構的最佳選擇。單片機已經廣泛應用於智能儀器、實時工業控制、通訊設備、導航系統、家用電器等領域。自20世紀90年代以來,單片機技術得到了發展。隨著時代的進步和科技的發展,這項技術的實際應用也越來越成熟,單片機被廣泛應用於各個領域。如今,人們越來越重視單片機在智能電子技術中的發展和應用,單片機的發展進入了一個新的時期。無論是自動測量的實踐,還是智能儀器的實踐,都可以看到單片機技術的身影。在當前的產業發展過程中,電子產業是一個新興的產業。在工業生產中,人們已經成功地應用了電子信息技術,將電子信息技術與單片機技術相結合,有效地提高了單片機的應用效果。作為計算機技術的一個分支,單片機技術在電子產品領域的應用豐富了電子產品的功能,為智能電子設備的開發和應用提供了新的途徑,實現了智能電子設備的創新和發展。以上內容參考:網路-單片機
你應該先學習C語言。你可以讀譚浩強和單片機的書,循序漸進。別擔心。基礎好,什麼都能說。
如果你沒學過微機原理,建議你先學完再買本上海馬超的書,一周就能看懂了~
不認同無意義的光。《C編程》確實創造了一時的輝煌,這種輝煌很可能會延續下去,但不代表就是最好的。這本書之所以流行,是因為當時沒有辦法學習C,這本書很好理解。但是現在這本書太落後了,甚至3版還在用老標准,現在大家普遍用C99標准。老標准不能用Dev C編譯而且好像提問者應該知道C的基礎,推薦《單片機C語言編程及實例》這本書。直接搜索就能找到pdf版本的下載。-馬克·提埃洛
看譚浩強老師的。清華大學出版的《飢餓》。
❷ 51單片機C語言編程
// 51單片機C語言編程,這個時鍾+秒錶可以參考一下。
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
sbit qingling=P1^0; //清零
sbit tiaofen=P1^1; //調分
sbit tiaoshi=P1^2; //調時
sbit sounder=P1^7; //naozhong
uint a,b;
uchar hour,minu,sec, //時鍾
hour0,minu0,sec0,//秒錶
hour1,minu1,sec1;
h1,h2,m1,m2,s1,s2,//顯示位
k,s;//狀態轉換標志
uchar code select[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};
uchar code table[]= {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
/*****************函數聲明***********************/
void keyscan();
void init();
void delay(uchar z);
void display(uchar,uchar,uchar);
void sounde();
/*****************主函數*************************/
void main()
{
init();
while(1)
{
while(TR1)
{
keyscan(); //掃描函數
while(s==1) //s是狀態標志,當s=0時,鬧鍾取消。s=1時,設定鬧鍾時間(也是通過調時,調分函數);
{ //s=2時,鬧鍾工作,時間與設定時刻一致時,鬧鍾響(一分鍾後自動關閉,可手動關閉)。再次切換,s=0.
keyscan(); //s狀態切換(0-》1-》2-》0)通過外部中斷1實現。
display(hour1,minu1,sec1); //鬧鍾時刻顯示
}
display(hour0,minu0,sec0);//時鍾表顯示
while(k) /*k是秒錶狀態(0-》1-》2-》0)通過外部中斷0實現。0秒錶關;1秒錶從零計時;2秒錶停,顯示計時時間*/
{
display(hour,minu,sec); //秒錶顯示
}
}
}
}
/*****************初始化函數***********************/
void init()
{
a=0;
b=0;
k=0;
s=0;
hour0=0;
minu0=0;
sec0=0;
hour=0;
minu=0;
sec=0;
hour1=0;
minu1=0;
sec1=0;
TMOD=0x11; //定時器0,1工作於方式1;賦初值
TH0=(65536-5000)/256;
TL0=(65536-5000)%256;
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
EA=1;
EX0=1; //秒錶中斷
EX1=1; //鬧鍾設定中斷
ET0=1;
ET1=1;
IT0=1; //邊沿觸發方式
IT1=1;
PX0=1;
PX1=1;
TR0=0; //初始,秒錶不工作
TR1=1; //時鍾一開始工作
}
/*****************定時器0中斷*************/
void timer0_int() interrupt 1 //秒錶
{
TH0=(65536-5000)/256;
TL0=(65536-5000)%256;
a++;
if(a==2)
{
a=0;
sec++;
if(sec==100)
{
sec=0; //毫秒級
minu++;
if(minu==60)
{
minu=0; //秒
hour++;
if(hour==60) //分
{
hour=0;
}
}
}
}
}
/*************外部中斷0中斷函數************/
void ex0_int() interrupt 0
{
k++;
if(k==3)
k=0;
if(k==1)
{
TR0=~TR0;
if(TR0==1)
{
hour=0;
minu=0;
sec=0;
}
}
if(k==2)
{
TR0=~TR0;
}
}
/*************外部中斷1中斷函數************/
void ex1_int() interrupt 2
{
s++;
if(s==3)
s=0;
}
/*************定時器1中斷****************/
void timer1_int() interrupt 3 //控制時鍾工作
{
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
if(s==2)
{
if(hour1==hour0 && minu0==minu1)
sounde();
}
b++;
if(b==20)
{
b=0;
sec0++;
if(sec0==60)
{
sec0=0;
minu0++;
if(minu0==60)
{
minu0=0;
hour0++;
if(hour0==24)
hour0=0;
}
}
}
}
/*************鍵盤掃描****************/
void keyscan()
{
if(s==1)
{
if(qingling==0)
{
delay(10);
if(qingling==0)
{
sec1=0;
minu1=0;
hour1=0;
}
}
if(tiaofen==0)
{
delay(10);
if(tiaofen==0)
{
minu1++;
if(minu1==60)
{
minu1=0;
}
while(!tiaofen);
}
}
if(tiaoshi==0)
{
hour1++;
if(hour1==24)
{
hour1=0;
}
while(!tiaoshi);
}
}
else //調整時鍾時間
{
if(qingling==0)
{
delay(10);
if(qingling==0)
{
sec0=0;
minu0=0;
hour0=0;
}
}
if(tiaofen==0)
{
delay(10);
if(tiaofen==0)
{
minu0++;
if(minu0==60)
{
minu0=0;
}
while(!tiaofen);
}
}
if(tiaoshi==0)
{
hour0++;
if(hour0==24)
{
hour0=0;
}
while(!tiaoshi);
}
}
}
/*************顯示函數****************/
void display(uchar hour,uchar minu,uchar sec)
{
h1=hour/10;
h2=hour%10;
m1=minu/10;
m2=minu%10;
s1=sec/10;
s2=sec%10;
P0=0xff;
P2=table[h1];
P0=select[7];
delay(5);
P0=0xff;
P2=table[h2];
P0=select[6];
delay(5);
P0=0xff;
P2=0x40;;
P0=select[5];
delay(5);
P0=0xff;
P2=table[m1];
P0=select[4];
delay(5);
P0=0xff;
P2=table[m2];
P0=select[3];
delay(5);
P0=0xff;
P2=0x40;
P0=select[2];
delay(5);
P0=0xff;
P2=table[s1];
P0=select[1];
delay(5);
P0=0xff;
P2=table[s2];
P0=select[0];
delay(5);
}
/*************鬧鍾函數****************/
void sounde()
{
sounder=~sounder;
}
/*************延時函數****************/
void delay(uchar z)
{
int x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
❸ 單片機c語言編程100個實例
51單片機C語言編程實例 基礎知識:51單片機編程基礎 單片機的外部結構: 1. DIP40雙列直插; 2. P0,P1,P2,P3四個8位準雙向I/O引腳;(作為I/O輸入時,要先輸出高電平) 3. 電源VCC(PIN40)和地線GND(PIN20); 4. 高電平復位RESET(PIN9);(10uF電容接VCC與RESET,即可實現上電復位) 5. 內置振盪電路,外部只要接晶體至X1(PIN18)和X0(PIN19);(頻率為主頻的12倍) 6. 程序配置EA(PIN31)接高電平VCC;(運行單片機內部ROM中的程序) 7. P3支持第二功能:RXD、TXD、INT0、INT1、T0、T1 單片機內部I/O部件:(所為學習單片機,實際上就是編程式控制制以下I/O部件,完成指定任務) 1. 四個8位通用I/O埠,對應引腳P0、P1、P2和P3; 2. 兩個16位定時計數器;(TMOD,TCON,TL0,TH0,TL1,TH1) 3. 一個串列通信介面;(SCON,SBUF) 4. 一個中斷控制器;(IE,IP) 針對AT89C52單片機,頭文件AT89x52.h給出了SFR特殊功能寄存器所有埠的定義。 C語言編程基礎: 1. 十六進製表示位元組0x5a:二進制為01011010B;0x6E為01101110。 2. 如果將一個16位二進數賦給一個8位的位元組變數,則自動截斷為低8位,而丟掉高8位。 3. ++var表示對變數var先增一;var—表示對變數後減一。 4. x |= 0x0f;表示為 x = x | 0x0f; 5. TMOD = ( TMOD & 0xf0 ) | 0x05;表示給變數TMOD的低四位賦值0x5,而不改變TMOD的高四位。 6. While( 1 ); 表示無限執行該語句,即死循環。語句後的分號表示空循環體,也就是{;} 在某引腳輸出高電平的編程方法:(比如P1.3(PIN4)引腳) 代碼 1. #include <AT89x52.h> //該頭文檔中有單片機內部資源的符號化定義,其中包含P1.3 2. void main( void ) //void 表示沒有輸入參數,也沒有函數返值,這入單片機運行的復位入口 3. { 4. P1_3 = 1; //給P1_3賦值1,引腳P1.3就能輸出高電平VCC 5. While( 1 ); //死循環,相當 LOOP: goto LOOP; 6. } 注意:P0的每個引腳要輸出高電平時,必須外接上拉電阻(如4K7)至VCC電源。 在某引腳輸出低電平的編程方法:(比如P2.7引腳) 代碼 1. #include <AT89x52.h> //該頭文檔中有單片機內部資源的符號化定義,其中包含P2.7 2. void main( void ) //void 表示沒有輸入參數,也沒有函數返值,這入單片機運行的復位入口 3. { 4. P2_7 = 0; //給P2_7賦值0,引腳P2.7就能輸出低電平GND 5. While( 1 ); //死循環,相當 LOOP: goto LOOP; 6. } 在某引腳輸出方波編程方法:(比如P3.1引腳) 代碼 1. #include <AT89x52.h> //該頭文檔中有單片機內部資源的符號化定義,其中包含P3.1 2. void main( void ) //void 表示沒有輸入參數,也沒有函數返值,這入單片機運行的復位入口 3. { 4. While( 1 ) //非零表示真,如果為真則執行下面循環體的語句 5. { 6. P3_1 = 1; //給P3_1賦值1,引腳P3.1就能輸出高電平VCC 7. P3_1 = 0; //給P3_1賦值0,引腳P3.1就能輸出低電平GND 8. } //由於一直為真,所以不斷輸出高、低、高、低……,從而形成方波 9. } 將某引腳的輸入電平取反後,從另一個引腳輸出:( 比如 P0.4 = NOT( P1.1) ) 代碼 1. #include <AT89x52.h> //該頭文檔中有單片機內部資源的符號化定義,其中包含P0.4和P1.1 2. void main( void ) //void 表示沒有輸入參數,也沒有函數返值,這入單片機運行的復位入口 3. { 4. P1_1 = 1; //初始化。P1.1作為輸入,必須輸出高電平 5. While( 1 ) //非零表示真,如果為真則執行下面循環體的語句 6. { 7. if( P1_1 == 1 ) //讀取P1.1,就是認為P1.1為輸入,如果P1.1輸入高電平VCC 8. { P0_4 = 0; } //給P0_4賦值0,引腳P0.4就能輸出低電平GND 2 51單片機C語言編程實例 9. else //否則P1.1輸入為低電平GND 10. //{ P0_4 = 0; } //給P0_4賦值0,引腳P0.4就能輸出低電平GND 11. { P0_4 = 1; } //給P0_4賦值1,引腳P0.4就能輸出高電平VCC 12. } //由於一直為真,所以不斷根據P1.1的輸入情況,改變P0.4的輸出電平 13. } 將某埠8個引腳輸入電平,低四位取反後,從另一個埠8個引腳輸出:( 比如 P2 = NOT( P3 ) ) 代碼 1. #include <AT89x52.h> //該頭文檔中有單片機內部資源的符號化定義,其中包含P2和P3 2. void main( void ) //void 表示沒有輸入參數,也沒有函數返值,這入單片機運行的復位入口 3. { 4. P3 = 0xff; //初始化。P3作為輸入,必須輸出高電平,同時給P3口的8個引腳輸出高電平 5. While( 1 ) //非零表示真,如果為真則執行下面循環體的語句 6. { //取反的方法是異或1,而不取反的方法則是異或0 7. P2 = P3^0x0f //讀取P3,就是認為P3為輸入,低四位異或者1,即取反,然後輸出 8. } //由於一直為真,所以不斷將P3取反輸出到P2 9. } 注意:一個位元組的8位D7、D6至D0,分別輸出到P3.7、P3.6至P3.0,比如P3=0x0f,則P3.7、P3.6、P3.5、P3.4四個引腳都輸出低電平,而P3.3、P3.2、P3.1、P3.0四個引腳都輸出高電平。同樣,輸入一個埠P2,即是將P2.7、P2.6至P2.0,讀入到一個位元組的8位D7、D6至D0。 第一節:單數碼管按鍵顯示 單片機最小系統的硬體原理接線圖: 1. 接電源:VCC(PIN40)、GND(PIN20)。加接退耦電容0.1uF 2. 接晶體:X1(PIN18)、X2(PIN19)。注意標出晶體頻率(選用12MHz),還有輔助電容30pF 3. 接復位:RES(PIN9)。接上電復位電路,以及手動復位電路,分析復位工作原理 4. 接配置:EA(PIN31)。說明原因。 發光二極的控制:單片機I/O輸出 將一發光二極體LED的正極(陽極)接P1.1,LED的負極(陰極)接地GND。只要P1.1輸出高電平VCC,LED就正向導通(導通時LED上的壓降大於1V),有電流流過LED,至發LED發亮。實際上由於P1.1高電平輸出電阻為10K,起到輸出限流的作用,所以流過LED的電流小於(5V-1V)/10K = 0.4mA。只要P1.1輸出低電平GND,實際小於0.3V,LED就不能導通,結果LED不亮。 開關雙鍵的輸入:輸入先輸出高 一個按鍵KEY_ON接在P1.6與GND之間,另一個按鍵KEY_OFF接P1.7與GND之間,按KEY_ON後LED亮,按KEY_OFF後LED滅。同時按下LED半亮,LED保持後松開鍵的狀態,即ON亮OFF滅。 代碼 1. #include <at89x52.h> 2. #define LED P1^1 //用符號LED代替P1_1 3. #define KEY_ON P1^6 //用符號KEY_ON代替P1_6 4. #define KEY_OFF P1^7 //用符號KEY_OFF代替P1_7 5. void main( void ) //單片機復位後的執行入口,void表示空,無輸入參數,無返回值 6. { 7. KEY_ON = 1; //作為輸入,首先輸出高,接下KEY_ON,P1.6則接地為0,否則輸入為1 8. KEY_OFF = 1; //作為輸入,首先輸出高,接下KEY_OFF,P1.7則接地為0,否則輸入為1 9. While( 1 ) //永遠為真,所以永遠循環執行如下括弧內所有語句 10. { 11. if( KEY_ON==0 ) LED=1; //是KEY_ON接下,所示P1.1輸出高,LED亮 12. if( KEY_OFF==0 ) LED=0; //是KEY_OFF接下,所示P1.1輸出低,LED滅 13. } //松開鍵後,都不給LED賦值,所以LED保持最後按鍵狀態。 14. //同時按下時,LED不斷亮滅,各佔一半時間,交替頻率很快,由於人眼慣性,看上去為半亮態 15. } 數碼管的接法和驅動原理 一支七段數碼管實際由8個發光二極體構成,其中7個組形構成數字8的七段筆畫,所以稱為七段數碼管,而餘下的1個發光二極體作為小數點。作為習慣,分別給8個發光二極體標上記號:a,b,c,d,e,f,g,h。對應8的頂上一畫,按順時針方向排,中間一畫為g,小數點為h。 我們通常又將各二極與一個位元組的8位對應,a(D0),b(D1),c(D2),d(D3),e(D4),f(D5),g(D6),h(D7),相應8個發光二極體正好與單片機一個埠Pn的8個引腳連接,這樣單片機就可以通過引腳輸出高低電平控制8個發光二極的亮與滅,從而顯示各種數字和符號;對應位元組,引腳接法為:a(Pn.0),b(Pn.1),c(Pn.2),d(Pn.3),e(Pn.4),f(Pn.5),g(Pn.6),h(Pn.7)。 如果將8個發光二極體的負極(陰極)內接在一起,作為數碼管的一個引腳,這種數碼管則被稱為共陰數碼管,共同的引腳則稱為共陰極,8個正極則為段極。否則,如果是將正極(陽極)內接在一起引出的,則稱為共陽數碼管,共同的引腳則稱為共陽極,8個負極則為段極。 以單支共陰數碼管為例,可將段極接到某埠Pn,共陰極接GND,則可編寫出對應十六進制碼的七段碼表位元組數據
❹ 求51單片機c語言教程 pdf
單片機學習方法:
網上單片機資料很多:
http://www.mcufan.com/scom.htm
http://www.51c51.com/cyuyan.htm
http://www.laogu.com/downtop.aspx
上面去搜搜看單片機的學習資料,都有入門級的
另外書店裡面入門級的書也很多,可以買一本(北航出版的比較好)
1.入門時先了解單片機的構造啊原理啊
2.如果沒有實驗板自己搭建單片機的最小平台是比較難的
網上有個叫proteus的軟體,可以用於單片機的模擬,就是說你編的程序可以在這個軟體里運行,效果挺逼真的,可免費下載.
3.單片機的編程軟體有keil或者wave,推薦前者,可以用c語言編寫也可以匯編語言,c語言比較好學,推薦入門學習c語言,(可以買c和匯編語言都有介紹的單片機的書)
4.然後用keil編寫程序在proteus上跑起來,如果你能點亮經典的單片機流水燈實驗,那你就已經入門了
另:單片機的開發板或者最小系統可以買,電路水平高的話也可以自己搭建起來,51單片機大概6塊左右一片自己搭建最小系統很便宜滴,學單片機一定要多做實驗,不過推薦還是從模擬入門,模擬成功了後面的就有方向了.
❺ 幫我解釋下單片機c語言程序
/********
//p1.0波形為:
//1、10ms為周期的方波或持續的高、低電平(與flag、p1.0初始值有關),持續2秒。
//2、持續的高、低電平或10ms為周期的方波(與flag、p1.0初始值有關),持續2秒。
//3、重復1、2步驟。
*********/
#include
unsigned
int
t02s;
unsigned
char
t05ms;
bit
flag;
void
main(void)
{
tmod=0x01;
//初始化定時器。
//可以對照單片機pdf相應章節,按位對比。
//此處設置定時器0工作於「16
位定時器/
計數器,tl0、th0
全用」模式。
th0=(65536-500)/256;
//初始化定時/計數器高位元組。
tl0=(65536-500)%256;
//初始化。。。。。。低位元組。
tr0=1;
//啟動定時器0。
//以下兩句開啟定時器中斷,缺一不可。
et0=1;
//允許定時器0中斷。
ea=1;
//開啟全局中斷。
while(1);
//循環,整個程序交由定時中斷控制。
}
//此處為定時器中斷子程序,每次定時器溢出,進入此段程序。
//根據參數定義,每5ms中斷一次。
//定時器中斷後,計數不停止,但是需要重新初始化定時/計數器。
void
t0(void)
interrupt
1
using
0
{
//重新「初始化定時/計數器」高、低位元組。
th0=(65536-500)/256;
tl0=(65536-500)%256;
//每次中斷,t02s
加
1。
t02s++;
//增加400次後(5ms
×
400
=
2s),flag標志取反。
if(t02s==400)
{
t02s=0;
flag=~flag;
}
//若中斷時flag標志為0,p1.0口取反。
if(flag==0)
{
p1_0=~p1_0;
}
}
❻ 《零基礎學編程零基礎學單片機C語言程序設計》epub下載在線閱讀全文,求百度網盤雲資源
《零基礎學編程》(趙建領)電子書網盤下載免費在線閱讀
鏈接: https://pan..com/s/1k_0seKiMUcr7Awfc1ySuhA
書名:零基礎學編程
作者:趙建領
出版社:機械工業出版社
出版年份:2014-7-1
頁數:504
內容簡介:
單片機C51語言是目前最流行的單片機程序設計語言。本書由淺入深,循序漸進地講解了C51語言的方方面面。本書知識點覆蓋全面、結構安排緊湊、講解詳細、言簡意賅、通俗易懂、實例豐富。內容包括51系列單片機開發環境和流程、程序設計基礎以及編程指南,並給出了一些常用的典型案例。全書分為四篇,共21章,全面詳細地講述了單片機的程序設計基礎、編程指南及應用案例。首先介紹了51系列單片機的基本結構以及單片機的開發概述,其次詳細介紹了單片機程序設計的C51語言,然後結合單片機的硬體資源細致講解了如何應用C51語言進行編程操作,最後結合實際應用,重點分析了在各個領域中常用到的一些典型案例,使讀者更加融會貫通地掌握C51語言,以供讀者在學習和工作中進行參考。在第21章中還介紹了部分常見的面試題及解答,方便讀者做好入職前的准備工作。
❼ 51單片機項目教程 C語言版 高清帶書簽(吳險峰)PDF,哪裡可以下載
《51單片機項目教程C語言版 贈單片機開發板.pdf》(選擇普通下載即可!)
1、找到這本資料,美中不足就是沒有書簽,湊合看吧;
2、手機瀏覽器網頁端登 陸 或 PC電腦端登 陸,即可查看、下載;
3、文件有時效性,若失效或下載問題,留言;
❽ 《零基礎學單片機C語言程序設計》epub下載在線閱讀全文,求百度網盤雲資源
《零基礎學單片機C語言程序設計》電子書網盤下載免費在線閱讀
鏈接:https://pan..com/s/11HzXgEX91f_f9PxykWMhBQ
書名:零基礎學單片機C語言程序設計
出版年份:2012-3
頁數:506
內容簡介:
《零基礎學單片機C語言程序設計(第2版》內容簡介:單片機C51語言是目前最流行的單片機程序設計語言。《零基礎學單片機C語言程序設計(第2版》由淺入深、循序漸進地講解了C51語言的方方面面。《零基礎學單片機C語言程序設計(第2版》知識點覆蓋全面、結構安排緊湊、講解詳細、通俗易懂、實例豐富。內容包括51系列單片機開發環境和流程、程序設計基礎以及編程指南,並給出了一些常用的典型案例。《零基礎學單片機C語言程序設計(第2版》分為四篇,共21章,全面詳細地講述了單片機的程序設計基礎、編程指南及應用案例。首先介紹了51系列單片機的基本結構以及單片機的開發概述,其次詳細介紹了單片機程序設計的C51語言,隨後結合單片機的硬體資源細致講解了如何應用C51語言進行編程操作,最後結合實際應用,重點分析了在各個領域中常用到的一些典型案例,使讀者更加融會貫通地掌握C51語言,以供讀者在學習和工作中進行參考。在第21章中還介紹了部分常見的面試題及解答,方便讀者做好入職前的准備工作。
❾ 《單片機C語言程序設計實訓100例——基於8051+Proteus模擬》完整pdf文檔
已發請查收
❿ 單片機C語言程序設計實訓100例——基於8051+Proteus模擬》完整pdf文檔
已發送至你的郵箱,給個最佳答案吧……