《單片機(jī)原理及應(yīng)用》第5章:C51簡(jiǎn)介_(kāi)第1頁(yè)
《單片機(jī)原理及應(yīng)用》第5章:C51簡(jiǎn)介_(kāi)第2頁(yè)
《單片機(jī)原理及應(yīng)用》第5章:C51簡(jiǎn)介_(kāi)第3頁(yè)
《單片機(jī)原理及應(yīng)用》第5章:C51簡(jiǎn)介_(kāi)第4頁(yè)
《單片機(jī)原理及應(yīng)用》第5章:C51簡(jiǎn)介_(kāi)第5頁(yè)
已閱讀5頁(yè),還剩71頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

第5章:C51的知識(shí)要點(diǎn)本章內(nèi)容5.1C語(yǔ)言簡(jiǎn)介5.1.1C語(yǔ)言的數(shù)據(jù)類(lèi)型5.1.2C語(yǔ)言的分支結(jié)構(gòu)與循環(huán)結(jié)構(gòu)5.1.3C語(yǔ)言的數(shù)組5.1.4C語(yǔ)言的指針5.2C51的變量與常量5.2.1C51變量

5.2.2C51的常量5.2.3C51的頭文件5.2.4C-51的運(yùn)算符5.3C51指針5.4C51函數(shù)5.4.1函數(shù)定義5.4.2函數(shù)的調(diào)用5.4.3不帶參數(shù)的函數(shù)寫(xiě)法及調(diào)用5.4.4帶參數(shù)的函數(shù)寫(xiě)法及調(diào)用5.4.5中斷函數(shù)5.5軟件程序設(shè)計(jì)舉例5.1C語(yǔ)言簡(jiǎn)介

美國(guó)貝爾實(shí)驗(yàn)室的KenThompson,以BCPL語(yǔ)言為基礎(chǔ),于1972年開(kāi)發(fā)出了C語(yǔ)言,C語(yǔ)言是一種結(jié)構(gòu)化語(yǔ)言,方便以模塊化方式組織程序,層次清晰,方便移植,減少了開(kāi)發(fā)周期。但是由于不通過(guò)國(guó)家地區(qū)的差異,不同的組織開(kāi)始使用自己的C語(yǔ)言版本。為了防止不同版本之間出錯(cuò)帶來(lái)的麻煩,美國(guó)國(guó)家標(biāo)準(zhǔn)化組織ANSI于1983年成立了一個(gè)委員會(huì),發(fā)布了C語(yǔ)言標(biāo)準(zhǔn)定義ANSI標(biāo)準(zhǔn)C語(yǔ)言。大多數(shù)的編譯器都遵循這個(gè)標(biāo)準(zhǔn)。5.1.1C語(yǔ)言的數(shù)據(jù)類(lèi)型C語(yǔ)言的數(shù)據(jù)類(lèi)型包括:基本類(lèi)型、構(gòu)造類(lèi)型、指針類(lèi)型、空類(lèi)型四大類(lèi)結(jié)構(gòu)1.基本類(lèi)型:char,short,int,long,float,double這六個(gè)關(guān)鍵字代表C語(yǔ)言里的六種基本數(shù)據(jù)類(lèi)型。但是由于CPU位數(shù)或者系統(tǒng)位數(shù)的不同,數(shù)據(jù)類(lèi)型可能占內(nèi)存的大小不同,因此在使用前需要使用sizeof()對(duì)各個(gè)類(lèi)型大小進(jìn)行測(cè)試。2.構(gòu)造類(lèi)型:結(jié)構(gòu)體struct、共用體union、數(shù)組和枚舉類(lèi)型A、定義結(jié)構(gòu)體的一般格式為:struct結(jié)構(gòu)名{類(lèi)型變量名;類(lèi)型變量名;}結(jié)構(gòu)變量;結(jié)構(gòu)體應(yīng)用舉例例:有3個(gè)候選人,對(duì)候選人得票統(tǒng)計(jì);每輸入一個(gè)人的名字,count++.#include<stdio.h>structperson{charname[20];intcount;}leader[3]={“l(fā)i”,0,”zhang”,0,”fang”,0};main(){inti,j;

