閱讀相關系列章節
單片機關鍵技術基礎詳解(一)
單片機關鍵技術基礎詳解(二)
? ? ? ?作為經驗豐富的嵌入式系統的開發人員,既有大型系統的經驗(波音777飛行控制)又有小型單人項目(筆記本電腦熱風扇控制)經驗,應避開單臺機器或語言的具體利弊,將更多的時間花在應用程序設計和構建上,并且獨立于語言和CPU內核。這方面部分來自于對類似系統的工作,只是“再用于“下一個項目(雖然要求完全不同,并且切換到了微控制器)。我也參與過由幾個獨立的設備組成的系統,每個設備都有自己的程序和微控制器,各部分經常在不同的子項目之間來回使用:某個子項目中的編碼器可能是另一個項目的測試器,或當完成自己的子項目的編碼后,會投入另一個子項目,以幫助完成項目。缺乏基于系統的設計方法會覺得這些情況很困難,難以按照計劃完成。通過獨立的系統設計可避免機器依賴性,讓設計復用和基于團隊的設計不僅成為可能,而且加大了成功機會(如以后的增加要求)。
最近的一個項目是我更加疑慮,幾乎每次都是,必須使設計適應(有時根本就是)所選的語言和機器。我們已經以某個系統架構和設計開始,只是按一般方式考慮了集成微控制器及其外圍設備,我們只關注我們需要什么并不關心它是如何實現的,至少我們是這么認為的。我們選擇了一些非常專業外設的新器件,并且開始編碼時,發現需要花費大量的時間來了解如何構建硬件,以及如何根據需求最好地利用。當我們發現好的方式來利用設備的某特征時,設備的此特點通過代碼嵌入了系統級設計。我們已不再堅持我們的系統,不得不讓機器和具體操作改變了系統設計。于是只好停下來檢查問題和實施方案,通過系統重新設計分離出依賴機器的“修復”,然后將“修復”融入系統四周的“包裝”中。
當設計某個應用時(甚至單一微控制器),以調溫器為例,有一個創建好了的系統級視圖,描述了硬件和實施某種方式的應用程序。該視圖用于多種用途,例如,可作為與高層管理人員或另一個小組進行交流的工具(不希望知道所有細節),如自動化測試人員。如果僅將其視為“視圖”而不是系統設計,并且實施不是從系統設計自上而下,而是將其用作起點,則問題就出現了。考慮圖1所示的溫控系統。

