之前C語言已經告一段落,現在我們學習單片機
首先,我們要了解怎樣學習單片機!
1. 單片機簡介和發展歷程?
這里就不說這些廢話了。。。。。。。
2. 學習單片機需要哪些基本條件?
模擬電路,數字電路基礎,對C語言或匯編語言有一定的了解。當然,這些也可以在學習過程中掌握。以后我都會講解的。
硬件條件的話:電腦一台,實驗開發平台一套。
3、單片機的結構
一台能夠工作的計算機要有這樣幾個部份構成:CPU(進行運算、控制)、RAM(數據存儲-內存)、ROM(程序存儲)、輸入/輸出設備(例如:串行口、並行輸出口等)。
單片機是一種控制芯片,一個微型的計算機,而加上晶振,存儲器,地址鎖存器,邏輯門,七段譯碼器(顯示器),按鈕(類似鍵盤),擴展芯片,接口等那是單片機系統。
4、MCS51單片機和8051、8031、89C51等單機片有什么不同
這里我們以后再做介紹,這里不需要了解。
//________________________________________________________________________________________________________________________________________
其次,我們要學C語言,而且要學好!C語言很簡單,單一很重要!
同時,你還得了解匯編,實際上不是了解匯編指令,而是為了了解單片機的體系結構
最后,我們來了解單片機引腳:
下圖:

0
121
單片機的40個引腳總的可分為4類:電源、時鍾、控制和I/O引腳。
⒈ 電源: a)_ VCC - 芯片電源,接+5V; b)_ VSS - 接地端;
⒉ 時鍾:XTAL1、XTAL2 ——晶體振盪電路反相輸入端和輸出端。
⒊ 控制線:控制線共有4根:
a)_ ALE/PROG:地址鎖存允許/片內EPROM編程脈沖 ① ALE功能:用來鎖存P0口送出的低8位地址 ② PROG功能:片內有EPROM的芯片,在EPROM編程期間,此引腳輸入編程脈沖。
b)_ PSEN:外ROM讀選通信號。
c)_ RST/VPD:復位/備用電源。 ① RST(Reset)功能:復位信號輸入端。 ② VPD功能:在Vcc掉電情況下,接備用電源。
d)_ EA/Vpp:內外ROM選擇/片內EPROM編程電源。 ① EA功能:內外ROM選擇端。 ② Vpp功能:片內有EPROM的芯片,在EPROM編程期間,施加編程電源Vpp。
⒋ I/O線 80C51共有4個8位並行I/O端口:P0、P1、P2、P3口,共32個引腳。P3口還具有第二功能,用於特殊信號輸入輸出和控制信號(屬控制總線)。
電源:是必不可少的了。單片機使用的是5V電源,其中正極接40管腳,負極(地)接20管腳。
振蒎電路:單片機是一種時序電路,必須供給脈沖信號才能正常工作,在單片機內部已集成了振盪器,使用晶體振盪器,接18、19腳。
只要買來晶體震盪器,電容,連上就能了,按上面的圖接上即可。
復位管腳:按圖1中畫法連好,至於復位是何含義及為何需要復要復位,在單片機功能中介紹。
EA管腳:EA管腳接到正電源端。 至此,一個單片機就接好,通上電,單片機就開始工作了。
OK,上面引腳介紹可能你又產生了很多疑問!下面我們實戰一下:
我們任務是讓單片機的第一個引腳控制一個LED燈點亮和熄滅。怎么做?
如下圖:

首先,第一個引腳我們規定叫做P1.0(這是規定)
各個所需原件接入P1.0,如果P1.0引腳是高電平,此時燈就不會亮,相反P1.0引腳是低電平,燈就亮了。
問題是怎樣控制P1.0引腳呢?
我們的指令STEB P1.0控制高電平; CLR P1.0控制低電平;
但我們的計算機不能讀取這些指令,它只能讀取數字,而我們的C51芯片讀取數字指令也有一些規定的;
我們得通過編程器把SETB P1.0變為(D2H,90H ),把CLR P1.0變為 (C2H,90H )寫入單片機中。
就是把你在電腦上寫出來來的代碼用匯編器等編譯器生成的一個目標燒寫到單片機的eprom里面去的工具
到這里第一步就完成了。
存儲原理
ok,我們編譯的代碼既然能控制燈亮或者滅,那么代碼是怎么存入單片機中的呢?
這里我們引入一個專業術語:ROM-只讀存儲器;
這里的只讀指的是在單片機中運行中只能讀取里面的內容,但是我們編譯的代碼在編譯器上是可以存入的(不然單片機怎么控制LED燈?)
那么在ROM中是怎么存的呢?
實際上同學們了解到我們是通過電平高低控制LED燈的(其它元件一般也是),我們規定1代表高電平,0代表低電平,那么我們就只需要存1、0就可以。
在ROM中,內存好比是在一個抽屜中有很多排條形槽,每個條形槽中又分為八個格子。這里為什么是八個格子我也不知道,這是規定。但我們要了解的是怎么把數字存入這些格子中(計算機只認識數字)
如果我們要存數字10;
首先,我們要將10轉成二進制——00001010(在我之前文章中專門講過)
那么我們就分別在這八個格子中存入相應的0、1;
通電,將電荷存入格子中,所有格子有電荷額就是存的1,空的就存的0;
但是我們電路都是以並聯的形式,要么輸入電荷。
此時就需要另外的信號線接在格子上,控制格子開關。進而控制電荷進入格子中。
我們怎樣來控制各個單元的控制線呢?
把每個單元元的控制線都引到集成電路的外面不就行了嗎?
事情可沒那么簡單,一片27512存儲器中有65536個單元,把每根線都引出來,這個集成電路就得有6萬多個腳?不行,怎么辦?要想法減少線的數量。我們有一種辦法稱這為譯碼,簡單介紹一下:一根線能代表2種狀態,2根線能代表4種狀態,3根線能代表幾種,256種狀態又需要幾根線代表?8種,8根線,所以65536種狀態我們只需要16根線就能代表了。
存儲器有很多,RAM,PROM,EPROM,EEPROM,FLASH........在后期我們介紹這些存儲器,對於隨機存儲器RAM你要理解也不是很難的。
這里就介紹了ROM的存儲原理
第一個小程序
雖然之前我們能控制燈的亮或者滅。
但是,這里燈只能亮一次;
現在我們任務升級,讓燈閃爍;
那么步驟就變成了:SETB P1.0 延長時間 CLR P1.0 循環執行;
;主程序:
LOOP: SETB P1.0 ;(1)熄滅燈
LCALL DELAY ;(2)延時一段時間
CLR P1.0 ;(3)點亮燈
LCALL DELAY ;(4)延時一段時間
AJMP LOOP ;(5)跳轉到第一句LOOP處
;以下子程序
DELAY: MOV R7,#250 ;(6)
D1: MOV R6,#250 ;(7)
D2: DJNZ R6,D2 ;(8)
DJNZ R7,D1 ;(9)
RET ;(10)
END
對於上面的代碼,我們先必須得了解一些指令:
AJMP轉移命令;
LCALL調用子程序;
顯而易見,第五條指令一直轉移到第一條指令,所以主程序一直處於循環狀態,
然后第二條指令在調用DELAY這個子程序,
至於子程序DELAY里面的內容我們以后再講,你只需要知道這是用來延長時間的。
這樣,可以循環有頻率的控制P1.0的電壓,從而控制LED燈的閃爍。
我們用C語言來寫:
#include <at89x52.h>
void DELAY() //延時函數
{ unsigned char i,j;
for(i=0;i<250;i++)
{
for(j=0;j<200;j++);
}
}
void main() //程序從這里開始執行
{
while(1) //這句的作用就是反復的執行下面這個{}中包含的4句
{
P1_0=1; //(1)熄滅燈
DELAY(); //(2)延時一段時間
P1_0=0; //(3)點亮燈
DELAY(); //(4)延時一段時間
}
}
大家不必在意其它,懂它的原理就可以了。當然,這只是C語言中的原理。
我們回到上面的子程序中
DELAY: MOV R7,#250 ;(6)
D1: MOV R6,#250 ;(7)
D2: DJNZ R6,D2 ;(8)
DJNZ R7,D1 ;(9)
RET ;(10)
END
我之前介紹了主程序的一些指令,我相信大家都能懂。
對於子程序,我們首先要了解:R6,R7代表什么?
459+889=?結果是什么呢?你會說:1348;
正確!計算機也是能直接算出1348;
那么:459+889+743=?結果是?------------2091;你會先算459+889=1348;然后算1348+743=2091;
計算機也是,不過先前的結果1348算出了后放在哪里?ROM?
不行,ROM是只讀的。
對,RAM(隨機存儲器)。RAM會分出一部分內存來寄存1348,在取出1348加入后面的運算。分出的內存叫寄存區。
現在我可以告訴你R6,R7就在這個寄存區中。
我們其次了解一下:DELAY(子程序名稱,主程序要調用的);D1(標識符,相當於一個id名,標注一個行,后面的可以根據這個標識直接轉移又執行這行代碼);D2(和D1一樣);RET(子程序結束);END(程序結束);
MOV指令代表:傳遞數據; 后面有傳遞者,接受者,數據;
MOV R7,#250:這里省略了傳遞者(不代表任意代碼都可以省),“#”標識“250”是被傳遞的數,R7是接受者;
DJNZ指令代表:有轉移執行的意思;
DJNZ R6,D2:這里表示將第一個參數R6中的值減1,如果等於0就執行下一句代碼,否則執行D2行的代碼;
關於這個延時程序我們后期會詳細分析。