charleader_name[20];for(i=1;i<=10;i++){scanf(%s”,leader_name);for(j=0;j<3;j++)if(strcmp(leader_name,leader[j].name)==0)leader[j].count++;}printf(“\n”);for(i=0;i<3;i++){printf(“%5s,%d\n”,leader[i].name,leader[i].count);}B、定義共用體的一般格式為:不同類(lèi)型的變量共用一段存儲(chǔ)單元union共用體名{成員表列}變量表列;*結(jié)構(gòu)體和共用體的區(qū)別:共用體占的存儲(chǔ)空間長(zhǎng)度是最長(zhǎng)成員長(zhǎng)度,即共用體的地址跟它各成員公用同一個(gè)地址。不允許對(duì)共用體變量做初始化賦值,賦值智能在程序中進(jìn)行。C、數(shù)組:整形數(shù)組、浮點(diǎn)型、字符型D、枚舉類(lèi)型:enum

enumweekday{sun,mon,tue,wed,thu,fri,sat}enumweekdayworkday,week_end;兩個(gè)變量被定義成枚舉類(lèi)型,那么他們的值只能是sun---sat之間一個(gè)workday=mon;week_end=sun;3.指針類(lèi)型:*4、空類(lèi)型5.1.2C語(yǔ)言的分支結(jié)構(gòu)與循環(huán)結(jié)構(gòu)分支結(jié)構(gòu)if(表達(dá)式){語(yǔ)句1;}else{語(yǔ)句2;}switch/case語(yǔ)句switch(表達(dá)式){case常量表達(dá)式1:{語(yǔ)句1;}break;case常量表達(dá)式2:{語(yǔ)句2;}break;case常量表達(dá)式a:{語(yǔ)句a;}break;default{語(yǔ)句a+1;}應(yīng)用舉例switch(grade){case'A':/*注意,這里是冒號(hào):并不是分號(hào);*/printf("85-100\n");break;case'B':printf("70-84\n");break;case'C':printf("60-69\n");break;case'D':printf("<60\n");break;default:printf("error!\n");}2.循環(huán)結(jié)構(gòu)控制語(yǔ)句(1)while語(yǔ)句構(gòu)成的循環(huán) 當(dāng)while括號(hào)里的條件為真時(shí)就執(zhí)行后面的語(yǔ)句while(條件表達(dá)式){語(yǔ)句;}

例:求n!,n<=100(作業(yè))(2)for語(yǔ)句構(gòu)成的循環(huán)在明確循環(huán)的次數(shù)下for語(yǔ)句是使用最靈活的循環(huán)控制語(yǔ)句,完全可以代替while語(yǔ)句for(表達(dá)式1;表達(dá)式2;表達(dá)式3){語(yǔ)句;}For(i=0;i<=5;i++){sum=sum+a[i];b[i]--;}5.1.3C語(yǔ)言的數(shù)組數(shù)組是一組數(shù)據(jù)存儲(chǔ)位置,其中每個(gè)位置的名稱(chēng)相同,存儲(chǔ)的數(shù)據(jù)類(lèi)型相同。數(shù)組中的數(shù)據(jù)存儲(chǔ)位置被稱(chēng)為數(shù)組元素。在使用數(shù)組時(shí)需要為其分配內(nèi)存空間,例如:定義一個(gè)數(shù)組inta[num];需要在a數(shù)組放入num=5個(gè)整數(shù),程序存儲(chǔ)內(nèi)存就得分配5個(gè)int型大小的空間inta[5];在設(shè)計(jì)程序時(shí)要合理定義數(shù)組的大小以免造成浪費(fèi)。數(shù)組一個(gè)非常常用的功能就是查表,比如記錄營(yíng)業(yè)每個(gè)月份的開(kāi)支,字形碼表,和程序一起固化在存儲(chǔ)器當(dāng)中。使用數(shù)組注意事項(xiàng):數(shù)組元素從0開(kāi)始編號(hào),而不是從1開(kāi)始,例如聲明一個(gè)數(shù)組inta[5];那么該數(shù)組的第一個(gè)元素為a[0]。數(shù)組與數(shù)組之間不能直接賦值例如:錯(cuò)誤寫(xiě)法inta[5]=b[5];如果數(shù)組之間要賦值,只能通過(guò)編程的方式進(jìn)行賦值,正確寫(xiě)法:for(i=0;i<num;i++){b[i]=a[i];}5.1.4C語(yǔ)言的指針指針是一個(gè)存儲(chǔ)計(jì)算機(jī)內(nèi)存地址的變量。&運(yùn)算符,獲取變量的地址.變量的指針:

變量的地址就是變量的指針。指向變量的指針變量:

存放變量地址的變量是指針變量,或者說(shuō)指向另一個(gè)變量指針變量。

定義指針變量指針變量定義的一般形式:

類(lèi)型名*標(biāo)識(shí)符如:int*p;定義了一個(gè)指針變量p,它指向一個(gè)整型變量。系統(tǒng)處理:在定義一個(gè)指針變量p以后,系統(tǒng)為這個(gè)指針變量分配了一個(gè)存儲(chǔ)單元(4個(gè)字節(jié)),用它來(lái)存放地址。但此時(shí)該指針變量并未指向一個(gè)確定的變量,因?yàn)樵撝羔樧兞恐形摧斎氪_定的地址。*要使一個(gè)整型的指針變量指向整型變量,必須將整型變量的地址賦給該指針變量。注意:(1)指針變量前面的“*”,表示該變量的類(lèi)型為指針型變量。

