51單片機學期總結

這學期開了《單片機原理與應用技術》,試考完了,課設也做完了,也放假一星期多了(^_^),抽出半天的時間把這學期在課堂上學到的東西做了個總結,以便以後可以快速查閱生氣
學完這門課給自己的感覺是學到挺多以前不知到的東西,雖說是8051單片機,裏面還是有很多值得學習的東西。以前一開始學51就直接用C語言去開發,只知道宏觀上的原理,裏面究竟是怎樣工作的也只是有個大概的模型,自個也沒有抽時間去學習,所以之前對51這種單片機的認識只是停留在表面上而已。另外,也感受到了彙編語言的“直接”在某些方面帶來的優勢,不過直接操作寄存器是比較直接豪放,51完成的功能一旦多代碼就顯得不清晰,而且移植修改花的時間也比較多。總之,對51原理的更深入理解需要看得懂彙編,高效的使用51當然用C語言。
總結內容開始
一、單片機有符號數的幾種碼 & 進制轉換:
(1)
單片機中數都是以補碼的形式存放的,這樣進行減法運算時直接變成加法運算,乘除法也是直接將補碼進行乘除運算
正數:原碼 = 反碼 = 補碼
負數:反碼 = 原碼除符號位,其餘位取反
補碼 = 反碼 + 1
8位有符號數的數值範圍:
(十進制)(-128)-->(+127) “-128”是怎麼來的?
(二進制)1111,1111-->0111,1111 (最高位爲符號位)
(正數的最大值爲0111,1111,最小值爲0000,0001,故爲+1~+127)
(負數的最大值爲1111,1111,最小值爲1000,0000,下面解釋“-128”的由來)
負數在單片機中是以補碼的形式存放,同時也是以補碼的形式進行加減運算的
就拿char型-100來說,他的原碼是1110,0100,反碼是1001,1011,因此它的補碼就是1110,1100
同理,1111,1111的補碼是它的反碼1000,0000(注意這裏的最高位1僅僅代表符號),補碼就是1000,0001,就是十進制的“-1”
1000,0000的補碼是它的反碼1111,1111,補碼就是1(1)000,0000,有一個進位位捨棄變成1000,0000,結果是十進制的“-128”
負數會比正數表示的數值範圍多1個的原因:7個數值位“000,0000”在符號位爲0時被0佔有,而符號位爲1時被負數佔有
減法運算:
100-50 = 0110,0100+1100,1110 = (1)0011,0010 進位位捨棄,符號位爲0,結果是50
乘法運算:具體的計算過程,單片機不用理什麼符號位,他就認爲有多少個數相加
(-50)*(-2) = 1100,1110*1111,1110 = 0110,0100   有254(1111,1110)個206(1100,1110)相加然後取出結果的低八位,不信你試試254*206然後看低八位的二進制值
(2)進制轉換
十進制轉二進制、八進制、十六進制:
整數部分:
將十進制分別除於2、8、16,直到商小於進制的權時停止,先出來的餘數是進制轉換結果的低位(LB),最後出來的是高位(MB)
小數部分:
將十進制的小數位分別乘於2、8、16,每次乘完取走整數部分,剩下來的小數部分繼續乘,直到小數爲0停止,先取出來的是高位(MB)
補充一個概念:
非壓縮8421BCD碼:用8位來表示,其實高四位一直都是0
壓縮BCD碼:用4位來表示,常用

二、51單片機結構:涉及片內RAM地址分佈,CPU架構、P0-3口特殊功能特點
(1)存儲區結構:
(8051單片機的片內ROM是4KB,片內RAM是256字節(平時使用的STC89C52RC片內ROM是8K,RAM是512字節。STC12C5A60S2/AD的片內ROM有60K,片內RAM有1280字節。其他的查一下對應手冊即可知道))


片內或片外的ROM分佈

code區:代碼存儲區,最大64K (MOVC指令,DPTR間址寄存器)
內部RAM分佈
data區:內部RAM區00H-7FH,通常128 Bytes,訪問通過直接尋址 (MOV指令)
00H-1FH是4組工作寄存器的地址每一組有8個8位的寄存器都叫做R0-R7
20H-2FH位尋址區(位地址00H-7FH)
30H-7FH用戶數據緩衝區,也就是程序跑起來之後臨時變量的存放區,堆棧區也通常在軟件上設置到這裏
專用寄存器SFR區(128Bytes):從80H到FFH,主要是這些寄存器:P0、P1、P2、P3、PCON、SCON、TCON、TMOD、PCON、IE、ACC、B、SBUF、PSW等等
IDATA區:8051系列比如型號爲8052的內部還有附加128Byte的RAM,從80H到FFH,爲了區別SFR只能通過間接尋址來訪問(MOV指令,@R1/R2寄存器)。
外部RAM分佈
xdata區:最大64K (MOVX指令,DPTR間址寄存器)

