版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1章C80C51系列單片機的軟件,KeilC編譯器、宏匯編、連接器、庫管理和一個功能強大的仿真調(diào)試器等在內(nèi)的完整開發(fā)方案,通過一個集成開發(fā)環(huán)境(μVision)將這些部份組合在在學(xué)會使用匯編語言后,學(xué)習(xí)C語言編程是一件比較容易的事,通過一系列的實例介紹C語言編程的方法。圖1-1所示電路圖使用89S52單片機作為主,這種單片80C518KFLASHROM,ISP功能,支4個按鈕開關(guān),我們的任務(wù)是讓接在P1引腳上的發(fā)光二極管按要求發(fā)光。簡單的C程序Copyright2003fan'smcustudioAllrights#include“reg51.h”sbitP1_0=P1^0;voidmain() }雖然只4C編譯器在處理的時候卻要處理幾十或幾百這里程序中包含REG51.h文件的目的是為了要使用P1這個符號,即通C編譯器,程序中所寫的P180C51單片機的P1端口而不是其它變量。這是如何做到的呢?Headerfileforgeneric80C51and80C31Copyright(c)1988-2001KeilElektronikGmbHandKeilSoftware,Inc.Allrights. BYTERegister sfrP0 =0x80;sfr =sfr =sfrP3 =0xB0;sfrPSW sfrACC =0xE0;sfrB =0xF0;sfrSP=0x81;sfrDPL=0x82;sfrDPH=0x83;sfrPCON=0x87;sfrTCON=0x88;sfrTMOD=0x89;sfrTL0=0x8A;sfrTL1=0x8B;sfrTH0=0x8C;sfrTH1=0x8D;sfrIE=0xA8;sfrIP=0xB8;sfrSCON=0x98;sfrSBUF= BIT /*PSWsbitCY=0xD7;sbitAC=0xD6;sbitF0=0xD5;sbitRS1=0xD4;sbitRS0=0xD3;sbitOV=0xD2;sbitP=0xD0; sbitTF1 =0x8F;sbitTR1 =0x8E;sbitTF0 =0x8D;sbitTR0 sbitIE1 =0x8B;sbitIT1 =0x8A;sbitIE0 =0x89;sbitIT0 =0x88;/*IEsbitEA=0xAF;sbitES=0xAC;sbitET1=0xAB;sbitEX1=0xAA;sbitET0=0xA9;sbitEX0=0xA8;/*IPsbitPS=0xBC;sbitPT1=0xBB;sbitPX1=0xBA;sbitPT0=0xB9;sbitPX0=0xB8; sbitRD =0xB7;sbitWR sbitT1 =0xB5;sbitT0 =0xB4;sbitINT1=0xB3;sbitINT0=0xB2;sbitTXD =0xB1;sbit = sbitSM0 =0x9F;sbit =sbitSM2=0x9D;sbitREN=0x9C;sbitTB8=0x9B;sbitRB8=0x9A;sbitTI =0x99;sbitRI =0x98;sfr =的,其用法是:sfrt變量名=在C語言里,如果直接寫P1.0,C編譯器并不能識別,而且P1.0也不是一個合法的CP1_0P1_0P1.0呢?你這么認為,CKeilC的關(guān)鍵字sbit來定義,sbit的用法有三種:第法:sbit位變量名=地址第二種方法:sbit位變量名=SFR名稱^變量位地址值第三種方法:sbit位變量名=SFR地址值^變量位地址值如定義PSW中的OV可以用以下三種方法:sbit sbit sbit (3)說明:0xD0就是PSW的地址起P10一類的名字,只要下面程序中也隨之更改就行了。1-2讓接在P1.0引腳上的LED閃爍發(fā)光Copyright2003fan'smcustudioAllrights#include"reg51.h"#defineucharunsignedchar#defineuint unsignedintsbitP10=P1^0;voidmDelay(unsignedint unsignedinti; }}void }}程序分析:主程序main中的第一行暫且不看,第二行是“P1_0=!P1_0;”,在P1_0前有注意:取反運算只是對變量的值而言的,并不會自動改變變量本身??梢哉J為C編譯器在處理“!P1_0P1_0的值給了一個臨時變量,然后對這個臨時變量取反,而不“P1.0是高電平,取反后,P1.0P1.0上燈就mDelay(1000)KeilC提供的庫函數(shù),即你不能在任何情況下寫這樣一行么又是正確的呢?注意觀察,可以發(fā)現(xiàn)這個程序中有voidmDelay(…)mDelay這個詞是我們自己起的名字,并且為此編寫了一些程序行,如果你的程序中沒有這mDelay(1000)了。有人腦子快,可能馬上想到,我可不可以把這段程序也到我其它程序中,然后就可以用mDelay(1000)了呢?回答是,那當(dāng)然就可以了。還有一點需要說明,mDelay這個名稱是由編程者自己命名的,可自行更改,但(1000可以在一定范圍內(nèi)調(diào)整延時時間的長短,這里用1000來要求延時時間為1000毫秒,要做到Keil工程的要使用Keil軟件,首先要正確安裝Keil軟件,該軟件的Eval版本可以直接去 這里就不再贅述了。安裝完成后,將Ledkey.dll文件到Keil安裝 下的C51\BIN文在這個窗口里輸入例1-2中的源程序,注意大小寫及每行后的分號,不要錯輸及漏輸。展名,一般C語言程序均以“.C”為擴展名,這里將其命名為exam2.c,保存完畢后可以將Keil使用工程(Project)這一概念,將這些參數(shù)設(shè)置和所需的所有文件都加在一個工程中,這里起名為exam2,不需要輸入擴展名。點擊“保存”按鈕,出現(xiàn)第二個框,如圖1-2所示,這個框要求選擇目標(biāo)CPU(即你所用的型號,Keil支持的CPU很多,這Group11-3所示,選中其中的“AddfiletoGroup”SourceGroup1”,出現(xiàn)一個框,要求尋找源文件。工程的詳細即出現(xiàn)對工程設(shè)置的框,這個框共有8個頁面,大部份設(shè)置項取默認值就行了。1-5XalU置該數(shù)值可使顯示時間與實際所用時間一致,一般將其設(shè)置成與你的硬件所用晶振頻率相MemoryModelRAM使用情況,有三個選擇項:SmallRAMCompact:可以使用一頁(256字節(jié))外部擴展RAM;Larget:可以使用全部外部的擴展RAM。Small:只用低于2K的程(NoneOutPut1-6CreatHexfile用于生成可執(zhí)行代碼文件,該文件可以用編程器寫入單片機,其格式為inHEX格式,文件的擴展名為.HEX,默工程設(shè)置框中的其它各頁面與C51編譯選項、A51的匯編選項、BL51連接器的連Listing的調(diào)節(jié),其中比較常用的選項是“CCompileListing”下的“AssambleCode”項,選中該項CC初學(xué)者ListC源代碼與對應(yīng)匯編代碼,對于提高C語言編程能力大有好處。C51該頁用于對Keil的C51編譯器的編譯過程進行控制,其中比較常用的是“CodeOptimization1.7Level是優(yōu)化等級,C51在對源程序進行編譯時,可以對代碼多至9級優(yōu)化,默認使用第8級,一般不必修改,如果在編譯中出現(xiàn)一些問題,可以降低優(yōu)化級別試一試。Emphasis是選擇編譯優(yōu)先方式,第一項是代碼量優(yōu)化(最終生Debug編譯、CP1將下面的源程序輸入,命名為exam3.c,并建立名為exam3的工程文件,將exam3.c文件加入該工程中,設(shè)置工程,在Target頁將Xtal后的值由24.0改為12.0,以便后面調(diào)試時Debug頁對DialogDLL框作一個設(shè)置,在進行項目設(shè)置時點擊Debug,打開Debug頁,可以看例1- 使P1口所接LED以流水燈狀態(tài)顯 Copyright2003fan's Allrights#include"reg51.h"#include#defineucharunsignedchar#defineuint unsignedintvoidmDelay(unsignedint unsignedinti; }}void unsignedcharOutData=0xfe;{ /*延時1000毫秒}}RebuildAlltargetfiles將會對當(dāng)前工程中的所有文件重新進行編譯然后再連接,確保最終生產(chǎn)的目標(biāo)代碼是的,而Translate….項則僅對當(dāng)前文件進行編譯,不進行連接。以上操1-10exam3.hex的文件,該文件即可被編程器讀入并(code=63(data=9,的文件,可被用于Keil的仿真與調(diào)試,到了這一步后即進行調(diào)試。程序的在對工程成功地進行匯連接以后Ctrl+F5或者使用菜Debug->Start/StopDebugSession調(diào)試狀態(tài),Keil內(nèi)建了一個仿真CPU用來模擬執(zhí)行程序,該仿真CPU功1-11所示,Debug菜單上的大部份命令可以在此找到對應(yīng)的快使用菜單STEP或相應(yīng)令按鈕或使用快捷鍵F11可以單步執(zhí)行程序,使用菜單STEPOVERF10C語言中的一每按一次F11,即執(zhí)行該箭頭所指程序行,然后箭頭指向下一行,當(dāng)箭頭指向不斷按F11鍵,即可逐步執(zhí)行延時子程序。mDelaymDelay程序已正使用F10來替代F11,在main函數(shù)中執(zhí)行到mDelay(1000)時將該行作為一條語句快速執(zhí)行這個程序中用到了延時程序mDelay,如果使用匯編語言編程,每段程序的延遲時間可以非常精確地計算出來,而使用C語言編程,就沒有辦法事先計算了。為此,可以使用觀的窗口,其中有一項是sec,即統(tǒng)計從開始執(zhí)行到目前為止用去的時間。按F10,以過程單后的數(shù)值上即可看到完整的數(shù)值記下該數(shù)值,然后按下F10,執(zhí)行完mDelay(1000)后再次觀察sec值,如圖1-13所示,這里前后兩次觀察到的值分別是:0. 和1. 獲得的延時值將小于1s,因此,最佳的取值應(yīng)該是124。C語言的一些1、C程序是由函數(shù)構(gòu)成的,一個C源程序至少包括一個函數(shù),一個C源程序有且只有main()C程序的基本單位。主程序C語言本身提供給我們的(3中的_crol_(…)函數(shù),這樣的函數(shù)稱之為庫函數(shù),也可以是用戶自己編寫的(2、3mDelay(…)函數(shù)KeilC語言的人,都可以C的庫函數(shù)而不需要為這個函數(shù)寫任何代碼,只需要包含具有該函數(shù)說明的相應(yīng)供了100多個庫函數(shù)供我們直接使用。例如 (unsignedintvoid在什么地方。例1.2中就是放在了最后,事實上這往往是最常用的式。4、主程序中mDelay如果寫mdelay就會編譯出錯,即C語言區(qū)分大小寫,這一點5、C語言書寫的格式自由,可以在一行寫多個語句,也可以把一個語句寫在多行。沒錯誤,初學(xué)C的人往往對此深感頭痛,這時就要檢查一下,是不是有這樣的情況,如果有 //取反P1.0FranklinCPCTC都不支持這種格式的注釋,用上這種注釋,編譯時2章分支程序設(shè)計程序功能與LED點亮,P3.2、P3.3、P3.4、P3.5K1~K4,按下按鈕時,相應(yīng)K1按下時,開始流動,K2按下時停止流動,全部燈滅,K3使燈由上往動,K4使燈由下往上流動。2-1:鍵控流水燈的程序#include"reg51.h"#defineucharunsignedvoidmDelay(unsignedint unsignedint {;}uchar uchartmp;P3=P3|0x3c四個按鍵所接位置if((KeyV|0xc3)==0xff)//無鍵按下 voidmain() unsignedcharOutData=0xfe;bitUpDown=0;bitStart=0; case case case case0xdf://P3.5=0 } }P1=0xff否則燈全滅}}exam21.c,建立名為exam21的工程文件,選擇的CPU型號為譯、后進入調(diào)試模式,點擊Peripherals51實驗仿真板,打開實驗仿真板,選擇Run(全速運行此時實驗仿真板沒有變化,用鼠標(biāo)點擊上方的K1按鈕,松開后即可看到LedK3LED的流動方向,改為由上往動,點擊K4按鈕,又可將流動方向變換回來。點擊K2按鈕,可使流動停止,所有LED“熄滅”。if(關(guān)系表達式)1else<=(“>=(大于等于==(等于)=(不等于。a>ba+b>b+c(a=3(b=5,而是賦值號,即將該號后面的值賦給該號前面的變量,所以最終結(jié)果是x1等于1。邏輯運算符和邏輯表||(判斷一個量是否是“真”時,以0代表而以非0代表“真一點務(wù)必要注意。以下的值為0。相與或者相或,結(jié)果都為真,系統(tǒng)給出的結(jié)果是1。ifif(表達式)語句if(表達式)語句 else語句elseif(2)語句2elseif(3)語句…elseif(表達式m)語句m 語句n 種f是C,相當(dāng)于匯語言中O的3值KeyV與0xc3即 )按位為0xf(即 )間4位有按鍵如果有么3間4中然一或位“eur(0”是返回之意,相當(dāng)于匯編語言中的“re”指令,通過該語句可以帶返回值,即該號中的數(shù)值,返回值就是這個函數(shù)的值,在這個函數(shù)被調(diào)用時,用了如下的形式:Kaue=Key();因此,返回的結(jié)果是該值被賦給Kvaue這變量。,如果沒鍵被按,則直返回,且Kvaue為0么reurn()將會被執(zhí)。{…燈流動顯示的代碼}P1=0xff;//if語句的第二種用法Startmain函數(shù)的中被定義,并賦以初值0,該變量在按鍵K1被按下后置為1,而K2按下后被清為0,用來控制燈流動是if后面括號中的寫法,量是0還是1來決定程序的,如果為1則執(zhí)行燈流動顯示的代碼,如果為0,則執(zhí)行if語句的第三種用法在本程序中沒有出現(xiàn),下面我們舉一例說明。在上述的鍵盤處理函 B BK3接地時,返回值是0xef BK4被按下(P3.5接地時,返回值是0xdf 該值將被賦給主程序中調(diào)用鍵盤程序的變量KValue。程序用了另一種選擇結(jié)構(gòu)switch進行處理,關(guān)于switch將在稍后介紹。下面用if語句來改寫:elseelseelse程序中第一條語句判斷Kvalue是否等于0xfb,如果是就執(zhí)行Start=1;執(zhí)行完畢即退出if語句if語句下面的程序Kvalue不等于0xfb就轉(zhuǎn)去下一elseif即判Kvalue是否等于0xf7,如果等于則執(zhí)行Start=0;,并退出if語句…這樣一直到最后一個elseif后面else后面的語句(通常這if語句的嵌if()else2if()else編程者的本意ifelse配對,縮if語句為內(nèi)嵌if語句,但實際else將if配對,因為兩者最近,從而造邁岐義。為避免這種情況,建議編程時使用大括號將內(nèi)嵌的if語句括起來,這樣可以避免出現(xiàn)這樣的問題。swich語ifif語層數(shù)多,程序冗長而且可讀性降低。Cswitch語句直接處理多分支選擇。Switchswitch(表達式 常量表達式1:語句1 defaultn+1}某一個case后面的常量表達式相等時,就執(zhí)行此case后面的語句,若所有的case中的常量表達式的值都沒有與表達式值匹配的,就執(zhí)行default后面的語句;每一個case的常量表達式的值必須不相同;各個case和default的出現(xiàn)次序不影響執(zhí)行結(jié)果。caseswitch,轉(zhuǎn)switch{casecase0xf7:casecase} 句,使流程序退出switch結(jié)構(gòu),即終止switch語句的執(zhí)行。3章數(shù)據(jù)類型些數(shù)據(jù)在計算機內(nèi)部進行處理、時往往有著很大的區(qū)別。下面我們來了解C語言數(shù)據(jù)C語言的數(shù)據(jù)類型概述常量與例1符號常量的使用,在P1口接有8個LED,執(zhí)行下面的程序:#defineLIGHT0 #include“reg51.h”voidmain() }程序中用#defineLIGHT00xfe來定義符號LIGHT00xfe,以后程序中所有出現(xiàn)LIGHT00xfeP1=0xfeP1.0引腳上的LED點亮。#definePORTA0x7fff#definePORTBPORTA、PORTB0x7ff、0x7fe。顯然,這變化(如修改了硬件0x7fff改成了0x3fff,那么只要將所定義的語句改動一下:序中把所有表示端口地址的0x7fff找出來并改掉可不是件容易的事。 經(jīng)過顯示程序處理后,在數(shù)碼管上顯示1234。這里的3CH就是一個單元,而送到3CH1,這就是數(shù)與該數(shù)據(jù)在地址單元的關(guān)系。同樣,在高級語言3CH,#5”之3CH作為存x1內(nèi)容的單元還是3DH,4FH等作為存放x1內(nèi)容的單元,是由C編譯器確定的。sum是兩個不同的標(biāo)識符。CCKeilC編譯器中可以使用長達數(shù)十個字符的標(biāo)識符。1000寫入程序中即可,這就是常量。顯然,這個數(shù)據(jù)是不能在現(xiàn)場一個變量(如Speed)程序時這么寫:mDelay(Speed);然后再編寫一段程序,使得Speed字符型數(shù)據(jù)與整型voidmDelay(unsignedint unsignedint }}unsignedintjunsignedcharj,其他任何地方都不作更改,重新編譯、連接后,可以發(fā)現(xiàn)延遲時間變?yōu)榧s0.38s。int和char是C語言中的兩種不同的數(shù)據(jù)類型,可見整型數(shù)KeilC中規(guī)定使用二個字節(jié)表示int型數(shù)據(jù),因此,變量i在內(nèi)存中的實際占用情況1.例如,-10,第一步取-10101010,由于是整型數(shù)占的存放形式。這里其實只要搞清一點,就是必須補足16位,其它的都不難理解。int,可以加上有關(guān)數(shù)值范圍的修飾符。這些修飾符分兩類,一類是short和long,另一類是unsigned,這兩類可以同時使用。下面就來看有關(guān)這些修飾符intshortlongkeilCshortshortint前加上longkeilC中,長整數(shù)要用4個字節(jié)來存放(int型是2個字節(jié)。顯然,長整數(shù)所能表達的范圍比整數(shù)要大,一個-231<x<231-21longint型數(shù)據(jù)的范圍是-32768~32767,可見,unsigned即無符號的意思,如果加上了這樣的一個修飾符,就說明其unsignedint而言,仍是用2個字節(jié)(16位)表示一個數(shù),但其數(shù)的范圍是0~65535,對于unsignedlongint而言,仍是用4個字節(jié)(32位)表示一個數(shù),但其數(shù)的范圍是0~232-1。字符型charc=10;/*定義c為字符型變量,并將10賦給該變量*/101010KeilCchar型數(shù)據(jù),因此,變量c在內(nèi)存中的實際占用情如下:int1680C518位機,一次只能處理8位二進制碼,所以就要分次處理,因此延遲時間就變長了。unsigned即無符號的。對于一個字符型變量來說,其表達的范圍是-128~+127,而加上了unsigned后,其表達的范圍變?yōu)?~255。unsigned和沒有加究竟有何區(qū)別呢?其實對于二進制形式而言,char型變量表達的范圍都是0000,0000~1111,1111,而int型變量表達的范圍都是char實際是將字符aASCII碼值賦給變量c,因此,做完這一操作之后,c97。inti255時,兩者完全可以互換。C語言對定符型數(shù)據(jù)作這樣的處理使用32即可(ASCII碼表可以看到任意一個大寫字母比小寫字母小voidmain() unsignedchara,b;intc,d;}ea23.cC0C編譯器認為這種程序無意義而自動優(yōu)化使我們不能3-1所示。a255,類型是無符2551111,1111,如果將8位,所以最的1丟失,于是該數(shù)字就變也 圖3-1數(shù)的溢解,機上有磁帶計數(shù)器,共有3位,當(dāng)轉(zhuǎn)到999后,再轉(zhuǎn)一圈,本應(yīng)是1000,但實際0001000轉(zhuǎn)還是根本沒有存放的形式是0111,1111,1111,1111,當(dāng)其加1后就變成了1000,0000,0000,0000,而這個二進制數(shù)正是-32768在內(nèi)存中的存放形式,所以c加1后就變成了-32768??梢姡诔霈F(xiàn)這樣的問題時C編譯系統(tǒng)不會給出提示(其他語言中BASIC等會報告出4章循環(huán)程序設(shè)計循環(huán)程序C語言提供的循環(huán)語句,及如何利用這些循環(huán)語句寫循4-1P1LED#include#include"intrins.h"該文件包含有_crol_(…)函數(shù)的說明voidmDelay(unsignedintDelayTime) unsignedint }}void unsignedcharOutData=0xfe;{P1=OutData; /*延時1000毫秒}}程序分析:輸入源程序,并命名為mDelay(1000)1000改大一些,如、或更大。軟件仿真無法實現(xiàn)atStart”和“GoTillmain4-1所示。選擇完成后,點擊“Setting”按鈕,選擇你所COM2384004-1設(shè)置DebugDebugStart/StopDebugSession,可以看到在窗口右下4-2選擇串口、波特率及其:4-3正確進入程序調(diào)while語while(表達式 語#include#include"intrins.h"該文件包含有_crol_(…)函數(shù)的說明voidmDelay(unsignedintDelayTime) unsignedint }}void unsignedcharOutData=0xfe; OutData=_crol_(OutData,1);//循環(huán)左移 }}whileK1鍵是否被按下,如do-whilewhile(表達式對同一個問題,既可以用while語句處理,也可以用do-while語句處理。但是這兩個語句是有區(qū)別的,下面我們用do-while語句改寫例2。#include#include"intrins.h"該文件包含有_crol_(…)函數(shù)的說明voidmDelay(unsignedintDelayTime) unsignedint }}void unsignedcharOutData=0xfe; /*延時1000毫秒}}while()K1鍵被按下,應(yīng)該執(zhí)行程序體,否則不執(zhí)行,效果與例4-2相同。但是事實上,實際做這個練習(xí)就會發(fā)現(xiàn),不論K1是否被按下,流K1鍵被按下,的確是在執(zhí)行循環(huán)體內(nèi)的程序,與設(shè)想相只是在判斷條件不成立(K1沒有被按下)后,轉(zhuǎn)去執(zhí)行P1=0xff;然后又繼續(xù)循環(huán),而下一for語句的一般形for(123)for語句典型的應(yīng)用是這樣一for(循環(huán)變量初值;循環(huán)條件;循環(huán)變量增值)j=0j125125則去執(zhí)行循環(huán)體(這里循環(huán)體 forfor1應(yīng)省略,但其后的分號不因為這里的變量DelayTime是由參數(shù)傳入的一個值,不能在這個式子里賦初值。break語可以通過break語句強行退出循環(huán)結(jié)構(gòu)。4:開機后,全LED不亮K1LED1開始依次點亮,至LED8后停止并全部熄滅,等待再次按下K1鍵,重復(fù)上述過程。如果中間K2鍵被按下,LED立即全部熄滅,#include#include"intrins.h"該文件包含有_crol_(?)函數(shù)的說明voidmDelay(unsignedintDelayTime) unsignedint }}void unsignedcharOutData=0xfe;unsignedchari; )// )//}}}}按下的時間必須足夠長,因為這里每1s才會檢測一次K2是否被按下。的循環(huán),即循環(huán)8 continueContinuebreak語名的區(qū)別是:continue語句只結(jié)束本次循環(huán),而不是終止整個循環(huán)的執(zhí)行;而break語句則是結(jié)束整個循環(huán)過程,不會再去判斷循環(huán)條件是否滿足。將循環(huán)8次,直到所有燈點亮,又加到初始狀態(tài),即所有燈滅,等待K1按鍵。如果K2鍵被按下,不是立即退出循環(huán),而只是結(jié)束本次循環(huán),即不執(zhí)行continue語句下面的 因此,不論K2鍵是否被按下,循環(huán)總是要經(jīng)過8次才會終止,差別在于是否執(zhí)行了上述兩行程序。如果上述程序行有一次未被執(zhí)行,意味著有一個LED未被點亮,因此,如果按下K2過一段時間(1、2s)松開,中間將會有一些LED不亮,直到最后一個LED被點亮,又回到全部熄滅的狀態(tài),等待K1被按下。5章單片機內(nèi)部資源編程應(yīng)使用DSB-1A型實驗板進行練習(xí)。5-1用定時器實現(xiàn)LED閃0116位定時/計數(shù)的工作方式,不使用門控位。由此可以確定定時器的工作方式字TMOD應(yīng)為B,即0x0165536-60000=5536T05536化為十六進制即為0x15a0,這樣就可以寫出初始化程序即:當(dāng)定時時間到后,TF01,因此,只需要查詢TF0是否等于1即可得知定時時間是否到達,程序中用“if(TF0){…}TF0=0,則條件不滿足,大括號中的程將TF0,然后重置定時初值,最后是執(zhí)行規(guī)定動作――取反P1.0的狀態(tài)。C51C返回值函數(shù)名interrupt中斷應(yīng)用例5- 用中斷法實現(xiàn)定時器控制P1.0所接LED以60ms閃爍用DSB-1A型實驗板來完成這一實驗。2用中斷法使用定時分析:本例與例1的要求相同,唯一的區(qū)別是必須用中斷方式來實現(xiàn)。這里仍選用定時器T0,工作于方式1,無門控,因此,定時器的初始化操作與上例相同。要開啟中斷,必須=1;”來實現(xiàn)。在做完這些工作以后,就用for(;;){;}讓主程序進入無限循環(huán)中,所有工作均由voidtimer0()interrupt1C51interrupt關(guān)寄存器組為進行中斷的現(xiàn)場保護,80C51單片機除采用堆棧技術(shù)外,還獨特地采用寄存器組的方80C514R0~R7的工作寄存器,中斷產(chǎn)生時,可以通過簡單地CRS0、RS1來切換工作C51usingnn的0~3,對應(yīng)使用四組工作寄存器。voidtimer0()interrupt1usingBUF中讀到接收到的數(shù)3P18只發(fā)光二極管,P3.2~P3.5K1~K4共四個按鍵,使用串行口編程,1)PCP1PC機送出的數(shù)以二進制形式顯示在發(fā)光二極#defineucharunsignedchar#include"string.h"#include"reg51.h"voidSendData(uchar uchari=0; }voidmDelay(unsignedint unsignedcharj=0; }}uchar uchar //中間4位置高電平 }}}void ucharP1=0xff;//關(guān)閉P1口接的所有燈 SCON=0x40;//串口工作方式1 //K1} }}}實現(xiàn)過程:輸入程序,命名為exam53.c,建立名為exam53的工程,將文件加入,設(shè)置工窗口空白處點右鍵,在彈出式菜單中選擇“HexMode3
5-3選擇顯LED產(chǎn)生相應(yīng)的5-4是按K1一次、K2連續(xù)兩次、再K1后看到的串行窗口現(xiàn)象,而實驗4使用實驗仿真板演示串行為0x311ASCII程序分析:本程序T1作為波特率發(fā)生器,工作于方2(8位自動重裝入方式),波特率為19200串行口工作于方式1根據(jù)以上條件不難算出T1的定時初值為0xfdTMOD應(yīng)初始0x20,SMOD應(yīng)初始化0x30PCONSMOD位必須1,主mainK1K1被按下,則調(diào)用發(fā)送數(shù)據(jù)程序,將數(shù)據(jù)0x55送出,如K2被按下0xAA送出。然后檢測RI是否1,如RI1,說RI,準(zhǔn)SendDataDat,即待發(fā)送的SBUF后,使用一個無限循送完畢,發(fā)送完畢使用break語句退出循環(huán)。5-5所示。5-5設(shè)置串第六章CCC語言編程方法,這一節(jié)通過若干例子進一步學(xué)習(xí)C語言程序的有關(guān)知識點。該部分的硬件6-1所示,U1P0P2口的部份引腳構(gòu)6LED數(shù)碼PNP型三極管作為片選端的驅(qū)動,所有三極管的發(fā)射極連在一起,接到正電源端,它們的基極則分別連到P2.0?P2.5,當(dāng)P2.0?P2.5中某引腳輸引腳是高或低電平。圖中看出,所有6位數(shù)碼管的筆段連在一起,通過限流電阻后接到P0口,因此,哪些筆段亮就取決于P0口的8根線的狀態(tài)。6-1計數(shù)器實驗硬件LED數(shù)碼管的字形碼、位驅(qū)動碼,然后編寫程序#include#defineucharunsignedchar#defineuint unsignedintucharcode //字形ucharDispBuf[6];//voidTimer1()interrupt ucharucharCount;//計數(shù)器,顯示程序通過它得知現(xiàn)正顯示哪個數(shù)碼管 //P2與 B相或P2=P2&tmp;//P2與取出的位值相 }void uintTMOD=0x15;//定時0工作于1,定1工作1 //T0中的數(shù)值}}C51的一種構(gòu)造數(shù)據(jù)類型,數(shù)組必須由具有相同數(shù)據(jù)類型的元素構(gòu)成,這些數(shù)類型說明符數(shù)組名[整型表達式]例:inta[5]={1,2,3,4,5}; 而后面3個元素的值全是0。 可以為數(shù)組指定空間,這個例子中
溫馨提示
- 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)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 職業(yè)健康促進與員工健康權(quán)益保障
- 長沙2025年湖南長沙工業(yè)學(xué)院引進博士人才筆試歷年參考題庫附帶答案詳解
- 金華浙江金華市民政局編外用工招聘筆試歷年參考題庫附帶答案詳解
- 職業(yè)健康與女職工發(fā)展平衡策略-1
- 溫州2025年浙江溫州市龍灣區(qū)人民檢察院聘用制書記員招錄筆試歷年參考題庫附帶答案詳解
- 瀘州2025年四川瀘州市江陽區(qū)教育系統(tǒng)招聘教師3人筆試歷年參考題庫附帶答案詳解
- 江門廣東江門恩平市基層農(nóng)技推廣體系改革與建設(shè)項目特聘農(nóng)技員遴選筆試歷年參考題庫附帶答案詳解
- 昭通云南昭通彝良縣醫(yī)共體總醫(yī)院龍海分院招聘合同制人員筆試歷年參考題庫附帶答案詳解
- 恩施2025年湖北恩施州中心醫(yī)院招聘筆試歷年參考題庫附帶答案詳解
- 常州2025年江蘇常州經(jīng)開區(qū)社會保障和衛(wèi)生健康局下屬事業(yè)單位招聘19人筆試歷年參考題庫附帶答案詳解
- 果農(nóng)水果出售合同范本
- 2025年事業(yè)單位聯(lián)考A類職測真題及答案
- DB11-T 693-2024 施工現(xiàn)場臨建房屋應(yīng)用技術(shù)標(biāo)準(zhǔn)
- 起重機械安全風(fēng)險辨識報告
- 2025年山東省村級后備干部選拔考試題(含答案)
- 村社長考核管理辦法
- 兒童顱咽管瘤臨床特征與術(shù)后復(fù)發(fā)風(fēng)險的深度剖析-基于151例病例研究
- 防潮墻面涂裝服務(wù)合同協(xié)議
- GB/T 15237-2025術(shù)語工作及術(shù)語科學(xué)詞匯
- 外賣跑腿管理制度
- 冷鏈物流配送合作協(xié)議
評論
0/150
提交評論