int*pointer_1,*pointer_2;

指針變量名是pointer_1、pointer_2,(2)在定義指針變量時(shí)必須指定基類(lèi)型。(3)指向整型數(shù)據(jù)的指針變量表示為

int*,讀作,指向整型的指針或簡(jiǎn)稱(chēng)int指針(4)請(qǐng)牢記,指針變量中只能存放地址(指針),不將一個(gè)整型量(或任何其他非地址類(lèi)型的數(shù)據(jù))賦給一個(gè)指針變量。指針類(lèi)型作為形參時(shí)voidswap(int*a,int*b){intt=*a;*a=*b;*b=t;}思考:此次交換是存儲(chǔ)空間的內(nèi)容交換還是數(shù)據(jù)交換函數(shù):求兩數(shù)相除的返回值#include<stdio.h>intdivide(inta,intb,int*result);intmain(){inta,b,result;scanf(“%d%d”,&a,&b);if(divide(a,b,&result))printf(“a/b=%d”,*result);elseprintf(“輸入有誤”);}intdivide(inta,intb,int*result){intret=1;//函數(shù)返回的狀態(tài)if(b==0)ret=0;else{*result=a/b;}returnret;}函數(shù)的返回值:求數(shù)組中元素的最大最小值#include<stdio.h>voidminmax(inta[],intlen,int*min,int*max);intmain(){inta[]={1,2,3,4,5,6,88,140,255,423};intmin,max;minmax(a,sizeof(a)/sizeof(a[0]),&min,&max);printf(“%d%d”,min,max);return0;}注:sizeof(a)求出數(shù)組長(zhǎng)度,單位字節(jié);sizeof(a[0]求出一個(gè)元素占的字節(jié)數(shù)voidminmax(inta[],intlen,int*min,int*max){inti;*min=*max=a[0];for(i=1;i<len;i++){if(a[i]<*min){*min=a[i];}if(a[i]>*max){*max=a[i];}}}5.2C51的變量與常量1、變量的存儲(chǔ)種類(lèi)要在程序中使用變量必須先用標(biāo)識(shí)符作為變量名,并指出所用的數(shù)據(jù)類(lèi)型和存儲(chǔ)模式,這樣編譯系統(tǒng)才能為變量分配相應(yīng)的存儲(chǔ)空間。定義一個(gè)變量的格式如:[存儲(chǔ)種類(lèi)]數(shù)據(jù)類(lèi)型[存儲(chǔ)器類(lèi)型]變量名;存儲(chǔ)類(lèi)型和存儲(chǔ)器類(lèi)型可以填寫(xiě)也可以不填寫(xiě)。c51變量的存儲(chǔ)種類(lèi)一共有四種分別為:自動(dòng)auto,靜態(tài)static,外部extern,寄存器register存儲(chǔ)種類(lèi)變量的存儲(chǔ)種類(lèi)auto 自動(dòng)變量(可以省略)動(dòng)態(tài)存儲(chǔ)register寄存器變量動(dòng)態(tài)存儲(chǔ)extern外部變量靜態(tài)存儲(chǔ)Static靜態(tài)變量靜態(tài)存儲(chǔ)auto自動(dòng)變量:凡未加存儲(chǔ)類(lèi)型說(shuō)明的變量均為自動(dòng)變量,自動(dòng)變量可以省去auto。Register:為了提高運(yùn)行速度,把局部變量值直接存儲(chǔ)在CPU的寄存器中不存儲(chǔ)在內(nèi)存中(單片機(jī)中少有)寄存器變量register寄存器變量:各類(lèi)變量都存放在存儲(chǔ)器里,當(dāng)對(duì)一個(gè)變量頻繁讀寫(xiě)時(shí),必然要反復(fù)訪問(wèn)存儲(chǔ)器,從而花費(fèi)大量的存取時(shí)間。c提供了寄存器變量,這種變量存放在CPU的寄存器中,使用時(shí)不需要訪問(wèn)內(nèi)存,直接從寄存器中讀寫(xiě),可提高效率。#include<stdio.h>main(){ registerinti,s=0; for(i=1;i<200;i++){ s=s+i; printf("s=%d\n",s);}注意:只有局部自動(dòng)變量和形式參數(shù)才可以定義為寄存器變量。靜態(tài)變量3.靜態(tài)變量有時(shí)希望函數(shù)中的局部變量的值在函數(shù)調(diào)用結(jié)束后不消失而保留原值,這時(shí)就應(yīng)該指定局部變量為靜態(tài)局部變量,用關(guān)鍵字static進(jìn)行聲明。靜態(tài)變量如果一個(gè)靜態(tài)變量是在一個(gè)函數(shù)或語(yǔ)句塊內(nèi)說(shuō)明的,那么該靜態(tài)變量是“局部的”,即其作用域被限制在該函數(shù)或塊內(nèi)。但是若希望函數(shù)中的局部變量的值在函數(shù)調(diào)用結(jié)束后不消失而保留原值,即其所占用的存儲(chǔ)單元不釋放,應(yīng)該指定該局部變量為“局部靜態(tài)變量”,用static加以說(shuō)明。

