單片機(jī)應(yīng)用技術(shù)項目式教程課件:城市路口交通燈的設(shè)計_第1頁
單片機(jī)應(yīng)用技術(shù)項目式教程課件:城市路口交通燈的設(shè)計_第2頁
單片機(jī)應(yīng)用技術(shù)項目式教程課件:城市路口交通燈的設(shè)計_第3頁
單片機(jī)應(yīng)用技術(shù)項目式教程課件:城市路口交通燈的設(shè)計_第4頁
單片機(jī)應(yīng)用技術(shù)項目式教程課件:城市路口交通燈的設(shè)計_第5頁
已閱讀5頁,還剩62頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

單片機(jī)應(yīng)用技術(shù)項目式教程—基于Proteus和KeilCSINGLE-CHIP

COMPUTER

APPLICATION

TECHNOLOGY

城市路口交通燈的設(shè)計C語言知識回顧01C51基礎(chǔ)知識0203城市路口交通燈的設(shè)計04知識要點(diǎn)流水燈的設(shè)計

串行通信技術(shù)學(xué)會使用Proteus軟件繪制交通燈硬件電路圖01學(xué)會使用Keil軟件進(jìn)行C51的軟件程序設(shè)計并調(diào)試信波特率的選擇與設(shè)計02掌握C51的基本編程方法和常用頭文件03掌握簡單流水燈的設(shè)計和編程方法04學(xué)習(xí)要求實(shí)現(xiàn)城市路口交通燈的設(shè)計05走近科學(xué)單片機(jī)控制的常用顯示器有很多種,如目前廣泛使用的液晶顯示器(LCD)、多段數(shù)碼管以及點(diǎn)陣顯示器,常用于電子游戲、電子鐘表、電視機(jī)等電子設(shè)備上。近年來,如OLED(OrganicLightEmittingDiode)顯示器和TFT-LCD(ThinFilmTransistor-LiquidCrystalDisplay)顯示器也已經(jīng)問世OLED除了具備高分辨率、高亮度、高對比度及低功耗的優(yōu)點(diǎn),還具備可彎曲、耐低溫等特點(diǎn),常用于高端手機(jī)及平板電腦顯示等場合。2.1C語言簡介2.1.1C語言的數(shù)據(jù)類型2.1.2C語言的分支結(jié)構(gòu)與循環(huán)結(jié)構(gòu)2.1.3C語言的數(shù)組2.1.4C語言的指針2.2C51的變量與常量2.2.1C51變量

2.2.2C51的常量2.2.3C51的頭文件2.2.4C-51的運(yùn)算符2.3C51指針2.4C51函數(shù)2.4.1函數(shù)定義2.4.2函數(shù)的調(diào)用2.4.3不帶參數(shù)的函數(shù)寫法及調(diào)用2.4.4帶參數(shù)的函數(shù)寫法及調(diào)用2.4.5中斷函數(shù)2.5軟件程序設(shè)計舉例C語言簡介2.1.1C語言的數(shù)據(jù)類型C語言的數(shù)據(jù)類型包括:基本類型、構(gòu)造類型、指針類型、空類型四大類結(jié)構(gòu)1.基本類型:char,short,int,long,float,double這六個關(guān)鍵字代表C語言里的六種基本數(shù)據(jù)類型。但是由于CPU位數(shù)或者系統(tǒng)位數(shù)的不同,數(shù)據(jù)類型可能占內(nèi)存的大小不同,因此在使用前需要使用sizeof()對各個類型大小進(jìn)行測試。2.構(gòu)造類型:結(jié)構(gòu)體struct、共用體union、數(shù)組和枚舉類型A、定義結(jié)構(gòu)體的一般格式為:struct結(jié)構(gòu)名{類型變量名;類型變量名;}結(jié)構(gòu)變量;例:有3個候選人,對候選人得票統(tǒng)計;每輸入一個人的名字,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);}結(jié)構(gòu)體應(yīng)用舉例B、定義共用體的一般格式為:不同類型的變量共用一段存儲單元union共用體名{成員表列}變量表列;*結(jié)構(gòu)體和共用體的區(qū)別:共用體占的存儲空間長度是最長成員長度,即共用體的地址跟它各成員公用同一個地址。不允許對共用體變量做初始化賦值,賦值只能在程序中進(jìn)行。C、數(shù)組:整形數(shù)組、浮點(diǎn)型、字符型D、枚舉類型:enum

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

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

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

