本節書摘來自異步社群《例說8051:單片機程式設計案例教程》一書中的第1章,第1-2節,作者 張義和,陳敵北,更多章節内容可以通路雲栖社群“異步社群”公衆号檢視。
“8051”源自intel公司的mcs-51系列,而目前所使用的8051并不是都采用intel公司所生産的晶片,而多采用其他廠商所推出的相容晶片,如atmel公司的89c51/89s51系列,其價格低廉,品質穩定,開發工具齊全,廣為學校或教育訓練機構所歡迎。
在此,先介紹8051的基本結構,包括基本結構、引腳、基本電路及51系列等,其中很多知識最好要“記”在腦中,本書也會提供很多快速記憶的技巧,讓讀者能在極短的時間裡記住40個引腳、基本電路等。
8051單片機發展至今,雖然有許多廠商各自開發不同的相容晶片,但其基本結構并沒有多大的變動,标準的8051結構圖如圖1-3所示。現說明如下:

上述結構中,最好能把加波浪線的知識“記憶”下來。
1 8位指的是微處理器内部資料總線、寄存器的寬度是8位。比如計算機(pc)所用的cpu:第一代pc的cpu 8088/8086到第二代pc的cpu 80286都是16位cpu,而從80386到pentium 4都是32位的cpu。盡管如此,目前所采用的單片機仍是以8位為主,隻有在特殊場合才會采用16位的單片機,如8096等。
2 通常存儲器的操作是以位元組(b)為機關,“可位尋址”是通路存儲器、寄存器或輸入/輸出端口時,可指定其中的一個位,例如要指定p0輸入/輸出口中的bit 1,則指定為p0.1即可,如圖1-4所示。
89c51的封裝方式有3種,除了這3種外,89s51的封裝方式還有pdip42封裝,說明如下。
qfp封裝
89c51/89s51的pqfp或tqfp(thin plastic gull wing quad flatpack)封裝為扁平的44個引腳表面貼片式封裝,這種封裝的體積很小,成本較低,是目前主流的商用晶片;但不适合學校或教育訓練機構使用。如圖1-5所示,在俯視圖中,左上方有個圓形記号“○”的是第1腳,然後按逆時針排序,分别為2~44腳,其中包括3個空腳,而相鄰兩個引腳的間距為0.8mm,晶片厚度為1.2mm。
plcc封裝
plcc(plastic j-leaded chip carrier)封裝也是89c51/89s51常用的封裝方式,這也是一個44個表面貼片式引腳(smt)的封裝,其中包括4個空引腳,其引腳編号與qfp封裝非常類似(相容),如圖1-6所示,在俯視圖裡,上面中間有個圓形記号“○”的是第1腳,然後按逆時針排列,分别為2~44腳,相鄰兩引腳的間距為0.05英寸(即1.270mm),晶片高度(含引腳)為4.572mm。
一般來說,采用這種面貼片式封裝的部件可直接貼裝于電路闆上,而不必鑽孔(其引腳如圖1-7所示)。在研發、實驗或教學時,可利用插座,以縮短開發與生産的時間。
直插式封裝pdip42
89s51的直插式封裝有兩種,第一種是42個引腳雙列直插式的封裝(plastic dual inline package),簡稱pdip42。第二種是40個引腳雙列直插式封裝,與89c51、mcs51相容,稍後說明。如圖1-8所示,在雙列直插式封裝裡,俯視圖左上方有個三角形記号“△”是第1腳,然後按逆時針排列,分别為2~42腳。相鄰兩引腳的間距為1.588mm,長度為36.96mm,而兩排引腳的間距為13.97mm,晶片厚度為4.826mm(不含引腳),與一般的面包闆或ic插座不符。
直插式封裝pdip40
89c51/89s51的第二種直插式封裝為40個引腳雙列直插式的pdip40,這種封裝與mcs-51完全相容。pdip40與pdip42除引腳數量不同外,尺寸差異也很大,pdip40剛好可插在面闆或40個引腳的插座上,如圖1-9所示,俯視圖左上方有個三角形記号“△”是第1腳,然後按逆時針排列,分别為2~40腳。相鄰兩引腳的間距為0.1英寸(即2.540mm),長度為52.578mm,而兩排引腳的間距為0.6英寸(即15.875mm),晶片厚度為4.826mm(不含引腳),特别适合學校、教育訓練機構使用。不過,由于直插式封裝體積較大,電路闆制作成本較高,已很少用作商用晶片。
本書将以采用pdip40封裝的89s51為探讨對象,當然,要學習8051,筆者強烈建議先将其引腳“背”下來,而要背40個引腳卻有點傷腦筋,是以在此提供一些技巧,讓大家輕松記住這40個引腳。
電源引腳
幾乎所有ic都需要接電源,而8051的電源引腳與大部分數字ic的電源引腳類似,右上角接vcc,左下角接gnd。是以8051的40腳為vcc引腳,連接配接5v10%的電源;20腳為gnd引腳,必須接地。
輸入/輸出口
有了電源之後,再來看看8051的主要部分,也就是輸入/輸出口。緊接于剛才介紹的vcc引腳下的是第39腳,為port 0的開始引腳,即39腳到32腳等8個引腳為port 0;port 0的對面就是port 1,也就是第1腳到第8腳。port 1從第1腳開始,是以port 2從其斜對角第21腳開始,也就是在右下方,21腳到28腳就是port 2。同樣地,port 2的斜對面就是prot 3,第10腳到第17腳就是port 3。39、1、21、10就是這四個port的開始引腳,我們可通過圖1-10來記住這4個輸入/輸出口。
複位引腳
幾乎所有微處理器都需要複位(reset)的操作,對于8051而言,隻要複位引腳接高電平超過2個機器周期(約2ms),即可産生複位的動作。而8051的複位引腳在port 1與port 3之間,即第9腳,輔助記憶的方法是“系統久久不動,就要按一下reset按鈕,以複位系統”,這久久就是第9腳的諧音。
時鐘引腳
微處理器都需要時鐘脈沖,而在接地引腳的上方兩個引腳,即19、18腳,就是時鐘脈沖引腳,分别是xtal1、xtal2。
存儲器引腳
8051内部有存儲器,外部也可接存儲器,至于使用内部存儲器還是外部存儲器,則必須視31腳(port 0下面那個引腳)而定。31腳就是引腳,即外部存儲器通路使能(external access enable)引腳。當=1時,系統使用内部存儲器;當=0時,系統使用外部存儲器。對于簡單的程式,大多隻使用内部存儲器,是以就把31腳直接接到vcc。若使用無内部存儲器的8031/8032,則31腳接到gnd。
外部存儲器控制引腳
現在隻剩下引腳下面的兩個引腳,而這兩個引腳與引腳有點類似,都是針對存儲器的控制,說明如下:
● 30腳為位址鎖存允許信号ale(address latch enable),其功能是在通路外部存儲器時,送出一個将原本在port 0的位址信号(a0~a7)鎖存到外部鎖存ic(如74373),讓port 0空出來,以便傳輸資料。
● 29腳為程式存儲器使能(program store enable),其功能也是通路外部存儲器。通常此引腳連接配接到外部程式存儲器(rom)的引腳,當8051要讀取外部存儲器的資料時,此引腳就會輸出一個低電平信号。
相對于前面的38個引腳,29、30腳比較難以了解,所幸的是,隻要不動用到外部存儲器,就可當它們不存在!具體将留到外部存儲器的章節再作說明。
根據上述要訣可以很輕松地記住這些引腳。
或許有人會質疑,“有這麼簡單嗎?”當然沒這麼容易!8051的40個引腳裡,其中有很多是多任務引腳,簡單講就是多用途的引腳,以39~32腳為例,平時為port 0;若是連接配接外部存儲器時,則當成ad0~ad7引腳,而ad0~ad7就是位址引腳與資料引腳複用的多任務引腳,好像有點複雜,但如果不接外部存儲器時,就可當它不存在。
所謂“基本電路”是指若要8051電路工作不可缺少的基本連接配接線路,是以,這是必要的!當然,在此我們也有熟記基本電路的方法,基本電路包括四部分,說明如下。
先接電源
電路都需要電源,8051電路也是如此。首先将40腳接vcc,也就是+5v、20腳接地gnd,如圖1-11所示。
再接時鐘脈沖
8051内部已具備振蕩電路,隻要将gnd引腳上方的兩個引腳(即19、18腳)連接配接簡單的石英振蕩晶體(crystal)即可。至于8051的時鐘脈沖頻率,目前的mcs-51晶片的工作頻率已大為提升,例如atmel公司的89c51的工作頻率為0~24mhz,而華邦電子(winbond)更提供了40mhz的版本,未來必然還會有更高頻率的版本。盡管如此,目前還是采用12mhz時鐘脈沖。如果懶得再設計一個振蕩電路,則可按圖1-11連接配接即可。如果非得自行設計一個振蕩電路不可,則可按圖1-12連接配接。
複位電路
8051的複位引腳(reset)是第9腳,當此引腳連接配接高電平超過2個機器周期(1個機器周期包含12個時鐘脈沖),即可産生複位的動作。以12mhz的時鐘脈沖為例,每個時鐘脈沖為1/12s,2個機器周期為2s,是以,我們可在第9腳上連接配接一個可讓該引腳上産生一個2s以上的高電平脈沖,即可産生複位的動作,如圖1-13(a)所示。
電源接上瞬間,電容c上沒有電荷,相當于短路,是以第9腳直接連接配接到vcc,即8051執行複位動作。随着時間的增加,電容上的電壓逐漸增加,而第9腳上的電壓逐漸下降,當第9腳上的電壓降至低電平時,8051即恢複正常狀态,稱為“power on reset”(加電複位)。在此使用10k電阻、10f電容,其時間常數為1ms,是以第9腳上的電壓可保持2s以上的高電平,足以使系統複位。而約1ms(一個時間常數)的時間系統是處于複位狀态。
通常,我們還會在電容兩端并接一個按鈕開關,如圖1-13(b)所示,此按鈕開關就是一個手動的reset(複位)開關。
存儲器設定電路
基本電路的最後一個部分是存儲器的設定,如果把31腳()接地,則使用外部存儲器;如果把31腳()接vcc,則使用内部存儲器。在本書裡大多采用内部存儲器,是以把31腳與40腳及vcc相連接配接。整個基本電路如圖1-14所示。
其中的元件如表1-1所示。
一般來說,mcs-51系列(micro controller system,mcs)可分為51與52兩大類,52類是51類的增強型,其最大的特色就是内部存儲器加倍,增加了一個定時器/計數器,但價格更加昂貴。
若按晶片内的rom來區分,可分為無rom型(8031/8032)、mask rom型(8051/8052)、eprom型(8751/8752),及eeprom型(89c51/89c52、89s51/89s52),如表1-2所示。
表1-2 mcs-51系列晶片的分類
以下簡要介紹這幾種8051。
無rom型
8031/8032為無rom型單片機,如圖1-15左圖所示。使用這種單片機必須外接程式存儲器。由于其封裝成本與含rom型的單片機很接近,且必須外接程式存儲器,反而使電路成本大增;目前除了程式太大,無法完全存入單片機外,已很少人采用此類單片機。
mask rom型
8051/8052為mask rom型單片機,如圖1-15右圖所示。這種單片機直接将程式放入晶片中的程式存儲器,是以不必“燒錄”程式(也不能燒錄),價格低廉。但由于這種晶片必須要制作其獨有的掩膜(mask),必須大批量生産。例如鍵盤裡所用的單片機(8048,是8051的前一代)就是mask rom型單片機。
eprom型
8751/8752為eprom型單片機,如圖1-16左圖所示。這種單片機是可将程式燒錄到晶片中的程式存儲器,也可以紫外線擦除程式存儲器裡的資料,是以可重複使用不同的程式。ic上面有一個視窗,可看到内部的晶片與連接配接線,通常在燒錄完畢後,在視窗上貼黑色膠布,以防止資料消失。如果要擦除rom裡的資料,則使用紫外線照射視窗,15~30min即可。由于這種封裝成本較高,再加上其擦除動作麻煩且費時,目前幾乎不再生産這種晶片了。
eeprom型
89c51/89c52、89s51/89s52為eeprom型單片機,如圖1-16右圖所示。這種單片機可以将程式“下載下傳”到晶片中的程式存儲器,隻要施以5v或12v電壓,即可輕松、快速擦除程式存儲器裡的資料,已成為目前的主流。在廠商的技術資料手冊中亦稱,這種晶片可重複寫入與擦除達1000次。根據經驗,如果不是操作上的失誤,或者是引腳折斷,就算是經常燒寫,的确是很難把它燒壞!
atmel半導體公司所提供的89c51系列已成為mcs-51相容單片機中的主流。在89c51系列中,當然是以停産的89c51最具代表性,取而代之的是更強勁的89s51,這兩種單片機的結構比較如表1-3所示。
由上可知,隻要89c51/52有的,89s51/52都有。而其中比較特别的是89s51/52新增了一個14位看門狗計數器(watchdog timer,wdt)。雖然,89s51/52的工作頻率提升為0~33mhz,但實質幫助不大。就像0~24mhz的89c51/52一樣,還是會使用12mhz的工作頻率,這樣就可以直接延用原有的程式設計;另外,設計程式時也比較容易計算,且耗用的資源也比較少。
雖然89c51停産了,但其核心仍存在于89s51及許多89c51的進階版本中,例如:
● at89c51rc單片機具有32kb程式存儲器、512b資料存儲器、wdt等,除存儲器比較多外,其他都和89s51相同。
● at89c51cc001、at89c51cc002、at89c51cc003等單片機以89c51為核心,并擴充外圍裝置,除配置更多的存儲器外,增加了10位的adc1、can2控制器等,而其重複資料燒錄/擦除的次數更可達到10萬次。
1 adc為analog to digital converter的縮寫,也就是将模拟信号轉換成數字信号的轉換器。
2 can為controller area network的縮寫,這是一種微處理器與can總線的接口,而can控制器應用bosch can 2.0b data link layer protocal通信協定。