打印1!到N!main(){intfactor();inti,n;printf("N=");scanf("%d",&n);for(i=1;i<=n;i++)printf("%d!=%d\n",i,factor(i));}靜態(tài)變量舉例#include<stdio.h>

intsum(inta){autointc=0;staticintb=5;

c++;b++;

printf("a=%d,\tc=%d,\tb=%d\t",a,c,b);

return(a+b+c);}intmain(){inti;inta=2;for(i=0;i<5;i++)printf("sum(a)=%d\n",sum(a));return0;}運(yùn)行結(jié)果a=2,c=1,b=6sum(a)=9a=2,c=1,b=7sum(a)=10a=2,c=1,b=8sum(a)=11a=2,c=1,b=9sum(a)=12a=2,c=1,b=10sum(a)=13外部型變量extern外部變量(即全局變量)是在函數(shù)的外部定義的,它的作用域?yàn)閺淖兞慷x處開(kāi)始,到本程序文件的末尾。如果外部變量不在文件的開(kāi)頭定義,其有效的作用范圍只限于定義處到文件末尾。如果在定義點(diǎn)之前的函數(shù)想引用該外部變量,則應(yīng)該在引用之前用關(guān)鍵字extern對(duì)該變量進(jìn)行“外部變量聲明”。表示該變量是一個(gè)已經(jīng)定義的外部變量。有了此聲明,就可以從“聲明”處起,合法地使用該外部變量.用extern聲明外部變量,擴(kuò)展程序文件中的作用域#include<stdio.h>

