關(guān)于單片機的C語(yǔ)言編程基礎知識(初學(xué)注意)
(1)學(xué)習過(guò)C語(yǔ)言的同學(xué)在對單片機有了基本了解之后,就可以開(kāi)始試著(zhù)寫(xiě)一兩個(gè)基于單片機的C語(yǔ)言的程序了。C51語(yǔ)言繼承了ANSI C 的絕大部分的特性,基本的語(yǔ)法相同,同學(xué)們上手會(huì )比較快。但是,由于C51語(yǔ)言是對硬件進(jìn)行控制的編程語(yǔ)言,其本身又在硬件結構上有所擴展以增強C語(yǔ)言對硬件的控制,如關(guān)鍵字sbit,data,code等(后面會(huì )講他們是做什么的)。
(2)因為單片機不是我們平時(shí)用的計算機,他的英文名為MCU(微控制器),特點(diǎn)體現在這個(gè)“微”字。因而,它里面的硬件資源是非常少的,所以你在寫(xiě)程序的時(shí)候就要注意對RAM(存儲數據)和ROM(存儲程序)的使用。說(shuō)白了,就是也程序的時(shí)候要盡量精簡(jiǎn),如各種算法,不要讓系統負擔太大。少用浮點(diǎn)運算,能夠使用unsigned的無(wú)符號型數據,就不要使用有符號的(當你寫(xiě)程序時(shí),你會(huì )發(fā)現很多位置都用的unsigned,不像我們在A(yíng)NSI C里面不同,不太注意,C51里面就非常注意資源的控制)。避免乘除,多用移位運算(寫(xiě)走馬燈程序時(shí),會(huì )使用到,很有意思,不是我們想象的用循環(huán)控制)。
基本的特性了解之后,我們來(lái)講下,具體的東西:
首先,是C51針對硬件控制增加的一些關(guān)鍵字,數據類(lèi)型。
(1)bit : 和我們平時(shí)用的int,char相同,只不過(guò)int是兩個(gè)字節(16位,16bit),char是單字節(8位,8bit),bit就是一位,取值范圍是0和1,類(lèi)似windows編程里的BOOL。
(2)sbit : sbit是對應可位尋址空間的一個(gè)位,可位尋址區:20H~2FH。一旦用了sbit xxx = REGE^6這樣的定義(例如,sibt a = P0^0,定義P0口的第0位為變量a,此時(shí)對a賦值0或者1時(shí),就是在對P0口的第0位進(jìn)行控制,賦低電平或高電平),這個(gè)sbit量就確定地址了。(sbit大部分是用在特殊功能寄存器中的,方便對寄存器的某位進(jìn)行操作的。)
(3)sfr:用于定義特殊功能寄存器(8位的)(在程序中會(huì )寫(xiě)頭文件#include,在Keil中右鍵點(diǎn)擊打開(kāi)reg51.h,就可以看到很多sfr的定義),如sfr P0 = 0x80,就定義了端口P0。
(4)sfr16:同上用于16位的
其次,C51還提供了對8051所有存儲區的訪(fǎng)問(wèn)。
8051芯片的存儲區從邏輯上分為內部數據存儲區,外部數據存儲區和程序存儲區(內外統一編址)。
80C51有4KB的內部程序存儲區(片內ROM)(0000H~0FFFH),其中前43單元有特殊用處,0000H~0002H無(wú)條件跳轉,0003H~002AH用于存放中斷程序(中斷程序這里不解釋)
256B的內部數據存儲區(片內RAM),分為低128B和高128B,有不同作用(可見(jiàn)硬件資源有多小了吧,所以我們要節省使用),低128B又分為為工作寄存器區,又稱(chēng)通用寄存器(00H~1FH),位尋址區(20H~2FH,之前的sbit就是對應位尋址空間中的一位),數據緩沖區(30H~7FH,這個(gè)區域就是給用戶(hù)用得,沒(méi)有任何限制,一共80個(gè)單位)
高128B為特殊功能寄存器(就是上面說(shuō)的sfr),具體的內容在很多書(shū)上面都有。
http://www.mytutorialcafe.com/Microcontroller%20Special%20Function%20Register.htm
給個(gè)英文的sfr的解釋的網(wǎng)址,不過(guò)沒(méi)必要看,看書(shū)就行了。
在這里講這么多的原因是因為C51中在對變量進(jìn)行聲明的時(shí)候還可以明確的指定存儲空間。關(guān)鍵字有:DATA,IDATA,BDATA(RAM中高128B),CODE等。
(1)DATA指定RAM中低128B,可以在一個(gè)機器周期內直接尋址,尋址速度最快,所以應該把經(jīng)常使用的變量放在DATA區
例如:unsigned char data system_status = 0;
(2)BDATA指定的是RAM中的位尋址區,在這個(gè)區域定義的變量可以進(jìn)行位操作,什么意思呢?舉例吧
unsigned char bdata status_byte,這里定義變量status_byte,是一個(gè)單字節(8位)的數據變量,我們可以對這個(gè)變量中的一位進(jìn)行置0或置1的操作。我們把 status_byte=0x00,即變量里面的8位都置為了0,前面講過(guò)一個(gè)sbit,用于位尋址區域中的一位,sbit a = status_byte^2;a = 1,表示把變量 status_byte的第2位置為了1(0,1,2,3,4,5,6,7共八位),于是變量 status_byte就等于了0x02;
(3)CODE 程序存儲區,他里面的內容是不變的,我們要使用的一些固定數據存于這個(gè)里面就不用占用RAM的空間了,比如我們學(xué)習數碼管顯示程序時(shí),數碼管上面的每一個(gè)數字都對應一個(gè)16進(jìn)制的數字,我們可以把它存到程序存儲區中去,例如:
unsigned char code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
關(guān)于特殊功能寄存器sfr的使用,我們以一個(gè)簡(jiǎn)單的程序為例,在80C51芯片的P0^0上接上一個(gè)發(fā)光二極管LED,一個(gè)電阻RES和一個(gè)電源VCC,三者串聯(lián),電流方向是從電源流向P0^0口。給80C51接上電源,接地,晶振,復位電路。如果使用proteus仿真,則這些電路不用接。
在Keil軟件中寫(xiě)程序
#include
sbit a = P0^0;
void main(){
a = 0;
while(1);
}
因為芯片剛剛上電,P0管教為高電位,我們在程序中把它置為0;電流就可以流過(guò)LED,于是LED燈就會(huì )發(fā)光。并用while(1)讓程序停在這里。
一個(gè)最簡(jiǎn)單的單片機C語(yǔ)言程序就寫(xiě)完了。講了這么多希望同學(xué)們了解,C51對C語(yǔ)言的擴展有所了解,知道可以通過(guò)C語(yǔ)言對硬件進(jìn)行控制,學(xué)會(huì )常用的關(guān)鍵字。
評論