專注電子技術(shù)學(xué)習(xí)與研究
當(dāng)前位置:單片機教程網(wǎng) >> MCU設(shè)計實例 >> 瀏覽文章

單片機c語言基礎(chǔ)教程

作者:63tz   來源:63tz   點擊數(shù):  更新時間:2014年06月07日   【字體:

 例 1-1: 讓接正在 P1.0 引腳上的LED 照射。

圖1-1 接有LED 的單片機根本通路
P1.0
EA/VPP
VCC
XTAL2
XTAL1
GND
RST
+5V +5V
+
R1
E1
10K
10U
27P CY
27P
PZ1 1K
D8
D1
89
#include reg51.h
sbit P1_0=P1^0;
void main()
{ P1_1=0;
}
某個順序的作用是讓接正在P1.0 引腳上的LED 點亮。上面來綜合一下某個C 言語順序包
含了哪些消息。
1)資料蘊含解決。
順序的第一溜兒是一度資料蘊含解決。
叫做資料蘊含是指一度資料將此外一度資料的形式全副蘊含出去,因為那里的順序
固然只要4 行,但C 意譯器正在解決的時分卻要解決多少十或者多少百行。那里順序中蘊含REG51.h
資料的手段是為了要運用P1 某個記號,即告訴C 意譯器,順序中所寫的P1 是指80C51 單
片機的P1 端口而沒有是其它變量。這是如何做到的呢?
翻開 reg51.h 能夠看到那樣的一些形式:


sfr P0 = 0x80;
sfr P1 = 0x90;
sfr P2 = 0xA0;
sfr P3 = 0xB0;
sfr PSW = 0xD0;
sfr ACC = 0xE0;
sfr B = 0xF0;
sfr SP = 0x81;
sfr DPL = 0x82;
sfr DPH = 0x83;
sfr PCON = 0x87;
sfr TCON = 0x88;
sfr TMOD = 0x89;
sfr TL0 = 0x8A;
sfr TL1 = 0x8B;
sfr TH0 = 0x8C;
sfr TH1 = 0x8D;
sfr IE = 0xA8;
sfr IP = 0xB8;
sfr SCON = 0x98;
sfr SBUF = 0x99;


sbit CY = 0xD7;
sbit AC = 0xD6;
sbit F0 = 0xD5;
sbit RS1 = 0xD4;
sbit RS0 = 0xD3;
sbit OV = 0xD2;
sbit P = 0xD0;

sbit TF1 = 0x8F;
sbit TR1 = 0x8E;
sbit TF0 = 0x8D;
sbit TR0 = 0x8C;
sbit IE1 = 0x8B;
sbit IT1 = 0x8A;
sbit IE0 = 0x89;
sbit IT0 = 0x88;

sbit EA = 0xAF;
sbit ES = 0xAC;
sbit ET1 = 0xAB;
sbit EX1 = 0xAA;
sbit ET0 = 0xA9;
sbit EX0 = 0xA8;

sbit PS = 0xBC;
sbit PT1 = 0xBB;
sbit PX1 = 0xBA;
sbit PT0 = 0xB9;
sbit PX0 = 0xB8;

sbit RD = 0xB7;
sbit WR = 0xB6;
sbit T1 = 0xB5;
sbit T0 = 0xB4;
sbit INT1 = 0xB3;
sbit INT0 = 0xB2;
sbit TXD = 0xB1;
sbit RXD = 0xB0;

sbit SM0 = 0x9F;
sbit SM1 = 0x9E;
sbit SM2 = 0x9D;
sbit REN = 0x9C;
sbit TB8 = 0x9B;
sbit RB8 = 0x9A;
sbit TI = 0x99;
sbit RI = 0x98;
相熟80C51 外部構(gòu)造的觀眾群沒有好看出,那里都是一些記號的界說,即規(guī)則記號名與地
址的對于應(yīng)聯(lián)系。留意內(nèi)中有
sfr P1 = 0x90;
那樣的一溜兒(下文頂用黑體示意),即界說P1 與地點0x90 對于應(yīng),P1 口的地點就是0x90
(0x90 是C 言語中十六進制數(shù)的寫法,相等于匯編言語中寫90H)。
從那里還能夠看到一度屢次涌現(xiàn)的詞:sfr
sfr 并規(guī)范C 言語的要害字,而是Keil 為能間接拜訪80C51 中的SFR 而需要了一度新
的要害詞,其用法是:
sfrt 變量名=地點值。
2)記號P1_0 來示意P1.0 引腳。
正在 C 言語里,假如間接寫P1.0,C 意譯器并沒有能辨認,并且P1.0 也沒有是一度非法的C
言語變量名,因為得給它另起一度名字,那里起的名為P1_0,可是P1_0 是沒有是就是P1.0
呢?你這樣以為,C 意譯器可沒有這樣以為,因為必需給它們構(gòu)建聯(lián)絡(luò),那里運用了Keil C
的要害字sbit 來界說,sbit 的用法有三種:
第一種辦法:sbit 位變量名=地點值
第二種辦法:sbit 位變量名=SFR 稱號^變量位地點值
其三種辦法:sbit 位變量名=SFR 地點值^變量位地點值
如界說 PSW 中的OV 能夠用以次三種辦法:
sbit OV=0xd2 (1)注明:0xd2 是OV 的位地點值
sbit OV=PSW^2 (2)注明:內(nèi)中PSW 必需先用sfr 界說好
sbit OV=0xD0^2 (3)注明:0xD0 就是PSW 的地點值
因而那里用 sfr P1_0=P1^0;就是界說用記號P1_0 來示意P1.0 引腳,假如你樂意也能夠
起P10 一類的名字,只需上面順序中也隨之更改就行了。
3)main 稱為主因變量。
每一度 C 言語順序有且只要一度主因變量,因變量前面定然有一對于大括號{},正在大括號
外面書寫其它順序。
從下面的綜合咱們理解了全體 C 言語的特點,上面再看一度稍簡單小半的事例。
例 1-2 讓接正在P1.0 引腳上的LED 閃耀照射

