版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第6章C51語言程序設計基礎6.1C51語言基礎6.2C51的函數和數組6.3C51的編程規(guī)范
6.4C51的基本運用教學提示:本章在匯編語言基礎上講解C51的特點,介紹了C51的數據類型、常量、常用運算符、表達式、基本語句及C51函數和數組。在此基礎上,采用C51進行單片機簡單功能的應用,力求盡快實現(xiàn)從匯編語言到C51的過渡。
教學要求:在單片機上采用C語言開發(fā)已成為一種趨勢。通過本章的學習,讀者可了解C51與普通C語言及匯編語言的不同,并學會利用它進行單片機開發(fā),這是進行后續(xù)章節(jié)學習重要的一步。
在單片機的開發(fā)中,以前基本上是使用匯編語言,也有使用BASIC語言進行開發(fā)的。從90年代中期以后,使用C語言開發(fā)單片機已成為一種流行的趨勢。它具有使用方便、編程效率高及仿真調試容易等突出特點。6.1C51語言基礎
C語言是一種源于編寫UNIX操作系統(tǒng)的語言,它是一種結構化語言,能產生高效率的緊湊代碼。C語言含有許多本應由匯編語言實現(xiàn)的機器級函數,與匯編語言相比,C語言又有如下優(yōu)點:
·不需要了解51單片機的指令系統(tǒng),僅僅要求對存儲器結構有初步了解;
·程序有規(guī)范的結構,可分為不同的函數,使得程序結構化;
·語言簡潔、緊湊,使用方便、靈活。
·運算符極其豐富;
·提供的庫包含許多標準子程序,具有較強的數據處理能力;
·編程和程序調試效率高;
·程序易于模塊化,便于移植。
C51的版本很多,下面就以德國KeilSoftware公司專門為8051單片機開發(fā)的KeilC51編譯器為例,對MCS51單片機如何使用C51進行編程做一個簡單的介紹。6.1.1C51程序創(chuàng)建過程
1.C51程序的創(chuàng)建過程
第一步:創(chuàng)建C51工程文件,如圖6.1所示。
點擊project→newproject→輸入工程名myproject,如圖6.2所示。
保存文件→選擇器件→Atmel,如圖6.3所示。
AT89C51→確定,如圖6.4所示。
圖6.1創(chuàng)建C51工程文件
圖6.2輸入工程名
圖6.3選擇器件
圖6.4點擊確定第二步:創(chuàng)建源(.c)文件。
點擊File→newFile,如圖6.5所示。
點擊保存→輸入源文件(.c)myproject.c,如圖6.6所示。
點擊Target1→SourceGroup1→點擊右鍵→AddFilestoGroup′SourceGroup1′→添加(.c),如圖6.7所示。
第三步:對生成文件進行設置。
鼠標放于Target1右擊→OptionsforTarget′Target1′,如圖6.8所示。
TargetOutput→CreateHEXFileHEXFormat:→確定,如圖6.9所示。
圖6.5創(chuàng)建文件
圖6.6輸入源文件
圖6.7添加
圖6.8OptionsforTarget′Target1′
圖6.9點擊確定
2.C51編程時常用到的頭文件
absacc.h:包含允許直接訪問8051不同存儲區(qū)的宏定義。
ctype.h:字符轉換和分類程序。
math.h:數學程序。
stdlib.h:存儲區(qū)分配程序。
assert.h:文件定義assert宏,可以用來建立程序的測試條件。
reg52.h:52的特殊寄存器。
intrins.h:包含指示編譯器產生嵌入式固有代碼的程序的原型。6.1.2存儲空間定義
在C51中,變量存儲空間有以下兩種定義方式:
(1)[數據類型][存儲器類型]變量名
(2)[存儲器類型][數據類型]變量名
C51內部只有128B的RAM,因而必須根據需要指定各種變量的存放位置。C51定義的存儲器類型與存儲空間如表6.1所示。表6.1C51定義的存儲器類型與存儲空間6.1.3C51數據類型
C語言數據類型包括:基本類型、構造類型、指針類型和空類型。其中,基本類型包括位(bit)、字符(char)、整型(int)、短整型(short)、長整型(long)、浮點型(float)以及雙精度浮點型(double);構造類型包括數組(array)、結構體(struct)、共用體(union)和枚舉類型(enum)。
對于51單片機編程而言,支持的數據類型是和編譯器有關的,比如在C51編譯器中整型(int)和短整型(short)相同,浮點型(float)和雙精度浮點型(double)相同。表6.2列出了KeilC51編譯器所支持的數據類型。表6.2C51數據類型
6.1.4C51的常量
C語言中的數據有常量與變量之分。在程序運行過程中,值不能改變的量稱為常量,而變量是可以在程序運行過程中不斷變化的量。
C51常量有五種類型:位型常量、整型常量、浮點型常量、字符型常量和字符串型常量。
(1)位型常量:位型常量是1位二進制值。
(2)整型常量:可以表示為十進制,如17,0,-33等。若表示為十六進制,則以0x開頭,如0x2A,0x5D等。長整型就在數字后面加字幕L,如:104L,034L等。表6.3整型常量表
(3)浮點型常量:浮點型常量可表示為十進制和指數形式。十進制由數字和小數點組成,如:0.8878,334.5等;指數表示形式為:[±]數字[.數字]e[±]數字,方括號“[]”中的內容為可選項,其中內容根據具體情況可有可無,但其余部分必須有,如125e3,7e9,-3.0e-3等。
在C51中浮點型常量默認為float型。對于絕對值小于1的浮點型常量,其小數點前的零可以省略。例如,0.34可以寫成.34,-0.021E-3可以寫成-.021E-3。
(4)字符型常量:字符型常量是單引號內的字符,如‘a’,‘d’等,用單個字符表示,用一對單引號括起來,其中單引號只起定界作用,并不表示字符。
轉義字符用于標示ASCII碼字符集中的格式控制字符和特定功能字符。這些字符不能打印,例如:(‘),(“),(\)等。常用的轉義字符如表6.4所示。
(5)字符串型常量:字符串型常量由雙引號內的字符組成,如“ERROR”,“OK”等。當雙引號內沒有字符時,為空字符串。在C語言中字符串常量是作為字符類型數據來處理的。在存儲字符串時,系統(tǒng)會在字符串尾部加上轉義字符\0,作為該字符串的結束符。表6.4常用的轉義字符
6.1.5C51常用的運算符
運算符表示特定的算術或邏輯操作的符號。C語言中的運算符和表達式數量很多,這在高級語言中是少見的。正是豐富的運算符和表達式使C語言功能十分完善。這也是C語言的主要特點之一。
C51語言有算術運算符、邏輯運算符、關系運算符、位運算符、賦值運算符、條件運算符和指針運算符7類運算符。
1.算術運算符
算術運算符用于各類數值運算,包括加(+),減(-),乘(×),除(÷)、求余或模運算(%),自增(++),自減(--)7種(見表6.5)。用算術運算符和括號將運算對象連接起來的式子稱為算術表達式。其中,運算對象包括常量、變量、函數、數組、結構等。表6.5算術運算符表
2.邏輯運算符
邏輯運算符用于邏輯運算,包括邏輯與(&&)、邏輯或(||)和邏輯非(!)3種。
(1)“!”運算符:進行邏輯非運算。
(2)“||”運算符:進行邏輯或運算。
(3)“&&”運算符:進行邏輯與運算。
運算符“&&”和“||”符號是雙目運算符,要求有兩個運算對象,而“!”運算符為單目運算符,只要求有一個運算對象?!?”運算符的優(yōu)先級高于算術運算符,算術運算符優(yōu)先級高于關系運算符,關系運算符優(yōu)先級高于邏輯運算符“&&”和“||”,“&&”和“||”的優(yōu)先級高于賦值運算符。用邏輯運算符將關系表達式或邏輯量連接起來的式子成為邏輯表達式,邏輯表達式的結合性為自左向右,其值應是一個邏輯的真或假。邏輯表達式的值和關系表達式的值相同,以1代表真,以0代表假。
3.關系運算符
關系運算符用于比較運算,包括大于(>)、小于(<)、大于等于(>=)、小于等于(<=)、等于(==)和不等于(?。?6種(見表6.6)。
前四種優(yōu)先級相同,后兩種優(yōu)先級相同,前四種的優(yōu)先級高于后兩種,關系運算符的優(yōu)先級低于算術運算符,但高于賦值運算符。表6.6關系運算符表
4.位運算符
位運算符是用來進行二進制位運算的運算符,包括邏輯位運算符和移位運算符(見表6.7)。邏輯位運算符包括位與(&)、位或(|)、位取反(~)和位異或(^);移位運算符包括位左移(<<)和位右移(>>)。
除了位取反(~)是單目運算符,其它位運算符均為雙目運算符。
5.賦值運算符
賦值運算符用于賦值運算,分為簡單賦值(=)、復合算術賦值(+=,-=,*=,/=,%=)和復合位運算賦值(&=,|=,^=,>>=,<<=)。表6.7位運算符表
6.條件運算符
條件運算符是一個三目運算符。唯一的三目運算是條件運算,條件運算符是“?:”,條件表達式的形式為:
<表達式1>?<表達式2>:<表達式3>其含義為:若<表達式1>的值為“真”,則條件表達式取<表達式2>的值;否則,取<表達式3>的值。
7.指針運算符
指針運算符用于取內容(*)和取地址(&)兩種運算。6.1.6C51的表達式
表達式由操作數和運算符組成。C51主要有算術運算表達式、賦值表達式、逗號表達式、關系表達式和邏輯表達式5種表達式。
1.算術運算表達式
算術運算表達式是指由算術運算符將操作數連接起來的式子,可以使用括號。
例如:(a+b)*c
2.賦值表達式
賦值表達式是指由賦值運算符“=”將一個變量和一個常量或表達式連接起來的式子。例如:a=23;c=a+b
3.逗號表達式
逗號表達式是指由逗號運算符“,”和括號將多個表達式連接起來的式子。一般形式為:表達式1,表達式2,…表達式n。
4.關系表達式
關系表達式是指將兩個表達式用關系運算符連接起來的式子,關系運算又稱比較運算。
例如:x>y;x!=y(tǒng)
5.邏輯表達式
邏輯表達式是指將兩個表達式用邏輯運算符連接起來的式子。邏輯表達式中操作的對象可以是任意類型的數據,其值為邏輯值“真”或“假”。6.1.7C51的基本語句
C51的基本語句與C語言的基本語句相同,有以下幾種:if(選擇語句),while(循環(huán)語句),for(循環(huán)語句),switch/case(分支語句),dowhile(循環(huán)語句)。
6.2.1函數的定義
1.函數
在C51編程語言中,一般函數的定義形式如下:
類型說明符函數名(形式參數列表)
{
語句1;
語句2;6.2C51的函數和數組語句n;
return語句;
}
注:形式參數可以沒有,即該函數可為無形式參數的函數。
2.中斷函數
C51中斷函數的形式:
void函數名()interrupt中斷號[using工作組]
{中斷服務程序內容
}
注意:
(1)中斷不能返回任何值,所以前面是void;
(2)函數名可以自己起,但不要與C語言的關鍵字相同;
(3)中斷函數不帶任何參數,所以函數名后面的()內是空的;
(4)中斷號是指單片機的幾個中斷源的序號。這個序號是單片機識別不同中斷的唯一標志,所以一定要寫正確;
(5)后面的using工作組是指這個中斷使用單片機內存中4個工作寄存器的哪一組,C51編譯后會自動分配工作組,因此using工作組通常省略不寫。6.2.2數組的定義
1.一維數組的定義
一維數組的定義形式如下:
數據類型數組名[整型常量表達式]
(1)數據類型:規(guī)定數組元素的數據類型。
(2)數組名:表示數組的名稱。
(3)整型常量表達式:規(guī)定了數組中包含元素的個數。
2.多維數組的定義
多維數組的定義形式如下:
數據類型數組名[整型常量表達式1]…[整型常量表達式n]
學習C51編程語言,應該按照一定的規(guī)范培養(yǎng)良好的編程習慣,良好的編程習慣有助于編程人員理清思路,整理和理解代碼,有利于代碼的優(yōu)化。6.3C51的編程規(guī)范6.3.1注釋
注釋是為了解釋程序代碼的作用,本身并不參與編譯鏈接。在C51中,注釋有兩種:一種用“//”用來注釋一行;另一種用“/**/”來對程序的一部分進行注釋。6.3.2命名
在C51程序設計時,經常會用到自定義的一些函數或者變量,這些自定義的函數或變量應當遵循能夠反映函數或變量功能的原則。
通常在表示數據的變量前面加上前綴,當看到變量時能夠很容易看出其數據類型。
例如:變量ucdata,前綴uc表示unsignedchar。
注:命名時不要和系統(tǒng)的標示符或關鍵字發(fā)生沖突。6.3.3格式
理論上,main()函數可以放在任何位置,但是為了便于程序的閱讀,main()函數盡量靠前。其順序為:頭文件,自定義函數或變量的聲明,main()函數,自定義函數。
對于源程序文件,不同結構之間要留空行,以此來區(qū)分不同的結構,使程序看起來條理清晰。要求“{”“}”配對對齊。程序代碼使用Table鍵實現(xiàn)縮進和對齊。
例6.1數據塊傳送。
例:將片內40H~60H單元中的內容送到以3000H為首地址的存儲區(qū)。
程序代碼:#include<reg51.h>
#include<stdlib.h>6.4C51的基本運用
#defineucharunsignedchar
#defineuintunsignedint
uchardata*data_in;
uintxdata*data_out;
voidmain()
{
uchari;
data_in=0x40;
data_out=0x3000;
for(i=0;i<32;i++)
{
*data_out=*data_in;
data_out++;
data_in++;
}
}
例6.2排序。
例:任意給幾個數,運用冒泡法排序,然后將排序結果通過LED顯示出來,其電路圖如圖6.10所示。
圖6.10排序的電路圖程序代碼:#include<reg51.h>
#defineucharunsignedchar
uchar*Min_to_max(uchars[],ucharn);//從小到大排序
voiddelay(ucharx);//延時xms
voidLED(uchars[],ucharn);//LED顯示
ucharchange(ucharx);//將十進制數字轉化的LED顯示對應的數字
voidmain()
{
uchara[6]={4,1,5,2,7,8};//任意已知的6個數
uchar*p;
p=Min_to_max(a,6);
LED(p,6);
}
uchar*Min_to_max(uchars[],ucharn)
{
uchari,j,t;
for(i=0;i<n;i++)
{
for(j=0;j<n-i-1;j++)
{
if(s[j]>s[j+1])
{
t=s[j];
s[j]=s[j+1];
s[j+1]=t;
}
}
}
returns;
}
voiddelay(ucharx)
{
uchari=0;
while(x--)
{
for(i=0;i<125;i++)
{
;
}
}
}
voidLED(uchars[],ucharn)
{
uchari;
for(i=0;i<n;i++)
{
P2=change(s[i]);
delay(250);
delay(250);
}
}
ucharchange(ucharx)
{
switch(x)
{
case0:return0x03;break;
case1:return0xf3;break;
case2:return0x25;break;
case3:return0x0d;break;
case4:return0x99;break;
case5:return0x49;break;
case6:return0x41;break;
case7:return0x1f;break;
case8:return0x01;break;
case9:return0x19;break;
}
}例6.3跑馬燈程序。
例:共8只LED燈,連成一排,要求:相隔0.5s跑馬燈跑向下一個位置,依次循環(huán),且始終保持8個LED燈中只有一個燈在跑,其電路圖如圖6.11所示。
圖6.11跑馬燈的電路圖程序代碼:#include<reg51.h>
#defineucharunsignedchar
voiddelay(ucharx);//延時xms
voidlight(void);//實現(xiàn)跑馬燈相隔0.5s跑向下一位置
voidmain()
{
light();
}
voidlight(void)
{
uchari,tmp;
while(1)
{
tmp=0xfe;
for(i=0;i<8;i++)
{P1=tmp;
tmp=(tmp<<1)|1;
delay(250);
delay(250);
}
}
}
voiddelay(ucharx)
{uchari;
while(x--)
{
for(i=0;i<125;i++)
{
;
}
}
}
例6.4中斷實例。
例:利用T0(或T1)定時,外部中斷INT0(或INT1)實現(xiàn)跑馬燈的跑與停,其電路圖如圖6.12所示。
圖6.12中斷的電路圖程序代碼:#include<reg51.h>
#defineucharunsignedchar
voidinit(void);//初始化T1中斷,INT1中斷
uchartmp;
voidmain()
{init();
}
voidinit(void)
{tmp=0xfe;
TMOD=0x10;//T1的方式1
TH1=0xff;
TL1=0x00;
ET1=0;
EA=1;
TR1=1;
IT1=1;//外部中斷1采用邊沿觸發(fā)
EX1=1;
}
voidt1()interrupt3
{
if(tmp==0xff)
{tmp=0xfe;
P1=tmp;
}
else
{P1=tmp;
tmp=(tmp<<1)|1;
}
TH1=0xff;
TL1=0x00;
}
voidrupt()interrupt2//通過控制T1中斷的開與斷來控制跑馬燈的跑與停
{
ET1=!ET1;
}例6.5利用T0或T1實現(xiàn)周期為0.4ms,占空比為1∶2的方波,如圖6.13所示。
程序代碼:#include<reg51.h>
#defineucharunsignedchar
sbitP1_0=P10;
voidinit(void);
voidmain()圖6.13方波
{init();
}
voidinit(void)
{
TMOD=0x20;
TL1=0x38;
TR1=1;
ET1=1;
EA=1;
}
voidtime1(void)interrupt3
{
P1_0=!P1_0;
}
例6.6鍵盤使用實例。
例:按下鍵盤的任意一個鍵,確定并顯示按鍵位置,其電路圖如圖6.14所示。
圖6.14鍵盤的電路圖程序代碼:#include<reg51.h>
#defineucharunsignedchar
voiddelay(void);
ucharkeyscan(void);
ucharinput(void);
voidmain()
{
while(1)
{
P2=input();
}
}
voiddelay(void)
{
inti,j;
for(i=0;i<10;i++)
{
for(j=0;j<50;j++)
{
;
}
}
}
ucharkeyscan(void)
{
ucharscancode,tmpcode;
P1=0xf0;
if((P1&0xf0)!=0xf0)
{
delay();
if((P1&0xf0)!=0xf0)
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年超鈾元素及其提取設備合作協(xié)議書
- 醫(yī)療穿戴設備企業(yè)招聘協(xié)議模板
- 2025年粉體無篩分離設備項目發(fā)展計劃
- 2025上海勞動合同法
- 2024年繼承股權協(xié)議:父子間的股份承接
- 城市公園防水系統(tǒng)修繕合同
- 建筑工程保溫系統(tǒng)施工合同
- 醫(yī)療新技術項目監(jiān)管辦法
- 城市食品安全處方管理辦法
- 服裝設計師勞動合同書
- 《金融工程原理-無套利均衡分析》筆記01
- 工程項目收尾管理辦法
- 閘門及啟閉機安裝專項施工方案
- 應征公民體格檢查表(征兵)
- 電力系統(tǒng)分析名詞解釋、簡答、模擬試卷
- 家具制造企業(yè)消防安全要求
- 鋼筋位置及保護層厚度檢測ppt課件
- 巖石堅固性和穩(wěn)定性分級表
- 控制網復測及控制點加密復測報告課件
- CNC程序控制管理辦法
- 案例思念休閑吧
評論
0/150
提交評論