存放變量地址的變量是指針變量,或者說指向另一個變量指針變量。

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

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

int*pointer_1,*pointer_2;

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

int*,讀作,指向整型的指針或簡稱int指針(4)請牢記,指針變量中只能存放地址(指針),不將一個整型量(或任何其他非地址類型的數(shù)據(jù))賦給一個指針變量。注意:指針類型作為形參時voidswap(int*a,int*b){intt=*a;*a=*b;*b=t;}思考:此次交換是存儲空間的內(nèi)容交換還是數(shù)據(jù)交換函數(shù):求兩數(shù)相除的返回值#include<stdio.h>intdivide(inta,intb,int*result);Void

main(){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)*result

=0;else{*result=a/b;}returnresult;}函數(shù)的返回值:求數(shù)組中元素的最大最小值#include<stdio.h>voidminmax(inta[],intlen,int*min,int*max);Void

main(){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);}注:sizeof(a)求出數(shù)組長度,單位字節(jié);sizeof(a[0]求出一個元素占的字節(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];}}}2.2C51的變量與常量1、變量的存儲種類要在程序中使用變量必須先用標(biāo)識符作為變量名,并指出所用的數(shù)據(jù)類型和存儲模式,這樣編譯系統(tǒng)才能為變量分配相應(yīng)的存儲空間。定義一個變量的格式如:[存儲種類]數(shù)據(jù)類型[存儲器類型]變量名;存儲種類和存儲器類型可以填寫也可以不填寫。c51變量的存儲種類一共有四種分別為:自動auto,靜態(tài)static,外部extern,寄存器register變量的存儲種類auto 自動變量(可以省略)動態(tài)存儲register寄存器變量動態(tài)存儲extern外部變量靜態(tài)存儲Static靜態(tài)變量靜態(tài)存儲auto自動變量:凡未加存儲類型說明的變量均為自動變量,自動變量可以省去auto。Register:為了提高運(yùn)行速度,把局部變量值直接存儲在CPU的寄存器中不存儲在內(nèi)存中(單片機(jī)中少有)register寄存器變量:各類變量都存放在存儲器里,當(dāng)對一個變量頻繁讀寫時,必然要反復(fù)訪問存儲器,從而花費(fèi)大量的存取時間。c提供了寄存器變量,這種變量存放在CPU的寄存器中,使用時不需要訪問內(nèi)存,直接從寄存器中讀寫,可提高效率。#include<stdio.h>main(){ registerinti,s=0; for(i=1;i<200;i++){ s=s+i; printf("s=%d\n",s);}注意:只有局部自動變量和形式參數(shù)才可以定義為寄存器變量。寄存器變量靜態(tài)變量3.靜態(tài)變量有時希望函數(shù)中的局部變量的值在函數(shù)調(diào)用結(jié)束后不消失而保留原值,這時就應(yīng)該指定局部變量為靜態(tài)局部變量,用關(guān)鍵字static進(jìn)行聲明。打印1!到N!main(){intfactor();inti,n;printf("N=");scanf(“%d\n",&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);}main(){inti;inta=2;for(i=0;i<5;i++)printf("sum(a)=%d\n",sum(a));

}運(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處開始,到本程序文件的末尾。如果外部變量不在文件的開頭定義,其有效的作用范圍只限于定義處到文件末尾。如果在定義點(diǎn)之前的函數(shù)想引用該外部變量,則應(yīng)該在引用之前用關(guān)鍵字extern對該變量進(jìn)行“外部變量聲明”。表示該變量是一個已經(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;}data:內(nèi)部數(shù)據(jù)存儲器(00H-7FH)

bdata:內(nèi)部數(shù)據(jù)存儲器(20H-2FH)idata:高128字節(jié)內(nèi)部數(shù)據(jù)存儲器Pdata:外部RAM256字節(jié)單元Xdata:64K,由于裝入地址的位數(shù)不同,pdata區(qū)要比xdata區(qū)尋址要快。*其中:data:代表直接尋址的內(nèi)部數(shù)據(jù)存儲器idata:代表間接尋址的內(nèi)部數(shù)據(jù)存儲器。存儲器類型data區(qū)code區(qū)bdata區(qū)pdata區(qū)idata區(qū)建立C51存儲類型與存儲空間的對應(yīng)關(guān)系【存儲種類】

數(shù)據(jù)類型

【存儲類型】

變量名(標(biāo)準(zhǔn)C)(標(biāo)準(zhǔn)C)*括號項——可以缺省(但需有缺省值)C51變量定義的四要素:(C51特有)(標(biāo)準(zhǔn)C+C51)【存儲種類】

數(shù)據(jù)類型

【存儲類型】

變量名數(shù)據(jù)的不同格式叫做數(shù)據(jù)類型標(biāo)準(zhǔn)C語言的數(shù)據(jù)類型C51擴(kuò)充數(shù)據(jù)類型:bit、sfr或sfr16、sbitbit型關(guān)鍵詞bit用于定義一個位變量,語法規(guī)則:bit

bit_name

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

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

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

sfr

sfr16sfr_name=

字節(jié)地址常數(shù);例如,sfrP0=0x80;//定義P0口地址80H

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

sfr16DPTR=0x82;//定義DPTR的低端地址82H注意:C語言中十六進(jìn)制整數(shù)是數(shù)值前加0x或0X前綴sbit型CYACF0RS1RS0OVF1PCYACF0RS1RS0OVF1PCYACF0RS1RS0OVF1PCYACF0RS1RS0OVF1PD0^7

D7HD6HD5HD4HD3HD2HD1HD0HD0HPSWD0^6

D0^5

D0^4

D0^3

D0^2

D0^1

D0^0

兩種位地址表達(dá)形式:相對位地址、絕對位地址關(guān)鍵詞sbit用于定義SFR位地址變量,三種定義形式:1)將SFR的絕對位地址定義為位變量名

