《基于C語言的MCS-51單片機教程》-單元3:C51程序設計基礎_第1頁
《基于C語言的MCS-51單片機教程》-單元3:C51程序設計基礎_第2頁
《基于C語言的MCS-51單片機教程》-單元3:C51程序設計基礎_第3頁
《基于C語言的MCS-51單片機教程》-單元3:C51程序設計基礎_第4頁
《基于C語言的MCS-51單片機教程》-單元3:C51程序設計基礎_第5頁
已閱讀5頁,還剩49頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

了解C51

的特點、關鍵字掌握C51

的數據類型(尤其是擴展數據類型)掌握C51

的基本運算、語句掌握C51

的函數、預處理指令單元3:

C51

程序設計基礎知識與能力目標寄存器分配、不同存貯器的

址及數據類型等細節(jié)可由編譯器管理程序有規(guī)范的結構,可分成不同的函數,這種方式可使

程序結構化具有將可變的選

特殊操作組合在一起的能力,改善

程序的可讀提供的庫包含許多標子程序,具有較強的數據處理能力對單片機的指令系統(tǒng)不要求了解,僅要求對8051的存

貯器結構有初步了解6

由于具有方便的模塊化編程,使已編好程序可容易地移植單元3:

C51

程序設計基礎2345C

5

1

優(yōu)

點類型符號關鍵字所占位數數的表示范圍整型有(signed)int16-32768~32767(signed)short16-32768~32767(signed)long32-2147483648~2147483647無unsigned

int160~65535unsigned

short

int160~65535unsigned

long

int320~4294967295實型有float323.4e-38~3.4e38有double641.7e-308~1.7e308字符型有char8-128~127無unsigned

char80~2552

、C51

的數據類型單元3:

C51

程序設計基礎基本數據類型2

、C51

的數據類型擴展數據類型1)sfr:定義特殊功能寄存器地址。其定義的語法規(guī)則如下:sfr

特殊功能寄存器名稱=字節(jié)地址常數;例如:sfr

P0=0x80;//定義一個特殊功能寄存器變量PO2)sfr16:定義雙字節(jié)特殊功能寄存器地址,其定義的語法

規(guī)則如下:sfr16雙字節(jié)特殊功能寄存器名稱=字節(jié)地址常數;例如:sfr16DPTR=0x82;//定義DPTR低端地址82H單元3:

C51

程序設計基礎2

、C51

的數據類型擴展數據類型3)sbit:定義能夠按位尋址的特殊功能寄存器中的位變量,

其定義的語法規(guī)則如下:sbit

位變量名=位地址表達式;這里的位地址表達式有三種形式:直接地址、特殊功能寄存器名帶位號、字節(jié)地址帶位號,所以這里的定義方式有三種,

分別如下:◆sbit

位變量名=位地址常數;

(位地址常數:特殊功能寄

存器內的絕對位地址)◆sbit

位變量名=特殊功能寄存器名個位號;◆sbit

位變量名=特殊功能寄存器字節(jié)地址位號;單元3:

C51

程序設計基礎特殊功能寄存器名符號字節(jié)地址位地址?PO口鎖存器??PO??80HP0.7?P0.6?P0.5?P0.40P0.3?P0.2?P0.1?P0.0e87H86H85H84H83H82H81H80Hp以特殊功能寄存器PO口的P0.0

位定義為例,三種定義方法P0_0=0x80;PO

0=P0^0;P0_0=0x80^0;如下

:方法1:

sbit

方法2:

sbit方法3:

sibt例:特殊功能寄存器PO

口的名稱及各位的分布如下:.2

、C51

的數據類型擴展數據類型4)bit:

定義片內RAM

的位變量。其值只有0或1。但注意不能用它定義指針,也用其不能定義數組。例:bit

N3_4;

//定義一個片內

RAM

位變量N3_4單元3:

C51

程序設計基礎補充說明:1

、C51編譯器在頭文件“reg51.h”中定義了全部sfr

、sfr16和

sbit

變量,因此當我們程序中如果需要使用這些,可以用一

