單片機部分_第1頁
已閱讀1頁,還剩67頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、現(xiàn)代電子技術(shù)實驗——綜合實驗之單片機部分,習(xí)友寶,目錄,2. 實驗開發(fā)板介紹,3. C51程序設(shè)計簡介,4. 開發(fā)環(huán)境與實驗例程,1. 本課程簡介及要求,1. 本課程簡介及要求,1)課程性質(zhì)必修課程:納入本科培養(yǎng)方案。綜合:先修課程的綜合;體現(xiàn)在模擬與數(shù)字、硬件與軟件技術(shù)等的綜合。實驗:實踐動手完成相應(yīng)的設(shè)計。2)課程目的實踐能力與工程素質(zhì)的培養(yǎng)。3)教學(xué)方式學(xué)生為主,教師為輔:教師講解后,學(xué)生自主完成,教師值班指導(dǎo)。

2、時間:2周(第1周講課3次,第2周五考試,其余時間開放,每天上午9:00~晚上9:00)。,,4)考核方式平時設(shè)計(含設(shè)計報告)50分;考試(現(xiàn)場完成,1小時)50分??紤]完成時間因素。5)課程內(nèi)容具有實際工程應(yīng)用背景的小課題。模擬實際電子設(shè)備或系統(tǒng)的設(shè)計。目前,主要基于FPGA或單片機兩種開發(fā)工具。這里主要介紹基于單片機的綜合應(yīng)用。單片機選型:增強型51單片機。,,5)課程內(nèi)容(續(xù))硬件:提供統(tǒng)一的單片機開發(fā)實驗板,但

3、需理解其設(shè)計原理、常用芯片、接口設(shè)計等。軟件:完成基于開發(fā)板的程序設(shè)計。編程語言:C51(面向51單片機的C語言)。,,6)平時設(shè)計題目基本要求:(1)程序運行后,在8位數(shù)碼管的高2位顯示自己的學(xué)號;低4位顯示“秒表計時器”(定時中斷實現(xiàn)),顯示從“00.00”開始,即00秒00(1/100秒,即10ms)。要求:用定時中斷實現(xiàn)(不用Delay()函數(shù))。(2)當(dāng)“秒表計時器”顯示到“10.00”(即10秒)時,啟動TLC54

4、9 A/D轉(zhuǎn)換器進(jìn)行電壓測量(輸入電壓來自電位器,調(diào)節(jié)范圍0~2.49V,單位:V),并將電壓值顯示在8位數(shù)碼管的低3位。高2位仍顯示學(xué)號。 (3)根據(jù)顯示的電壓值來調(diào)節(jié)一個發(fā)光二極管指示燈的亮度(如LED1),即電壓為零時,完全不亮,電壓為最大2.49V時,全亮。 要求能夠線性調(diào)節(jié),即A/D轉(zhuǎn)換器TLC549為8bit,理論上可對應(yīng)256級亮度。提示:用PWM控制,PWM波頻率適當(dāng)即可,建議取2.56ms或25.6

5、ms的周期,亮度等級為25級。,,(4)調(diào)節(jié)電位器,若電壓超過2.00V,則聲光報警,即用另一個發(fā)光二極管指示燈(如LED2)閃爍(亮0.5s、滅0.5s);蜂鳴器響(用500Hz方波驅(qū)動);若輸入電壓低于2.00V后,則撤銷聲光報警。(5)設(shè)置一個按鍵,當(dāng)按下該按鍵時,蜂鳴器響0.1秒(按鍵提示音),同時啟動LM75A數(shù)字溫度傳感器完成溫度的測量,并將溫度值(2位整數(shù)1位小數(shù))顯示在低3位數(shù)碼管上。高2位仍顯示學(xué)號。 (6)再次按

6、下該鍵時,蜂鳴器響0.1秒,同時再回到電壓測量狀態(tài)。 擴展要求:(7)對電壓測量值進(jìn)行簡單的數(shù)據(jù)處理,如去除尖峰干擾的平均濾波:每12個測量值數(shù)據(jù)為一組,去掉最大值和最小值后的10個測量值進(jìn)行算術(shù)平均后,作為顯示值。為不影響測量結(jié)果的實時性,還可進(jìn)行滾動濾波。(8)其他:LCD、擴展接口。 設(shè)計報告要求:按科技論文規(guī)范。,,7)參考資料(1)51單片機參考書(主要了解單片機結(jié)構(gòu)和內(nèi)部資源)(2)C語言、C51程序設(shè)計參考書