inti=5;//定義全局變量,并初始化

voidtest(void){printf("insubfunctioni=%d\n",i);}#include<stdio.h>

externi;//聲明引用全局變量i

intmain(void){printf("inmaini=%d\n",i);test();return0;}存儲(chǔ)類(lèi)型51系列:data:內(nèi)部數(shù)據(jù)存儲(chǔ)器(00H-7FH)

bdata:內(nèi)部數(shù)據(jù)存儲(chǔ)器(20H-2FH)52系列:idata:高128字節(jié)內(nèi)部數(shù)據(jù)存儲(chǔ)器52系列:內(nèi)部數(shù)據(jù)存儲(chǔ)器共256字節(jié),可分為三個(gè)部分,低128字節(jié)RAM,高128字節(jié)RAM,和特殊功能寄存器區(qū)。低128字節(jié)內(nèi)部數(shù)據(jù)存儲(chǔ)器既可直接尋址又可間接尋址。高128字節(jié)內(nèi)部數(shù)據(jù)存儲(chǔ)器與特殊功能寄存器共用相同的地址范圍,但是物理上是獨(dú)立的沒(méi)有相互重疊,高128字節(jié)RAM只能間接尋址,特殊功能寄存器區(qū)只可直接尋址。外部數(shù)據(jù)存儲(chǔ)器是可讀可寫(xiě)的,C51編譯器提供了兩種存儲(chǔ)類(lèi)型:xdata和pdata,來(lái)訪問(wèn)外部數(shù)據(jù)存儲(chǔ)器。pdata區(qū)只有256字節(jié)而xdata區(qū)可達(dá)到65536字節(jié),由于裝入地址的位數(shù)不同,pdata區(qū)要比xdata區(qū)尋址要快。*其中:data:代表直接尋址的內(nèi)部數(shù)據(jù)存儲(chǔ)器idata:代表間接尋址的內(nèi)部數(shù)據(jù)存儲(chǔ)器。建立C51存儲(chǔ)類(lèi)型與存儲(chǔ)空間的對(duì)應(yīng)關(guān)系xdata區(qū)data區(qū)code區(qū)bdata區(qū)pdata區(qū)idata區(qū)【存儲(chǔ)種類(lèi)】

數(shù)據(jù)類(lèi)型

【存儲(chǔ)類(lèi)型】

變量名51單片機(jī)的3個(gè)邏輯存儲(chǔ)空間:片內(nèi)數(shù)據(jù)存儲(chǔ)器,片外數(shù)據(jù)存儲(chǔ)器和程序存儲(chǔ)器。3種編譯模式分別對(duì)應(yīng)于3種缺省存儲(chǔ)類(lèi)型:【存儲(chǔ)種類(lèi)】

數(shù)據(jù)類(lèi)型

【存儲(chǔ)類(lèi)型】

變量名C51編譯器可根據(jù)當(dāng)前采取的編譯模式自動(dòng)認(rèn)定默認(rèn)的存儲(chǔ)類(lèi)型約定:若無(wú)特殊聲明,一般均為“SMALL編譯模式”C51的存儲(chǔ)類(lèi)型與存儲(chǔ)空間對(duì)應(yīng)關(guān)系表