#include reg51.h
#define uchar unsigned char
#define uint unsigned int
sbit P10=P1^0;

void mDelay(unsigned int Delay)
{ unsigned int i;
for(;Delay0;Delay--)
{ for(i=0;i124;i++)
{;}
}
}
void main()
{ for(;;)
{ P10=!P10; //取反P1.0 引腳
mDelay(1000);
}
}
順序綜合:主順序main 中的第一溜兒姑且沒有看,第二行是P1_0=!P1_0;,正在P1_0 前有
一度記號!,記號!是C 言語的一度演算符,就像數(shù)學(xué)中的+、-一樣,是一種
演算任號,意思是取反,行將該記號前面的那個變量的值取反。
留意:取反演算但是對于變量的值而言的,并沒有會主動改觀變量自身。能夠以為 C 意譯
器正在解決!P1_0時,將P1_0 的值給了一度暫時變量,而后對于某個暫時變量取反,而沒有
是間接對于P1_0 取反,因而取反終了后還要運用賦值記號(=)將取反后的值再賦給P1_0,
那樣,假如本來P1.0 是低電平(LED 亮),那樣取反后,P1.0 就是高電平(LED 滅),反之,
假如P1.0 是高電平,取反后,P1.0 就是低電平,這條訓(xùn)令被重復(fù)地施行,接正在P1.0 上燈就
會一直亮、滅。
該條訓(xùn)令會被重復(fù)施行的要害就正在于 main 中的第一路程序:for(;;),那里沒有對于此作細致
的引見,觀眾群臨時只需曉得,這路程序偕同其后的一對于大括號{}形成了一度有限重復(fù)語
句,該大括號內(nèi)的語句會被重復(fù)施行。
其三路程序是:mDelay(1000);,這路程序的用處是延時1s 工夫,因為單片機施行指
令的進度很快,假如沒有停止延時,燈亮以后立即就滅,滅了以后立即就亮,進度太快,人眼
基本無奈區(qū)分。
那里 mDelay(1000)并沒有是由Keil C 需要的庫因變量,即你沒有能正在任何狀況下寫那樣一溜兒
順序以完成延時。假如正在編寫其它順序時寫上這樣一溜兒,會發(fā)覺意譯通沒有過。那樣那里為什
么又是準(zhǔn)確的呢?留意視察,能夠發(fā)覺某個順序中有void mDelay()那樣一溜兒,可見,
mDelay 某個詞是咱們本人起的名字,況且為此編寫了一些順序行,假如你的順序中沒有這
么一段順序行,那就沒有能運用mDelay(1000)了。有人腦力快,能夠立即悟出,我可沒有可
以把這段順序也復(fù)制到我其它順序中,而后就能夠用mDelay(1000)了呢?答復(fù)是,那千萬
就能夠了。再有小半需求注明,mDelay 某個稱號是由編程者本人起名兒的,可自行更改,但
一旦更改了稱號,main()因變量中的名字也要作呼應(yīng)的更改。
mDelay 前面有一度小括號,小括號里無數(shù)據(jù)(1000),某個1000 被稱之參數(shù),用它
能夠正在定然范疇內(nèi)調(diào)動延常常間的長度,那里用1000 來請求延常常間為1000 毫秒,要做到
這小半,必需由咱們本人編寫的mDelay 那段順序決議的,細致狀況正在前面重復(fù)順序中再作
綜合,那里就沒有引見了。

關(guān)閉窗口

相關(guān)文章