C語言編程時:根據需要在定義變量或數組時加上以下關鍵字

data:直接尋址的片內RAM區低128B(00H~7FH) 
bdata:片內RAM的可位尋址區(20H~2FH),允許字節和位混合訪問 
idata:單片機間接訪問的片內RAM區,允許訪問全部片內RAM 
pdata:Ri間接訪問的片外RAM的低256B(00H~FFH) 
xdata:用DPTR間接訪問的片外RAM,允許訪問全部64KB片外RAM(0000H~FFFFH) 
code:彙編使用MOVC查表指令,單片機的64KB程序存儲區ROM

(2)51單片機引腳功能特點:
IO接口:
P0:8位不帶內部上拉電阻準雙向IO口,非常值得研究的一組IO口,P0端口是51單片機的總線口,分時出現數據D7一D0、低8位地址A7一AO,以及三態,用來接口存儲器、外部電路與外部設備
情況1:做地址/數據總線時和做輸入I/O口時,p0口不用接上拉電阻。
情況2:但當做輸出I/O口時,p0口必須要接上拉電阻(4.7k-10k)纔可以。但是加上拉電阻不會提高他的驅動能力。
P1/P2/P3:帶內部上拉電阻的準雙向口,可作一般雙向I/O使用。
P2口還可以作訪問外部存儲器的高八位地址
P3口還有第二功能:RXD、TXD、INT0、INT1、Timer0/1外部時鐘輸入、外部RAM寫讀控制線WR和RD
(注意:WR/RD兩個信號是單片機自動產生的,很多人總是以爲要設置什麼寄存器之類的東西,容易出現迷惑,只要我們在程序裏一調用 MOVX 或者在 C 語言裏讀寫 XDATA(外部)的地址,這兩個信號就產生了)
EA/VPP:EA=1,即該引腳接高電平VCC,先使用內部的ROM,訪問單元的地址超過0FFFH(4K地址空間)時,將自動執行訪問外部ROM程序。EA=0時只訪問外部的ROM。
ALE/PROG:訪問外部RAM/ROM時作爲低八位地址鎖存允許控制信號,這個信號也很有意思,他只有在使用MOVC和MOVX指令時才輸出信號
PSEN:訪問外部ROM時的讀選通信號,低電平表示讀信號
XTAL1/XTAL2:接晶振
RST:復位引腳
(3)最小系統電路:8051的ALE引腳和PSEN引腳輸出高電平,同時RST引腳爲高電平時系統復位

電阻和電容的參數共同決定電容的充電時間t=RCLn[E/Vt],這個時間又決定了單片機復位響應時間。下圖中:


在按鍵按下去的瞬間,電容存儲的電量通過R1釋放,RST引腳由低電平變成高電平,進入復位狀態,C和R1決定系統從按鍵按下到響應系統復位的時間。
按釋放之後,電容通過R2開始充電,直至“-”極引腳變成低電平,C和R2決定從復位狀態退出的時間長短。
(4)8051單片機系統設計方案:重點方案二
方案一:非總線式

不利用單片機的讀寫外部 RAM 功能, 而直接利用 I/O口讀寫方式進行外部設備的讀寫,比如我們點亮LED之類的操作
這種方式估計大家最熟悉不過了,它的實質就是根據外設需要的時序在程序上來控制IO引腳在什麼時候高電平,什麼時候低電平。
優點:靈活性好   缺點:擴展時要要重新設計電路
方案二:總線式
所謂總線式設計方案就是利用51單片機的讀寫外部RAM功能,將要設計的外部設備(比如說鍵盤、液晶等)統統掛到單片機總線上,使其統一按類似讀寫外部 RAM 功能的指令方法進行操作。
優點:方便擴展   缺點:靈活性差,設計要求較多
設計涉及的主要問題:單片機和外圍設備時序邏輯的分配、 地址空間的分配、 總線驅動能力

51單片機的讀寫外部RAM功能分析:(作了解)

     