SMALL系統(tǒng)COMPACT系統(tǒng)LARGE系統(tǒng)編譯模式【存儲(chǔ)種類(lèi)】

數(shù)據(jù)類(lèi)型

【存儲(chǔ)類(lèi)型】

變量名【存儲(chǔ)種類(lèi)】

數(shù)據(jù)類(lèi)型

【存儲(chǔ)類(lèi)型】

變量名(標(biāo)準(zhǔn)C)(標(biāo)準(zhǔn)C)*括號(hào)項(xiàng)——可以缺?。ǖ栌腥笔≈担〤51變量定義的四要素:(C51特有)(標(biāo)準(zhǔn)C+C51)數(shù)據(jù)的不同格式叫做數(shù)據(jù)類(lèi)型*有符號(hào)數(shù)類(lèi)型可以忽略signed標(biāo)識(shí)符標(biāo)準(zhǔn)C語(yǔ)言的數(shù)據(jù)類(lèi)型【存儲(chǔ)種類(lèi)】

數(shù)據(jù)類(lèi)型

【存儲(chǔ)類(lèi)型】

變量名C51擴(kuò)充數(shù)據(jù)類(lèi)型:bit、sfr或sfr16、sbitbit型關(guān)鍵詞bit用于定義一個(gè)位變量,語(yǔ)法規(guī)則:bitbit_name

[=0或1];例如:bitdoor=0;//定義一個(gè)叫door的位變量且初值為0與標(biāo)準(zhǔn)C的變量定義相似:

inta=5;//定義一個(gè)初值為5的整形變量a//語(yǔ)法規(guī)則:intint_name[=常數(shù)];

sfr或sfr16型關(guān)鍵詞sfr或sfr16用于定義SFR字節(jié)地址變量,語(yǔ)法規(guī)則:

sfr

sfr16sfr_name=

字節(jié)地址常數(shù);51MCU中有21個(gè)SFR,如何定義與這些單元相關(guān)的變量?例如,sfrP0=0x80;//定義P0口地址80H

sfrPCON=0x87;//定義PCON地址87H

sfr16DPTR=0x82;//定義DPTR的低端地址82H注意:C語(yǔ)言中十六進(jìn)制整數(shù)是數(shù)值前加0x或0X前綴sbit型部分SFR具有位地址,如何定義與這些位地址相關(guān)的變量?CYACF0RS1RS0OVF1PCYACF0RS1RS0OVF1PCYACF0RS1RS0OVF1PCYACF0RS1RS0OVF1PD0^7

D7HD6HD5HD4HD3HD2HD1HD0HD0HPSWD0^6

D0^5

D0^4

D0^3

D0^2

D0^1

D0^0

絕對(duì)位地址相對(duì)位地址字節(jié)地址兩種位地址表達(dá)形式:相對(duì)位地址、絕對(duì)位地址1)將SFR的絕對(duì)位地址定義為位變量名

sbit

bit_name=

位地址常數(shù);例如,sbitCY=0xD7;3)將SFR的相對(duì)位位置定義位變量名sbitbit_name=

sfr_name

^

位位置;例如,sbitCY=PSW^7;2)將SFR的相對(duì)位地址定義為位變量名

sbit

bit_name=

sfr字節(jié)地址

^

位位置;例如,sbitCY=0xD0^7;關(guān)鍵詞sbit用于定義SFR位地址變量,三種定義形式:C51編譯器在頭文件“REG51.H”中定義了全部sfr/sfr16和sbit變量。用一條預(yù)處理命令#include<REG51.H>把這個(gè)頭文件包含到C51程序中,無(wú)需重新定義即可直接使用它們的名稱(chēng)。變量名可以由字母、數(shù)字和下劃線三種字符組成,且第一個(gè)字符必須為字母或下劃線,變量名長(zhǎng)度隨編譯系統(tǒng)而定。變量名具有字母大小寫(xiě)的敏感性,如SUM和sum代表不同的變量。強(qiáng)調(diào):頭文件中定義的變量都是大寫(xiě)的,若程序采取小寫(xiě)變量則需要重新定義?!敬鎯?chǔ)種類(lèi)】