7、(3)本課程的電子版資料,包括實驗指導(dǎo)書、實驗例程、主要元器件數(shù)據(jù)手冊(datasheet)、軟件資料等(4)網(wǎng)絡(luò)資源,2. 實驗開發(fā)板介紹,(1)開發(fā)板上單片機的選型P89LV51RD2:80C51 內(nèi)核的ISP低功耗增強型單片機含64kB flash和1024字節(jié)的數(shù)據(jù)RAM;另8KB 引導(dǎo) flash(用來支持 ISP 和 IAP 功能) 可選擇X2方式:每個機器周期6個時鐘3V工作電壓,操作頻率為0~33M

8、Hz,兼容TTL和CMOS邏輯電平 SPI(串行外圍接口)和增強型UART PCA(可編程計數(shù)器陣列),具有PWM和捕獲/比較4個8位I/O口,3個高電流P1口(16mA) 3個16位定時器/計數(shù)器 可編程看門狗定時器(WDT) 8個中斷源,4個中斷優(yōu)先級 2個DPTR寄存器 低功耗模式、掉電模式,外部中斷喚醒、空閑模式詳見其datasheet。,,P89LV51RD2內(nèi)部功能圖,,P89LV51RD2 TQFP4

9、4封裝引腳圖,,(3)開發(fā)板主要特性和板載資源,,外接+5V供電,板上主電源為+3.3V。開發(fā)板在PC機 Windows 環(huán)境軟件開發(fā)工具 Keil uVision的支持下,不需要安裝特別的驅(qū)動程序,通過RS232串口就能夠方便地進(jìn)行硬件在線仿真、調(diào)試,支持單步、全速、斷點、跳出、變量觀察、外圍設(shè)備訪問等仿真功能。 設(shè)置跳線選擇,所有4個端口P1、P3、P0、P2可作為普通I/O口;或P3口第二功能、 P0、P2口作為數(shù)據(jù)/地址。

10、晶振頻率:為常用的11.0592MHz。復(fù)位方式:RC上電復(fù)位、按鍵復(fù)位 外部32KB靜態(tài)RAM(U9,IS62LV256),地址為0x0000~0x7FFF,其中0x0000~0x03ff(1kB)可設(shè)置為片內(nèi)或片外。8個LED燈、8位撥動開關(guān)、8個按鍵、8個共陽極數(shù)碼管、蜂鳴器,,擴展并行輸出接口(74HC573)、輸入(74HC245)實時時鐘(PCF8563)64kb(8kB)EEPROM存儲器(AT24LC64 )

11、1-Wire總線的數(shù)字溫度計(DS18B20 )I2C接口的數(shù)字溫度計(LM75A )8位串行接口的逐次比較式A/D轉(zhuǎn)換器(TLC549 )提供128x64 LCD模塊接口,可并行連接或串行連接。擴展功能連接(8位數(shù)據(jù)線、高8位地址線、3.3V電源線)??赏瓿傻闹饕獙嶒瀮?nèi)容有:基本:LED燈、撥動開關(guān)、鍵盤、蜂鳴器、LED動態(tài)掃描顯示、液晶屏、I2C總線、EEPROM數(shù)據(jù)存儲、數(shù)字溫度計、電壓測量、頻率測量、電子鐘,等等。

12、 擴展:LCD顯示;其他測量與控制,如直流電機、步進(jìn)電機應(yīng)用,,開發(fā)板主要芯片,,(4)開發(fā)板原理圖介紹,(4)開發(fā)板原理圖-1,,,(4)開發(fā)板原理圖-2,,地址分配外部擴展RAM: CS_=A15:0x0000~0x7fffI/O地址:0x8000~0xbfff, 0xc000~0xffff(可用于擴展)地址譯碼電路:,,各端口地址如下:,,P1口線的分配,,,跳線設(shè)置:,3. C51程序設(shè)計簡介,1)C51與標(biāo)準(zhǔn)C語言的