sbit

bit_name=

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

sfr_name

^

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

sbit

bit_name=

sfr字節(jié)地址

^

位位置;例如,sbitCY=0xD0^7;

使用sbit進(jìn)行特殊功能位的定義:用一個已經(jīng)聲明的特殊功能寄存器的地址作為sbit的基地址,“^”后數(shù)字范圍0~7,表示該寄存器的第幾位。sbit位名=特殊功能寄存器名^位置;例如:sfrPSW=0xD0;sbitCY=PSW^7;sbitAC=PSW^6;STC15.H數(shù)據(jù)結(jié)構(gòu)定義舉例unsignedchardatasystem_status=0;

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

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

staticcharm,n;

//定義status_byte為無符號字符型自動變量,該變量位于bdata區(qū)//定義unit_id[2]為無符號整型自動變量,該變量位于code區(qū)中,是長度為2的數(shù)組,且初值為0x1234和0x89ab。//定義m和n為2個位于data區(qū)中的有符號字符型靜態(tài)變量。

C-51的包含的頭文件通常有:STC15.hmath.hctype.hstdio.hstdlib.habsacc.h常用有:reg51.h(定義特殊功能寄存器和位寄存器);

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

#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)ABSACC.h_crol_

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

字符循環(huán)右移

_irol_

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

_iror_

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

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

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

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

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

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

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

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

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

if選擇語言

switch/case多分支選擇語言

while循環(huán)語言

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

for循環(huán)語言C51的基本語句

中斷服務(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:查找零的個數(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;/*把個數(shù)放在2100H單元中*/}例3:將外部存儲器的000BH和000CH單元的內(nèi)容互換(C51)使用absacc.h頭文件進(jì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個十進(jìn)制數(shù)(BCD碼)并存入20H開始的單元中Voidmain(){unsignedchar*p=0x0020;Unsignedcharnumber=123;*p=number/100;P++;*p=(number%100)/10;P++;*p=(number%100)%10;}舉例:LED閃爍控制功能預(yù)處理命令---------函數(shù)說明------------全局變量定義------

主函數(shù)------------自定義函數(shù)---------局部變量定義---------

程序體

程序體------方法1:用if語句實(shí)現(xiàn)。#include“reg51.h”voidmain(){chara;while(1)

{a=P1;a=a&0x03;//屏蔽高6位if(a==0)P1=0xe3;elseif(a==1)P1=0xd3;elseif(a==2)P1=0xb3;elseP1

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論