數(shù)據(jù)類(lèi)型

【存儲(chǔ)類(lèi)型】

變量名C51擴(kuò)展的若干關(guān)鍵字一覽表

變量名不得使用標(biāo)準(zhǔn)C語(yǔ)言和C51語(yǔ)言的關(guān)鍵字。關(guān)鍵字變量類(lèi)型關(guān)鍵字與結(jié)構(gòu)相關(guān)的關(guān)鍵字C51變量相關(guān)的關(guān)鍵字unsignedchardatasystem_status=0;

//定義system_status為無(wú)符號(hào)字符型自動(dòng)變量,該變量位于data區(qū)中且初值為0。數(shù)據(jù)結(jié)構(gòu)定義舉例變量名為system_status位與片內(nèi)RAM區(qū)無(wú)符號(hào)字符型自動(dòng)型初值為零unsignedcharbdatastatus_byte;

unsignedintcodeunit_id[2]={0x1234,0x89ab};

staticcharm,n;

//定義status_byte為無(wú)符號(hào)字符型自動(dòng)變量,該變量位于bdata區(qū)//定義unit_id[2]為無(wú)符號(hào)整型自動(dòng)變量,該變量位于code區(qū)中,是長(zhǎng)度為2的數(shù)組,且初值為0x1234和0x89ab。//定義m和n為2個(gè)位于data區(qū)中的有符號(hào)字符型靜態(tài)變量。㈤C-51的包含的頭文件通常有:reg51.hmath.hctype.hstdio.hstdlib.habsacc.h常用有:reg51.h(定義特殊功能寄存器和位寄存器);

math.h(定義常用數(shù)學(xué)運(yùn)算);

/*BITRegister*//*PSW*/sbitCY=0xD7;sbitAC=0xD6;sbitF0=0xD5;sbitRS1=0xD4;sbitRS0=0xD3;sbitOV=0xD2;sbitP=0xD0;/*TCON*/sbitTF1=0x8F;sbitTR1=0x8E;sbitTF0=0x8D;sbitTR0=0x8C;sbitIE1=0x8B;sbitIT1=0x8A;sbitIE0=0x89;sbitIT0=0x88;/*IE*/sbitEA=0xAF;sbitES=0xAC;sbitET1=0xAB;sbitEX1=0xAA;sbitET0=0xA9;sbitEX0=0xA8;/*IP*/sbitPS=0xBC;sbitPT1=0xBB;sbitPX1=0xBA;sbitPT0=0xB9;sbitPX0=0xB8;/*P3*/sbitRD=0xB7;sbitWR=0xB6;sbitT1=0xB5;sbitT0=0xB4;sbitINT1=0xB3;sbitINT0=0xB2;sbitTXD=0xB1;sbitRXD=0xB0;/*SCON*/sbitSM0=0x9F;sbitSM1=0x9E;sbitSM2=0x9D;sbitREN=0x9C;sbitTB8=0x9B;sbitRB8=0x9A;sbitTI=0x99;sbitRI=0x98Reg51.h#ifndef__REG51_H__#define__REG51_H__/*BYTERegister*/sfrP0=0x80;sfrP1=0x90;sfrP2=0xA0;sfrP3=0xB0;sfrPSW=0xD0;sfrACC=0xE0;sfrB=0xF0;sfrSP=0x81;sfrDPL=0x82;sfrDPH=0x83;;#endifsfrPCON=0x87;sfrTCON=0x88;sfrTMOD=0x89;sfrTL0=0x8A;sfrTL1=0x8B;sfrTH0=0x8C;sfrTH1=0x8D;sfrIE=0xA8;sfrIP=0xB8;sfrSCON=0x98;sfrSBUF=0x99Absacc.h#defineCBYTE((unsignedcharvolatilecode

