




版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
1、單片機C51程序設計教程與實驗主講教師:董蘊華實驗指導教師:楊其鋒單片機C51程序設計教程與實驗教學安排本課程共45學時(理論25學時,實驗20學時)課程性質(zhì):考查 本課程考試以應用程序設計作為考查的評分依據(jù)教學安排本課程共45學時(理論25學時,實驗20學時)學習本課應具備的基礎知識學習本課程應具備的基礎知識 單片機原理及應用 C語言程序設計學習本課應具備的硬件 實驗板一塊 程序下載線一條學習本課應具備的基礎知識學習本課程應具備的基礎知識本課程主要內(nèi)容單片機基礎知識(復習)C51編程語言及開發(fā)環(huán)境Keil uVision功能模塊的C語言編程實現(xiàn)本課程主要內(nèi)容單片機基礎知識(復習)MCS-51
2、系列單片機的結構 (1)面向控制的8位CPU; (2)128B的片內(nèi)數(shù)據(jù)存儲器; (3)可以尋址64KB的片外程序存儲器; (4)可以尋址64KB的片外數(shù)據(jù)存儲器; (5)32根雙向和可單獨尋址的I/O線; (6)一個全雙工的異步串行口; (7)兩個16位定時/計數(shù)器; (8)5個中斷源,兩個中斷優(yōu)先級; (9)有片內(nèi)時鐘振蕩器; (10)采用高性能HMOS生產(chǎn)工藝生產(chǎn); (11)有布爾處理(位操作)能力; (12)含基本指令111條,其中單機器周期指令64種。 MCS-51系列單片機的結構 MCS-51系列單片機的內(nèi)部總體結構88微處理器(運算部件)控制部件B 數(shù)據(jù)存儲器RAMP0口P2口程
3、序存儲器P1口P3口串行口定時/計數(shù)器中斷系統(tǒng)特殊功能寄存器(SFR)88ROM/EPROMVCCVSSXTAL1XTAL2 PSENALEEARESET MCS-51系列單片機的內(nèi)部總體結構88 P0口P2口程序第一講 C51程序設計基礎主要內(nèi)容: 單片機程序設計語言 單片機匯編語言與C語言的特點 C語言程序設計知識(復習) 第一講 C51程序設計基礎主要內(nèi)容:1.1 單片機程序設計語言(1)機器語言 :機器可以識別的語言如: 74010111010000000001 78020111100000000010 3800111000(2)匯編語言:由指令助記符書寫的語言 如: MOV A, #
4、01H MOV R0,#02H ADD A, R0(3)C語言:通用程序設計語言,由函數(shù)組成 如: void main( ) int m; m=1+2; 1.1 單片機程序設計語言(1)機器語言 :機器可以識別三種語言的特點機器語言:計算機可以識別,直接面向硬件、程序代碼短、可直接運行、運行速度快、但難懂、難記、開發(fā)慢;匯編語言:必須“翻譯”成機器語言,直接面向硬件、運行速度快、但通用性差、不易移植;C語言:使用了與人的思維更接近的關鍵字和操作函數(shù),容易理解,通用性好、易移植。 應用C語言設計單片機程序可以大大加快開發(fā)速度,增強程序可讀性,便于修改、擴充、移植,是目前開發(fā)人員用的最多的一種單片
5、機開發(fā)語言。三種語言的特點機器語言:計算機可以識別,直接面向硬件、程序代C的優(yōu)勢C語言作為一種方便語言得到廣泛支持,多個硬件開發(fā)都用C,如單片機、DSP、ARM。C本身不依賴于機器硬件系統(tǒng),基本上不作修改就可將程序從不同單片機中移植過來。C提供很多數(shù)學函數(shù)并支持浮點運算,開發(fā)效率高。C的優(yōu)勢C語言作為一種方便語言得到廣泛支持,多個硬件開發(fā)都用1.2 C51與ASM-51相比的優(yōu)勢對單片機的指令系統(tǒng)不要求了解,僅要求對8051的存儲結構有初步了解;寄存器分配,不同存儲器的尋址及數(shù)據(jù)類型等細節(jié)由編譯器管理;程序有規(guī)范的結構,可分成不同的函數(shù),這種方式可使程序結構化;提供的庫包含多個標準子程序,具有
6、較強的處理能力;由于具有方便的模塊化設計,便于移植。1.2 C51與ASM-51相比的優(yōu)勢對單片機的指令系統(tǒng)不要匯編語言特點代碼執(zhí)行效率高;占用存儲空間少;可移植性差。 長度上比較:高級語言比匯編語言長15%200%; 執(zhí)行時間上比較:高級語言比匯編語言增長50%300%。 C51用于編寫復雜的大型程序,對要求反應靈敏、控制及時,實時檢測等控制系統(tǒng)都是用匯編語言和C語言聯(lián)合編寫的。對時鐘要求嚴格時,使用匯編語言是唯一的方法。匯編語言特點代碼執(zhí)行效率高; 1.3 C語言程序設計知識簡單C程序舉例void main( ) int b ,a=1; / a表示一個整型變量,變量名為a / ;為語句結束
7、符號 b=+a; / a的值加一變?yōu)?,然后將a的值賦給b說明: C程序從main開始執(zhí)行程序,前一個void表示無值返回; C程序中用到的變量一定要先定義變量的數(shù)據(jù)類型,只有定義了變量的數(shù)據(jù)類型后,變量才會在內(nèi)存中按其數(shù)據(jù)類型長度給其分配空間。 1.3 C語言程序設計知識簡單C程序舉例1.3.1 數(shù)據(jù)類型數(shù)據(jù)類型 位數(shù) 字節(jié)數(shù) 值域 bit 1 01 signed char 8 1 -128+127 unsigned char 8 1 0255 enum 16 2 -32768+32767 signed short 16 2 -32768+32767 unsigned short 16 2
8、065535 signed int 16 2 -32768+32767 unsigned int 16 2 0655351.3.1 數(shù)據(jù)類型數(shù)據(jù)類型 位數(shù) 數(shù)據(jù)類型(二)數(shù)據(jù)類型 位數(shù) 字節(jié)數(shù) 值域signed long 32 4 -2147483648 2147483647unsigned long 32 4 04294967295 float 32 4 0.175494E- 38 0.402823E+38 sbit 1 01 sfr 8 1 0255 sfr16 16 2 065535單片機中使用最多的是char,int型,默認為有符號型。sbit ,sfr ,sfr16是C51對C的擴展
9、。數(shù)據(jù)類型(二)數(shù)據(jù)類型 位數(shù) 字節(jié)數(shù) unsigned int a;for(a=100;a=0;a-)unsigned int a;for(a=100;a=01.3.2 常量與變量常量:使用預定義對常量進行定義,使用一個標識符代替一個常量。例:#define CONST 10為了與變量區(qū)別,常量一般使用大寫。#define 宏名 字符串以一個宏名稱來代表一個字符串,當程序任何地方使用宏名稱時將以代表的字符串來替換,可以是一個常數(shù)、表達式等。#define uchar unsigned char#define unit unsigned int1.3.2 常量與變量常量:使用預定義對常量進行定
10、義,使用一變量變量有3個相關參數(shù):變量名、變量值、變量地址。變量名由字母、數(shù)字、下劃線組成,首字母必須是字母或下劃線。在程序定義變量時首先要選擇它的數(shù)據(jù)類型,一個變量可能有多大值,要幾個字節(jié)能存下,在夠用的情況下,盡量選一個字節(jié)的char。例: bit b_Start; char c_Start; int i_Start;變量使用前必須進行定義。變量變量有3個相關參數(shù):變量名、變量值、變量地址。1.3.3 C語言的基本運算符-算術運算符運算符 范 例 說 明+ a+b a變量值和b變量值相加- a-b a變量值和b變量值相減* a*b a變量值乘以b變量值/ a/b a變量值除以b變量值% a
11、%b a變量值除以b變量值的余數(shù)1.3.3 C語言的基本運算符-算術運算符運算符 賦值運算符運算符 范 例說 明= a=6 將6賦值給a變量,即a變量值等于6+= a+=b 等同于a=a+b,將a和b相加的結果又存回a-= a-=b 等同于a=a-b,將a和b相減的結果又存回a*= a*=b 等同于a=a*b,將a和b相乘的結果又存回a/= a/=b 等同于a=a*b,將a和b相除的結果又存回a%= a%=b 等同于a=a%b,a值除以b值的余數(shù)又存回 a有兩個操作數(shù)的運算符都可寫成復合形式變量 運算符 變量 等效為 變量變量 運算符 變量x=y 等效為 x=xy賦值運算符運算符 范 例說 明
12、關系運算符運算符 范 例 說 明 ab 測試a是否大于b a= a=b 測試a是否大于或等于b = ay的值為1,xyz的值為0。(左結合性)關系運算符運算符 范 例 說 明邏輯運算符運算符 范 例 說 明& a&b a和b邏輯與,兩個變量都是“真”, 結果才為 “真”否則結果為“0”| a|b a和b作邏輯OR,只要有任何 一個變量為“真”,結果就為“真” !! !a 將a變量的值取反,即原來為“真”則 變 “假”,為“假”則變?yōu)檎妗?”代表假,“非0”代表真例:a=3, b=6 , 則!a的值為0a&b的值為1注意:匯編語言中字節(jié)做與或非運算(ANL ORL XRL CPL )為按位操作。
13、邏輯運算符運算符 范 例 說 位操作位操作可大大提高單片機程序的運行速度,方便用戶編程,經(jīng)常用到。 運算符 范 例 說 明 ab a和b按位作OR運算& a&b a和b按位作AND運算 ab a和b按位作XOR運算 a 將a的每一位取反 ab 將a按位右移b個位,左側補“0”,溢出舍去 ab 將a按位左移b個位,右側補“0”,溢出舍去注意:C51中沒有循環(huán)移位,需自己編程實現(xiàn)。位操作位操作可大大提高單片機程序的運行速度,方便用戶編程,經(jīng)自增減運算,-,相當于變量變量1例:設x=0 x23則 y=x+; /y=23H, x=24H y=+x; /y=24H, x=24H y=x-; /y=23H
14、, x=22H y=-x; /y=22H, x=22Hx+是先賦值,后自加;+x是先自加,后賦值自增減運算,-,相當于變量變量1逗號運算符表達式1,表達式2,表達式n表達式按從左到右的方式運算,整個表達式的值取決于最后一個。例:unsigned char x=100; unsigned char y; y=(x=x/10,x/2) /先計算 x/10=10,然后計算 x/2=5,所以y=5逗號運算符表達式1,表達式2,表達式n條件運算符條件運算符:表達式1?表達式2:表達式3條件運算符表達式的運算規(guī)則:如果表達式1的值為真,那么整個表達式的值就是表達式2的值,否則是表達式3的值。各種運算符時,
15、要考慮運算符的優(yōu)先級及結合性。(P51)條件運算符條件運算符:表達式1?表達式2:表達式31.3 C51控制流順序結構選擇結構循環(huán)結構1.3 C51控制流順序結構 選擇結構(1) if (條件表達式) 動作 如果條件表達式的值為真(非零數(shù)),則執(zhí)行 內(nèi)的動作,如果條件表達式為假,則略過該動作而繼續(xù)往下執(zhí)行。 選擇結構(1) if (條件表達式)(2) if (條件表達式) 動作1 else 動作2 如果條件表達式為真,則執(zhí)行動作1,略過else的部分,接著往下執(zhí)行,如果條件表達式為假,則略過if的部分而執(zhí)行else的動作2,然后再往下執(zhí)行。 范例 IfDemo2.C (P54)(2) if (
16、條件表達式)(3)if (條件表達式1) if (條件表達式2) if (條件表達式3) 動作A else 動作B else 動作C else 動作D 動作 A:條件表達式1,2,3都成立時才會執(zhí)行。動作 B:條件表達式1,2成立,但條件表達式3不成立時才會執(zhí)行。動作 C:條件表達式1成立,條件表達式2不成立時才會執(zhí)行。動作 D:條件表達式1不成立時才會執(zhí)行。范例 IfDemo3.C(3)if (條件表達式1)(4) switch-case語句 switch (條件表達式) case條件值1: 動作1 break; case條件值2: 動作2 break; case條件值3: 動作3 brea
17、k; default: 動作4break; (4) switch-case語句switch內(nèi)的條件表達式的結果必須為整數(shù)或字符。Switch用條件表達式的值來與各case的條件值對比,如 果與某個條件值相符合,則執(zhí)行該case的動作,之后一定要寫break退出循環(huán)。如果所有的條件值都不符合,則執(zhí)行default的動作,每 一個動作之后一定要寫break,否則會繼續(xù)執(zhí)行。 另外case之后的條件值必須是數(shù)據(jù)常數(shù),不能是變量, 而且不可以重復,即條件值必須各不同,如果有數(shù)種case所做的動作一樣時,也可以寫在一起,即上下并列。 一般當程序必須作多選1時,可以采用switch語句。switch內(nèi)的條
18、件表達式的結果必須為整數(shù)或字符。break:是跳出循環(huán)的命令,任何由switch、for、while、do-while構成的循環(huán),都可以用break來跳出。必須注意的是break一次只能跳出一層循環(huán),通常都和if連用,當某些條件成立后就跳出循環(huán)。 default:當所有case的條件值都不成立時,就執(zhí)行 default所指定的動作,作完后也要使用break指令跳出switch循環(huán)。范例 SwitchDemo.c(P58)break:是跳出循環(huán)的命令,任何由switch、for、w例:x有1-5共5個取值,判斷該值,并將另外一個變量y分別賦值為前5個素數(shù)2,3,5,7,11。switch(x)
19、case 1:y=2; break; case 2:y=3; break; case 3:y=5; break; case 4:y=7; break; default:y=11; break;if(x=1) y=2;else if(x=2) y=3;else if(x=3) y=5;else if(x=4) y=7;else y=11;例:x有1-5共5個取值,判斷該值,并將另外一個變量y分別賦#include #include void Uart_Init();main() int nVar1; Uart_Init(); while(1) printf(“Input a character:
20、n”);nVar1=getchar();printf(“n”);switch(nVar1) case (0): printf(“case 0 switchedn”); break; case (1): printf(“case 1 switchedn”); break; case (2): printf(“case 2 switchedn”); break; default: printf(“default casen”); break; void Uart_Init() SCON=0X52; TMOD=0X20; TCON=0X69; TH1=0Xf3;#include #include 循
21、環(huán)結構(1)while循環(huán)語句while (條件表達式) 動作 先測試條件表達式是否成立,當條件表達式為真時,則執(zhí)行循環(huán)內(nèi)動作,做完后又繼續(xù)跳回條件表達式作測試,如此反復直到條件表達式為假為止,使用時要避免條件永遠為真,造成死循環(huán)。范例 whileDemo.c循環(huán)結構例:求1-100的和,存放到sum中。main() unsigned char counter; int sum; counter=1; sum=0; while(counter=100) sum=sum+counter; counter+; 例:求1-100的和,存放到sum中。(2)do-while 循環(huán)語句 do 動作 wh
22、ile(條件表達式);先執(zhí)行動作后,再測試條件表達式是否成立。當條件表達式為真,則繼續(xù)回到前面動作,如此反復直到條件表達式為假為止,不論條件表達式的結果為何,至少會做一次動作,使用時要避免條件永遠為真,造成死循環(huán)。范例 DowhileDemo.c(2)do-while 循環(huán)語句main() unsigned char counter; int sum; counter=1; sum=0; do sum=sum+counter; counter+; while(counter=100);main() unsigned char cou(3) for循環(huán)語句: 是循環(huán)語句中最靈活和最強大的語句fo
23、r (表達式1;表達式2;表達式3) 動作 表達式1:通常是設定起始值。表達式2:通常是條件判斷式,如果條件為真時,則執(zhí)行動作,否則終止循環(huán)。表達式3:通常是步長表達式,執(zhí)行動作完畢后,必須再回到這里做運算,然后再到表達式2做判斷。break語句:退出循環(huán)體continue語句:退出當前循環(huán)體,從下一輪循環(huán)開始執(zhí)行范例 ForDemo.c(3) for循環(huán)語句: 是循環(huán)語句中最靈活和最強大的語句main( ) unsigned char counter; int sum=0; for(counter=0;counter=100;counter+) sum=sum+counter; 特例:for
24、(counter=0;counter=100;counter+);沒有代碼段,用于一定的時間延時,其延時長度由單片機執(zhí)行每一條指令所需的時間決定。main( ) unsigned char cou 所謂函數(shù),即子程序,也就是“語句的集合”。就是說把經(jīng)常使用的語句群定義為函數(shù),在程序用到時調(diào)用,這樣就可以減少重復編寫程序的麻煩,也可以減少程序的長度。當一個程序太大時,建議將其中的一部分改用函數(shù)的方式比較好,因為大程序過于繁雜容易出錯,而小程序容易調(diào)試,也易于閱讀和修改。1.4 函數(shù)(FUNCTION)1.4 函數(shù)(FUNCTION)C程序由一個個函數(shù)構成,其從一個主函數(shù)開始執(zhí)行,調(diào)用其它函數(shù)后返
25、回主函數(shù),進行相應操作,最后從主函數(shù)中退出整個程序。從結構上分 (1)主函數(shù):可調(diào)用普通函數(shù)(2)普通函數(shù):可調(diào)用其他普通函數(shù),不能調(diào)用主函數(shù)從用戶使用角度分(1)標準庫函數(shù):C51編譯器提供的函數(shù)庫,通過#include對應的頭文件調(diào)用。例:math.h, reg51.h, stdio.h, stdlib.h(2)用戶自定義函數(shù)從定義的形式分:(1)無參數(shù)函數(shù)(2)有參數(shù)函數(shù)C程序由一個個函數(shù)構成,其從一個主函數(shù)開始執(zhí)行,調(diào)用其它函數(shù)(1).函數(shù)的定義數(shù)據(jù)類型 函數(shù)名稱 ( 數(shù)據(jù)類型 參數(shù)1, 數(shù)據(jù)類型 參數(shù)2,.) 聲明語句和代碼塊; /聲明語句是對函數(shù)內(nèi)使用的變量聲明 (2).函數(shù)的調(diào)用
26、 函數(shù)名(參數(shù)列表)(3)函數(shù)的返回值return是用來使函數(shù)立即結束以返回原調(diào)用程序的指令,而且可以把函數(shù)內(nèi)的最后結果數(shù)據(jù)傳回給原調(diào)用程序。返回值的類型和被調(diào)用函數(shù)類型相同。沒有返回值使用void標識符(1).函數(shù)的定義數(shù)據(jù)類型 函數(shù)名稱 ( 數(shù)據(jù)類型 參數(shù)例: int Sum(unsigned char A, unsigned char B) / 函數(shù)定義 int temp; temp=A+B; return temp; /函數(shù)返回 void main() int RealSum; unsigned char X,Y; X=0 x23; Y=0 x65; RealSum=Sum(X,Y);
27、 /函數(shù)調(diào)用例: int Sum(unsigned char A, 使用函數(shù)的注意事項1、函數(shù)定義時要同時聲明其類型;2、調(diào)用函數(shù)前要先聲明該函數(shù);3、傳給函數(shù)的參數(shù)值,其類型要與函數(shù)原定義一致;4、接受函數(shù)返回值的變量,其類型也要與函數(shù)一致。 函數(shù)的定義void functionl(void)此函數(shù)無返回值,也不傳參數(shù)。void function2(unsigned char i , int j)此函數(shù)無返回值,但需要unsign char類型的i參數(shù)和int類型的j參數(shù)。unsigned char function3(unsigned char i)此函數(shù)有unsign char類型的返回
28、值給原調(diào)用程序。使用函數(shù)的注意事項1.5 C51語言對標準C的擴展(1)數(shù)據(jù)類型 C51具有標準C語言的所有標準數(shù)據(jù)類型,除此之外,為了更加有效的利用8051結構,還加入了以下特殊的數(shù)據(jù)類型。sbit 從字節(jié)中聲明的位變量0或1。sfr 特殊功能寄存器,sfr字節(jié)地址為0255sfr16 同sfr ,只是 sfr字地址為065535 bit、sbit、sfrs和sfr16數(shù)據(jù)類型專門用于8051硬件和C51編譯器,并不是標準C語言的一部分,不能通過指針進行訪問。 sbit、sfr和sfr16數(shù)據(jù)類型用于訪問8051的特殊功能寄存器. 例如sfr P0=0 x80,表示聲明變量P0,并為其分配特
29、殊功能寄存器地址0 x80。1.5 C51語言對標準C的擴展(1)數(shù)據(jù)類型 (2)存儲類型及存儲區(qū)C51編譯器支持8051及其擴展系列,并提供對8051所有存儲區(qū)的訪問。 存儲區(qū)可分為片內(nèi)RAM,片外RAM,片內(nèi)ROM,片外ROM。8051最多可有256字節(jié)片內(nèi)RAM,其中低128字節(jié)可直接尋址,高128字節(jié)(從0 x80到0 xFF)為SFR,從20H開始的16字節(jié)可位尋址。(2)存儲類型及存儲區(qū)C51編譯器支持8051及其擴展系列,C51程序設計時,每個變量可以明確地分配到指定的存儲空間。對內(nèi)部存儲器的訪問比對外部存儲器的訪問快許多,因此應當將頻繁使用的變量盡量選擇data,然后選擇ida
30、ta,在內(nèi)部RAM不夠時才使用pdata,最后選xdata。存儲類型的選擇關系到程序的執(zhí)行效率問題。關鍵字 存儲器對應關系data片內(nèi)直接尋址RAM區(qū),低128字節(jié),bdata片內(nèi)位尋址區(qū),可字節(jié)、位混合尋址的16個Byteidata片內(nèi)間接尋址RAM區(qū),可以訪問全部RAM內(nèi)容xdata外部RAM(64K),使用DPTRpdata分頁尋址片外RAM(256字節(jié)),使用指令MOVX Rncode程序存儲區(qū)(64K)C51程序設計時,每個變量可以明確地分配到指定的存儲空間。對1)data區(qū): data指低128字節(jié)的內(nèi)部數(shù)據(jù)區(qū)。data區(qū)可直接尋址,所以對其存取是最快的,應該把經(jīng)常使用的變量放在d
31、ata區(qū);但是data區(qū)的空間是有限的,data區(qū)除了包含程序變量外,還包括了堆棧和存儲器組。舉例:unsigned char data system_status=0;/定義無符號字符型變量system_status,初值為0使其存儲在內(nèi)部低128字節(jié)unsigned int data unit_id2;/定義無符號整型數(shù)組 data unit_id,存儲在內(nèi)部RAMchar data inp_string16;/定義字符型變量 inp_string,使其存儲在內(nèi)部低128字節(jié)1)data區(qū):2)bdata區(qū):指內(nèi)部可位尋址的16字節(jié)存儲區(qū)(20H到2FH)可位尋址變量的數(shù)據(jù)類型。 bdat
32、a區(qū)實際就是data區(qū)中的位尋址區(qū),在這個區(qū)聲明變量就可進行位尋址。位變量聲明對狀態(tài)寄存器來說是十分有用的,因為它可能僅僅需要使用某一位,而不是整字節(jié)。例1:unsigned char bdata status_byte;/定義無符號字符型 變量 status_byte,使其存儲20H到2FH區(qū),可進行位尋址。unsigned int bdata status_word;/ 定義無符號整型變量 status_word,使其存儲20H到2FH區(qū)sbit start_flag=status_byte4;/將status_byte的第4位賦值 給位變量sbit start_flagIf(status
33、_word15) start_flag=0; . 2)bdata區(qū):指內(nèi)部可位尋址的16字節(jié)存儲區(qū)(20H3)idata區(qū): idata區(qū)聲明中的存儲類型標識符為idata,指內(nèi)部的256字節(jié)的存儲區(qū),但是只能間接尋址,速度比直接尋址慢。舉例如下:unsigned char idata system_status=0;unsigned int idata unit_id2;char idata inp_string16;float idata outp_value;3)idata區(qū): idata區(qū)聲明中的存儲類型標識4)pdata和xdata區(qū):pdata和xdata區(qū)屬于外部存儲區(qū)。外部存儲
34、區(qū)是可讀寫的存儲區(qū),最多可有64KB。訪問外部數(shù)據(jù)存儲區(qū)比訪問內(nèi)部數(shù)據(jù)存儲區(qū)慢,因為外部數(shù)據(jù)存儲區(qū)是通過數(shù)據(jù)指針加載地址來間接訪問的。在這兩個區(qū),變量的聲明和在其他區(qū)的語法是一樣的,但pdata區(qū)只有265字節(jié)而xdata區(qū)可達65536字節(jié)。對pdata和xdata的操作是相似的;對pdata區(qū)的尋址比對xdata區(qū)的尋址要快,因為對pdata區(qū)的尋址只需要裝入8位地址,而對xdata區(qū)的尋址需裝入16位地址,所以要盡量把外部數(shù)據(jù)存儲在pdata段中。MOVX A,R0MOVX A,DPTR4)pdata和xdata區(qū):pdata和xdata區(qū)屬于外從反匯編程序看,當一個變量定義在data區(qū)
35、和pdata、xdata區(qū)時,執(zhí)行時間、程序所占內(nèi)存差別很大例二#include#define uchar unsigned charuchar data inp_reg1;uchar data inp_reg2;void main()inp_reg1=P1;inp_reg2=P3;從反匯編程序看,當一個變量定義在data區(qū)和pdata、xd5)程序存儲區(qū)code:程序存儲區(qū)code聲明中的標識符為code,在C51編譯器中可用code存儲區(qū)類型標識符來訪問程序存儲區(qū)。程序存儲區(qū)的數(shù)據(jù)是不可改變的,編譯的時候要對程序存儲區(qū)中的對象進行初始化,否則就會產(chǎn)生錯誤。程序存儲區(qū)聲明的舉例:unsign
36、ed char code a =0 x00,0 x01,0 x02,0 x03,0 x04,0 x05,0 x06,0 x07,0 x08,0 x09,0 x10,0 x11,0 x12,0 x13,0 x14,0 x15;5)程序存儲區(qū)code:程序存儲區(qū)code聲明中的標識符為c 存儲器模式 存儲器模式是函數(shù)自變量、自動變量和沒有明確規(guī)定存儲類型的變量的默認存儲器類型,指定存儲器需要在命令行中使用SMALL,COMPACT和LARGE 3個控制命令中的1個。例如:void fun(void) small ; 存儲器模式 存儲器模式是函數(shù)自變量、自動變SMALL : 相關參數(shù)、堆棧和局部變量
37、都默認地位于51內(nèi)部數(shù)據(jù)存儲器,使用data存儲類型。在此模式下,變量訪問的效率很高,但所有的數(shù)據(jù)對象和堆棧必須適合內(nèi)部RAM。COMPACT:相關參數(shù)和局部變量都被默認為在256Byte的分頁片外數(shù)據(jù)存儲器,使用pdata存儲類型。堆棧在片內(nèi)數(shù)據(jù)存儲器,和SMALL模式相比,該存儲器模型的效率比較低,對變量訪問的速度也慢一些,但比LARGE模式快。LARGE : 所有變量都默認為位于外部存儲器(這和使用xdata指定存儲器類型是一樣的),并使用數(shù)據(jù)指針DPTR進行尋址。通過數(shù)據(jù)指針訪問外部數(shù)據(jù)存儲器的效率較低,特別是當變量為2字節(jié)或更多字節(jié)時,該模式要比SMALL和COMPACT產(chǎn)生更多的代
38、碼。堆棧在片內(nèi)數(shù)據(jù)存儲器。SMALL : 相關參數(shù)、堆棧和局部變量都默認地位于51內(nèi)部 特殊功能寄存器(SFR) 51系列單片機提供128字節(jié)的SFR尋址區(qū),地址為80H-FFH。除了程序計數(shù)器PC和4組通用寄存器之外,其他所有的寄存器均為SFR,并位于片內(nèi)特殊功能寄存器區(qū)。這個區(qū)域部分可位尋址,字節(jié)尋址或字尋址,用以控制定時/計數(shù)器,串口,I/O及其他部件。特殊功能寄存器可由以下幾種關鍵字說明。(1)sfr: 聲明字節(jié)尋址的特殊功能寄存器。例: sfr P0=0 x80; /P0口地址為80H sfr TL0=0 x8A; sfr TH0=0 x8C;注意:“sfr”后面必須跟一個特殊寄存器
39、名;“=”后面的地址必須是常數(shù),不允許帶有運算符的表達式,這個常數(shù)值的范圍必須在特殊功能寄存器地址范圍內(nèi),位于80H到FFH之間。 特殊功能寄存器(SFR) 51系列單片機提供1(2)sfr16:許多新的8051派生系列單片機用兩個連續(xù)地址的SFR來指定16位值,例如8052用地址0 xCC和0 xCD表示定時器/計數(shù)器2的低和高字節(jié)。例: sfr16 T2=0 xCC;/定義T2口地址的低字節(jié)地址 T2L=0 xCC,高地址T2H=0 xCD。注意: sfr16聲明和sfr聲明遵循相同的原則。聲明中名字后面不是賦值語句,而是一個sfr地址,其高字節(jié)必須位于低字節(jié)之后,這種聲明適用于所有新的S
40、FR,但不能用于定時/計數(shù)器0和1。 (2)sfr16:許多新的8051派生系列單片機用兩個連sbit:聲明可位尋址的特殊功能寄存器和別的可位尋址的目標(20H-2FH)。 “=”號后將絕對地址賦給變量名。sbit聲明變量位尋址的聲明形式如下: sbit 變量名=SFR名稱序號例:使用sbit定義位變量sfr PSW=0 xD0;sbit OV=PSW2; /聲明溢出位變量OV,是PSW的第2位sbit P10=P10; /聲明位變量P10,是P1口的第0位該變量用一個已聲明的sfr_name作為sbit基地址,“”后面的表達式指定了位的位置,必須是07之間的一個數(shù)字。 sbit:聲明可位尋址
41、的特殊功能寄存器和別的可位尋址的目標(sbit 變量名=字節(jié)地址序號 例如:sbit CY=0 xD07;sbit OV=0 xD02;sbit P10=0 x900; sbit 變量名=位地址 例如: sbit OV=0 xD2; sbit P10=0 x90;sbit 變量名=字節(jié)地址序號 例如:sbit sbit也可對其他的變量定義,但變量必須存放在位尋址內(nèi)存空間,絕對地址必須是位地址空間.例:使用sbit定義變量空間 bdata unsigned char uc_Byte; sbit b_x_Flg= uc_Byte1; sbit也可對其他的變量定義,但變量必須存放在位尋址內(nèi)存空間若編
42、程時已將8051微處理器頭文件包含#include則sfr PSW=0 xD0; sfr IE=0 xA8; sbit OV=PSW2; 可以不用聲明PSW為特殊功能寄存器,因頭文件中已定義??芍苯釉诔绦蛑惺褂肞SW、IE、OV等。但P1_0、P1_1是頭文件中沒有的變量,要求它指向P1的第0位、第1位。所以使用時應定義sbit P1_0=P10;sbit P1_1=P11;注意:文件中的寄存器、特殊功能寄存器均是大寫。所以P10、P11中的P1一定要大寫。但P1_0 、P1_1由于是用戶自定義變量,所以大小寫隨意,也可是其它標識符。若編程時已將8051微處理器頭文件包含#includere(
43、3)函數(shù)的使用 函數(shù)聲明keil C51編譯器擴展了標準C函數(shù)聲明,這些擴展有:1)指定一個函數(shù)作為一個中斷函數(shù);2)選擇所用的寄存器組;3)選擇存儲模式;4)指定重入;聲明C51函數(shù)的標準格式如下:返回類型 函數(shù)名(參數(shù)表)存儲模式 reentrantinterrupt nusing nreetrant:表示函數(shù)是遞歸的或可重入的。interrupt:表示是一個中斷函數(shù)。using n:指定函數(shù)所用的寄存器組,n=03(3)函數(shù)的使用 1、中斷函數(shù) 51單片機的中斷系統(tǒng)十分重要,可以用C51語言來聲明中斷和編寫中斷服務程序,當然也可以用匯編語言來寫。中斷過程通過使用interrupt關鍵字和
44、中斷編號04來實現(xiàn)。中斷函數(shù)的完整語法如下:返回值 函數(shù)名(參數(shù)) interrupt n using ninterrupt n 中的n對應中斷源的編號:中斷編號告訴編譯器中斷程序的入口地址,它對應著IE寄存器中的使能位,既IE寄存器中的0位對應著外部中斷0,相應的外部中斷0的編號是0。1、中斷函數(shù)8051單片機的中斷源以及中斷編號.在51系列單片機中,有的單片機多達32個中斷源,所以中斷編號是031。 中斷編號 中斷源 入口地址 0外部中斷0 0003H 1定時器/計數(shù)器0溢出 000BH 2外部中斷 1 0013H 3定時器/計數(shù)器1溢出 001BH 4串行口中斷 0023H8051單片機
45、的中斷源以及中斷編號.在51系列單片機中,有的using n中的n對應四組通用寄存器中的一組。 當正在執(zhí)行一個特定任務時,可能有更緊急的事情需要CPU處理,這就涉及到了中斷優(yōu)先級。 高優(yōu)先級中斷可以中斷正在處理的低優(yōu)先級中斷程序,因而最好給每種優(yōu)先程序分配不同的寄存器組。 在C51中可使用using指定寄存器組,using后的變量為03的常整數(shù),分別表示51單片機內(nèi)的4個寄存器組。using n中的n對應四組通用寄存器中的一組。例:編寫定時器0中斷服務程序unsigned int interruptcnt=0;unsigned char second;void timer( ) interru
46、pt 1 using 2if(+interruptcnt=4000) /*計數(shù)到4000*/second+; /*另一個計數(shù)器*/ interruptcnt=0; /*計數(shù)器清零*/ 例:編寫定時器0中斷服務程序2、重入函數(shù)標準C中調(diào)用函數(shù)時會將函數(shù)的參數(shù)和函數(shù)中使用的局部變量入棧。而C51中采用為每個函數(shù)設定一個空間用于存放局部變量,當函數(shù)遞歸調(diào)用時會導致變量被覆蓋。重入函數(shù):可以在函數(shù)體內(nèi)間接調(diào)用其自身的函數(shù)。每次調(diào)用時的局部變量都會被單獨保存起來,而不會被覆蓋。格式:函數(shù)類型 函數(shù)名(形參表) reentrant2、重入函數(shù)標準C中調(diào)用函數(shù)時會將函數(shù)的參數(shù)和函數(shù)中使用的局(4) 指針指針和指針變量變量的指針:就是變量的地址指向變量的指針變量:存放變量地址的變量,
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 智能交通系統(tǒng)在城市管理中的應用與前景
- 商業(yè)空間裝修協(xié)議書樣本
- 停車場智能管理公司
- 現(xiàn)代農(nóng)業(yè)金融創(chuàng)新方案
- 新型智能穿戴產(chǎn)品設計手冊
- 電信行業(yè)智能化通信網(wǎng)絡智能化管理與維護方案
- 豆制品加工項目可行性報告
- 長興垃圾焚燒發(fā)電項目
- 商貿(mào)城項目可行性研究報告
- 關于提升員工職業(yè)技能的培訓教程與計劃安排
- 初中英語語法大全知識點總結可打印
- 醫(yī)患溝通技巧培訓試題及答案
- FANUCROBOSHOTSi注塑機操作說明書學習課件
- 2023遼寧醫(yī)藥職業(yè)學院單招數(shù)學模擬試題(附答案解析)
- 變更風險識別、評估記錄表參考模板范本
- 南京長安汽車有限公司環(huán)保搬遷(置換升級)項目環(huán)境影響報告表
- 人工挖孔樁施工危險源辨識與評價及應對措施
- 品管圈成果匯報——提高導管固定正確率PPT課件
- 2018年真分數(shù)假分數(shù)PPT課件
- 及成品SN編碼規(guī)則
- 機械畢業(yè)實習報告
評論
0/150
提交評論