條預處理命令#include<reg51.h>把這個頭文件包含到C51

序中,無須重新定義即可使用。2、使

用sbit的幾點說明:◆用sbit定義的位變量必須能夠按位操作,而不能對無位操

作功能的位定義位變量。◆用sbit定義的位變量必須放在函數外面作為全局變量,而

不能在函數內部定義?!粲胹bit每次只能定義一個位變量。單元3:

C51

程序設計基礎3、

標識符和關鍵字1)C語言中標識符是指軟件開發(fā)者在程序中自定義的字符序

列,用來命名程序中需要辨認的對象,包括:符號常量、變量、

數組及函數等。標識符的定義注意事項如下:·

由字母、數字、下劃線構成?!?/p>

首字符必須是字母或下劃線?!?/p>

長度不得大于32

個字符,通常是8個字符?!?/p>

嚴格區(qū)分大小寫字母?!?/p>

不應該使用C

語言中的保留標識符來做自定義的變量或函

數等的標識符。單元3:

C51

程序設計基礎3、

標識符和關鍵字2)下面列出了C

語言的所有關鍵字,在使用時應慎用這些關

鍵字,不要將其作為標識符來用:Auto、enum、restrict、unsigned、break、extern、return、void、case、float、short、volatile、char、

for、signed、while、const、goto、sizeof、Bool、continue、if、static、default、inline、struct、

Imaginary、do、int、switch、double、long、typedef、else

、register、union等。運

算符名

稱例

子運算功能一取負值-X取x的負值十加x+y求x與y的和一減x-y求x與y的差*乘x*y求x與y的積/除x/y求x與y的商%求余(或模)x%y求x除以y的余數◆注

意:◆“I”:

參與運算的變量都是整數時,結果也為整數,舍去小數;若除數或被除數中一個為負數,則結果隨機器而定。、◆

“%”:參與運算的變量必須都是整數。4

、C51

的基本運算單元3:C51

程序設計基礎1)算術運算符11◆++i與

i++的區(qū)別

:◆舉例:

i的初值為3j=++i;/1先i=3+1=4,再將4賦值給jj=i++;/1先將i的值3賦值給j,再

將i的值加1,變?yōu)?◆

前置運算和后置運算的區(qū)別:◆

前置運算是變量的值先加1或減1,然后再以該變量變化后額值參加其它運算?!艉笾眠\算是變量的值先參加有關運算,然后變量的值再加1或減1。運

算符名

稱例

子等價于+加1i++或++ii=i+1--減1i--或—ii=i-12)自增、自減運算符:

“++12相關知識點3)關系運算符:1)

<

小于2

)

<

=

于3)>

大于4)

>=

大于或等于5)==

等于6)!=

不等于◆關系表達式◆一般形式:表達式關系運算符表達式◆關系表達式的值:真(成立)用“1”表示

假(不成立)用“0”表示134)邏輯運算符:1)

&&與運算符2)

或運算符3)

!

非運算符◆邏輯表達式◆一般形式:表達式邏輯運算符表達式◆邏輯表達式的值:真(成立)用“1”表示

假(不成立)用“0”表示145)位運算符:①&(按位與):兩個字符或整數按位進行邏輯與運算。②|

(按位或):兩個字符或整數按位進行邏輯或運算。③^(按位異或):兩個字符或整數按位進行邏輯異或運算。④~(按位取反):字符或整數按位進行邏輯非運算。⑤<<(左移):字符或整數按位進行左移運算。⑥>>(右移):字符或整數按位進行右移運算。15value

|=0x17;//value=0x97value

&=0x34;//value=0x14value

^=0xOf;//value=0x1Bvalue

=~value;//value=0xe4value

=value>>1;//value=0x72value

=value<<2;//value=0xc8舉例:設下列程序執(zhí)行前,value已經定義為unsignedchar,且

value=0x83,分析每一條語句執(zhí)行后value

的值。6)賦值運算符:1)基本賦值運算符“=”:其功能是把某個常量