13、差異兼容標(biāo)準(zhǔn)C:語法、結(jié)構(gòu)、程序設(shè)計方法等相同具有特殊性:面向51單片機,與單片機的硬件資源相關(guān)庫函數(shù):特定的庫函數(shù)數(shù)據(jù)類型:增加了面向單片機的特殊數(shù)據(jù)類型,如位操作的位類型、寄存器類型等變量存儲模式:與51單片機的存儲器密切相關(guān)函數(shù):增加了用于處理單片機中斷的中斷函數(shù)專用編譯器:如常用的Keil,代碼緊湊、使用方便。集成開發(fā)環(huán)境:編輯、編譯、調(diào)試。如常用的Keil uVision。,,2)C51的數(shù)據(jù)類型與標(biāo)準(zhǔn)C一樣

14、,有基本數(shù)據(jù)類型、組合數(shù)據(jù)類型;但char型與short型相同,float型與double型相同。C51的特定數(shù)據(jù)類型(如特殊功能寄存器型、位類型)(1)字符型(“字節(jié)型”):charsigned char(默認(rèn)):帶符號字節(jié)數(shù)據(jù),補碼表示的數(shù)值范圍:(1000 0000) -128~+127 (0111 1111)。unsigned char:無符號字節(jié)數(shù)據(jù)或字符(ASCII碼),可表示0~255。因此,我們可稱其為“字節(jié)型

15、”。,,(2)整形:intsinged int(默認(rèn)):存放一個雙字節(jié)數(shù)據(jù), 補碼表示的數(shù)值范圍為:-32768~+32767;unsigned int:存放一個雙字節(jié)無符號數(shù),數(shù)值范圍為0~65535。(3) 長整型:longsinged long(默認(rèn)):存放一個4字節(jié)數(shù)據(jù);unsigned long:存放一個4字節(jié)無符號數(shù)據(jù)。注:由于所定義的不同類型的變量,需要占用單片機內(nèi)存,所以盡量選用滿足變量范圍的類型。,,(4)

16、 浮點型:floatfloat :4個字節(jié)表示,格式符合IEEE-754標(biāo)準(zhǔn)的單精度浮點型數(shù)據(jù);C51中,double雙精度浮點型和long double與float相同;包含指數(shù)和尾數(shù)兩部分,最高位為符號位,“1”表示負(fù)數(shù),“0”表示正數(shù),其次的8位為階碼,最后的23位為尾數(shù)的有效數(shù)位,由于尾數(shù)的整數(shù)部分隱含為“1”,所以尾數(shù)的精度為24位。浮點數(shù)均為帶符號數(shù)。,,注:單片機的數(shù)據(jù)處理盡量采用整數(shù),而不用小數(shù)(浮點型);對小數(shù)

17、的處理,將其小數(shù)點移位變成整數(shù)即可。如:8位A/D轉(zhuǎn)換器測電壓:unsigned int Vx;unsigned char V100,V10,V1;NADC = ReadADC();Vx=[(NADC)/256]*2.50V,其中Vref=2.50VVx=(NADC*250)/256;V100 = Vx/100; //百位數(shù)V10 = (Vx-100*V100)/10; //十位數(shù)

18、V1 = (Vx-100*V100)%10; //個位數(shù)小數(shù)點隱含在百位數(shù)。,,(5)指針型:**:指針型變量中存放的是指向另一個數(shù)據(jù)的地址。如:int a, b,*p; //指針變量的聲明,p是指向整形變量的指針變量 p = &a; //指針變量賦初值 b = *p; //相當(dāng)于 b = a;實際應(yīng)用中,常將單片機外部存儲器或I/O端口的訪問用指針操作。,,(6)特

19、殊功能寄存器型:sfr或sfr16C51擴展的數(shù)據(jù)類型。sfr:字節(jié)型特殊功能寄存器類型,可訪問51單片機內(nèi)部所有特殊功能寄存器;sfr16: 雙字節(jié)型特殊功能寄存器類型,可訪問51單片機內(nèi)部所有雙字節(jié)的特殊功能寄存器。在reg51.h(或reg52.h)頭文件中,已有標(biāo)準(zhǔn)51單片機寄存器的聲明,因此,C51程序的開頭都是:#include ,這樣,在程序中就可直接使用單片機的特殊功能寄存器了。對于特定型號單片機的特殊功能寄存

