1. 51單片機(jī)概述
51單片機(jī)是對所有兼容Intel 8031指令系統(tǒng)的單片機(jī)的統(tǒng)稱。目前教科書基本都是以早期的MCS-51為原型,講解微機(jī)的原理及其接口技術(shù)的。早期的51單片機(jī)功能都較弱,需擴(kuò)展rom,ram等才能組成一個較復(fù)雜的系統(tǒng)。而現(xiàn)今流行的8位51單片機(jī)都比早期芯片作了較多的功能擴(kuò)展,性能強(qiáng)勁。生產(chǎn)51單片機(jī)的廠家有很多,像atmel的at80c51系列,華邦w78c051系列,宏晶stc80c51系列等,其中***宏晶stc系列51單片機(jī)在國內(nèi)尤為流行。因此,筆者采用宏晶性價比較高的一款51單片機(jī)stc12c5a60s2來作開發(fā)講解。該款51單片機(jī)已經(jīng)是宏昌第N代產(chǎn)品了,其主要特征如下:
1.1. 增強(qiáng)型8051 CPU,1T,單時鐘/機(jī)器周期,指令代碼完全兼容傳統(tǒng)8051;
1.2. 工作頻率范圍:0 - 35MHz,相當(dāng)于普通8051的 0~420MHz;
1.3. 用戶應(yīng)用程序空間60K字節(jié),片上集成1280字節(jié)RAM;
1.4. 通用I/O口36個(以封裝PDIP40為例),可設(shè)置成準(zhǔn)雙向口/弱上拉,推挽/強(qiáng)上拉,僅為輸入/高阻,開漏,每個I/O口驅(qū)動能力均可達(dá)到20mA,但整個芯片最大不要超過55Ma;
1.5. ISP(在系統(tǒng)可編程)/IAP(在應(yīng)用可編程),無需專用編程器,無需專用仿真器 可通過串口(P3.0/P3.1)直接下載用戶程序。
1.6. 內(nèi)部集成MAX810專用復(fù)位電路,2路PWM,8路高速10位A/D轉(zhuǎn)換(250K/S),EEPROM,看門狗,內(nèi)部RC振蕩器,4個定時器,7路外部I/O口中斷等。
尤其需注意的是stc新一代的單片機(jī)都是1T單時鐘/機(jī)器周期,與課本介紹的早期51單片機(jī)是12T單周期是不一樣的,軟件實(shí)現(xiàn)延時時需作注意,其余擴(kuò)充的特殊功能寄存器等請參考stc12c5a60s2的數(shù)據(jù)手冊。
2. 51單片機(jī)編程環(huán)境概述2.1. 代碼編譯工具
51單片機(jī)開發(fā)軟件基本無疑選用Keil C51集成開發(fā)環(huán)境。Keil C51是德國Keil Software公司(ARM公司收購了)出品的51系列兼容單片機(jī)C語言軟件開發(fā)系統(tǒng),提供了包括C編譯器、宏匯編、連接器、庫管理和一個功能強(qiáng)大的仿真調(diào)試器等,目前最新版本已經(jīng)到了uVision5。這里需要說明的是,Keil C51并不完全與ANSI C一樣,Keil C51由于面向的是51單片機(jī),為了更好地詳述51的架構(gòu),Keil C51擴(kuò)展了一些獨(dú)特的關(guān)鍵字,語法描述等。如用code說明為常量放在代碼區(qū),data說明直接尋址區(qū)的變化,sfr聲明特殊功能寄存器等。
圖2.1-1
2.2. 代碼調(diào)試工具2.2.1. Keil自帶仿真調(diào)試器
Keil集成開發(fā)環(huán)境除了編譯鏈接工具外,還自帶了一個功能強(qiáng)大的仿真調(diào)試器。當(dāng)然軟仿真是能夠看到Keil編譯后的匯編代碼,單步調(diào)試可以跟蹤各個寄存器的狀態(tài)變化,但是軟仿真是無法得到真實(shí)的外部輸入狀態(tài)的,如仿真真實(shí)開發(fā)板的按鍵輸入等。代碼調(diào)試時往往需要知道編譯器是否按照要求進(jìn)行代碼的編譯處理,因此,可以讓編譯器輸出它是如何編譯,鏈接文件的,我們可以查看這些了解編譯器編譯c生成的匯編代碼,鏈接的符號,內(nèi)存分配之類的信息。Keil在Target屬性中Listing列可進(jìn)行設(shè)置,如C Compiler Listing選項中是c編譯器輸出選項,點(diǎn)上Assembly Code即輸出c編譯對應(yīng)的匯編代碼,在文件.lst中。C Preprocessor Listing為c編譯器預(yù)處理輸出的信息,AssemblerListing為匯編器輸出的處理信息,LinkerListing為鏈接器輸出的處理信息(在.m51后綴文件中),這包括編譯器對內(nèi)存的分配,各個函數(shù)符號等。通常編譯后的匯編代碼以及代碼的鏈接信息是可以跟蹤查看,以判斷代碼的問題所在。
2.2.2. Proteus仿真軟件
Proteus軟件是英國Lab Center Electronics公司出版的EDA工具軟件,它不僅具有其它EDA工具軟件的仿真功能,還能仿真單片機(jī)及外圍器件。Proteus具有電路仿真功能,能仿真一些最基本電子元器件,如led,數(shù)碼管,鍵盤等,并且是能仿真51單片機(jī)代碼運(yùn)行的。在這里需要說明的是,請務(wù)必不能以仿真電路的效果圖與真實(shí)的硬件開發(fā)混攪,電路仿真軟件往往都是邏輯上的電路連接,完全不能夠用來說明真實(shí)硬件開發(fā)過程。此外,Proteus仿真51單片機(jī)也會有一些邏輯的問題,例如,在硬件上真實(shí)可運(yùn)行的代碼在Proteus上無法仿真達(dá)到效果,修改一下代碼順序即可。總之,對于小代碼,Proteus都是可以勝任的,如果代碼太復(fù)雜,仿真任務(wù)會達(dá)到100%,無法再進(jìn)行仿真了。因此,筆者推薦對于初學(xué)者,可先用Proteus進(jìn)行仿真,進(jìn)行一些最基本的練習(xí),熟悉匯編語言,51單片機(jī)狀態(tài)變化,c語言等,驗(yàn)證自己在51單片機(jī)架構(gòu)學(xué)習(xí)中的一些理解,代碼實(shí)現(xiàn)的理解。學(xué)習(xí)到一定的程度還是需要一塊51開發(fā)板進(jìn)行開發(fā)練習(xí)的,畢竟仿真軟件只能仿真很少部分的外圍,也不能仿真復(fù)雜的硬件及代碼。
圖2.2.2-1
2.3. 代碼燒錄工具
Keil C51編譯生成的hex文件通過STC_ISP工具,連接串口線(一般采用usb轉(zhuǎn)串口線)進(jìn)行下載。代碼燒寫傳輸是通過51單片機(jī)的uart串口信號線Tx,Rx完成的,stc單片機(jī)實(shí)現(xiàn)isp下載是因?yàn)樾酒瑑?nèi)部有廠商的固化代碼,上電復(fù)位后是先執(zhí)行固化代碼,檢測串口有無接收到特定的命令,如果有則進(jìn)入下載模式,與上位機(jī)的isp下載軟件進(jìn)行通信,從而把代碼下載進(jìn)單片機(jī)rom區(qū)。如果沒有有效的串口下載命令,則跳轉(zhuǎn)執(zhí)行真正的用戶代碼,即從0000H處開始執(zhí)行代碼。
圖2.3-1
3. 匯編流水燈入門代碼
筆者認(rèn)為學(xué)習(xí)51單片機(jī)并不是能通過別人的例子用c語言模仿寫出類似的功能即可,必須要對自己的編碼意圖比較清晰,這樣脫離任何例程都是可以自己掌控編寫代碼。因此學(xué)習(xí)51單片機(jī)其實(shí)更準(zhǔn)確來說是學(xué)習(xí)微機(jī)的原理以及接口技術(shù)。而微機(jī)的原理以及接口技術(shù)對于51,arm或其它架構(gòu)的mcu都是通用的,通過51來學(xué)習(xí)微機(jī)原理會涉及到匯編語言,因?yàn)橹挥袇R編語言才能直接描述51內(nèi)部的工作狀態(tài)。筆者以過來人的身份推薦初學(xué)者從51微機(jī)原理,匯編學(xué)起。C語言只是簡化封裝了匯編語言的一些處理過程,學(xué)完匯編,c語言也自然會達(dá)到相應(yīng)的水平。此外,對于軟件出錯調(diào)試,只能跟蹤匯編代碼,查看寄存器的狀態(tài)判斷,而想學(xué)習(xí)arm,從事更深入的嵌入式開發(fā),匯編是必不可少的。
3.1. 硬件原理圖
8個LED連接到P0口,當(dāng)短接CON2后,只要P0口對應(yīng)位為0(低電平),相應(yīng)的LED則被點(diǎn)亮。此外說明一下為什么不用P0對應(yīng)位為1時點(diǎn)亮而用0,因?yàn)閭鹘y(tǒng)51單片機(jī)I/O口是弱上拉的,高電平是輸不出大電流的(相對低電平),高電平拉電流估計是ua級,但低電平灌電流幾個ma是不成問題的。對于stc系列51單片機(jī),I/O口是可以配置成推挽輸出的,這樣高低電平都是可以達(dá)到20ma(手冊數(shù)據(jù))的輸出/吸收電流。
圖3.1-1
3.2. 工程搭建
打開Keil C51,Project-》NewuVersion Project,保存項目后,選擇cpu為Atmel的AT89C52的51單片機(jī),這里需要說明的是,Keil沒有stc系列的51單片機(jī)選擇,只要是51內(nèi)核,在Keil下可選擇任一廠家,任一款51單片機(jī)進(jìn)行代碼編寫,因?yàn)榇a都是兼容的。而不同廠商芯片之間的差異只是rom大小,ram大小,片內(nèi)外設(shè)以及一些廠家特有的特殊功能寄存器的定義。這些都可以在工程中,代碼中重新定義,編譯器會老老實(shí)實(shí)按照要求編譯代碼。選擇了cpu后,會提示是否加入51的啟動代碼到工程中,由于我們編寫的是匯編語言,此處不需要,加入后啟動代碼會與我們自己的匯編代碼定義沖突。這里需要說明的是,啟動代碼是初始化c環(huán)境需要的文件,啟動代碼會設(shè)置c代碼運(yùn)行時的堆棧,清零全局變量,靜態(tài)變量區(qū)等。這就是為什么我們在c文件中定義一個全局變量,默認(rèn)這個變量的初始值為0(C標(biāo)準(zhǔn))。
3.3. 代碼編寫
創(chuàng)建一個新文件,命名為LEDs.ASM,ASM為51匯編文件后綴,保存并加入工程。匯編的一些基本用法在代碼注釋中有說明,更多的匯編用法請google,百度。這里需要說明的是,51單片機(jī)第一條指令位置是在0H,后面相鄰的地址是分配給相應(yīng)的中斷進(jìn)入的,因此第一條指令往往會跳轉(zhuǎn)避開中斷向量地址區(qū)。以下代碼實(shí)現(xiàn)8個LED燈輪流點(diǎn)亮,點(diǎn)亮延時1s,這個匯編代碼是模仿c語言函數(shù)結(jié)構(gòu)化編程的,里面可以類似認(rèn)識到c編譯器大概是如何處理c函數(shù)并生成匯編的,當(dāng)然編譯器匯編質(zhì)量基本是無法達(dá)到人工匯編質(zhì)量的。
ORG 0H ; 表示后面緊跟的那條指令的地址是 0000H
JMP Begin; 無條件跳轉(zhuǎn)到Begin處,以避免中斷向量地址
ORG 0BH ;000BH處為定時器T0的中斷處理入口
JMP T0_INT ; 未使用T0定時器中斷,只供代碼說明
T0_INT:
; 中斷發(fā)生時會自動把當(dāng)前程序運(yùn)行地址PC壓入棧sp
; 中斷處理完后用RETI中斷返回,從棧sp中出棧到PC返回打斷程序處
RETI
LED1 EQUP0.0 ; LED1由P0口第0位控制,以下類似
LED2 EQU P0.1
LED3 EQU P0.2
LED4 EQU P0.3
LED5 EQU P0.4
LED6 EQU P0.5
LED7 EQU P0.6
LED8 EQU P0.7
ORG 100H
Begin:
MOV P0, #0xff ;P0口輸出全1,所有LED滅
LOOP:
; R6,R7為調(diào)用函數(shù)的參數(shù)傳入,參數(shù)為16位,需2字節(jié)
; _Delay_ms對應(yīng)c函數(shù)原型為void Delay_ms(intnCount)
; 共延時nCount * 1ms(12M普通8051),對于stc指令周期1T的
; 延時nCount * (1/6)ms (12M)
CLR LED1 ;直接位清0指令,清除P0口第0位,LED1亮
MOV R7, #(1000& 0xff) ; 參數(shù)為1000,普通8051延時1s
MOV R6, #((1000》》8) & 0xff) ; 16位變量
評論