版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
第5章C51應(yīng)用基礎(chǔ)
5.1
KeilC51簡介5.2
C51程序設(shè)計基礎(chǔ)知識
5.3
C51的函數(shù)與數(shù)組5.4
C51的編程規(guī)范5.5
C51的基本應(yīng)用
習(xí)題與思考題
C語言是一種通用的計算機語言。它既可以用來編寫系統(tǒng)程序,也可以用來編寫應(yīng)用程序。它同時具有匯編語言和高級語言的特點。在早期單片機開發(fā)中,基本上是使用匯編語言,也有使用BASIC等高級語言進行開發(fā)的。20世紀(jì)90年代中期以后,使用C語言開發(fā)單片機成為一種流行的趨勢,因為它具有使用方便、編程效率高及仿真調(diào)試容易等突出特點。C51的版本很多,本章以德國KeilSoftware公司專門為8051單片機開發(fā)的KeilC51編譯器為例,對51系列單片機如何使用C51進行編程作一簡單的介紹。5.1
KeilC51簡介
1.KeilC51主要模塊
KeilC51的主要模塊有:
·C51優(yōu)化C編譯器;
·A51宏匯編器;
·8051工具連接器、目標(biāo)文件轉(zhuǎn)換器、庫管理器;
·Windows版dScope源程序調(diào)試器/模擬器;
·Windows版μVision集成開發(fā)環(huán)境。
2.KeilC51編程步驟
使用KeilC51編程和用其他軟件開發(fā)項目時大致一樣,按下列步驟編程:
(1)創(chuàng)建C或匯編語言的源程序;
(2)編譯或匯編源文件運算符;
(3)糾正源文件中的錯誤;
(4)連接產(chǎn)生目標(biāo)文件;
(5)模擬調(diào)試用戶程序。
KeilC51既可以編輯、編譯和調(diào)試匯編語言程序,也可以編輯、編譯和調(diào)試C51程序,是一個基于Windows平臺的集成開發(fā)環(huán)境。它不但可以仿真模擬一般的程序運行,而且還可以仿真模擬I/O口、定時器/計數(shù)器、串行口及中斷等單片機特有的功能部件,甚至可以模擬在某個I/O引腳上輸入一個方波或正弦波,其功能非常強大。鑒于本書篇幅有限,只就C51編程的一些基本方法作簡要的介紹,如需深入了解可參閱有關(guān)專門介紹KeilC51的書籍。5.2
C51程序設(shè)計基礎(chǔ)知識
5.2.1
C51特點
C51是針對8051系列單片機開發(fā)的高級語言。它與一般的標(biāo)準(zhǔn)C語言基本一致,但根據(jù)8051單片機的硬件特點作了少量的擴展和重新定義。例如,C51支持位變量,printf函數(shù)由串行口輸出而不是屏幕輸出,以及不同廠家的單片機為描述其硬件的差異需要使用特定的頭文件等。C51主要有以下特點:(1)語言簡潔、緊湊,使用方便、靈活。(2)運算符極其豐富。(3)生成的目標(biāo)代碼質(zhì)量高,程序執(zhí)行效率高(與匯編語言相比)。(4)可移植性好(與匯編語言相比)。(5)可以直接操作硬件。5.2.2一個簡單的C51例子一個完整的C51程序是由一個main()函數(shù)(又稱主函數(shù))和若干個其他函數(shù)結(jié)合而成的,或僅由一個main()函數(shù)構(gòu)成。
【例5[CD*2]1】[HT][ST]僅由main()函數(shù)構(gòu)成的C語言程序。
#include<reg51.h>
#include<stdio.h>
#include<intrins.h>
voidmain(void)
{
P0=0x00;
P1=0x01;
P2=0x02;
P3=0x03;
}程序說明:
(1)Reg51.h為寄存器說明頭文件;stdio.h為輸入/輸出說明頭文件;intrins.h為部分特殊指令說明頭文件??筛鶕?jù)對8051編程的需要選擇不同的頭文件,一般情況下若只用于簡單控制,這三個頭文件就夠了。具體頭文件包含的內(nèi)容見相關(guān)資料。一般編程時先寫上這三個頭文件,如果編譯出錯再根據(jù)錯誤信息加其他的頭文件。
(2)main()函數(shù)為C51的主函數(shù)。由于P0、P1、P2及P3口在reg51.h中已有說明,故可以直接賦值。運行結(jié)果:將P0、P1、P2及P3口依次置為0x00、0x01、0x02及0x03(其中0x00、0x01、0x02及0x03為C語言中十六進制0、1、2及3的表示方法)。在KeilC51中的運行結(jié)果如圖5-1所示。圖5-1例5-1的運行結(jié)果圖5.2.3
C51的基礎(chǔ)知識標(biāo)識符為程序中某個對象的名字。這些對象可以是變量、常量、函數(shù)、數(shù)據(jù)類型及語句等。標(biāo)識符命名規(guī)則如下:(1)為有效字符,即只能由字母、數(shù)字和下劃線組成,且以字母或下劃線開頭。(2)在有效長度范圍內(nèi),有效長度隨系統(tǒng)而異,但至少前8個字符有效。如果超長,則超長部分被舍棄。關(guān)鍵字是C51用于說明類型、語句功能等專門用途的標(biāo)識符,又稱保留字,如int、printf等。標(biāo)準(zhǔn)C語言的關(guān)鍵字共有32個。根據(jù)關(guān)鍵字的作用,可將其分為數(shù)據(jù)類型關(guān)鍵字、控制語句關(guān)鍵字、存儲類型關(guān)鍵字和其他關(guān)鍵字四類。C51結(jié)合單片機的特點在此基礎(chǔ)上又?jǐn)U展了一部分關(guān)鍵字,如data、sfr及bit等。5.2.4存儲空間定義
單片機由于體積小,因此不可能像微型計算機那樣有很大的存儲器,如8051內(nèi)部只有128字節(jié)的RAM。因而,首先必須根據(jù)需要指定各種變量的存放位置,這一點是C51與標(biāo)準(zhǔn)C語言的主要差異。C51定義的存儲器類型關(guān)鍵字及對應(yīng)存儲變量的存儲空間如表5-1所示。表5-1
C51定義的存儲器類型與存儲空間5.2.5
C51數(shù)據(jù)類型
C51的數(shù)據(jù)類型有以下幾類。
1)Char:字符型(8位整數(shù))字符型數(shù)據(jù)的長度為1個字節(jié),可分為以下兩種:(1)unsignedchar:字符或無符號8位整數(shù)。數(shù)據(jù)范圍:0~256。(2)signedchar:有符號8位整數(shù)。其最高位為符號位,數(shù)據(jù)范圍:-128~+127。默認(rèn)值為signedchar。
2)Int:整型(16位整數(shù))整型數(shù)據(jù)的長度為2個字節(jié),可分為以下兩種:(1)unsignedint:無符號16位整數(shù)。數(shù)據(jù)范圍:0~65536。(2)signedint:有符號16位整數(shù)。其最高位為符號位,數(shù)據(jù)范圍:-32768~+32768。默認(rèn)值為signedint。
3)long:長整型(32位整數(shù))長整型數(shù)據(jù)的長度為4個字節(jié),可分為以下兩種:(1)unsignedlong:無符號16位整數(shù)。數(shù)據(jù)范圍:0~4294967295。(2)signedlong:有符號16位整數(shù)。其最高位為符號位,數(shù)據(jù)范圍:-2147483648~+2147483647。默認(rèn)值為signedlong。
4)float:單精度浮點型單精度浮點型數(shù)據(jù)的長度為4個字節(jié)。
5)*:指針型指針型數(shù)據(jù)是存放數(shù)據(jù)地址的變量,即它存放的是需要尋址數(shù)據(jù)的地址。定義和使用指針型變量可以很方便地對8051單片機各部分物理地址直接進行操作。其實際應(yīng)用參考后面的應(yīng)用實例。
6)bit:位型位型數(shù)據(jù)是C51編譯器提供的一種擴展數(shù)據(jù)類型。使用它可以定義一個位變量,但不能定義位指針,也不能定義位數(shù)組。例如:
intbdataibase;/*Bit-addressableint*/
charbdatabary[4];/*Bit-addressablearray*/
sbitmybit0=ibase∧0;/*bit0ofibase*/
sbitmybit15=ibase∧15;/*bit15ofibase*/
sbitAry07=bary[0]∧7;/*bit7ofbary[0]*/
sbitAry37=bary[3]∧7;/*bit7ofbary[3]*/
7)sfr:特殊功能寄存器型特殊功能寄存器型數(shù)據(jù)是C51編譯器提供的一種擴展數(shù)據(jù)類型,用于訪問8051單片機的特殊功能寄存器,長度為1個字節(jié),是一個僅用于特殊功能寄存器空間的8位無符號的整型變量。例如:
SfrP0=0x80/*Port-0,address80H*/
SfrP1=0x90/*Port-1,address90H*/
SfrP2=0xA0/*Port-2,address0A0H*/
SfrP3=0xB0/*Port-3,address0B0H*/
8)sfr16:16位特殊功能寄存器型
16位特殊功能寄存器型數(shù)據(jù)是C51編譯器提供的一種擴展數(shù)據(jù)類型。此類型數(shù)據(jù)用于以16位方式訪問8051單片機的特殊功能寄存器,數(shù)據(jù)長度為2個字節(jié),也是一個僅用于特殊功能寄存器空間的16位無符號的整型變量。例如:
Sfr16T2=0xCC;/*Timer2:T2L0CCh,T2H
0CDH*/
Sfr16RCAP2=0xCA; /*RCAP2L0CAH,RCAP2H
0CBH*/
9)sbit:可尋址位型可尋址位型數(shù)據(jù)是C51寄存器提供的一種擴展數(shù)據(jù)類型。它用于定義和訪問8051內(nèi)部RAM及特殊功能寄存器中可位尋址的空間。例如:
SfrPSW=0xD0;
SfrIE=0xA8;
SbitOV=PSW∧2;
SbitCY=PSW∧7;
SbitEA=IE∧7;表5-2為C51支持的所有數(shù)據(jù)類型一覽表。表5-2
C51支持的數(shù)據(jù)類型5.2.6
C51存儲空間的定義在C51中,變量存儲器空間按下列兩種方式定義均可:方式1[數(shù)據(jù)類型][存儲器類型]變量名方式2[存儲器類型][數(shù)據(jù)類型]變量名例如:UnsignedchardataI,num;/*在內(nèi)部RAM中定義變量1,
num*/Unsignedchardatadisplay_data_buff[8];/*數(shù)據(jù)顯示緩沖區(qū)*/Unsignedchardatadisplay_code_buff[8];/*顯示字形緩沖區(qū)*/Unsignedcharcodedisplay_code[16]={0x0C0,0x0F9,0x0A4,0x0B0,0x99,0x92,0x82,0x0F8,/*0,1,2,3,4,5,6,7*/0x80,0x90,0x88,0x83,0x0C6,0x0A1,0x86,0x8E/*8,9,A,B,C,D,E,F(xiàn)*/};其中,display_data_buff[8]、display_code_buff[8]、I、num被定義在內(nèi)部RAM中,而display_code[16]是常數(shù),因此被定義在代碼區(qū)中。5.2.7
C51的常量
C51的常量可分為以下幾種。
1.整型常量在C語言中,8位整型和16位長整型量以下列方式表示:(1)十進制整型常量。如250、-12等,其每個數(shù)字位可以是0~9。(2)十六進制整型常量。如果整型常量以0x或0X開頭,就表示為十六進制形式的整型常量。十進制數(shù)128,用十六進制表示為0x80,其每個數(shù)字位可以是0~9,a~f。
2.浮點型常量
C51中,浮點型常量用十進制數(shù)形式表示時,由數(shù)字和小數(shù)點組成。如3.14159、-7.2、9.9等都是用十進制數(shù)的形式表示的浮點數(shù)。浮點型常量還可用指數(shù)法形式表示。指數(shù)法又稱為科學(xué)記數(shù)法,它是為了方便計算機對浮點數(shù)的處理而提出的。如十進制數(shù)180000.0用指數(shù)法可以表示為1.8e5,其中1.8稱為尾數(shù),5稱為指數(shù),字母e也可用E表示。又如,0.00123可以表示為1.23E-3。需要注意的是,用指數(shù)形式表示浮點數(shù)時,字母e或E之前(即尾數(shù)部分)必須有數(shù)字,且e后面的指數(shù)部分必須是整數(shù)。如e-3、9.8e2.1、e5等都是不合法的指數(shù)表示形式。
3.字符型常量字符型常量是由一對單撇號括起來的單個字符,如′a′,′*′和′8′等都是合法的字符型常量。除此之外,C51還允許使用一些特殊的字符常量,這些字符常量都是以反斜杠字符(\)開頭的字符序列,稱為“轉(zhuǎn)義字符”。表5-3給出了C51語言中由轉(zhuǎn)義字符構(gòu)成的控制符。表5-3
C51語言中的轉(zhuǎn)義字符
4.字符串常量
C51語言除了允許使用字符常量外,還允許使用字符串常量。字符串常量是由一對雙撇號括起來的字符序列,如″string″就是一個字符串常量。
C51與C語言相同,每個字符串的結(jié)尾,系統(tǒng)都會自動加一個字符串結(jié)束標(biāo)志\0,以便系統(tǒng)判斷字符串是否結(jié)束。\0代表空操作字符,它不引起任何操作,也不會顯示到屏幕上。例如字符串″Iamastudent″在內(nèi)存中的形式如下:它的長度不是14而是15,最后一個字符為\0。注意,在寫字符串時不能加\0。所以,字符串″a″與字符′a′是不同的兩個常量。前者是由字符′a′和字符\0構(gòu)成的,而后者僅由字符′a′構(gòu)成。需要注意的是,不能將字符串常量賦給一個字符變量。在C51語言中,沒有專門的字符串變量,如果要保存字符串常量,則要用一個字符數(shù)組來存放。5.2.8
C51的常用運算符
C51的運算符與C語言的運算符基本上是一致的。它把除了控制語句和輸入/輸出以外的幾乎所有的基本操作都作為運算符處理,例如將賦值符“=”作為賦值運算符,方括號作為下標(biāo)運算符。C51的運算符有以下幾類:算術(shù)運算符 (+
-*/
%
++
--)關(guān)系運算符 (<
>
==
<=
>=
!=)邏輯運算符(!
&&
||)位運算符(~
&
|∧)賦值運算符(=及擴展賦值運算符)條件運算符(?:)逗號運算符(,)指針運算符(*&)求字節(jié)運算符(sizeof)強制類型轉(zhuǎn)換運算符(類型)下標(biāo)運算符([])分量運算符(.→)其他(如函數(shù)調(diào)用運算符())1.算術(shù)運算符
·+:加法運算符,或正值運算符。如2+9=11。
·-: 減法運算符,或負(fù)值運算符。如9-5=4。
·*:乘法運算符。如4*5=20。
·/:除法運算符。如7/2=3,兩個整數(shù)相除結(jié)果為整數(shù),舍去小數(shù)。
·%:求模運算符,或稱求余運算符,要求兩側(cè)均為整型數(shù)。如9%2=1,9%5=4。
·++:自增運算符。++n表示在用該表達式的值之前先使n的值增1;n++表示在用該表達式的值之后再使n的值增1。
·--:自減運算符。--n表示在用該表達式的值之前先使n的值減1;
·n--表示在用該表達式的值之后再使n的值減1。
2.關(guān)系運算符
C51的關(guān)系運算符如表5-4所示。表5-4關(guān)系運算符
3.邏輯運算符
C51提供了三種邏輯運算符,分別為&&(邏輯與)、 ||(邏輯或)和!(邏輯非)。
4.位運算符
位運算本來屬于匯編語言功能,但由于C語言最初是為了編寫系統(tǒng)程序而設(shè)計的,所以,它提供了許多類似于匯編語言的處理能力。在C51中,位運算結(jié)合8051單片機的具體特點得到了進一步加強,并專門定義了SBIT可尋址位型(數(shù)據(jù)類型)。位操作對單片機的編程非常重要,故對位操作符進行詳細介紹。表5-5為位運算符的定義。表5-5位運算符
1)&:“按位與”運算符“按位與”的運算規(guī)則是:如果兩個運算對象的對應(yīng)二進制位都是1,則結(jié)果的對應(yīng)位是1,否則為0?!鞍次慌c”運算有如下一些用途:(1)將數(shù)據(jù)中的某些指定位清0。例如,假如x是字符型變量(占8個二進制位),則要將x的第2位置0,可進行如下運算:
x=x&0xfb;或x&=0xfb;(2)取出數(shù)據(jù)中的指定位。例如,為了判斷x的第4位是否為0,可進行如下運算:
If((x&0x10)!=0)…若條件表達式為真(即不為0),則x的第4位為1,否則為0。
2)|:“按位或”運算符“按位或”的運算規(guī)則是:只要兩個運算對象的對應(yīng)位有一個是1,則結(jié)果的對應(yīng)位為1,否則為0?!鞍次换颉边\算可將數(shù)據(jù)的某些指定位置1,而其余位不發(fā)生變化。例如,要將x中的第6位置1,可進行如下運算:
x=x|0x40;或x|=0x40;
3)∧:“按位異或”運算符“按位異或”的運算規(guī)則是:如果兩個運算對象的對應(yīng)位不同,則結(jié)果的對應(yīng)位為1,否則為0?!鞍次划惢颉笨赡艿倪\算組合及其結(jié)果如下:
0∧0=0;0∧1=1;1∧0=1;1∧1=0“按位異或”運算有如下一些應(yīng)用:(1)使數(shù)據(jù)中的某些位取反,其余位保持不變,即0變1,1變0。例如,要將x中的第5位取反,可進行如下的運算:
x=x∧0x20;或x∧=0x20;
(2)同一個數(shù)據(jù)進行“異或”運算后,結(jié)果為0。例如,要將x變量清0,可進行如下運算:
x∧=x;“異或”運算具有如下的性質(zhì):(x∧y)∧y=x例如,若x=0x17,y=0x06,則x∧y=0x11,0x11∧y=0x17。
4)~:“按位取反”運算符“按位取反”的運算規(guī)則是:將運算對象中的各位的值取反,即將1變0,將0變1。
5)和:“左移”運算符和“右移”運算符“左移”的運算規(guī)則是:將運算對象中的每個二進制位向左移動若干位,從左邊移出去的高位部分被丟掉,右邊空出的低位部分補零?!坝乙啤钡倪\算規(guī)則是:將運算對象中的每個二進制位向右移動若干位,從右邊移出去的低位部分被丟掉,對無符號數(shù)來講,左邊空出的高位部分補0。例如,若x=0x17,則語句
x=x2;表示將x中的每個二進制位左移2位后存入x中。由于0x17的二進制數(shù)表示為00010111,所以,左移2位后,將變?yōu)?1011100,即x=x2的結(jié)果為0x5c。其中,語句
x=x2;可以寫成:
x=2;例如,x=0x08,則語句
x=x2;表示將x中的每個二進制位右移2位后存入x中。由于0x08的二進制表示為00001000,所以,右移2位后,將變?yōu)?0000010,即x=x2的結(jié)果為0x02。其中,語句
x=x2;可以寫成:
x=2;在進行“左移”運算時,如果移出去的高位部分不包含1,則左移1位相當(dāng)于乘2,左移2位相當(dāng)于乘4,左移3位相當(dāng)于乘8,依此類推。因此,在實際應(yīng)用中,經(jīng)常利用“左移”運算進行乘以2倍的操作。在進行“右移”運算時,如果移出去的低位部分不包含1,則右移1位相當(dāng)于除以2,右移2位相當(dāng)于除以4,右移3位相當(dāng)于除以8,依此類推。因此,在實際應(yīng)用中,經(jīng)常利用“右移”運算進行除以2的操作。
【例5-2】用“左移”8位的方法分離出16位數(shù)的高8位,用“與”0x00ff的方法分離出16位數(shù)的低8位。程序清單如下:
#include<reg51.h>
#include<stdio.h>
#include<intrins.h>
voidmain(void)
{
unsignedintdatax;/*定義在內(nèi)部RAM中的無符號16位整數(shù)*/
unsignedchardatah,l;/*定義在內(nèi)部RAM中的無符號8位字符*/
h=x8;/*取x的高8位*/
l=x&0x00ff;/*取x的低8位*/
}
5.賦值運算符
C51語言的賦值運算符是“=”,它的作用是將賦值運算符右邊的表達式的值賦給其左邊的變量。如:
x=12;的作用是執(zhí)行一次賦值操作(運算),將12賦給變量x。
a=5+x;的作用是將表達式5+x的值賦給變量a。在賦值號“=”左邊的只能是變量,而不能是常量或表達式,如不能寫成:
2=x;或x+y=a+b;
C語言規(guī)定,凡是雙目運算符都可以與賦值符“=”一起組成復(fù)合的運算符。復(fù)合的賦值運算符一共有10種,即:+=-=*=/=
%=
=
=
&=
|=∧=例如:
a+=5等價于a=a+5
x*=y+8等價于x=x*(y+8)
a%=2等價于a=a%=2
x%=y+8等價于x=x%(y+8)
x=8等價于x=x8
y∧=0x55等價于y=y∧0x55
x&=y+8等價于x=x&(y+8)
使用這種復(fù)合的賦值運算符有兩個優(yōu)點:一是可以簡化程序,使程序精練;二是可以提高編譯效果,產(chǎn)生質(zhì)量較高的目標(biāo)代碼。5.2.9
C51的表達式
1.算術(shù)表達式由算術(shù)運算符和圓括號將運算對象連接起來的有意義的式子稱為算術(shù)表達式。例如:
a*(b+c);
(7+6)%5/2;
2.關(guān)系表達式用關(guān)系運算符將兩個表達式(可以是算術(shù)表達式或關(guān)系表達式、邏輯表達式、賦值表達式、字符表達式)連接起來構(gòu)成的式子稱為關(guān)系表達式。例如:
a+b>c
b>=c+a
c+a==b-c
d=a<b<c
f=a!=b<c若a=4,b=3,c=5,則:
·a+b>c等價于(a+b)>c。結(jié)果為“真”,表達式的值為1。
·b>=c+a等價于b>=(c+a)。結(jié)果為“假”,表達式的值為0。
·c+a==b-c等價于(c+a)=(b-c)。結(jié)果為“假”,表達式的值為0。
·d=a<b<c等價于d=(a<b<c)。d的值為1(在計算“a<b<c”時,因為“<”運算符是自左至右的結(jié)合方向,所以先執(zhí)行“a<b”得值為0,再執(zhí)行運算“0<c”得值為1,賦給d)。
·f=a!=b<c等價于f=(a!=(b<c))。f的值為1。
3.邏輯表達式用邏輯運算符將若干關(guān)系表達式或任意數(shù)據(jù)類型(除void外)的數(shù)據(jù)連接起來的有意義的式子稱為邏輯表達式。例如:
!a
a&&b
!b<a||5&&5<=5若a=5,b=0,則:
·!a的值為0。因為a的值為非0,所以被認(rèn)為是“真”,對它進行“非”運算,得“假”,因而!a值為0。
·a&&b的值為0。因為a的值為非0,所以被認(rèn)為是“真”,b的值為0,所以被認(rèn)為是“假”,因而a&&b的值為“假”,即為0。
·!b<a||5&&5<=5的值為1。對此表達式自左至右求解,執(zhí)行順序如下:
!b<a||5&&5<=5
①②⑤④③第①步“!b”的值為1。第②步“1<2”的值為1。第③步“5<=5”的值為1。此時,要運行的表達式變成“1||5&&1”(&&的優(yōu)先級比||高)。所以第④步“5&&1”的值為1。第⑤步“1||1”的值為1。如果需要使用復(fù)雜的邏輯表達式,建議使用括號區(qū)分邏輯表達式執(zhí)行順序(優(yōu)先級),以減少由于編譯程序在處理時帶來的不可預(yù)見的邏輯運算錯誤。另外,編譯程序在處理含有“&&”或“||”的表達式時,往往采用優(yōu)化的算法,即在從左到右的運算中,只要結(jié)果一確定,就不再繼續(xù)運算下去。對于<表達式1>&&<表達式2>&&<表達式3>&&…,在所有運算分量中,只要一個為假,則整個表達式的結(jié)果就為假。對于<表達式1>||<表達式2>||<表達式3>||…,在所有運算分量中,只要一個為真,則整個表達式的結(jié)果就為真。例如,對于表達式
((y=7)<6)&&((y=5)<6)在自左至右計算過程中,表達式“(y=7)<6”的值為假,即可確定整個表達式的值為假。(在進行&&運算時,只要其中一個為假,則結(jié)果就為假,所以右邊的表達式“(y=5)<6”就不再計算了。)
4.賦值表達式由賦值運算符將一個變量和另一個表達式連接起來的式子稱為賦值表達式。賦值表達式一般形式為變量賦值運算符表達式例如:
x=5
x=7%2+y
a=(b=6)或a=b=6(賦值表達式的值為6,a、b的值均為6)
a+=a*(若a=5,相當(dāng)于a=5+5*5)5.2.10
C51的基本語句
1.表達式語句
在表達式后加上一個“;”,就構(gòu)成了表達式語句。例如:
a=b+c;
u=3;v=4;
y=(m+n)*10/u;
j++;
2.復(fù)合語句復(fù)合語句是由若干條語句組合在一起形成的語句。它以“{”開始,以“}”結(jié)束,中間是若干條語句,語句間用“;”分隔。復(fù)合語句的一般形式為
{語句1;語句2;
語句N;
}下面為一個復(fù)合語句的例子:
If(rxd_newdata==rxd_buf[3])
{
rxd_newaddr=rxd_buf[1];
rxd_newdata=rxd_buf[2];
rxd_end=1;
}
其中:
{
rxd_newaddr=rxd_buf[1];
rxd_newdata=rxd_buf[2];
rxd_end=1;
}
為復(fù)合語句。當(dāng)條件rxd_newdata==rxd_buf[3]成立時,執(zhí)行該復(fù)合語句。
3.if條件選擇語句
if條件選擇語句是通過給定條件的判斷,來決定所要執(zhí)行的操作。
if條件選擇語句的一般形式如下:
if(條件表達式)語句1[else語句2]其中,用“[”和“]”括起來的部分表示其為可選項。當(dāng)if語句的條件表達式成立時執(zhí)行語句1;不成立時則執(zhí)行語句2?!癳lse語句2”為可選項。語句1和語句2可以是任何語句,當(dāng)然也包括if語句本身。其流程圖如圖5-2所示。圖5-2
if條件選擇語句的執(zhí)行流程例如:
if(txd_point>=4)
{
txd_end=1;
txd_data_full_flag=0;
txd_point=0;
}else
{SBUF=txd_buf[txd_point];}
4.switch多分支選擇語句
if-else語句一般適合用于兩路選擇,即在兩個分支中選擇一個執(zhí)行。盡管可以通過if條件選擇語句的嵌套形式來實現(xiàn)多路選擇的目的,但這樣做的結(jié)果是使得if條件選擇語句的嵌套層次太多,降低了程序的可讀性。C51中的switch多分支選擇語句提供了更方便地進行多路分支選擇的功能。
switch多分支選擇語句的一般形式如下:switch(表達式){
case常量表達式1:[語句1][break;]
case常量表達式2:[語句2][break;]
case常量表達式n:[語句n][break;][default:語句n+1]
}
switch的執(zhí)行過程:先計算表達式的值,然后將表達式的值與所有的常量表達式進行比較,若與某個常量表達式的值相同則運行相應(yīng)的語句,如該語句后有break語句,則退出,沒有break語句時則執(zhí)行下一條case語句;如果將表達式的值與所有常量表達式進行比較后均不相等則執(zhí)行default后的語句n+1(如有default語句)。
switch語句的執(zhí)行流程如圖5-3所示。圖5-3
switch語句的執(zhí)行流程例如:
voidexecute_end(unsignedcharrecv_cmd)
{
switch(rec_cmd)
{
case0:pgm_operation();/*編程操作*/break;
case1:read_operation();/*讀數(shù)據(jù)操作*/break;
case2:pgm_lock_bit1();/*寫加密位1操作*/serial_out(CMD_2);
break;
case3:verify_data();/*數(shù)據(jù)校驗操作*/
break;
default:/*復(fù)位*/break;
}
}
5.循環(huán)語句
1)while循環(huán)語句
while循環(huán)語句的一般形式如下:
while(表達式)循環(huán)體語句
while語句的執(zhí)行過程如下:
(1)求出while后圓括號內(nèi)表達式的值,若此值為“真”(非0),則執(zhí)行(2);若為“假”(為0),則執(zhí)行(4);(2)執(zhí)行循環(huán)體內(nèi)語句,如果循環(huán)體由一個以上的語句組成,則應(yīng)用{}將循環(huán)體括起來以形成復(fù)合語句;(3)轉(zhuǎn)向執(zhí)行(1);(4)結(jié)束while循環(huán),執(zhí)行while語句后的其他語句。while語句的特點是先判斷,再執(zhí)行。
while循環(huán)語句的執(zhí)行流程如圖5-4所示。圖5-4
while循環(huán)語句的執(zhí)行流程圖例如:
while(txd_point>=4)
{
txd_end=1;
txd_data_full_flag=0;
txd_point=0;
}do-while循環(huán)語句do-while循環(huán)語句的一般形式如下:
do
{循環(huán)體語句
}while(表達式);do-while語句的執(zhí)行過程如下:
(1)執(zhí)行do-while之間的循環(huán)體語句。
(2)計算while后圓括號內(nèi)表達式的值,若為“真”(非0),則重復(fù)執(zhí)行(1);若值為“假”(0),則執(zhí)行(3);
(3)結(jié)束循環(huán),執(zhí)行do-while循環(huán)語句后的其他語句。
do-while語句的特點是先執(zhí)行,再判斷。
do-while循環(huán)語句的執(zhí)行流程如圖5-5所示。圖5-5
do-while循環(huán)語句的執(zhí)行流程例如:
do{
txd_end=0;
txd_data_full_flag=0;
txd_point++;
}while(txd_point<4);
3)for循環(huán)語句在C語言中,for循環(huán)語句使用最為靈活,它的功能也很強,凡是用while語句能夠完成的循環(huán)功能,用for循環(huán)都能實現(xiàn)。
for循環(huán)語句的一般形式如下:
for(循環(huán)初值設(shè)定表達式;[循環(huán)終止條件表達式];[循環(huán)變量更新表達式])循環(huán)體其中,for循環(huán)語句中的三個表達式之間用“;”隔開,一般通俗地理解為(1)循環(huán)初值設(shè)定表達式通常是循環(huán)變量賦初值;(2)循環(huán)終止條件表達式判斷循環(huán)什么時候結(jié)束;(3)循環(huán)變量更新表達式用以控制循環(huán)變量的修改;(4)“語句”即for循環(huán)語句的“循環(huán)體”部分。for循環(huán)語句的執(zhí)行過程如下:(1)計算循環(huán)初值設(shè)定表達式的值;(2)計算循環(huán)終止條件表達式的值,若值為“真”(非0),則執(zhí)行(3);若值為“假”(0),則執(zhí)行(6);(3)執(zhí)行循環(huán)體中的語句;(4)計算循環(huán)變量更新表達式的值;(5)轉(zhuǎn)向(2)繼續(xù)執(zhí)行;(6)結(jié)束循環(huán),執(zhí)行for循環(huán)語句后的其他語句。for循環(huán)語句的執(zhí)行流程如圖5-6所示。圖5-6
for循環(huán)語句的執(zhí)行流程例如:s=0;
for(i=1;i<5;i++)
{s=s+i;}
6.goto語句
和標(biāo)準(zhǔn)C語言一樣,C51也提供了無條件轉(zhuǎn)移的goto語句。goto語句的一般形式如下:
goto標(biāo)號
goto語句的執(zhí)行過程是:將程序的執(zhí)行流程轉(zhuǎn)到以該標(biāo)號為前綴的語句去執(zhí)行。在C51中,標(biāo)號可以是任意合法的標(biāo)識符,可以和變量同名,但不允許和關(guān)鍵字同名。C語言允許在任何語句前添加符號,以作為goto語句的轉(zhuǎn)向目標(biāo)。標(biāo)號的一般形式如下:標(biāo)號:語句;
goto語句作為一種語言成分不是必需的,沒有它照樣能編寫程序。按結(jié)構(gòu)化程序設(shè)計的原則,應(yīng)該盡量不使用goto語句,因為它會影響程序的可讀性和模塊化。5.3
C51的函數(shù)與數(shù)組
函數(shù)是C語言程序的基本組成部分。在C語言中,一個程序可以由一個主函數(shù)main()和若干個子函數(shù)構(gòu)成,由主函數(shù)調(diào)用其他函數(shù),其他函數(shù)之間也可以相互調(diào)用,程序最后在main()函數(shù)中結(jié)束。在C語言中可以從不同的角度對函數(shù)分類。從函數(shù)定義的角度看,函數(shù)可分為庫函數(shù)和用戶定義函數(shù)兩種。庫函數(shù)由C系統(tǒng)提供,用戶無需定義,也不必在程序中作類型說明,只需在程序前包含該函數(shù)原型的頭文件即可在程序中直接調(diào)用。如printf、scanf、getchar、putchar、gets、puts等函數(shù)均屬此類。不過C51與標(biāo)準(zhǔn)C語言對上述函數(shù)處理不一樣。標(biāo)準(zhǔn)C語言中上述函數(shù)的輸入來自鍵盤,輸出是顯示器,而C51的輸入、輸出則均是串行口。C51除具有與標(biāo)準(zhǔn)C語言相同的庫函數(shù)外,還有一些與單片機有關(guān)的特殊庫函數(shù)。
C語言提供了極為豐富的庫函數(shù),這些庫函數(shù)又可從功能角度作以下分類。(1)字符類型分類函數(shù)。此類函數(shù)用于對字符按ASCII碼分類:數(shù)字、控制字符、分隔符、大小寫字母等。(2)轉(zhuǎn)換函數(shù)。此類函數(shù)用于字符或字符串之間的轉(zhuǎn)換;字符量與各類數(shù)字量(整型,實型等)之間的轉(zhuǎn)換;大、小寫之間的轉(zhuǎn)換等。(3)輸入/輸出函數(shù)。此類函數(shù)用于完成輸入/輸出功能。(4)數(shù)學(xué)函數(shù)。此類函數(shù)用于數(shù)學(xué)函數(shù)計算。(5)其他函數(shù)。此類函數(shù)用于其他各種功能。用戶定義函數(shù)指由用戶按需要編寫的函數(shù)。對于用戶自定義函數(shù),不僅要在程序中定義函數(shù)本身,而且在主調(diào)函數(shù)模塊中還必須對該被調(diào)函數(shù)進行類型說明,然后才能使用。
C語言的函數(shù)兼有其他語言中的函數(shù)和過程兩種功能,從這個角度看,又可把函數(shù)分為有返回值函數(shù)和無返回值函數(shù)兩種。有返回值函數(shù)在被調(diào)用執(zhí)行完后將向調(diào)用者返回一個執(zhí)行結(jié)果,稱為函數(shù)返回值。如數(shù)學(xué)函數(shù)即屬于此類函數(shù)。由用戶定義的這種要返回函數(shù)值的函數(shù),必須在函數(shù)定義和函數(shù)說明中明確返回值的類型。無返回值函數(shù)用于完成某項特定的處理任務(wù),執(zhí)行完成后不向調(diào)用者返回函數(shù)值。這類函數(shù)類似于其他語言的過程。由于函數(shù)無需返回值,因此用戶在定義此類函數(shù)時可指定他的返回為“空類型”,空類型的說明符為“void”。從主調(diào)函數(shù)和被調(diào)函數(shù)之間數(shù)據(jù)傳送的角度又可將函數(shù)分為無參函數(shù)和有參函數(shù)兩種。無參函數(shù)的函數(shù)定義、函數(shù)說明及函數(shù)調(diào)用中均不帶參數(shù)。主調(diào)函數(shù)和被調(diào)函數(shù)之間不進行參數(shù)傳送。此類函數(shù)通常用來完成一組指定的功能,可以返回或不返回函數(shù)值。有參函數(shù)也稱帶參函數(shù),在函數(shù)定義及函數(shù)說明時都有參數(shù),稱為形式參數(shù)(簡稱為形參)。有參函數(shù)在函數(shù)調(diào)用時也必須給出參數(shù),稱為實際參數(shù)(簡稱為實參)。進行函數(shù)調(diào)用時,主調(diào)用函數(shù)將把實參的值傳送給形參,供被調(diào)函數(shù)使用。5.3.1函數(shù)的定義函數(shù)定義的一般形式為類型標(biāo)識符函數(shù)名(形式參數(shù)表)形式參數(shù)說明
{說明部分函數(shù)體
}
1.無參函數(shù)的一般形式
類型說明符函數(shù)名()
{類型說明語句
}其中,類型說明符和函數(shù)名稱為函數(shù)頭;類型說明符指明了本函數(shù)的類型,函數(shù)的類型實際上是函數(shù)返回值的類型;函數(shù)名是由用戶定義的標(biāo)識符,函數(shù)名后有一個空括號,其中無參數(shù),但括號不可少;{}中的內(nèi)容稱為函數(shù)體,在函數(shù)體中也有類型說明,這是對函數(shù)體內(nèi)部所用到的變量的類型說明。在很多情況下都不要求無參函數(shù)有返回值,此時函數(shù)的類型可以寫為void。我們可以給出一個函數(shù)定義:
voidHello()
{
Printf(″Helloworld,\n″);
}此函數(shù)與主函數(shù)相比,只把main改為Hello,作為函數(shù)名,其余不變。Hello函數(shù)是一個無參函數(shù),當(dāng)被其他函數(shù)調(diào)用時,輸出Helloworld字符串。
2.有參函數(shù)的一般形式類型說明符函數(shù)名(形式參數(shù)表)形式參數(shù)類型說明
{類型說明語句
}有參函數(shù)比無參函數(shù)多了兩個內(nèi)容,其一是形式參數(shù)表,其二是形式參數(shù)類型說明。在形參表中給出的參數(shù)稱為形式參數(shù),他們可以是各種類型的變量,各參數(shù)之間用逗號間隔。在進行函數(shù)調(diào)用時,主調(diào)函數(shù)將賦予這些形式參數(shù)實際的值。形參既然是變量,當(dāng)然必須給予類型說明。例如,定義一個函數(shù),用于確定兩個數(shù)中的大數(shù),可寫為intmax(inta,intb){if(a>b)returna;
elsereturnb;
}
5.3.2數(shù)組
在程序設(shè)計中,為了處理方便,經(jīng)常把具有相同類型的若干變量按有序的形式組織起來,這些按序排列的同類數(shù)據(jù)元素的集合稱為數(shù)組。在C語言中,數(shù)組屬于構(gòu)造數(shù)據(jù)類型。一個數(shù)組可以分解為多個數(shù)組元素,這些數(shù)組元素可以是基本數(shù)據(jù)類型或是構(gòu)造類型。因此,按數(shù)組元素的類型不同,數(shù)組又可分為數(shù)值數(shù)組、字符數(shù)組、指針數(shù)組、結(jié)構(gòu)數(shù)組等各種類別。
1.一維數(shù)組
一維數(shù)組說明的一般形式為類型說明符數(shù)組名[常量表達式],…;其中,類型說明符是任意一種基本數(shù)據(jù)類型;數(shù)組名是用戶定義的數(shù)組標(biāo)識符;方括號中的常量表達式表示數(shù)據(jù)元素的個數(shù),也稱為數(shù)組的長度。例如:
inta[10];//整型數(shù)組a,有10個元素
floatb[10],c[20];//實型數(shù)組b,有10個元素;實型數(shù)組c,有20個元素
charch[20];//字符型數(shù)組ch,有20個元素對于數(shù)組類型說明應(yīng)注意以下幾點:(1)數(shù)組的類型實際上是數(shù)組元素的取值類型。對于同一個數(shù)組,其所有元素的數(shù)據(jù)類型都是相同的。(2)數(shù)組名的書寫規(guī)則應(yīng)符合標(biāo)識符的書寫規(guī)定。(3)數(shù)組名不能與其他變量名相同,例如:
voidmain()
{
inta;
floata[10];
}是錯誤的。
(4)方括號中的常量表達式表示數(shù)組元素的個數(shù),如a[5]表示數(shù)組a有5個元素,但其下標(biāo)是從0開始計算的,因此5個元素分別為a[0],a[1],a[2],a[3],a[4]。(5)不能在方括號中用變量來表示元素的個數(shù),但是可以是符號常數(shù)或常量表達式。例如:
#defineFD5
voidmain()
{
inta[3+2],b[7+FD];
}
是合法的。但是下述說明方式是錯誤的:
voidmain()
{
intn=5;
inta[n];
}
(6)允許在同一個類型說明中,說明多個數(shù)組和多個變量。例如:
inta,b,c,d,k1[10],k2[20];數(shù)組元素是組成數(shù)組的基本單元。數(shù)組元素也是一種變量,其標(biāo)識方法為數(shù)組名后跟一個下標(biāo)。下標(biāo)表示了元素在數(shù)組中的順序號。數(shù)組元素的一般形式為數(shù)組名[下標(biāo)]其中,下標(biāo)只能為整型常量或整型表達式,為小數(shù)時,C編譯將自動取整。例如,a[5],a[i+j],a[i++]都是合法的數(shù)組元素。數(shù)組元素通常也稱為下標(biāo)變量。必須先定義數(shù)組,才能使用下標(biāo)變量。在C語言中只能逐個地使用下標(biāo)變量,而不能一次引用整個數(shù)組。
【例5-3】將顯示數(shù)據(jù)緩沖區(qū)display_data_buff中的數(shù)字0~15轉(zhuǎn)換成七段字型碼送顯示字型緩沖區(qū)display_code_buff。程序清單如下:#include<reg51.h>#include<stdio.h>#include<intrins.h>voidmain(void){unsignedchardatai,num;
unsignedchardatadisplay_data_buff[8];//顯示數(shù)據(jù)緩沖區(qū)
unsignedchardatadisplay_code_buff[8];//字型顯示緩沖區(qū)
unsignedcharcodedisplay_code[16]={
0x0c0,0x0f9,0x0a4,0x0b0,0x99,0x92,0x82,0x0f8,//0,1,2,3,4,5,6,7
0x80,0x90,0x88,0x83,0x0c6,0x0a1,0x86,0x8e,//8,9,A,B,C,D,E,F(xiàn)
};
for(i=0;i<=7;i++){
num=display_data_buff[i];
display_code_buff[i]=display_code[num];} }其中,display_data_buff[8]、display_code_buff[8]、i、num被定義在內(nèi)部RAM中,而display_code_buff[16]是常數(shù),因而被定義在代碼區(qū)中。
2.二維數(shù)組前面介紹的數(shù)組只有一個下標(biāo),稱為一維數(shù)組,其中數(shù)組元素也稱為單下標(biāo)變量。在實際問題中,有很多量是二維或多維的,因此,C語言允許構(gòu)造多維數(shù)組。多維數(shù)組元素有多個下標(biāo),以標(biāo)識其在數(shù)組中的位置,所以也稱為多下標(biāo)變量。多維數(shù)組可由二維數(shù)組類推而得到。二維數(shù)組類型說明的一般形式為類型說明符數(shù)組名[常量表達式1][常量表達式2]…;其中,常量表達式1表示第一維下標(biāo)的長度;常量表達式2表示第二維下標(biāo)的長度。例如:
inta[3][4];說明了一個三行四列的數(shù)組,數(shù)組名為a,其下標(biāo)變量的類型為整型。該數(shù)組的下標(biāo)變量共有3×4個,即:
a[0][0],a[0][1],a[0][2],a[0][3]
a[1][0],a[1][1],a[1][2],a[1][3]
a[2][0],a[2][1],a[2][2],a[2][3]二維數(shù)組在概念上是二維的,即是說其下標(biāo)在兩個方向上變化,下標(biāo)變量在數(shù)組中的位置也處于一個平面之中,而不是像一維數(shù)組一樣只是一個向量。但是,實際的硬件存儲器卻是連續(xù)編址的,也就是說,存儲器單元是按一維線性方式排列的。在一維存儲器中存放二維數(shù)組,可有兩種方式:一種是按行排列,即放完一行后順次放入第二行;另一種是按列排列,即放完一列之后再順次放入第二列。在C語言中,二維數(shù)組是按行排列的。如上述定義的數(shù)組a[3][4]按行順次存放,先存放a[0]行,再存放a[1]行,最后存放a[2]行。每行中的四個元素也是依次存放的。由于數(shù)組a說明為int類型,該類型占2個字節(jié)的內(nèi)存空間,因此每個元素均占有2個字節(jié)。二維數(shù)組的元素也稱為雙下標(biāo)變量,其表示的形式為:數(shù)組名[下標(biāo)][下標(biāo)]其中,下標(biāo)應(yīng)為整型常量或整型表達式。例如,a[3][4]表示a數(shù)組的第三行第四列的元素。下標(biāo)變量和數(shù)組說明在形式中有些相似,但這兩者具有完全不同的含義。數(shù)組說明的方括號中給出的是某一維的長度,即可取下標(biāo)的最大值;而數(shù)組元素中的下標(biāo)是該元素在數(shù)組中的位置標(biāo)識。前者只能是常量,后者可以是常量、變量或表達式。二維數(shù)組的初始化舉例如下:
Unsignedchardataoutput[2][3]=
{1,2,3,
4,5,6,
};初始化后,output[0][0]=1,output[0][1]=2,output[0][2]=3,output[1][0]=4,output[1][1]=5,output[1][2]=6。數(shù)組output[2][3]被定義在內(nèi)部RAM中。5.4
C51的編程規(guī)范現(xiàn)在,在單片機程序設(shè)計中,C51已經(jīng)得到了廣泛的推廣和應(yīng)用,成為單片機的主流程序設(shè)計語言,甚至可以說是單片機開發(fā)人員必須要掌握的一門語言了。作為一門工具,最終的目的就是實現(xiàn)功能。在滿足這個前提條件下,我們希望我們的程序能容易地被別人讀懂,或者我們能夠很容易地讀懂別人和自己以前的程序,這樣,在團體合作開發(fā)中就能起到事半功倍之效。在網(wǎng)上請求幫助時,如能以規(guī)范的寫法貼出程序,網(wǎng)友就會比較容易地明白你的問題,你也會比較快地得到網(wǎng)友的幫助。因此,為了便于源程序的交流,減少開發(fā)中的障礙,必須按規(guī)范對C51進行編程。下面對C51的編程規(guī)范作簡要介紹。
1.注釋一般情況下,注釋均應(yīng)采用中文。
(1)開始的注釋。文件(模塊)注釋內(nèi)容包括:公司名稱、版權(quán)、作者名稱、修改時間、模塊功能、背景介紹等,復(fù)雜的算法需要加上流程說明。例如:
/**************************************/公司名稱:模塊名:89S52編程器硬件型號:89S52創(chuàng)建人:日期:20070708修改人:日期:20070819功能描述:對89S51、89S52編程其他說明:版本:2.1
/**************************************/函數(shù)開頭的注釋內(nèi)容包括:函數(shù)名稱、功能、說明、輸入、返回、函數(shù)描述、流程處理、全局變量、調(diào)用函數(shù)等,復(fù)雜的函數(shù)需要加上變量用途說明。例如:/**************************************/函數(shù)名稱:hex_to_ascii功能描述:十六進制到ASCII碼轉(zhuǎn)換入口參數(shù):十六進制數(shù)返回值:相應(yīng)的ASCII碼調(diào)用函數(shù):全局變量:局部變量:hex_data,ascii_code/**************************************/unsignedcharhex_to_ascii(unsignedchar);
unsignedcharhex_to_ascii(unsignedcharhex_data)
{
unsignedcharascii_code;
if(hex_data<=9){ascii_code=hex_data+0x30;}else{ascii_code=hex_data+0x37;}returnascii_code;
}
(2)程序中的注釋。程序中的注釋內(nèi)容包括:修改時間和作者、方便理解的注釋等。注釋內(nèi)容應(yīng)簡練、清楚、明了,一目了然的語句不用加注釋。
2.變量和函數(shù)的命名
變量和函數(shù)的命名必須具有一定的實際意義。例如:unsignedcharascii_code;
unsignedcharhex_data;
unsignedcharhex_to_ascii(unsignedchar);
(1)常量的命名。常量的命名全部用大寫。例如:
//定義命令常量
#defineCMD_00x00
#defineCMD_10x01
#defineCMD_20x02
#defineCMD_30x03
#defineCMD_40x04(2)結(jié)構(gòu)體命名。例如:structtime_str{
unsignedcharhour;//小時
unsignedcharminute;//分
unsignedcharsecond;//秒
unsignedcharsecond20;//1/20秒
}time;(3)函數(shù)的命名。一般函數(shù)名首字母需大寫,若包含有兩個單詞,則每個單詞的首字母大寫。函數(shù)原型說明包括:引用的外部函數(shù)及內(nèi)部函數(shù),外部引用必須在右側(cè)注明函數(shù)來源,模塊名及文件名、內(nèi)部函數(shù)等只要注釋其文件名即可。
3.編輯風(fēng)格(1)縮進:縮進以Tab為單位,一個Tab為4個空格大小。預(yù)處理語句、全局?jǐn)?shù)據(jù)、函數(shù)原型、標(biāo)題、附加說明、函數(shù)說明、標(biāo)號等均頂格書寫。語句塊的“{”和“}”配對對齊,并與其前一行對齊。(2)空格:數(shù)據(jù)和函數(shù)在其類型、修飾名稱之間加適當(dāng)空格并據(jù)情況對齊。關(guān)鍵字原則上空一格。運算符的空格規(guī)定為:“->”、“[”、“]”、“++”、“--”、“~”、“!”、“+”、“-”、“&”(取址或引用)、“*”(指針)等幾個運算符兩邊不空格(其中單目運算符系指與操作數(shù)相連的一邊),其他運算符包括大多數(shù)二目運算符和三目運算符“?:”兩邊均空一格,“(”、“)”運算符在其內(nèi)側(cè)空一格。在作函數(shù)定義時還可據(jù)情況多空或不空格來對齊,但在函數(shù)實現(xiàn)時可不用空格?!?,”運算符只在其后空一格,需對齊時也可不空或多空格,對語句行后加的注釋,應(yīng)加適當(dāng)空格使之與語句隔開,并盡可能對齊。(3)對齊:原則上,關(guān)系密切的行應(yīng)對齊。對齊包括類型、修飾、名稱、參數(shù)等各部分對齊。另外,每一行的長度不應(yīng)超過屏幕太多,必要時應(yīng)適當(dāng)換行,換行時應(yīng)盡可能在“,”處或運算符處,換行后最好以運算符打頭,并且以下各行均以該語句為參照首行縮進,但該語句仍以首行的縮進為準(zhǔn),即如其下一行為“{”,則應(yīng)與首行對齊。(4)空行:程序文件結(jié)構(gòu)各部分之間空兩行,若不必要也可只空一行,各函數(shù)之間一般空兩行。(5)修改:版本封存以后的修改一定要將原來的語句用/*…*/封閉,不能自行刪除或修改,并要在文件及函數(shù)的修改記錄中加以記錄。(6)形參:在定義函數(shù)時,在函數(shù)名后面括號中直接進行形式參數(shù)說明,不再另行說明。5.5
C51的基本應(yīng)用5.5.1
8051I/O口字節(jié)操作的應(yīng)用
【例5-4】將P1口輸入的8位數(shù)直接由P3口輸出。在實際應(yīng)用中,可對輸入信號進行處理后再由P3口輸出。程序清單如下:#include<reg51.h>
#include<stdio.h>
#include<intrins.h>
sfrP1=0x90;/*定義特殊功能寄存器P1(SFR)*/
sfrP3=0xb0;/*定義特殊功能寄存器P3(SFR)*//*************主程序********************/
voidmain(void)
{
unsignedcharpval;/*臨時變量*/
P1=0xFF;/*設(shè)置P1口為輸入方式*/while(1)
{
pval=P1;/*讀P1到臨時變量pval*/
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 遼寧冶金職業(yè)技術(shù)學(xué)院《酒店人力資源管理》2023-2024學(xué)年第一學(xué)期期末試卷
- 江西洪州職業(yè)學(xué)院《教師課堂教學(xué)藝術(shù)》2023-2024學(xué)年第一學(xué)期期末試卷
- 吉林職業(yè)技術(shù)學(xué)院《財經(jīng)法規(guī)與會計職業(yè)道德》2023-2024學(xué)年第一學(xué)期期末試卷
- 湖南電子科技職業(yè)學(xué)院《后期合成A》2023-2024學(xué)年第一學(xué)期期末試卷
- 黑龍江司法警官職業(yè)學(xué)院《電路理論A》2023-2024學(xué)年第一學(xué)期期末試卷
- 重慶應(yīng)用技術(shù)職業(yè)學(xué)院《當(dāng)代社會思潮評析》2023-2024學(xué)年第一學(xué)期期末試卷
- 重慶機電職業(yè)技術(shù)大學(xué)《影像設(shè)備學(xué)》2023-2024學(xué)年第一學(xué)期期末試卷
- 浙江農(nóng)林大學(xué)暨陽學(xué)院《版式設(shè)計與表現(xiàn)》2023-2024學(xué)年第一學(xué)期期末試卷
- 中國石油大學(xué)(北京)《畫法幾何與機械制圖I》2023-2024學(xué)年第一學(xué)期期末試卷
- 鄭州升達經(jīng)貿(mào)管理學(xué)院《金融法》2023-2024學(xué)年第一學(xué)期期末試卷
- 2024年高標(biāo)準(zhǔn)農(nóng)田建設(shè)土地承包服務(wù)協(xié)議3篇
- 閱讀理解(專項訓(xùn)練)-2024-2025學(xué)年湘少版英語六年級上冊
- 無創(chuàng)通氣基本模式
- 飛行原理(第二版) 課件 第4章 飛機的平衡、穩(wěn)定性和操縱性
- 暨南大學(xué)珠海校區(qū)財務(wù)辦招考財務(wù)工作人員易考易錯模擬試題(共500題)試卷后附參考答案
- 羊水少治療護理查房
- 管道坡口技術(shù)培訓(xùn)
- 2024年全國統(tǒng)一高考英語試卷(新課標(biāo)Ⅰ卷)含答案
- OQC培訓(xùn)資料教學(xué)課件
- 2024年8月CCAA國家注冊審核員OHSMS職業(yè)健康安全管理體系基礎(chǔ)知識考試題目含解析
- 2024年認(rèn)證行業(yè)法律法規(guī)及認(rèn)證基礎(chǔ)知識 CCAA年度確認(rèn) 試題與答案
評論
0/150
提交評論