20、器,就需要用sfr或sfr16重新定義。,,(7)位類型:bit型C51擴展的數(shù)據(jù)類型??捎糜谠L問51單片機中的可尋址的位單元,占一個二進(jìn)制位,其值為’0’或’1’。bit型:bit定義的位變量,其位地址是可以變化的;sbit型:sbit定義的位變量與51單片機的一個可尋址位單元或可位尋址的字節(jié)單元(如可位尋址的特殊功能寄存器)中的某一位相聯(lián)系,其對應(yīng)的位地址是不可變化的。常用于設(shè)定程序中的一些“標(biāo)志位”。如:bdata un

21、signed char flags; //定義可位尋址的字節(jié)sbit int10ms_flag = flags^0; //定義標(biāo)志位或者:bit bdata int10ms_flag;又如:sbit LED = P1^0; //定義LED由P1.0控制,,C51的基本數(shù)據(jù)類型,,(8)變量類型的轉(zhuǎn)換數(shù)據(jù)運算中出現(xiàn)數(shù)據(jù)類型不一致時,就需要轉(zhuǎn)換;隱式轉(zhuǎn)換,按如下優(yōu)先級: bit?char?int?lo

22、ng?float signed?unsigned強制類型轉(zhuǎn)換:“()”如:unsigned char a; unsigned int b=256; a = (unsigned char)b; //此時,a=0,,(9)組合數(shù)據(jù)類型包括數(shù)組類型、結(jié)構(gòu)類型、聯(lián)合類型、枚舉類型等。數(shù)組:一維數(shù)據(jù),如:unsigned char disp_buf[8];字符數(shù)組,如:unsigned char

23、 string[10];數(shù)組常與指針一起用;二維數(shù)組。,,聯(lián)合:也稱“共同體”,將不同數(shù)據(jù)類型組織成一個整體——聯(lián)合變量;這些不同類型變量存儲在單片機同一存儲區(qū)。典型應(yīng)用如:unsigned char ch_word_h,ch_word_l;union //union后的聯(lián)合體名可省略{ unsigned char byte[2]; unsigned int word;}ch_wor

24、d; //定義聯(lián)合變量ch_word,以存儲一個漢字ch_word.word = 0x8090; //一個漢字編碼(雙字節(jié),高位’1’)ch_word_h = ch_word.byte[0];//取編碼的高字節(jié),應(yīng)為0x80ch_word_l = ch_word.byte[1];//取編碼的低字節(jié),應(yīng)為0x90可以看到,51單片機是以低字節(jié)在前、高字節(jié)在后存儲的,,結(jié)構(gòu)體:將一類相關(guān)變量“歸類”在一起

25、。如:struct date{ unsigned int year; unsigned char month , day;}d1; //定義結(jié)構(gòu)體變量d1注意與聯(lián)合體的區(qū)別:結(jié)構(gòu)體內(nèi)變量分別獨立存儲(獨立存在);而聯(lián)合體是共用同一存儲區(qū),對其中一個變量賦值,另外的變量也就有了相應(yīng)的值。,,枚舉:對于具有固定取值范圍的變量,將其值一一列出,并用相應(yīng)符號表示,這些符號具有從0開始的序列號值(整數(shù)

26、,依次加1)。如:enum weekday //定義枚舉類型,枚舉名為weekday { Sun,//枚舉元素,其后用’,’ Mon, Tue, Wed, Thu, Fri, Sat//最后一個元素不用’,’} d1;//定義枚舉變量d1d1 = Sun;//d1的值實際為0,,(10)變量引用當(dāng)一個項目(project,即一個完整程序)中有多個源程序文件時,如果在一

27、個文件中定義的變量需要在另一個文件中使用(“引用”),需在該變量定義前加“extern”。如:在file1.c中,定義: unsigned char key_value;若在file2.c中需要使用key_value,則: extern unsigned char key_value;,,(11)數(shù)據(jù)類型的別名用typedef為已有數(shù)據(jù)類型取別名,可增加程序的可讀性,且簡潔明了。如首先定義: typedef

28、unsigned int uchar; typedef unsigned char uint;其后就可用uint和uchar 定義變量了,如: uchar a1=0x12; uint a2=0x1234;,,(12)變量名的命名規(guī)則:由字母、數(shù)字和下劃線三種字符組成,且第一個字母必須為字母或下劃線。為提高程序的可讀性,一般由多個英文單詞(或縮寫)連接而成。注意規(guī)范: 多個英文單詞的首字母大寫,