、變量或表達式的值賦值給另外一個變量。2)復合賦值運算符◆復合賦值運算符有:

“+=”、

“-=”、66*

、

“/=”、

“%=”、“

=

、“~=”“&=”、

“|=”、“<<=”、“>>=”◆例如:i+=2;等價于i=i+2;

a%=5;等價于

a=a%5;177)強制類型轉換運算符:◆其一般形式為:(類型說明符)

(表達式)◆其功能是:把表達式的運算結果強制轉換為類

型說明符所表示的類型。18單元3:

C51

程序設計基礎4

C51的基本語句oif語句○第

一種形式:·if

(表達式)語句假(0)表達式真(非0)語句○舉例:輸出兩個整數中的較大者//

************//*程序名稱:輸出兩個整數中的較大者-cpp//*主要功能:判斷輸出兩個整數中的較大者//**************#include

<stdio.h>void

main(){int

a,b,max;printf("請輸入兩個整數:");scanf('"%d%d",&a,&b);max=a;if(max<b)max=b;printf("max=%d\n",max);}20o

if語

句○第二種形式:·

if

(表達式)語句1;else語句2;表達式

假語句2真語句121○舉例:輸出兩個整數中的較大者*******

**//*程序名稱:輸出兩個整數中的較大者-cpp//*主要功能:判斷輸出兩個整數中的較大者//*******************************#include<stdio.h>int

main(){int

a,b;printf("請輸入兩個整數:");scanf("%d%d",&a,&b);if(a>b)printf("max=%d\n",a);else

printf("max=%d\n",b);return

B;22//3o

if語

句○第三種形式:·

if(表達式1)語句1else

if

(表達式2

)語句2elseif(表達式3)語句3else

if

(表達式n)語句nelse語句n+1假表

2真語句2表

達式1真語句1假表

4

真假表達式3真語句3

語句4

語句523假舉例:輸入1~7轉換為對應的星期英文//*

**********************//*程序名稱:數值1-7轉換為對應星期的英文-cpp//*主要功能:數值1-7轉換為對應星期的英文//***********************#include

<stdio.h>main()int

a;printf("請輸入1~7中任意數值:");

scanf('%d",&a);if

(a==1)printf("Monday\n");else

if(a==2)printf("Tuesday\n");else

if(a==3)printf("Wednesday\n");else

if(a==4)printf("Thursday\n");else

if(a==6)printf("Saturday\n");else

if

(a==5)printf("Firday\n");else

if(a==6)printf("Saturday\n")

;else

if(a==7)printf("Sunday\n");else

printf("error\n");return

B;}int{oswitch語句switch

語句的一般格式是:switch(變量){case

常量1:

語句1;case常量2:

語句2;case

常量3:

語句3;■case

常量n:語句n;default:語句n+1;執(zhí)行switch

語句時,將變量逐個與case

后的常量進行比

較,若與其中一個相等,則執(zhí)行該常量后的語句;若都不相等,

則執(zhí)行default

后的語句。舉例:自動售貨機商品價格的查詢·

:自動售貨機可以售出薯片3.0元,爆米花2.5

元,

巧克力4.0

元,可樂3.5

元四種商品。在屏幕上顯示

菜單。當用戶輸入編號1

~

4

時,顯示相應商品的價

格;輸入其它編號,顯示價格為0?!?/p>

解決方案:·

(1)定義整型變量x用于存放用戶輸入編號·

(2)定義雙精度實型變量y用于存放價錢·

(3)根據x值使用switch

語句判斷用戶選擇商品價格y的值·

(4)輸出商品價格y//****************//*程序名稱:自動售貨機商品價格查詢-cp

p//*主要功能:自動售貨機商品價格查詢//

*************#include

<stdio.h>int

main(){int

x,i;double

y;printf("***************************************\n");printf("1)選擇薯片\n2)選擇爆米花\n3)選擇巧克力\n4)選擇可樂\nθ)退出\n");printf("***************************************n");printf("請輸入你的選擇:");scanf("%d",&x);switch(x){case

1:printf("

薯片單價:3.0元\n");break;//y=3.8;case

2:y=2.5;printf("

爆米花單價:%.11f元\n",y);break;case

3:y=4.0;printf("巧克力單價:%.11f元\n",y);

break;case

4:y=3.5;printf("可樂單價%.11

f

元\n",y);break;default:y=8.0;printf("

不在選擇范圍內\n");break;}printf("謝謝惠顧!");return

B;}程序owhile語句○一般格式:while

(表達式)循環(huán)體語句;◆執(zhí)行過程:表達式

0非

0語句29舉例:尋找密碼·

任務描述:小張的行李箱密碼忘記,密碼是四位,每位密碼是由0~9之間的數字構成。請編寫模擬小張尋找密碼的過程。o任務分析:密碼是一個四位整數,而四位整數的取值范圍是0000~9999,共計10000個,那么我們需要在這10000個四位整數中逐個尋找,直到找到與密碼符

合的四位整數為止。31·

解決方案:·

(1)定義整形變量password

用于存放密碼·

(

2

)

定義整形變量value,

賦初值0,用于存放每次比較的四位整數·

(

3

)

用value的值與password的值進行比較,若不相等則修改

value的值(value++)繼續(xù)進行比較,直到找到為止·

(4)輸出找到的四位密碼·

(

5

)

回◆程

序//

**********************//*程序名稱:尋找密碼.cpp//*主要功能:尋找密碼//*************************#include

<stdio.h>//預編譯int

main(){int

password=7691;//password:存放密碼

int

value=;

//ualue:

存放比較的四位密碼

while

(value<=9999){printf("

請輸入~9999四位密碼:");

scanf("%d",&ualue);if

(value==password){printf("密碼是:%4d\n",value);

break;}}return

B;}循環(huán)體語句;while

(表達式);執(zhí)行過程:odo-while語句○

一般格式:do循環(huán)體語句表達式0非034請用do-while語句改寫上面尋找密碼的函數。o

一般格式:for(表達式1;表達式2;表邊{表達式1:初值表達式,對循環(huán)變量賦初值循環(huán)體語句:被反復執(zhí)

行的語句求解表達式1表達式2真循環(huán)體求解表達式3for語句的下一語句表達式2:條件表達式,給出循環(huán)的條件表達式3:步長

表達式,改變

循環(huán)變量的值o

for語句循環(huán)體語合假36案例四:猜數字游戲·任務描述:由計算機隨機生成100以內的一個整數,用鍵盤輸入你猜的整數(假定1~99內),與計算機產生的被猜數比較,若相等,顯示猜中;若不相等,顯示與被猜數的大小關系,最多允許猜5次,如果用戶猜的次數大于5次,則提示游戲結束。o任務分析:要求計算機隨機產生一個0~99的一個整數

,設置一個計數器控制猜的次數,最多5次。38·解

:·

(1)本例要使用隨機函數,這些函數包含在頭文件:stdlib.h和timen.h中·

(2)定義整形變量key用于存放隨機數·(3)定義整形變量temp

存放用戶猜的數字·

(4)定義整形變量i作為循環(huán)變量·

(5)調用srand()設置隨機數種子·

(6)調用rand()函數產生1~100之間的隨機數·

(7)使用循環(huán)讓用戶進行猜數字游戲,用計數循環(huán)語句for語句控制循環(huán)5次。如果不到5次猜對,則利用break語句,提前結束程序;如果用戶猜的次數達到5次仍沒猜對,則循環(huán)正常結束。{int

count,key,temp;//count:猜的次數;key:隨機數;temp:用戶猜的數字srand((unsigned)time(NULL));//初始化隨機數種子,使后面rand()函數產生不同的數

key=1+rand()%100;//隨機生成1~100的一個整數printf("系統(tǒng)產生了一個1~108之間的整數,猜猜它是幾?\n\n");printf("請輸入1個1~108之間的整數:");scanf("%d",&temp);if

(key==temp){printf("恭喜你,猜對了!你真棒!!!\n");break;i

f(key<temp)printf("

你輸入的數大了,再猜!\

n");if

(key>temp)printf("

你輸入的數小了,再猜!\n");}if(count==6)printf("你的次數已用完!!!");return

G;}}//**************************1/*程序名稱:猜數字游戲-cpp//*主要功能:猜數字游戲**//************************#include

<stdio.h>//預編譯#include

<stdlib.h>#include

<time.h>int

main()********for(count=1;count<=5;count++){◆程

序相關知識點obreak語句obreak

語句用在switch

語句中,使程序跳出switch

語句,執(zhí)行switch

語句后的語句。o

break語句用于while、do-while、for

句中使程序終止循環(huán),而執(zhí)行循環(huán)體后面的其他語句41相關知識點ocontinue語句○只用于while、do-while、fo

r

語句中,跳過循環(huán)中剩下的語句,而強制執(zhí)行

下一次循環(huán)。42表達式1真真表達式2continue假while語句

的下一語句表達式1真表達式2假while語句

的下一語句假

真break假//

***************//*程序名稱:輸出10到20

被7整除的數.CPP//*王要功能:輸出16到20能被7整除的數//**

**********************#include<stdio.h>

//預編譯int

main(){

tr

180;i<=288;i++){if(i%7!=8)continue;printf("%d\t",i);}printf("\n");return

B;}foin**main()int

i,m;printf("請輸入一個整數:");scanf('%d",&m);for

(i=2;i<=m/2;i++)if

(m%i==0)break;if((i>m/2)&&(m?=1))printf("%d是素數!\n",m);

else

printf("%d不是素數!\n",m);return

B;//*****************************//*程序名稱:判斷m堤否是素數

CPP

//*主要功能:判斷是否是素數//

********************#include

<stdio.h>

/1預編譯int{4

、C51

函數oC

程序是由函數構成,函數是C

語言程序的基本模塊,通過對函數模塊的調用實現(xiàn)特定的功能。01)函數的定義:·

:·

函數返回值類型函數名(形式參數列表)聲明部分執(zhí)行部分46相關知識點—函數2)函數的分類:·

從用戶角度分:標準函數和用戶自定義函數?!?/p>

從參數形式分:無參函數和有參函數。·

從函數返回值來分:無返回值函數和有返回值函數。3)函數的聲明:C

語言程序,對函數實行“先定義,后調用”的原則。即:如果函數定義在調用前,則可以直接調用,無需聲明;但如果函數定義在調用之后,則先聲明才能調用。·

標準庫函數的聲明:程序開頭部分用#include

進行文件包含。·

用戶自定義函數的聲明:函數返回值類型

函數名(形式參數列表);474)函數的調用:○一般來說,按照函數在程序中出現(xiàn)的位置來劃分,C

語言有三種常用的函數調用方式:·

函數表達式。函數作為表達式中的一項出現(xiàn)在表達式中,以函數的返回值參與表達式的運算?!?/p>

函數語句。把函數調用作為一個語句?!?/p>

函數參數。函數作為另外一個函數調用的實際參數

。48○舉例:輸入立方體的長、寬、高,求體積及三個面的面積。/

/

*//*程序名稱:立方體體積和三個面面積.cpp//*主要功能:立方體體積和三個面面積/

/**********************#include<stdio.h>

/1預編譯i

t

isn2t,s

,;int

b,int

c)a3uss1nn{int

u;U=a*b*c;51=a*b;s2=b*c;s3=a*C;return

u;}intmain(){int

u,1,w,h;printf("請輸入立方體的長、寬、高的值\n");

scanf("%d%d%d",&l,&w,&h);U=us(1,w,h);printf("\nu=%d,s1=%d,s2=%d,s3=%d\n",u,51,s2,s3);

return

B;493相關知識點—編譯預處理6

、C51

的編譯預處理01)宏定義·

用標識符來代表一個字符串(給字符串取個名

)

。C

語言用“#define”進行宏定義?!ず甓x分為:不帶參數的宏定義和帶參數的宏

?!?/p>

不帶參數的宏定義:

#define

標識符字符串#include

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論