總線應用小結:硬件上,需要在P0口添加一個地址鎖存器(一般是ROM/RAM的擴展),或者添加譯碼電路來選中外設,會使用WR/RD/PSEN/ALE這四個引腳。
軟件上,彙編的話使用特殊指令MOVX(EXRAM),MOVC(EXROM)來進行操作外設。C語言的話使用xdata來聲明變量的存儲類型(例如:char xdata i=0;//以後CPU讀寫這個變量都是在外部的RAM裏面的)

使用總線並沒有想象中的那麼難,它只是聽起來比較高大上而已,不要畏懼它!它只是CPU在硬件上的一種機制,相關引腳有特殊時序而已。


三、定時器/計數器(計數器主要是用來計數外部時鐘脈衝)
主要是工作方式的設置(TMOD),初值設置(TH0、TL0、TH1、TL1),中斷控制(TCON)
此外定時器1是串口通信產生波特率的振盪源,只要開了定時器1,就默認提供給串口使用,不需要開中斷之類的設置
對定時器/計數器的響應可以使用查詢(TF0、TF1)方式和中斷方式。
中斷入口地址:
T0:000BH、T1:001BH
C語言中斷組:
T0:interrupt 1、T1:interrupt 3

四、外部中斷
主要是觸發方式&中斷請求設置(TCON),中斷允許控制設置(IE),中斷優先級設置(IP)
中斷入口地址:
EX0:0003H、EX1:0013H
C語言中斷組:
EX0:interrupt 0、EX1:interrupt 2

五、串口通信使用
主要是工作方式的設置(SCON)、波特率的設置(T1)、優先級(IP)、奇偶校驗設置(TB8、RB8、PSW.0,注意把一個數值放進ACC累加器中如果“1”的個數是奇數PSW.0=1)
TB8和RB8還可以在多機通訊的時候作爲地址幀和數據幀的區別,使用這種功能之後就不能再進行奇偶校驗了
作用:可用來下載程序、擴展並行IO口(74LS164輸出/74LS165輸入)、多機通訊收發數據
在做串口通信的項目的時候需要用到反饋信息來進行調試比較容易找出問題。

六、電源控制(PCON)
空閒模式:置位IDLE進入空閒模式
空閒模式將停止程序執行,RAM中的數據仍然保持,晶振繼續工作但與CPU斷開,定時器和串行口繼續工作,可由任一中斷喚醒 ,執行完中斷程序後,將從程序停止的地方(進入空閒模式時)繼續指令的執行
掉電模式:也叫低功耗模式,通過置位PDWN位來進入,低功耗模式中晶振將停止工作,定時器和串行口都將停止工作。至少有2伏的電壓加在芯片上,所以RAM中的數據仍將保存
省電模式只可由外部中斷喚醒

七、IIC總線(集成電路總線)

IIC是一種新的芯片間的通訊方式由PHILIPS 開發和推廣IIC通訊採用兩條線進行通訊,一般有兩根信號線,一根是雙向的數據線SDA,另一根是時鐘線SCL,因此也叫二線制串行總線。可進行多器件通訊。


總線上的每個器件都有自己的地址,數據傳送是雙向的,總線支持多主機。普通8051系列單片機是沒有硬件支持IIC的,但是可以通過軟件來實現模擬IIC總線通信。飛利浦的8051內核的單片機就是有硬件支持IIC的。

時序種類:起始信號、終止信號、發送“0”、發送“1”


主機傳輸時序:


主機發送數據給從機
(1)主機先發開始信號 (2)然後發送從機匹配(寫)地址  (3)接着讀SDA引腳檢查一次從機發送的應答信號,“0”表示應答了  (4)若應答了接着串行發送8位數據(先發高8位)  (5)再去檢查從機發送的應答信號  (6)收到應答信號就發終止信號
主機讀取從機的數據
(1)主機先發開始信號 (2)然後發送從機匹配(讀)地址  (3)接着讀SDA引腳檢查一次從機發送的應答信號,“0”表示應答了  (4)若應答了接着串行接收8位數據(先收高8位)  (5)一個字節接收成功的話,緊接着主機向從機發送應答信號“0”  (6)全部數據接收完畢之後向從機發送非應答信號迫使從機結束數據傳輸
當然上面的這種數據傳輸協議是廣義上的,具體的時序還得根據外設的IIC接口時序來調整。
小結:編程時主機需要的函數
void  iic_start(void);//產生START信號
void  iic_stop(void);//產生STOP信號
void  iic_write_byte(uchar dat);//寫IIC總線寫1個字節
uchar iic_read_byte(void);//從IIC總線讀取1個字節
void  iic_send_ack(bit ack);//由主向從發送應答碼,0-ACK,1-NAK
 bit  iic_get_ack(void)//取得由從到主的應答碼,0-ACK,1-NAK
常見的IIC總線接口設備:
OLED、12864、DS1302時鐘芯片、A/D轉換芯片AD1100、D/A轉換芯片MAX517、調頻接收發射模塊PL-102B、三軸磁場模塊HMC5883L、三軸陀螺儀加速度模塊MPU6050等等

八、SPI總線(4線制串行總線接口) STC12系列的單片機就有這種接口,特點:全雙工、同步。
四條導線分別爲:
串行時鐘(SCLK)
主出從入(MOSI):主機寫從機的數據線
主入從出(MISO):主機讀從機的數據線
從選信號(SS)
常見的SPI總線接口設備:
無線收發模塊NRF24101、

九、看門狗

看門狗可設定溢出率,也可單獨用來作爲定時器使用。




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章