29、如:KeyValue 多個英文單詞之間用下劃線連接,如:key_value,,3)C51的常數(shù)整形常數(shù):如100,-1;100L則為長整形——用4字節(jié)存儲;十六進(jìn)制表示:如0x64;浮點數(shù)常數(shù)(實型常數(shù)):十進(jìn)制表示,如1.23;指數(shù)表示,如1.234e2。字符常數(shù):對于可顯示字符,加單引號表示,如’a’, ‘1’;對于不可顯示字符,用轉(zhuǎn)義字符(反斜杠“\”)表示,如’\n’表示換行,也可用其ASCII碼值表示:’\x0

30、a’。字符串常數(shù):加雙引號,如“abc123”,注:字符串后有一個結(jié)束符’\x00’。,,轉(zhuǎn)義字符表,,定義符號常數(shù):const如,在程序開頭,定義: const float PI = 3.14159;則程序中可用PI代替該常數(shù)。,,4)變量的存儲程序中的變量,其在程序運行過程中,存在時間、作用范圍以及對于單片機實際物理存儲區(qū)域有所不同。全局變量與局部變量:全局變量:在源程序開頭定義的變量,其作用范圍為本文件中,其他

31、文件需要引用的話,需加extern。局部變量:函數(shù)中定義的變量,其作用范圍為本函數(shù)中;函數(shù)執(zhí)行時才分配(占用)內(nèi)存空間,結(jié)束時釋放。盡量少定義全局變量:占內(nèi)存;可靠性有些固定的數(shù)據(jù)表(不需要改變其值),可加code,存儲于程序存儲器。如LED七段碼表:code unsigned char disp_seg[] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x

32、7c,0x39,0x5f,0x79,0x71};,,從作用范圍來說,有自動(auto)、外部(extern)、靜態(tài)(static)和寄存器(register)等4種。自動變量,auto:函數(shù)中的變量,可省略auto關(guān)鍵字,缺省為auto。外部變量,extern:文件外;函數(shù)外;占用固定內(nèi)存空間。靜態(tài)變量,static:函數(shù)體內(nèi)定義:內(nèi)部靜態(tài)變量。典型應(yīng)用,如在定時中斷服務(wù)函數(shù)中,用一個靜態(tài)變量來計定時中斷的次數(shù):stati

33、c unsigned char int10ms_num=0; 函數(shù)外部定義:外部靜態(tài)變量,本文件中有效。寄存器變量,register:對應(yīng)單片機寄存器,速度快。如,可用于for(;;)循環(huán)變量;可不專門聲明,編譯器可自動識別程序中頻繁使用的變量。,,變量的存儲器類型定義變量在單片機中的物理存儲區(qū)域,缺省時編譯器按具體編譯模式默認(rèn)指定存儲區(qū)。如下表:,,3種編譯模式默認(rèn)的存儲器類型small模式(小模式):編譯時函數(shù)參數(shù)和變量

34、被默認(rèn)在片內(nèi)RAM中,存儲器類型為data。compact模式(緊湊模式)。編譯時函數(shù)參數(shù)和變量被默認(rèn)在片外RAM的低256字節(jié)空間,存儲器類型為pdata。large模式(大模式)。編譯時函數(shù)參數(shù)和變量被默認(rèn)在片外RAM的64K字節(jié)空間,存儲器類型為xdata。可在程序開頭用預(yù)處理指令說明編譯模式: #pragma small //編譯模式:small或:開發(fā)環(huán)境中設(shè)置。一般均采用small模式。,,

35、5)絕對地址訪問對code、data、pdata和xdata空間進(jìn)行絕對尋址(規(guī)定只能以無符號數(shù)方式訪問)。在absacc.h (absolute address access)頭文件中,有如下宏定義:#define CBYTE ((unsigned char volatile code *) 0)#define DBYTE ((unsigned char volatile data *) 0)#define PBYTE

36、((unsigned char volatile pdata *) 0)#define XBYTE ((unsigned char volatile xdata *) 0)#define CWORD ((unsigned int volatile code *) 0)#define DWORD ((unsigned int volatile data *) 0)#define PWORD ((unsigned int vol

37、atile pdata *) 0)#define XWORD ((unsigned int volatile xdata *) 0),,以XBYTE為例,說明如下:#define XBYTE ((unsigned char volatile xdata *) 0)0為常數(shù),(unsigned char xdata *)為強制類型轉(zhuǎn)換,將0轉(zhuǎn)換為指向外部存儲器的字節(jié)型指針;關(guān)鍵字volatile修飾的變量,可防止編譯器優(yōu)化;因此

