服務熱線
MCU是微控制器單元(Microcontroller Unit)的縮寫,俗稱單晶片,其原理是在適當降低CPU的頻率和規格的同時,將記憶體、計數器、USB介面、A/D轉換器、UART、PLC、DMA甚至LCD驅動電路等外圍介面整合到單一晶片上,形成晶片級電腦。它可以對不同的應用進行不同的控制組合,例如手機、PC週邊、遙控器、汽車電子、工業步進馬達和機器人手臂控制等。 MCU的結構如圖所示。
為前線醫護人員打氣,送上由衷的敬意。讓你在送禮的同時,也為香港盡一分力。
微控制器發展簡史
微控制器的歷史雖然不長,但發展速度卻非常快速。它的生產和發展通常與微處理器(CPU)的生產和發展同步進行。自美國英特爾公司於1971年首次推出4位元微處理器以來,其發展歷程大致可分為五個階段。以下是英特爾公司微控制器發展歷程的介紹。
1971~1976
微控制器發展的初期階段。 1971年11月,英特爾首次設計了Intel 4004,這是一款4位元微處理器,每個晶片整合了2,000個晶體管,並配備了RAM、ROM和移位暫存器,構成了第一款MCS-4微處理器。隨後,英特爾推出了8位元微處理器Intel 8008,其他公司也相繼推出了8位元微處理器。
1976~1980
低性能微控制器階段。以英特爾於1976年推出的MCS-48系列為代表,它採用單晶片結構,將8位元CPU、8位元並行I/O介面、8位元定時器/計數器、RAM和ROM整合在一顆半導體晶片上。雖然其尋址範圍有限(不超過4KB),沒有串行I/O,RAM和ROM容量較小,中斷系統也相對簡單,但其功能足以滿足一般工業控制和智慧儀表的需求。
1980~1983
高效能微控制器階段。此階段推出的高效能8位元微控制器通常具有串列埠、多層中斷處理系統和多個16位元定時器/計數器。片上RAM和ROM的容量增加,尋址範圍可達64KB。部分晶片還附有A/D轉換介面。
1983年~1980年代末
16位元微控制器階段。 1983年,英特爾推出了高效能16位元微控制器MCS-96系列。由於採用了當時最先進的製造工藝,該晶片的整合度高達120,000萬個電晶體/晶片。
1990s
微控制器在整合度、功能性、速度、可靠性和應用領域等各個方面都在不斷發展,邁向更高的水準。
二
單晶片的分類與應用
根據記憶體類型,MCU 可以分為兩類:無片上 ROM 的和有片上 ROM 的。對於無片上 ROM 的晶片,必須連接外部 EPROM 才能使用(通常為 8031);有片上 ROM 的晶片又分為片上 EPROM 型(典型晶片為 87C51)、片上遮罩 ROM 型(典型晶片為 8051)、片上 Flash 型(典型晶片為 89C51)和其他型別晶片。
根據用途,可分為通用型和專用型;根據資料匯流排的寬度和一次可處理的資料位元組長度,可分為 8 位元、16 位元和 32 位元 MCU。
目前,國內MCU應用最廣泛的領域是消費性電子領域,其次是工業領域和汽車電子市場。消費性電子領域包括家用電器、電視、遊戲機、影音系統等;工業領域包括智慧家庭、自動化、醫療應用以及新能源發電和輸配電;汽車領域包括汽車動力總成和安全控制系統。
三
微控制器的基本功能
對於大多數微控制器(MCU)而言,以下功能是最常用和最基本的。不同MCU對這些功能的描述方式可能有所不同,但本質上是相同的:
1. 定時器(Timer):雖然定時器有很多種類,但可以歸納為兩大類:一類是固定時間間隔的定時器,即定時時間由系統設定,用戶程式無法控制。系統僅提供幾個固定的時間間隔供使用者程式選擇,例如 32Hz、16Hz、8Hz 等。這類定時器在 4 位元單晶片中較為常見,可用於實現時鐘、定時等相關功能。
另一種類型是可程式定時器。顧名思義,這類定時器的定時時間可以由使用者程式控制。控制方法包括:選擇時鐘來源、選擇分頻(預分頻)以及設定預設值。有些微控制器同時具備這三種功能,而有些則可能只具備其中一種或兩種。這種定時器的應用非常靈活,其實際用途也不斷變化。最常見的應用之一是用於實現脈寬調變(PWM)輸出。
由於時鐘來源可以自由選擇,因此這種類型的計時器通常與事件計數器結合使用。
2. I/O 連接埠:任何 MCU 都具有一定數量的 I/O 連接埠。如果沒有 I/O 端口,MCU 就失去了與外界通訊的通道。根據 I/O 連接埠的可配置性,可以將其分為以下幾種類型:
純輸入/純輸出埠:這種類型的I/O埠由MCU硬體設計決定,只能用於輸入或輸出,無法透過軟體進行即時設定。
直接讀寫I/O埠:例如,MCS-51的I/O埠就屬於這種類型的I/O埠。當執行讀取I/O埠指令時,它是一個輸入埠;當執行寫入I/O埠指令時,它會自動成為一個輸出埠。
輸入輸出方向的設定:此類I/O埠的輸入或輸出方向由程式依實際需求設定。應用較為靈活,可實現一些匯流排級應用,例如I2C匯流排、各種LCD、LED驅動控制匯流排等。
對於 I/O 端口的使用,必須牢記一點:對於輸入端口,必須有清晰的電平信號以確保其不會浮空(這可以通過添加上拉或下拉電阻來實現);對於輸出端口,輸出狀態電平必須考慮其外部連接條件,並且應確保在待機或靜態狀態下沒有電流拉取或吸收。
3. 外部中斷:外部中斷也是大多數MCU的基本功能。它通常用於訊號的即時觸發、數據採樣和狀態檢測。中斷方式包括上升沿觸發、下降沿觸發和電平觸發。外部中斷通常透過輸入連接埠實現。如果是I/O端口,其中斷功能僅在設定為輸入時啟用;如果是輸出端口,外部中斷功能將自動關閉(ATMEL的ATiny系列是例外,即使作為輸出端口也可以觸發中斷功能)。外部中斷的應用如下:
外部觸發訊號的偵測:一種是基於即時性要求,例如控制閘流管、偵測突發訊號等;另一種則是為了節省電力。
訊號頻率測量:為了確保不漏掉訊號,外部中斷是理想的選擇。
數據解碼:在遙控應用領域,為了降低設計成本,通常需要使用軟體來解碼各種編碼數據,例如曼徹斯特編碼和PWM編碼的解碼。
關鍵偵測與系統喚醒:對於進入睡眠狀態的微控制器 (MCU),通常需要透過外部中斷來喚醒。最基本的方式是按鍵,按鍵動作會造成電平變化。
4. 通訊介面:MCU提供的通訊介面一般包括SPI介面、UART、I2C介面等,具體描述如下:
SPI介面:這種介面是大多數MCU提供的最基本的通訊方式。其資料傳輸由同步時鐘控制。訊號包括:SDI(串列資料輸入)、SDO(串列資料輸出)、SCLK(串列時脈)和Ready訊號;在某些情況下,可能沒有Ready訊號;此介面可以工作在主模式或從模式下。通俗地說,這取決於誰提供時鐘訊號。提供時脈訊號的一方是主設備,另一方是從設備。
UART(通用非同步收發器):是最基本的非同步傳輸介面。它只有兩條訊號線,Rx 和 Tx。基本資料格式為:起始位元 + 資料位元(7 位元/8 位元)+ 奇偶校驗位元(偶校驗、奇校驗或無校驗)+ 停止位元(1~2 位元)。傳輸一位資料所花費的時間稱為波特率。
對於大多數微控制器(MCU),資料位元長度、資料校驗模式(奇校驗、偶校驗或無校驗)、停止位元長度和波特率都可以透過程式編程靈活設定。此類介面最常用的方法是與PC的串口通訊。
I2C介面:I2C是由飛利浦公司開發的一種資料傳輸協定。它也使用兩個訊號來實現:SDAT(串行資料輸入/輸出)和SCLK(串行時脈)。其最大的優勢在於可以將多個裝置連接到該總線上,並透過位址進行識別和存取;I2C匯流排的另一個主要優勢是可以透過I/O埠使用軟體輕鬆實現。與對速率有嚴格要求的UART介面不同,I2C的資料傳輸速率完全由SCLK控制,可以設定很快也可以很慢。
5. 看門狗(看門狗定時器):看門狗也是大多數MCU的基本配置(某些4位MCU可能不具備此功能)。大多數MCU的看門狗隻允許程式重位,而不能將其關閉(有些MCU在程式燒錄時就已設置,例如Microchip PIC系列MCU),而有些MCU則使用特定方法來決定是否開啟看門狗,例如三星KS57系列。只要程式存取看門狗暫存器,看門狗就會自動開啟,無法再次關閉。一般來說,看門狗的複位時間可以透過程式設定。看門狗最基本的應用是為因意外故障而崩潰的MCU提供自我恢復能力。
四
全球主流微控制器製造商
學習微控制器的技巧
微控制器程式設計
必須防止在中斷和主程式體中同時存取或設定相同的變數或資料。一種有效的防止方法是將此類資料的處理安排在一個模組中,並透過判斷觸發標誌來確定是否對資料執行相關操作;在其他程式體(主要是中斷)中,僅在需要處理資料的地方設定觸發標誌。 ——這樣可以確保資料執行的可預測性和唯一性。
在微控制器應用開發中,程式碼使用效率、抗干擾性能和微控制器可靠性等問題仍然困擾著我們。本文總結了微控制器開發中需要掌握的幾項基本技能。
八
微控制器開發技能
1 如何減少程式中的錯誤
關於如何減少程式錯誤,您首先應該考慮以下在系統運作期間應考慮的超出範圍管理參數。
- 物理參數:這些參數主要是系統的輸入參數,包括激勵參數、採集處理過程中的操作參數和處理結束時的結果參數。
- 資源參數:這些參數主要是系統中電路、裝置和功能單元的資源,例如記憶體容量、儲存單元長度和堆疊深度。
- 應用參數:這些應用參數通常會作為某些微控制器和功能單元的應用條件出現。過程參數:指在系統運作過程中依序變化的參數。
2 如何提高 C 語言程式碼的效率
使用C語言進行微控制器程式設計是微控制器開發和應用領域不可避免的趨勢。如果想要在C語言程式設計中達到最高效率,最好熟悉所使用的C編譯器。首先測試每種C語言編譯方式對應的組合語言語句行數,以便清楚了解其效率。在以後的程式設計中,優先選擇編譯效率最高的語句。由於每個C編譯器都會存在一定的差異,因此編譯效率也會有所不同。對於嵌入式系統而言,優秀的C編譯器產生的程式碼長度和執行時間僅比用組譯語言編寫的相同函數長5%到20%。
對於開發時間緊迫的複雜項目,可以使用C語言,但前提是您必須非常熟悉C語言以及MCU系統的C編譯器。尤其要注意C編譯系統支援的資料類型和演算法。雖然C語言是最常用的高階語言,但不同的MCU廠商擁有不同的C語言編譯系統,尤其是在某些特殊功能模組的操作方面。因此,如果您不了解這些特性,調試過程中會遇到很多問題,導致執行效率低於彙編語言。
防止幹擾最有效的方法是消除乾擾源並阻斷幹擾路徑,但這往往難以做到,因此我們只能檢驗微控制器的抗干擾能力是否足夠強。在提升硬體系統抗干擾能力的同時,軟體抗干擾因其設計靈活、節省硬體資源和可靠性高等優點,正受到越來越多的關注。
微控制器幹擾最常見的現象就是重設。至於程式失控,實際上可以使用軟體陷阱和看門狗機制將程式拉回到重設狀態。因此,微控制器軟體抵抗干擾的關鍵在於妥善處理復歸狀態。
通常,微控制器會配備一些標誌暫存器,用於判斷重設原因;此外,你也可以自行將一些標誌位元儲存在 RAM 中。每次程式重設時,都可以透過判斷這些標誌位元來確定不同的重設原因;你也可以根據不同的標誌位元直接跳到對應的程式。這樣,程式就可以持續運行,使用者在使用過程中不會察覺到程式已被重設。
4 如何測試微控制器系統的可靠性
當微控制器系統設計完成後,不同的微控制器系統產品會有不同的測試項目和方法,但有些項目是必須測試的:
- 測試微控制器軟體功能的完整性
- 開機和關機測試
- 老化測試
- 諸如靜電放電測試(ESD)和情緒釋放測試(EFT)等。
有時,我們也可以模擬人為使用過程中可能造成的損壞。例如,故意用人體或衣物摩擦微控制器系統的接點,以測試其抗靜電能力;或使用高功率電鑽靠近微控制器系統進行操作,以測試其抗電磁幹擾能力。
此外,在開發和應用過程中,我們必須掌握技能並提高效率,以便它能夠用於更廣泛的用途。
九
晶片運作概述
晶片上的操作主要是對晶片內部暫存器的操作。晶片中的暫存器在記憶體中都有各自唯一的位址,操作就是對應位址的操作。在查看晶片時,首先要查看時序圖,然後了解對應的暫存器及其工作原理,定義所需的連接埠(這些連接埠可以透過程式識別),並編寫寫入操作流程和讀取操作流程。
為了在顯示器或印表機上輸出漢字,需要根據圖形符號將漢字設計成點陣,從而得到對應的點陣碼(字碼)。
GB1616.h//------------------ 中文字體資料結構定義 ------------------------//structtypFNT_GB16 //中文字體資料結構 {unsignedcharIndex[3]; //中文字元內部程式碼索引 unsignedchar Msk[32];//點陣程式碼資料 }; /// ... :Xu;寬度×高度(像素):16×16--------------------------------------------------------------------------------*/"Xu",0x10,0x80,0x10,0x80,0x21 ,0x40,0x42,0x20,0x94,0x10,0x1B,0xEC,0x20,0x80,0x60,0x80,0xAF,0xF8,0x 20,0x80,0x22,0xA0,0x24,0x90,0x2A,0x88,0x21,0x00,0x00,0x00,0x00,0x00, 這種結構非常簡單:一部分是內部程式碼,一部分是點陣序列。之前的點陣庫是按照內部程式碼的順序放置的,不需要內部程式碼索引。如果只放置一些漢字,則需要內部代碼索引。 (前面的漢字「Xu」是為了在輸出「Xu」時查找對應的點陣序列。這個點陣序列是我自己寫的。當使用1602顯示時,由於晶片記憶體中已經儲存了英文點陣序列,所以不需要再編寫。)通常,內部程式碼只需要兩個位元組就足夠了。如果需要多用一個字節,只需在末尾添加一個0即可。這樣,就可以直接將漢字字串放入漢字內部程式碼中;
13. 12864 LCD:
每個顯示點對應一個二進位數,1 表示開,0 表示關。儲存這些點陣資訊的 RAM 稱為顯示資料記憶體。要顯示某個圖形或漢字,就需要將對應的點陣資訊寫入對應的儲存單元。
圖形記憶體的位址計數器 (AC) 只會自動將水平位址(X 軸)加一。當水平位址為 0FH 時,它將被重設為 00H。但是,它不會自動將垂直位址加一並帶進位。因此,當連續寫入多個資料時,程式需要判斷是否需要重置垂直位址。
繪圖顯示RAM提供128×8位元組的記憶體空間。修改繪圖RAM時,先連續寫入水平和垂直座標值,然後再向繪圖RAM寫入兩個位元組的資料。位址計數器(AC)會自動將水平位址(X位址)加1。當水平位址為0XFH時,將重設為00H;垂直位址不會自動加1。寫入繪圖RAM時,必須關閉繪圖顯示。
[cpp] view plain copy//顯示中文字元 voiddispString (uchar X, Y,uchar *msg)//哪行是 X,哪列是 Y。 msg 是中文字元 {if(X==0) write_data(*msg++); //顯示中文字元}}////////////////////////////////// /////////////////////////// i,j;//*******顯示螢幕上半部內容設定 for(i=0;i<32;i++)//螢幕上半部32列位址 { write_com(0x80 + i);//設定垂直位址 VERTICALADD write_com(0x80);//設定水平位址 HORIZONTALrite ADDfor(jd=0dj++djd); //************在螢幕下半部顯示內容設定 for(i=0;i<32;i++) //{ write_com(0x80 + i); //設定垂直位址 VERTICALADD write_com(0x88); //設定水平位址 HORIZONTAL ADD for(j=0;j<16;j++){wder_data(++adder); 在 C 語言中,系統會自動為定義的變數分配空間,變數的位址就是變數名。透過這個名稱,可以從記憶體中檢索數據,也可以透過計算來獲得新的數據。然而,在組合語言中,程式設計師需要定義儲存空間,並將資料傳送到累加器進行計算。每一步都需要程式設計師的操作。而在 C 語言中,這些過程都是由編譯器自動完成。
① 在微控制器C語言中,變數的記憶體分配是如何進行的?編譯器是否會在編譯過程中智慧地添加分配和回收程式碼?關鍵在於,我編寫的程式如何確保不會出現記憶體溢位錯誤?如果我進行遞歸操作,那麼記憶體需求很難自行計算。
如果變數過多,編譯器會提示資料段過大。為避免記憶體溢出錯誤,主要考慮的是棧溢出,而這取決於經驗。
微控制器可以定義位元變量,但不能定義位數組。用C語言編寫程式碼看似簡單,但實際上會產生大量的程式碼。用於控制的微控制器幾乎不使用浮點運算,這不僅速度慢,而且繁瑣並佔用空間。如果是DSP晶片,擁有合適的硬體結構會更好。
公司電話號碼:+86-0755-83044319
傳真:+86-0755-83975897
郵箱:1615456225@qq.com
QQ:3518641314 李經理
QQ:332496225 邱經理
地址:深圳市龍華新區民治大道1079號展濤科技大樓C座809室




粤公网安备44030002007346号