單片機(jī)部分_第1頁(yè)
已閱讀1頁(yè),還剩67頁(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)介

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

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

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

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

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

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

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

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

9、4封裝引腳圖,,(3)開發(fā)板主要特性和板載資源,,外接+5V供電,板上主電源為+3.3V。開發(fā)板在PC機(jī) Windows 環(huán)境軟件開發(fā)工具 Keil uVision的支持下,不需要安裝特別的驅(qū)動(dòng)程序,通過(guò)RS232串口就能夠方便地進(jìn)行硬件在線仿真、調(diào)試,支持單步、全速、斷點(diǎn)、跳出、變量觀察、外圍設(shè)備訪問等仿真功能。 設(shè)置跳線選擇,所有4個(gè)端口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個(gè)LED燈、8位撥動(dòng)開關(guān)、8個(gè)按鍵、8個(gè)共陽(yáng)極數(shù)碼管、蜂鳴器,,擴(kuò)展并行輸出接口(74HC573)、輸入(74HC245)實(shí)時(shí)時(shí)鐘(PCF8563)64kb(8kB)EEPROM存儲(chǔ)器(AT24LC64 )

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

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

13、差異兼容標(biāo)準(zhǔn)C:語(yǔ)法、結(jié)構(gòu)、程序設(shè)計(jì)方法等相同具有特殊性:面向51單片機(jī),與單片機(jī)的硬件資源相關(guān)庫(kù)函數(shù):特定的庫(kù)函數(shù)數(shù)據(jù)類型:增加了面向單片機(jī)的特殊數(shù)據(jù)類型,如位操作的位類型、寄存器類型等變量存儲(chǔ)模式:與51單片機(jī)的存儲(chǔ)器密切相關(guān)函數(shù):增加了用于處理單片機(jī)中斷的中斷函數(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)):帶符號(hào)字節(jié)數(shù)據(jù),補(bǔ)碼表示的數(shù)值范圍:(1000 0000) -128~+127 (0111 1111)。unsigned char:無(wú)符號(hào)字節(jié)數(shù)據(jù)或字符(ASCII碼),可表示0~255。因此,我們可稱其為“字節(jié)型

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

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

17、的處理,將其小數(shù)點(diǎn)移位變成整數(shù)即可。如:8位A/D轉(zhuǎn)換器測(cè)電壓: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; //個(gè)位數(shù)小數(shù)點(diǎn)隱含在百位數(shù)。,,(5)指針型:**:指針型變量中存放的是指向另一個(gè)數(shù)據(jù)的地址。如:int a, b,*p; //指針變量的聲明,p是指向整形變量的指針變量 p = &a; //指針變量賦初值 b = *p; //相當(dāng)于 b = a;實(shí)際應(yīng)用中,常將單片機(jī)外部存儲(chǔ)器或I/O端口的訪問用指針操作。,,(6)特

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

20、器,就需要用sfr或sfr16重新定義。,,(7)位類型:bit型C51擴(kuò)展的數(shù)據(jù)類型??捎糜谠L問51單片機(jī)中的可尋址的位單元,占一個(gè)二進(jìn)制位,其值為’0’或’1’。bit型:bit定義的位變量,其位地址是可以變化的;sbit型:sbit定義的位變量與51單片機(jī)的一個(gè)可尋址位單元或可位尋址的字節(jié)單元(如可位尋址的特殊功能寄存器)中的某一位相聯(lián)系,其對(duì)應(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ù)運(yùn)算中出現(xiàn)數(shù)據(jù)類型不一致時(shí),就需要轉(zhuǎn)換;隱式轉(zhuǎn)換,按如下優(yōu)先級(jí): bit?char?int?lo

22、ng?float signed?unsigned強(qiáng)制類型轉(zhuǎn)換:“()”如:unsigned char a; unsigned int b=256; a = (unsigned char)b; //此時(shí),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ù)類型組織成一個(gè)整體——聯(lián)合變量;這些不同類型變量存儲(chǔ)在單片機(jī)同一存儲(chǔ)區(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ǔ)一個(gè)漢字ch_word.word = 0x8090; //一個(gè)漢字編碼(雙字節(jié),高位’1’)ch_word_h = ch_word.byte[0];//取編碼的高字節(jié),應(yīng)為0x80ch_word_l = ch_word.byte[1];//取編碼的低字節(jié),應(yīng)為0x90可以看到,51單片機(jī)是以低字節(jié)在前、高字節(jié)在后存儲(chǔ)的,,結(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)變量分別獨(dú)立存儲(chǔ)(獨(dú)立存在);而聯(lián)合體是共用同一存儲(chǔ)區(qū),對(duì)其中一個(gè)變量賦值,另外的變量也就有了相應(yīng)的值。,,枚舉:對(duì)于具有固定取值范圍的變量,將其值一一列出,并用相應(yīng)符號(hào)表示,這些符號(hào)具有從0開始的序列號(hào)值(整數(shù)

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

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

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

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

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

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

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

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

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

35、5)絕對(duì)地址訪問對(duì)code、data、pdata和xdata空間進(jìn)行絕對(duì)尋址(規(guī)定只能以無(wú)符號(hào)數(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為例,說(shuō)明如下:#define XBYTE ((unsigned char volatile xdata *) 0)0為常數(shù),(unsigned char xdata *)為強(qiáng)制類型轉(zhuǎn)換,將0轉(zhuǎn)換為指向外部存儲(chǔ)器的字節(jié)型指針;關(guān)鍵字volatile修飾的變量,可防止編譯器優(yōu)化;因此

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

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

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

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

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

43、:主調(diào)函數(shù)通過(guò)實(shí)參進(jìn)行參數(shù)傳遞,一般將形參說(shuō)明放在列表中,實(shí)參與形參一一對(duì)應(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)一個(gè)函數(shù)正被調(diào)用尚未返回時(shí),又直接或間接調(diào)用該函數(shù)。需大量使用堆棧。,,interrupt n修飾

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

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

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

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

48、實(shí)參列表);調(diào)用形式: 函數(shù)語(yǔ)句 函數(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)庫(kù)函數(shù)安裝keil軟件時(shí),在\Keil\C51\INC目錄下,使用時(shí)在程序開頭用預(yù)處理命令: #include C51常用庫(kù)函數(shù):字符函數(shù)庫(kù):ctype.h字符串函數(shù)庫(kù):string.h輸入/輸出函數(shù)庫(kù):stdio.h數(shù)學(xué)函數(shù)庫(kù):math.h

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

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

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

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

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

溫馨提示

  • 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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 眾賞文庫(kù)僅提供信息存儲(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)論