38、,XBYTE應(yīng)該是一個指針,指向64kB外部存儲器(或I/O)的0x0000地址;對0x1234的訪問(讀/寫、輸入/輸出)可用如下形式: unsigned char a=10,b; XBYTE[0x1234] = a; //讀0x1234存儲單元;或輸入 b = XBYTE[0x1234] ; //寫0x1234存儲單元;或輸出用XWORD每次可訪問一個字(相鄰地址的2個字節(jié))。,,用指針實現(xiàn)絕對地址

39、訪問 #define pXBYTE (unsigned char xdata *) unsigned char xdata *pbyte;//定義指向xdata的指針 pbyte = pXBYTE(0x1234); //指針賦值為訪問地址; //pbyte=0x1234也可,但加上強制類型轉(zhuǎn)換更規(guī)范 *pbyte = 10; //寫操作用_at

40、_訪問 unsigned char xdata temp _at_ 0x1000; //在xdata //的0x1000單元定義字節(jié)變量temp(全局變量) temp = 10; //寫操作,,6)C51的運算符與表達(dá)式(1)賦值運算符:=(2)算術(shù)運算符:+、-、*、/、%(3)關(guān)系運算符:>、=、>(6)復(fù)合賦值運算符:在賦值運算符“=”的前面加上其它運算符:+=

41、、-=、*=、/=、%=, 如a+=2; 相當(dāng)于a=a+2; &=、|=、^=、~=,>>=、>=2; 相當(dāng)于a=a>>2;,,(7)自加:++,自減:--如:a++; //相當(dāng)于a=a+1;(8)逗號運算符:,將多個(兩個以上)表達(dá)式連接起來;按從左至右的順序依次計算出各表達(dá)式的值,而整個逗號表達(dá)式的值是最右邊的表達(dá)式的值。如: x=(a=1,b=2); //x的

42、值為2(9)條件運算符:?:如:c=(a>b)?a:b; //當(dāng)滿足條件a>b時,c=a;否則c=b,,7)函數(shù)自定義函數(shù)和庫函數(shù)。對自定義函數(shù):(1)函數(shù)定義的一般格式函數(shù)類型 函數(shù)名(形式參數(shù)表) [reentrant][interrupt m][using n]形式參數(shù)說明{局部變量定義函數(shù)體}函數(shù)類型:即函數(shù)返回值的類型,無返回值用void函數(shù)名:程序利用函數(shù)名實現(xiàn)函數(shù)調(diào)用形式參數(shù)

43、:主調(diào)函數(shù)通過實參進(jìn)行參數(shù)傳遞,一般將形參說明放在列表中,實參與形參一一對應(yīng)。,,函數(shù)示例:int max(int x,int y) //函數(shù)定義{ int z; z=(x>y)?x:y; return(z);}reentrant修飾符定義該函數(shù)為可重入函數(shù)(允許被遞歸調(diào)用),即當(dāng)一個函數(shù)正被調(diào)用尚未返回時,又直接或間接調(diào)用該函數(shù)。需大量使用堆棧。,,interrupt n修飾

44、符C51的中斷(服務(wù))函數(shù),n為中斷號,取值0~31 0——外部中斷0(int0) 1——定時/計數(shù)器(T0) 2——外部中斷1(int1) 3——定時/計數(shù)器(T1) 4——串行口中斷(UART) 5——定時/計數(shù)器(T2)特別注意:中斷函數(shù)無參數(shù)也無返回值;它是在中斷允許條件下,中斷事件發(fā)生時,自動進(jìn)入的,而不是由主程序軟件調(diào)用的!編譯時,添加斷點和現(xiàn)場保護(hù)(堆棧)的相應(yīng)語句;并

45、從絕對地址8n+3處產(chǎn)生一個中斷向量(中斷入口地址)。,利用1ms定時中斷函數(shù)實現(xiàn)100ms定時示例:bit bdata timer_100ms_flag = 0;TMOD &= 0x0f;//僅使用定時器/計數(shù)器1(只需設(shè)置TMOD高4位)TMOD |= 0x10;TH1 = 0xFC;//設(shè)置定時器初值0xfc66,對應(yīng)定時時間:1msTL1 = 0x66;TR1 = 1; /