?
顯示系統相對簡單,卻反映了許多嵌入式產品設計。在“溫度傳感”部分包含溫度輸入,其輸出進入主系統“控制邏輯”部分。“控制邏輯”的其它輸入是標記“用戶輸入”的部分,代表人機接口,大概設置了恒溫器的溫度調節。“控制邏輯”部分根據這些輸入確定了如何命令供暖、通風和空調(HVAC)系統,以保持恒溫器設定的溫度,將這些命令發送到“熱與冷命令”部分。最后一個部分是“顯示輸出”,將當前系統狀態傳遞到用戶。當前系統狀態的一部分是恒溫設置,另一部分是最新的溫度讀數,最后部分是正在執行的命令,以迫使溫度返回恒溫設置(即加熱、冷卻和/或打開或關閉風扇)。
正如前面所述,這是一個直接和相對簡單的應用,非常簡單以至于不需要考慮系統,而是很自然地跳到實施(我相信大多數讀者甚至可以說出最喜歡的微控制器供應商的型號)。可以是用于次級市場的高端PC游戲圖形系統的墻恒溫器或溫度管理裝置。用于墻恒溫器的微控制器的具體實施基本不需用于圖形系統。重點是,無論設計顯得多么簡單,都有很好的理由先設計系統,然后實現它。將其盡量設計成適合通常應用。
開始時,需要考慮理想的系統設計,然后生成layers,在理想的系統和實際實施之間構建wrappers(有時是雜亂的)。“控制邏輯”部分作為框圖的核心是有充分理由的-因為它是系統的內核。周圍的每個部分都服務于“控制邏輯”部分,要根據需要提供“服務”。
應自“溫度傳感器”部分開始。其理由是獲得當前/瞬時溫度,并以一致的格式提供出來。從“控制邏輯”的角度來看,其作用是“獲取溫度”,并以格式化的值(xxx.xx攝氏度)返回當前溫度值。溫度傳感器部分的硬件wrappers將包括實施中任何需要用來將原溫度傳感輸入“翻譯”成預期格式的攝氏度。這可能意味著需要考慮獲得新讀數的最佳時間,如果溫度讀數中有太多的噪音(無論何種原因),應添加過濾算法,并且如果溫度硬件出現故障,應采用決策邏輯。重點是,“溫度傳感器”部分的輸出是什么,而且傳遞到“控制邏輯”應為理想的溫度,所有的噪音,實際隱藏的細節都應很容易的由wrapper代替。
如果設計需要從系統中三個不同的點測量三個溫度值(對于計算機箱內的計算機很普遍)怎么辦?處理這三個溫度是控制邏輯問題(例如,何時多路輸出也將受到控制)?如果是這樣,從1個溫度轉換到3個溫度首先意味著“溫度傳感器”部分要更新,以提供3個溫度和為每個溫度實施創建的wrappers(允許多種類型的輸入),然后控制邏輯也因為多個輸出而更新。這可能意味著三個不同的“GetTemperature_n”服務或需要更新服務以確定是識別哪個溫度的參量。
如果三個溫度僅僅用于加權以得到一個“更真實”的系統溫度,控制邏輯不需要改變,只需將含wrappers的溫度傳感塊以統一格式輸入這三個溫度,然后通過一個wrappers來對這三個溫度進行加權,生成控制邏輯所需的單一溫度。這種方法易于包含來自不同的溫度輸入(例如,圖形處理器的二極管結測量和連接到PCB的模擬熱敏電阻),因為wrappers將系統邏輯與硬件隔離開。
讓我們以兩個不同的實現例子驗證這個論點:一個用于墻恒溫器,另一個是顯卡上的溫度控制子系統。首先對于墻恒溫器,如圖2所示,假定使用基于8051的賽普拉斯PSoC3設備。“溫度傳感器”部分的硬件由連接到ADC(16位Δ-Σ轉換器)的熱敏電阻組成。“用戶輸入”部分的硬件由5個常開按鍵開關組成,一邊連接到電路接地端,另一邊連接到含內部上拉電阻的5輸入數字端口。“熱和冷命令”模塊的硬件部分包括三個功率場效應管,由配置為開漏低輸出的3輸出端口驅動。最后,“顯示輸出”塊的硬件實現是串行字符液晶顯示器,能夠根據需要顯示字母數字字符串。

?
對于第2個應用,即顯示卡,將用戶輸入從離散開關變為I2C基于寄存器的從接口(由主CPU而不是人類直接控制),并將串行LCD顯示變為SPI-從控制顯示器(使用一系列的寄存器和指令,可能是安裝在主計算機外殼前面板上的遠程變頻顯示,未安裝到顯卡上)。溫度輸入和HVAC命令保持不變。圖3顯示了早期實施的變化,假定使用基于8051的賽普拉斯PSoC3設備。