*)0)#defineDBYTE((unsignedcharvolatiledata

*)0)#if!defined(__CX2__)#definePBYTE((unsignedcharvolatilepdata*)0)#endif#defineXBYTE((unsignedcharvolatilexdata*)0)

#defineCWORD((unsignedintvolatilecode

*)0)#defineDWORD((unsignedintvolatiledata

*)0)#if!defined(__CX2__)#definePWORD((unsignedintvolatilepdata*)0)#endif#defineXWORD((unsignedintvolatilexdata*)0)Intrins.h_crol_

字符循環(huán)左移_cror_

字符循環(huán)右移

_irol_

整數(shù)循環(huán)左移

_iror_

整數(shù)循環(huán)右移

_lrol_長(zhǎng)整數(shù)循環(huán)左移_lror_

長(zhǎng)整數(shù)循環(huán)右移

C-51的運(yùn)算符與C語(yǔ)言基本相同:+-*/

(加減乘除)>>=<<=

(大于大于等于小于小于等于)==!=

(測(cè)試等于測(cè)試不等于)&&||!

(邏輯與邏輯或邏輯非)>><<

(位右移位左移)&|(按位與按位或)^~(按位異或按位取反)C-51的基本語(yǔ)句與標(biāo)準(zhǔn)C語(yǔ)言基本相同:

if選擇語(yǔ)言

switch/case多分支選擇語(yǔ)言

while循環(huán)語(yǔ)言

do-while循環(huán)語(yǔ)言

for循環(huán)語(yǔ)言

中斷服務(wù)程序函數(shù)名()interruptn

{}

㈨I/O口定義#include<absacc.h>#defineprotxbyte[0x1000]或用指針定義例1、清零程序(將2000H—20FFH的內(nèi)容清零)

★C-51程序

#include<reg51.h>

//#defineucharunsignedcharmain(){inti;unsignedcharxdata*p=0x2000;

/*指針指向2000H單元*/for(i=0;i<256;i++){*p=0;p++;}/*清零2000H-20FFH單元*/}★例2:查找零的個(gè)數(shù)C-51程序#include<reg51.h>main(){unsignedcharxdata*p=0x2000;/*指針p指向2000H單元*/intn=0,i;for(i=0;i<16;i++){if(*p==0)n++;/*若該單元內(nèi)容為零,則n+1*/p++;/*指針指向下一單元*/}p=0x2100;/*指針p指向2100H單元*/*p=n;/*把個(gè)數(shù)放在2100H單元中*/}:例3:將外部存儲(chǔ)器的000BH和000CH單元的內(nèi)容互換(C51)#include<reg51.h>Voidmain(){unsignedchar*p,c,x;While(1){p=0x0b;c=*p;p++;x=*p;*p=c;p--;*p=x;}}例3:將外部存儲(chǔ)器的000BH和000CH單元的內(nèi)容互換(C51)使用absacc.h頭文件進(jìn)行絕對(duì)地址的訪問(wèn),也可以用指針編程。#include<absacc.h>Voidmain()unsignedcharc;While(1){c=XBYTE[11];XBYTE[11]=XBYTE[12];XBYTE[12]=C}例4、將1字節(jié)的二進(jìn)制數(shù)轉(zhuǎn)換成3個(gè)十進(jìn)制數(shù)(BCD碼)并存入20H開(kāi)始的單元中Voidmain(){unsignedchar*p=0x0020;Unsignedcharnumber=123;*p=number/100;P++;*p=(number%100)/10;P++;*p=(number%100)%10;}【例4-24】雙字節(jié)無(wú)符號(hào)整數(shù)快速乘法C51程序:#include<reg51.h>#defineuintunsigne

溫馨提示

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

評(píng)論

0/150

提交評(píng)論