46、/啟動定時器T1ET1 = 1; //允許T1中斷EA =1; //總開中斷void T1INTSVC() interrupt 3 //中斷號3:T1中斷{ static unsigned char n = 100; //靜態(tài)變量n,計中斷次數(shù) TR1 = 0; TH1 = 0xFC; //設(shè)置定時器初值0xfc66

47、,對應(yīng)定時時間:1ms TL1 = 0x66; TR1 = 1; n--; if(n==0) {n=100; timer_100ms_flag = 1;}},,using n修飾符用于指定本函數(shù)內(nèi)部使用的單片機R0~R7工作寄存器組,n為組號,取值為0~3。注意: using n不能用于有返回值的函數(shù),因為C51函數(shù)的返回值是放在寄存器中的。一般不用。,,(2)函數(shù)的調(diào)用函數(shù)調(diào)用:函數(shù)名(

48、實參列表);調(diào)用形式: 函數(shù)語句 函數(shù)表達(dá)式 函數(shù)參數(shù)(3)函數(shù)的聲明函數(shù)原型一般形式: [extern] 函數(shù)類型 函數(shù)名(形式參數(shù)表);,,函數(shù)聲明示例:int max(int x, int y); //函數(shù)聲明void main(void) //主函數(shù){ int a,b,c; c = max(a,b);//函數(shù)調(diào)用}i

49、nt max(int x, int y) //函數(shù)定義{ int z; z=(x>y)?x:y; return(z);},,(4)庫函數(shù)安裝keil軟件時,在\Keil\C51\INC目錄下,使用時在程序開頭用預(yù)處理命令: #include C51常用庫函數(shù):字符函數(shù)庫:ctype.h字符串函數(shù)庫:string.h輸入/輸出函數(shù)庫:stdio.h數(shù)學(xué)函數(shù)庫:math.h

50、標(biāo)準(zhǔn)函數(shù)庫:stdlib.h內(nèi)部函數(shù)庫:intrins.h關(guān)于庫函數(shù)的使用,可參考相關(guān)資料。,,8)C51程序基本結(jié)構(gòu)與相關(guān)語句(1)順序結(jié)構(gòu)程序順序執(zhí)行(2)選擇結(jié)構(gòu)條件判斷,跳轉(zhuǎn)兩個分支、多個分支,,選擇結(jié)構(gòu)的相關(guān)語句if/else、或if語句嵌套格式1:if (表達(dá)式) {語句;}格式2:if (表達(dá)式) {語句1;} else {語句2;}格式3:if (表達(dá)式1) {語句1;}

51、 else if (表達(dá)式2) {語句2;} else if (表達(dá)式3) {語句3;} …… else if (表達(dá)式n-1) {語句n-1;} else {語句n; }如:前面c=(a>b)?a:b;相當(dāng)于如下語句: If(a>b) c=a; else c=b;,,switch/case語

52、句多分支選擇switch (表達(dá)式){ case 常量表達(dá)式1:{語句1;} break; case 常量表達(dá)式2:{語句2;} break; …… case 常量表達(dá)式n:{語句n;} break; default:{語句n+1;}},,(3)循環(huán)結(jié)構(gòu)當(dāng)型循環(huán)結(jié)構(gòu)(while) while(表達(dá)式) {語句;} //循環(huán)體示例: while

53、(!TF0);直到型循環(huán)結(jié)構(gòu)(do while,for語句) do {語句; //循環(huán)體, 至少執(zhí)行一次 } while(表達(dá)式);for語句 for(表達(dá)式1;表達(dá)式2;表達(dá)式3) {語句;} //循環(huán)體,,(4)循環(huán)的嵌套多重循環(huán),如:void delay(unsigned char ms) //實現(xiàn)ms毫秒延時函數(shù){ while(ms--)

54、 for(i=0;i<210;i++); //約1ms,對fosc=11.0592MHz}(5)循環(huán)結(jié)構(gòu)中的break和continue語句break;從循環(huán)體中跳出,提前結(jié)束循環(huán)continue; 結(jié)束本次循環(huán)(而不是終止整個循環(huán)),,(6)函數(shù)返回語句: return終止函數(shù)執(zhí)行(返回),兩種格式: return; return (表達(dá)式);//帶回返回值,4. 開發(fā)環(huán)境與實驗例程,開發(fā)

溫馨提示

  • 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. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(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

提交評論