?
用戶輸入的兩種實現均可服務于“GetThermostatSetting”、“IsHeaterEnabled”、“IsCoolerEnabled”和“IsFanOn”。對于第一個墻恒溫器應用,“用戶輸入”將數字端口包裝到所列的服務中,當設備被調用時,提供端口的實時讀數(一種可能的實施)。對于另一個應用,基于I2C從機的實現,相同的服務將來自I2C主機寫入的寄存器的最新值返回到“控制邏輯”部分,也許經常返回也許僅在上電時返回。并且這些實現還有很多其它特點,包括用作切換鍵的墻上按鈕開關而不是瞬間讀數,甚至在“用戶輸入”部分的wrappers深層進行邊沿觸發異步處理。
綜合上述的關鍵是:系統設計隱藏了硬件細節;硬件和實施細節被系統設計包裝并隱藏。通過外端設計(即代碼)的實施細節,可以保護這些應用實現時避免分裂,可以做到個性化的設計,權衡利弊,保證項目成功交付,并仍然能夠提供可復用性和組設計。不要讓賣方牽引注意力——先設計系統,然后加強保護系統設計實現細節不被抄襲。
二、單片機設計與KeilC編程總結
1基本原則
質量是關鍵。沒有人會對很差的工作感到滿足。當完成高質量的工作時,你會為此而感到驕傲。不管你是否知道,你都會因為你的高質量工作而得到信譽。因此,要想為自己所做的事感到驕傲,就需要建立個人標準,并為達到這一標準而努力奮斗。在達到這些標準時,再提高標準并繼續努力。挑戰自己去完成更優良的工作,你將會為自己的成就而感到驚訝。
1.1 了解單片機的能力
【規則1】設計滿足要求的最精簡的系統。
正確估計單片機的能力,知道單片機能做什么,最大程度的挖掘單片機的潛力對一個單片機系統設計者來說是至關重要的。我們應該有這樣一個認識,即單片機的處理能力是非常強大的。早期的PC 機,其CPU(8086)處理能力和8051 相當,卻能處理相當復雜的任務。單片機的能力的關鍵就在軟件設計者編寫的軟件上。只有充分地了解到單片機的能力,才不會做出“冗余”的系統設計。而采用許多的外圍芯片來實現單片機能實現的功能。這樣做即增加了系統成本,也可能會降低了系統的可靠性。
1.2 系統可靠性至關重要
【規則2】使用看門狗。
看門狗電路通常是一塊在有規律的時間間隔中進行更新的硬件。更新一般由單片機來完成,如果在一定間隔內沒能更新看門狗,那看門狗將產生復位信號,重新復位單片機。更新看門狗的具體形式多是給看門狗芯片相關引腳提供一個電平上升沿或讀寫它的某個寄存器。使用看門狗電路將在單片機發生故障進行死機狀態時,重新復位單片機。當前有多種看門狗的芯片,如MAXIM 公司的MAX802,MAX813等。而且,有好多種單片機中本身就集成有看門狗。一個外部的看門狗是最好的,因為它不依賴于單片機。如果可能的話,看門狗更新程序不應該放在中斷或是子程序中,原則上應該放在主程序中。我曾經見過一個工程師,他所調試的程序在運行時偶而會引起看門狗的復位動作,于是他干脆在每10ms 就中斷一次的時鐘中斷程序中清看門狗。我相信他也知道使看門狗失去作用,可他卻沒有不是去查明引起這個現象的真正原因。因此,我想提醒大家:不論什么理由,絕對不要忽略系統故障的真正原因。高質量的產品來自于高素質的工程師,高質量的產品造就高素質的工程師。
【規則3】確定系統的復位信號可靠。
這是一個很容易忽略的問題。當你在設計單片機系統時,你腦中有這個概念嗎?什么樣的復位信號才是可靠的嗎?你用示波器查看過你設計的產品的復位信號嗎?不穩定的復位信號可能會產生什么樣的后果?你有沒有發現過你所設計的單片機系統,每次重新上電啟動后,數據變得亂七八糟,并且每一次現象并不相同,找不出規律,或者有時候干脆不運行,或者有時候進入一種死機狀態,有時候又一點事都沒有正常運行?在這種情況下,你應該查一下你的系統的復位信號。一般在單片機的數據手冊(Datasheet)中都會提到該單片機需要的復位信號的要求。一般復位信號的寬度應為。復位電平的寬度和幅度都應滿足芯片的要求,并且要求保持穩定。還有特別重要的一點就是復位電平應與電源上電在同一時刻發生,即芯片一上電,復位信號就已產生。不然,由于沒有經過復位,單片機中的寄存器的值為隨機值,上電時就會按PC 寄存器中的隨機內容開始運行程序,這樣很容易進行誤操作或進入死機狀態。
【規則4】確定系統的初始化有效。
系統程序開始應延時一段時間。這是很多單片機程序設計中的常用方法,為什么呢?因為系統中的芯片以及器件從上電開始到正常工作的狀態往往有一段時間,程序開始時延時一段時間,是讓系統中所有器件到達正常工作狀態。究竟延時多少才算合適?這取決于系統的各芯片中到達正常工作狀態的時間,通常以最慢的為準。一般來說,延時20-100 毫秒已經足夠。對于系統中使用嵌入式MODEM 等“慢熱”型的器件來說,則應更長。當然,這都需要在系統實際運行中進行調整。
【規則5】上電時對系統進行檢測。
上電時對系統中進行檢測是單片機程序中的一個良好設計。在硬件設計時也應該細細考慮將各個使用到的芯片、接口設計成容易使用軟件進行測試的模式。很多有經驗的單片機設計者都會在系統上電時(特別是第一次上電時)進行全面的檢測,或者更進一步,將系統的運行狀態中分為測試模式和正常運行模式,通過加入測試模式對系統進行詳細的檢測,使得系統的批量檢測更為方便容易。另外要注意的是,一個簡單明了的故障顯示界面也是頗要費得心思的。比如:系統的外部RAM(數據存儲器)是單片機系統中常用的器件。外部RAM 如果存在問題,程序通常都會成為一匹脫韁的野馬。因此,程序在啟動時(至少在第一次上電啟動時)一定要對外部RAM 進行檢測。檢測內容包括:1)檢測RAM 中的單元。這主要通過寫入和讀出的數據保持一致。
2)檢測單片機與RAM 之間的地址數據總線。總線即沒有互相短路,也沒有連接到“地”上。另外,很多芯片,都提供了測試的方法。如串行通信芯片UART,都帶環路測試的功能。
【規則6】按EMC 測試要求設計硬件。
EMC 測試要求已經成為產品的必需。有很多的文章關于這方面的。
1.3 軟件編程和調試
【規則7】盡可能使用Small 模式編譯
對比起Large 模式和Compact 模式,Small 模式能生成更為緊湊的代碼。在Small模式下,C51 編譯器將沒有使用關鍵詞,如idata、pdata、xdata 特殊聲明的變量通通放在data 單元中。在編程中,對于在的數據區,可以指定放在外部存儲器中。
【規則8】在仿真前做好充分的準備
單片機硬件仿真器給單片機開發者帶來了極大的方便,同時也很容易造成人的依賴性。很多時候,沒有仿真器卻能促使工程師寫出更高質量的程序。也許在硬件仿真調試之前,下面準備工作將會對你有用:
1)程序編完后,對代碼仔細逐行檢查。檢查代碼的錯誤,建立自己的代碼檢查表,對經常易錯的地方進行檢查。檢查代碼是否符合編程規范。
2)對各個子程序進行測試。測試的方法:用程序測試程序,編制一個調用該子程序的代碼,建立要測試子程序的入口條件,再看看它是否按預期輸出結果。
3)如果代碼有修改,再次對代碼進行檢查。
4)有可能的話,進行軟件仿真——Keil C 的軟件仿真功能十分強大。軟件仿真可以防止因硬件的錯誤,如器件損壞、線路斷路或短路,而引起調試的錯誤。
5)開始硬件仿真。
【規則9】使用庫函數
重用代碼,尤其是是標準庫的代碼,而不是手工編寫你自己的代碼。這樣更快、更容易也更安全。KeilC 中提供了多個庫函數,這些庫函數的用法在KeilC 的幫助文件中有詳細的描述。
【規則10】使用const。
這一點在很多經典的關于C 和C++的書籍中是必談的要點。在《Exceptional C++》一書中,對這點有很精彩的描述,現摘錄如下:“沒有正確的安全意識的槍手在世界上是不可能活的很長的。const 觀念不正確的程序員也是一樣和沒有時間戴緊帽子的正確,沒有時間檢查帶電電線的電工一樣不會活的很長。”在C 語言中,const 修飾符表示告訴編譯器此函數將不會改變被修飾的變量的指向的任何值(除了強制類型轉換)。當把指針作為參數傳遞時,總是合適地使用const,不僅可以防止你無意中錯誤的賦值,而且還可以防止在作為參數將指針傳遞給函數時可能會修改了本不想改變的指針所指向的對象的值。如:
const int num= 7;
num = 9; //有/可能得到編譯器的警告。
const char *ptr,則表示該指針所指向的內容不會被改變,如果在程序中被發生對其賦值的操作,編譯時將出錯誤提示。如:
const char *ptr = “hello”;
*ptr = `H`;//錯誤,所指內容不可改變也可將const 放在星號后面來聲明指針本身不可改變。如:
char* const ptr;
ptr++; //錯誤,指針本身不可改變
也可同時禁止改變指針和它所引用的內容,其形式如下: const char* const ptr;
【規則11】使用static
static 是一個能夠減少命名沖突的有用工具。將只在一個模塊文件中的變量和函數使用static 修飾,將不會和其他模塊可能具有相同名稱的函數和變量在模塊連接時不會產生名稱沖突。一般來說,只要不是提供給其它模塊使用的函數,和非全局變量,均應使用static 修飾。將子程序中的變量使用static 修飾時,表示這個變量在程序開始時分配內存,在程序結束時釋放,它們在程序執行期間保持它們的值。如:
void func1(void)
{
static int time = 0;
time++
}
void func2(void)
{
static int time = 0;
time++;
}
兩個子程序中的time 變量使用static 修飾,所以它們是靜態變量,每調用一次time將進行加1,并保持這個值。它們的功能與下面程序相似:
int time1 = 0;
int time2 = 0;
void func1(void)
{
time1++
}
void func2(void)
{
time2++;
}
我們可以看出,使用static 修飾后,模塊中的全局變量減少,使得程序的更為簡單。
【規則12】不要忽視編譯器的警告。
編譯器的給出的警告都是有的放矢,在沒有查清引起警告的真正原因之前,不要忽視它。
【規則13】注意溢出問題,寫安全的代碼。
1.4 KeilC 編程
【規則14】深入了解你所用的工具。
仔細查看KeilC 附帶的幫助文件,你能找到你期待已久的東西。KeilC 是當前最好用的單片機開發軟件。要充分利用該軟件的功能,就必須對它深入的進行了解。
【規則15】不要使用語言的冷僻特性,并且記住,耍小聰明會貽害無窮。最重要的是編寫你理解的代碼,理解你編寫的代碼,你就可能會做得很好。
2 推薦書目
要成為一個優秀的單片機系統產品設計工程師,興趣、熱情、責任心至關重要。
2.1 單片機技術學習
《微機原理及應用(從16 位到32 位) 》戴梅萼等著清華大學出版社。學校教材,也是當年我學習單片機的啟蒙書。
2.2 C51 編程學習
《單片機高級語言C51 Windows 環境編程與應用》作者:徐愛鈞彭秀華電子工業出版社。這本書幾乎覆蓋了C51 編程的方方面面,最新版本對當前使用最廣的keilC 也有很詳細的講述。對于剛學C51 編程的同志,本書是上上之選,強力推薦。比起現今書市上的所謂什么“C51 編程圣經”之類的書強得多。
2.3 C 語言編程必讀
《C 陷阱與缺陷》Andrew Koenig 著
《C 專家編程》Peter Van Der Linden 著
C 語言開發技術經典之作,C 程序員必讀之書,數十年來經久不衰。如果你想對C語言全面的掌握,真正了解C 語言的精髓,這兩本書是必讀之作。由人民郵電出版社出版的中文譯本也還不錯。
2.4 程序設計技術方面
《數據結構》 嚴蔚敏 清華大學出版社。清華大學出版社的教材質量穩定,中規中矩,價格相對來說也便宜一點。
《程序設計實踐》Brian W. Kernighan Rob Pike 著;《代碼大全》
三、MCS-51單片機終端及外中斷軟件編程
?
MCS-51單片機有多個中斷源,以8051為例,有5個中斷源,兩個外中斷、兩個定時中斷和一個串行中斷,這一節我們討論外中斷軟件編程。
外中斷是由外部原因引起的中斷,有兩個中斷源。即外中斷0(INT0)和外中斷1(INT1),中斷請求信號由引腳P3.2(INT0)和P3.3(INT1)輸入。
外中斷請求信號有兩種方式,一是電平方式,二是脈沖方式。可通過有關控制位的定義進行規定。
電平方式為低電平有效,只需在單片機的(INT0)和(INT1)中斷請求輸入端采樣到有效的低電平時,就會激活外部中斷。
脈沖方式則在脈沖的后負跳沿有效,即在相鄰兩個機器周期對中斷請求引入端進行采樣中,如前一次為高,后一次為低即為有效中斷請求。這就要求在這種中斷方式,中斷請求信號的脈沖寬度必須大于一個機器周期,以保證電平變化能被單片機采樣到。
定時器控制寄存器 (TCON)
外中斷請求方式的控制位在定時控制寄存器TCON(地址為88H)中的位88(IT0)和位8A(IT1)兩個位,當IT0(IT1)=0為電平方式,IT0(IT1)=1為脈沖方式。同時在此寄存器中的位89(IE0)和位8B(IE1)為外中斷請求標志位,當CPU采樣到INT0(INT1)端出現有效中斷請求時,此位由硬件置1。在中斷響應完成后轉向中斷服務時,再由硬件自動清0。
下面我們對有關控制位作說明:
·EA——中斷允許總控制位,EA=0,中斷總禁止,禁止所有中斷。EA=1,中斷總允許,總允許位打開后,各中斷的允許或禁止由各中斷允許控制位設置決定。
·EX0(EX1)——外部中斷允許控制位,EX0(EX1)=0,禁止外部中斷。EX0(EX1)=1,允許外部中斷。
·ET0(ET1)——定時/計數中斷允許控制位,ET0(ET1)=0,禁止定時/計數中斷。ET0(ET1)=1,允許定時/計數中斷。
·ES——串行中斷允許控制位,ES=0,禁止串行中斷。ES=1,允許串行中斷。
中斷的允許和禁止就是中斷的開放和關閉,中斷允許就是開放中斷,中斷的禁止就是關閉中斷。從以上說明我們可看出,MCS-51的中斷允許是通過兩級控制的,以EA位作為總中斷控制位,以各中斷控制位為分控制位。當總中斷位為禁止狀態時,不管分控制位是允許或禁止整個中斷都是禁止的。只有當EA=1(允許)時,才能由各分控制位設置各自的中斷允許與禁止。MCS-51單片機復位后,IE=00H,因此中斷處于禁止狀態。
值得一提的是:單片機中斷響應后不會自動關閉中斷,因此在轉入中斷服務程序后,應由軟件指令禁止中斷。
中斷優先級控制寄存器 (IP)
MCS-51的中斷優先級控制比較簡單,只設置了高、低兩個級別的有限級,各中斷源的優先級別由優先寄存器(IP)進行控制。
·PX0——外中斷0(INT0)優先級控制位。
·PT0——定時中斷0(T0)優先級控制位。
·PX1——外中斷1(INT1)優先級控制位。
·PT1——定時中斷1(T1)優先級控制位。
·PS ——串行中斷(ES)優先級控制位。
控制位=0,優先級為低。控制位=1,優先級為高。
中斷優先級是為了中斷嵌套服務的,控制原則為:
(1) 低優先級中斷不能打斷高優先級的中斷服務,而高優先級的中斷服務可以打斷低優先級的中斷服務。
(2) 同級的中斷已經響應,其他中斷將被禁止。
(3) 如果同級的多個中斷源同時出現,CPU將按查詢次序確定哪個中斷被響應,次序為:外中斷0→定時中斷0→外中斷1→定時中斷1→串行中斷。
中斷控制寄存器的狀態設置
在應用中,我們可以通過相應的控制寄存器來使用中斷系統,因此從使用的角度上看,這些控制寄存器是面向用戶的。這些控制寄存器既可以進行字節尋址,也可以進行位尋址,也就是對位狀態的尋址既可以使用字節操作指令也可以使用位操作指令,例如:
MOV IE,#81H
如使用位操作指令,也可寫為:
SETB EA
SETB EX0
對于一般的外中斷程序,我們可以這樣安排:
ORG 0000H ;主程序入口
START: AJMP MAIN
ORG 0003H ;外中斷程序入口
AJMP INT00
MAIN: MOV IE,#81H ;允許總中斷和外中斷
…… ;主程序
……
……
INT00: …… ;外中斷服務程序
……
RETI ;中斷返回
?
四、STC89C52最小系統
自己動手做了一個STC89C52單片機最小系統板,下面是實物圖!下面是原理圖,拿出來僅供參考.
單片機部分
單片機與PC機接口部分
測試部分
現在就做的過程中遇到的問題說一下.
1. 線路連接問題: 這個問題只要仔細一點應該沒有什么問題.
2.電容選擇問題: 在這里很容易出問題,一般要選好一點的電容,具體參數一定要根據電平轉換芯片類型而定. 我在這里選的是電解電容.剛開始用的是瓷片電容,發現不太好用,程序下載不進去,所以推薦大家用好一點的電容
3.電平轉換芯片最好用進口的,國內的不怎么好用.據說容易出問題(自己沒有用過,我用的是美信公司的).可以通過測第2腳和第6腳的電壓來確定電路是否正常工作,一般第2腳電壓為+8.6伏到+10伏之間,第6腳為-8.6伏到-10伏之間.
4.還有當時犯了一個很幼稚的錯誤,就是沒有搞清接口是公頭還是母頭(公頭的輸出線正好是母頭的輸入線)
5.下載的時候先點下載,然后再給單片機上電!
評論