C語言程序設計及仿真調試_第1頁
C語言程序設計及仿真調試_第2頁
C語言程序設計及仿真調試_第3頁
C語言程序設計及仿真調試_第4頁
C語言程序設計及仿真調試_第5頁
已閱讀5頁,還剩77頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

任課教師:劉忠國山東大學課程中心網站:

/G2S/stcmcu.cc宏晶官方網站:STC單片機編譯(匯編)/編程(燒錄)/仿真工具說明書;stc15系列單片機器件手冊等keilμvision軟件下載及指導手冊(Help→μvisionHelp)/KeilSoftware–Cx51編譯器用戶手冊:Cx51編譯器--對傳統(tǒng)和擴展的8051微處理器的優(yōu)化的C編譯器和庫參考1第五章單片機的C語言程序設計及仿真調試本章學習目標掌握單片機C語言程序中的常用功能掌握KeilC的程序設計掌握STC15F2K60S2單片機C語言程序調試過程2第五章單片機的C語言程序設計及仿真調試目錄§5.1單片機C語言程序中的常用功能5.1.1邏輯運算和位運算5.1.2

預處理§5.2KeilC和ANSIC5.2.1KeilC51擴展關鍵字5.2.2擴展I/O口的使用5.2.3KeilC51函數5.2.4

STC15F2K60S2單片機C51程序框架§5.3單片機C語言程序調試3匯編語言和C語言的選擇問題設計規(guī)模較小的嵌入式應用系統(tǒng)時,可以使用匯編語言。因為代碼一般不長,且較簡單。當程序比較復雜,且沒有很好的注釋時,使用匯編語言編寫的程序,可讀性和可維護性會很差,代碼的可重用性也比較低。使用C語言編程,編寫簡單、直觀易讀、便于維護、通用性好。在控制任務比較復雜或者具有大量運算的系統(tǒng)中,C語言優(yōu)勢明顯。由于模塊化,用C語言編寫的程序具有很好的可移植性。4§5.1單片機C語言程序中的常用功能5.1.1邏輯運算和位運算1、邏輯運算符邏輯運算符包括與(&&),或(||),非(!)3種,用于邏輯運算。邏輯運算符的表達式,返回0表示“假”,

返回1表示“真”。5與運算符(&&)功能:兩個條件同時滿足時(即兩個條件都為真時),結果才為真。如一個程序在同時滿足條件a<10和b==7時,則執(zhí)行某些操作,應使用關系運算符和邏輯與運算符(&&)來寫這個條件的代碼:(a<10)&&(b==7)。按布爾邏輯值(真假)運算1、邏輯運算符或運算符(||)功能:檢查兩個條件中是否有一個為真,只要有一個條件為真,運算結果就為真。對條件a<10和b==7,若任一條件為真,程序執(zhí)行某操作,則條件代碼為:

(a<10)||(b==7);6邏輯非運算符(!)功能:表示對表達式的真值取反。例如,如果變量s小于10,程序需執(zhí)行某些操作,則條件代碼如下:(s<10)

也可以寫成:(!(s>=10))//s不大于等于102、位運算符很多系統(tǒng)程序常要求進行位(bit)運算或處理。C語言提供了六種位運算符:按位與(&)、按位或(|)、按位異或(^)、取反(~)、左移(<<)和右移(>>)

。7(1)按位“與”運算:

按位與運算符“&”是雙目運算符。功能:參與運算的兩數各對應二進制位相與。只有對應的兩位均為1時,結果位才為1,否則為0。例如,9&5的算式:00001001&00000101=00000001按位與運算通常用來對某些位清0或保留某些位。例把16位數a的高8位清0,保留低8位,可作運算:a&255(255的二進制數為0000000011111111)。(2)按位“或”運算按位或運算符“|”是雙目運算符。功能是參與運算的兩數各對應的二進制位相或。只要對應的兩個位有一個為1時,結果位就為1。例如,9|5的算式:00001001(十進制為9)

|00000101(十進制為5)00001101(十進制13)或運算通常用來對某些位置1。8(3)按位“異或”運算按位異或運算符“^”是雙目運算符。功能是參與運算的兩數各對應的二進制位相異或。當兩個對應的位相異時,結果為1。例如,9^5的算式:00001001(十進制為9)

^00000101(十進制為5)00001100(十進制12)異或運算通常用來對某些位取反。9(4)求反運算求反運算符“~”為單目運算符,具有右結合性。功能是對參與運算的數的各二進制位按位求反。例如,~9的運算為:~(0000000000001001)結果為:111111111111011010(5)左移運算左移運算符“<<”是雙目運算符。功能:把“<<”符左邊運算數的各二進制位都左移若干位,

“<<”符右邊的數指定移動位數,高位丟棄,低位補0。例如:a<<4

指把a的各二進位向左移動4位。如a=00000011(十進制3),

左移4位后為00110000(十進制48)。(6)右移運算右移運算符“>>”是雙目運算符。功能是把“>>”左邊的運算數的各二進制位全部右移若干位,“>>”右邊的數指定移動的位數。例如,設a=15,a>>2000001111右移2位為00000011(十進制3)。對于有符號數,在右移時,符號位將隨同移動。當為正數時,最高位補0,而為負數時,符號位為1,最高位是補0或是補1取決于編譯系統(tǒng)的規(guī)定。115.1.2預處理以“#”號開頭的命令是預處理命令。C語言的預處理功能包括宏定義#define,文件包含#include,條件編譯等。合理地使用預處理功能,可以使得編寫的程序便于閱讀、修改、移植和調試,也利于模塊化程序設計。121、宏定義(#define)在C語言源程序中允許用一個標識符來表示一個字符串,稱為宏。被定義為宏的標識符稱為宏名。在編譯預處理時,對程序中所有出現的宏名,都用宏定義中的字符串去代換,這稱為宏代換或宏展開。宏代換是由預處理程序自動完成的。在C語言中,宏分為有參數和無參數兩種。(1)無參宏定義無參宏的宏名后不帶參數。其定義的一般形式為:#define標識符字符串其中,標識符為所定義的宏名。字符串可以是常數,表達式,格式串等。若要終止宏定義,可用#undef命令:#undef標識符符號常量的定義就是一種無參宏定義。此外,常對程序中反復使用的表達式進行宏定義。13例如:#definePI3.14159#define

M(y*y+3*y)程序中的語句:L=2*PI;s=3*M+M/2;經宏代換后為:L=2*3.14159;s=3*(y*y+3*y)+(y*y+3*y)/2(2)帶參宏定義在宏定義中的參數稱為形式參數,在宏調用中的參數稱為實際參數。對帶參數的宏,在調用中,不僅要宏展開,而且要用實參去代換形參。帶參宏定義的一般形式為:#define

宏名(形參表)

字符串14在字符串中含有各個形參。例如:#defineMAX(a,b)(a>b)?a:b

//取a和b的最大數例如,程序中的語句:max=MAX(x,y);

經宏代換后為:max=(x>y)?x:y;帶參宏調用的一般形式為:宏名(實參表);2、文件包含(#include)文件包含的一般形式為:

#include"文件名"功能是把指定文件插入該命令行位置取代該命令行,從而把指定的文件和當前的源程序文件連成一個源文件。15說明:(頭)文件名可用雙引號括起來(用戶頭文件),也可用尖括號括起來(系統(tǒng)頭文件)。如:#include“stdio.h”,#include<math.h>。二者區(qū)別:用尖括號表示在包含文件目錄中去查找(包含目錄可由用戶在開發(fā)環(huán)境中設置,一般在\INC\),而不在源文件目錄去查找;用雙引號則表示首先在當前源文件目錄中查找,若未找到才到包含目錄中去查找。3、條件編譯條件編譯就是按不同的條件去編譯不同的程序部分,從而產生不同的目標代碼文件。條件編譯對于程序的移植和調試(可以分段調試)非常有用。特別在操作系統(tǒng)的裁減中,經常使用條件編譯。16(1)第一種形式:#ifdef標識符程序段1#else

程序段2#endif功能是:如果標識符已被#define命令定義過,則對程序段1進行編譯;否則對程序段2進行編譯。如果沒有程序段2(它為空),本格式中的#else可以沒有。3、條件編譯(2)第二種形式:

#ifndef標識符程序段1#else

程序段2#endif功能是:如果標識符未被#define命令定義過則對程序段1進行編譯,否則對程序段2進行編譯。這與第一種形式的功能正相反。173、條件編譯(3)第三種形式:

#if常量表達式程序段1#else

程序段2#endif功能是,如果常量表達式的值為真(非0),則對程序段1進行編譯,否則對程序段2進行編譯。因此可以使程序在不同條件下,完成不同的功能。18§5.2KeilC和ANSICKeilC51基本語法與ANSIC相同,針對8051內核單片機硬件等進行了擴展。5.2.1KeilC51擴展關鍵字(共19個)

_at_,sbit,sfr,bit,sfr16,code,idata,bdata,data,

xdata,pdata,small,compact,large,using,reentrant,interrupt,alien,_task_,

19(或參考keil官網/support/man/docs/c51/)(參考keil軟件幫助文件bookswindow→Cx51CompilerUser'sGuide)(或參考“keilsoftwareCx51編譯器用戶手冊09.2001-對傳統(tǒng)和擴展的8051微處理器的優(yōu)化的C編譯器和庫參考”)(keil幫助文件介紹21個)_priority_,far下面分類介紹常用關鍵字:alien(聲明與Intel編譯器PL/M51兼容的函數)。far聲明3字節(jié)擴展地址。_task_,_priority_分別定義實時多任務操作系統(tǒng)的實時任務及其優(yōu)先級。1、存儲區(qū)域(MemoryAreas)

(1)程序存儲器8051結構支持幾個物理分開的程序和數據存儲空間,這些存儲空間可能:可讀不可寫;可讀寫;讀寫比別的存儲空間快。(1)程序存儲器:程序(CODE)存儲區(qū)只讀不能寫,可在8051CPU片內或片外或都有,根據8051派生硬件決定,STC15F2K60S只在片內。最多可有64K字節(jié)的程序存儲區(qū)。存儲程序代碼,包括所有函數和庫,常數變量。8051可執(zhí)行程序只保存在程序存儲區(qū)。C51編譯器中,通過存儲類型標識符code可訪問程序存儲器。20關鍵字1、存儲區(qū)域(MemoryAreas)(1)程序存儲器(1)程序存儲器:通過存儲類型標識符code可訪問程序存儲器。code用來限定常量或函數的存儲類型,而程序的函數默認為code存儲類型,并不需code限定符(也可寫上)。code一般只用來定義常量,例:staticcodeunsignedcharDPY_TAB[16]={0X3f,0X06,0X5b,0X4f,0X66,0X6d,0X7d,0X07,0X7f,0X6f,0X77,0X7c,0X39,0X5e,0X79,0X71};

//

用code定義共陰極數碼管顯示0~9,A~F時對應的字模21關鍵字1、存儲區(qū)域(MemoryAreas)

(2)內部RAMdata:直接尋址區(qū),內部RAM的低128字節(jié),地址范圍是:00H~7FH。idata:間接尋址區(qū),包括整個內部RAM區(qū),256字節(jié),地址范圍為00H~0FFH。bdata:可位尋址區(qū),地址范圍為20H~2FH。22(2)內部RAM數據存儲器。位于51片內,可讀寫。根據51種類不同,最多256字節(jié)。低128字節(jié)可直接尋址,而高128字節(jié)只能間接尋址??捎靡韵玛P鍵字分為3種存儲類型:特殊功能寄存器(0x80~0xFF)單獨一類,見后。1、存儲區(qū)域(MemoryAreas)(3)外部數據存儲器(3)外部數據存儲器:可讀寫。采用數據指針訪問,比訪問內部數存要慢,最多可達64K字節(jié)。外部RAM可由以下關鍵字標識分為2種存儲類型::xdata:可指定多達64KB的外部直間接尋址區(qū),地址范圍0000H~0FFFFH。23xdata可訪問外部數存64K字節(jié)的任意位置,只能通過數據指針(MOVX@DPTR)來訪問。pdata:可訪問外部數存的一頁即256字節(jié),通過R0和R1(MOVX@Ri)來訪問(有時可能需P2指出高8位地址)。51對外設采取統(tǒng)一編址,外設也占用此空間,可通過訪問外部數存來控制外設----存儲器映射I/O,所以可用空間可能不足64K字節(jié)。(對物理上(且邏輯上)在外部的數存)。(片內XRAM只能訪問00-0FFh)。在Xtal(MHz)右側框輸入6,其余按默認設置。4-10-2KeilμVision集成開發(fā)環(huán)境調試匯編語言程序方法Project窗口,選中Target1,并單擊右鍵,出現浮動菜單。浮動菜單中選中OptionsforTarget‘Target1’...選項。24*出現OptionsforTarget‘Target1’對話框界面。在該界面中,點擊Target標簽。在該標簽界面中,按下面設置參數:在此設置使用晶振的頻率3.針對目標硬件設置工具選項MemoryModel右側下拉選擇:Small,Compact,large。1、存儲區(qū)域(MemoryAreas)

存儲模式(Small,large,Compact)數據存儲類型的指定:變量或函數參數存儲類型可由存儲模式

(Small,large,Compact)(OptionsforTarget‘Target1’...選項)指定缺省存儲類型;在small模式下,函數參數和局部變量位于由data定義的單片機片內數據RAM(00~7FH)中;在compact模式下,函數參數和局部變量位于pdata定義的擴展數據RAM中(訪問用MOVX@Ri)。在large模式下,函數參數和局部變量位于xdata定義的擴展數據RAM中(訪問用MOVX@DPTR)25數據1、存儲區(qū)域(MemoryAreas)

存儲模式(Small,large,Compact)數據存儲類型的指定:變量或函數參數存儲類型可由存儲模式(Small,large,Compact)(OptionsforTarget‘Target1’...選項)指定缺省存儲類型;也可由關鍵字code、data、idata、bdata、xdata、pdata直接聲明指定。例如:unsignedchardatabuffer;

charcodearray[]=“hello!”;

unsignedcharxdataarr[10][4][4];26數據1、存儲區(qū)域(MemoryAreas)

(4)特殊功能寄存器(4)特殊功能寄存器(SFR)(128字節(jié):0x80~0xFF)單片機特殊功能寄存器(SFR)可位尋址,字節(jié)尋址或字尋址,用來控制定時器,計數器,串口,I/O及其他部件。通過關鍵字sfr,sfr16和sbit聲明數據類型,訪問SFR。27sfr:字節(jié)尋址。語法如下:

sfr

sfr_name=int_constant;如sfr

P0=0x80;

0x80為P0口寄存器的地址,

“=”

后為常數用來指定地址,且其范圍必須位于80H到~FFH。sfr16:字尋址。

如sfr16DPTR=0x82;指定DPTR地址DPL=0x82,DPH=0x83。(4)特殊功能寄存器(SFR)(128字節(jié):0x80~0xFF)sbit:位尋址用于聲明可位尋址的特殊功能寄存器位變量,三種方法:28方法1:sbitbitname=sfr_name^bit_number;

sfr_name必須是已定義SFR的名字,bit_number是位號(0~7)。如:sbitCY=PSW^7;//定義CY為PSW的第7位。方法2:sbitbitname=sfr_address^bit_number;

sfr_address是SFR所在地址(0x80~0xff),bit_number是位號(0~7)。如:sbitOV=0xD0^2;//定義PSW中的OV位方法3:sbitbitname=bit_address;其中,bit_address是位地址。如:sbitEA=0xAF;//第0xAF位為IE寄存器的EA位

(見46頁特殊功能寄存器SFR中位地址)IE位地址AFHAEHADHACHABHAAHA9HA8H寄存器IE位名稱EAELVDEADCESET1EX1ET0EX0IE字節(jié)地址A8H*位尋址區(qū)--圖3-11特殊功能寄存器SFR中位地址特殊功能寄存器中位地址范圍:80H~0FFH。圖3-11特殊功能寄存器中的位地址291、存儲區(qū)域(MemoryAreas)(4)特殊功能寄存器KeilCx51沒有預先定義SFR的名字,而是提供了一個包含所有特殊功能寄存器和它們的位定義的頭文件reg51.h(在安裝文件夾...\Keil\C51\INC)。通過包含頭文件可很容易的進行新的擴展。附錄C提供了STC15F2K60S2單片機的頭文件stc15.h的內容,其中包含了標準8051單片機寄存器的定義,編程時只需包含這一個文件即可。該文件可從www.mcu001stcmcu.com中下載。在STC新ISP軟件V6.85I中選擇菜單選項“頭文件”即可找到STC各系列的頭文件(包括stc15.h)。301、存儲區(qū)域(MemoryAreas)(4)特殊功能寄存器STC15F2K60S2單片機的頭文件stc15.h的內容,31/*---------8051內核特殊功能寄存器-------------*/sfr

ACC=0xE0;//累加器sfr

B=0xF0; //B寄存器sfr

PSW=0xD0;//程序狀態(tài)字寄存器sbit

CY=PSW^7; //進位標志位sbit

AC=PSW^6;//輔助進位標志位sbit

F0=PSW^5; //用戶標志位0sbit

RS1=PSW^4;//工作寄存器組選擇控制位sbit

RS0=PSW^3;//工作寄存器組選擇控制位sbit

OV=PSW^2;//溢出標志位sbitF1=PSW^1; //用戶標志位1sbit

P=PSW^0; //奇偶標志位sfr

SP=0x81; //堆棧指針寄存器sfr

DPL=0x82; //數據指針0低字節(jié)sfr

DPH=0x83; //數據指針0高字節(jié)/*------------系統(tǒng)管理特殊功能寄存器-------------*/sfrPCON=0x87; //電源控制寄存器sfrAUXR=0x8E;//輔助寄存器sfrINT_CLKO=0x8F;//外部中斷和時鐘輸出控制寄存器sfrAUXR1=0xA2;//輔助寄存器1sfrCLK_DIV=0x97;//時鐘分頻控制寄存器sfrBUS_SPEED=0xA1;//總線速度控制寄存器sfrWKTCL=0xAA;//掉電喚醒專用定時器低字節(jié)sfrWKTCH=0xAB;//掉電喚醒專用定時器高字節(jié)/*-----------中斷控制特殊功能寄存器--------------*/sfrIE=0xA8; //中斷允許寄存器sbitEA=IE^7; //總中斷允許位sbitELVD=IE^6; //低電壓檢測中斷控制位sbitEADC=IE^5; //ADC中斷允許控制位sbitES=IE^4; //串口1中斷允許位sbitET1=IE^3; //定時器1溢出中斷允許位sbitEX1=IE^2; //外部中斷1允許位sbitET0=IE^1; //定時器0溢出中斷允許位sbitEX0=IE^0; //外部中斷0允許位sfrIE2=0xAF;//中斷允許寄存器2sfrIP=0xB8; //中斷優(yōu)先級寄存器sbitPPCA=IP^7; //PCA中斷優(yōu)先級控制位sbitPLVD=IP^6;//低電壓檢測中斷優(yōu)先級控制位sbitPADC=IP^5;//ADC中斷優(yōu)先級控制位sbitPS=IP^4;//串口1中斷優(yōu)先級控制位sbitPT1=IP^3;//定時器1中斷優(yōu)先級控制位sbitPX1=IP^2;//外部中斷1優(yōu)先級控制位sbitPT0=IP^1;//定時器0中斷優(yōu)先級控制位sbitPX0=IP^0;//外部中斷0優(yōu)先級控制位sfrIP2=0xB5;//第二中斷優(yōu)先級寄存器低字節(jié)/*---------------I/O口特殊功能寄存器-------------------*/sfrP0=0x80; //P0口寄存器sfrP0M1=0x93;//P0口工作模式寄存器1sfrP0M0=0x94;//P0口工作模式寄存器0sfrP1=0x90;//P1口寄存器sfrP1M1=0x91;//P1口工作模式寄存器1sfrP1M0=0x92;//P1口工作模式寄存器0sfrP1ASF=0x9D;//P1口模擬量功能設置寄存器sfrP2=0xA0;//P2口寄存器sfrP2M1=0x95;//P2口工作模式寄存器1sfrP2M0=0x96;//P2口工作模式寄存器0sfrP3=0xB0; //P3口寄存器sbitT1=P3^5;//定時器1外部輸入sbitT0=P3^4;//定時器0外部輸入sbitINT1=P3^3;//外部中斷1sbitINT0=P3^2;//外部中斷0sbitTXD=P3^1; //串行輸入通道sbitRXD=P3^0; //串行輸出通道sfrP3M1=0xB1;//P3口工作模式寄存器1sfrP3M0=0xB2;//P3口工作模式寄存器0sfrP4=0xC0;//P4口寄存器sfrP4M1=0xB3;//P4口工作模式寄存器1sfrP4M0=0xB4;//P4口工作模式寄存器0sfrP5=0xC8;//P5口(只有P5.3P5.2P5.1P5.0)sfrP5M1=0xC9;//P5口工作模式寄存器1sfrP5M0=0xCA;//P5口工作模式寄存器0sfrP_SW2=0xBA; //外設功能切換控制寄存器/*-----------------定時器特殊功能寄存器-----------------*/sfrTCON=0x88; //定時/計數控制寄存器sbitTF1=TCON^7; //定時器1溢出中斷標志sbitTR1=TCON^6; //定時器1運行控制位sbitTF0=TCON^5; //定時器0溢出中斷標志sbitTR0=TCON^4; //定時器0運行控制位sbitIE1=TCON^3; //外部中斷1請求標志sbitIT1=TCON^2;//選擇外部中斷請求1為邊沿觸發(fā)方式的控制位sbitIE0=TCON^1; //外部中斷0請求標志sbitIT0=TCON^0;

//選擇外部中斷請求0為邊沿觸發(fā)方式的控制位sfrTMOD=0x89;//定時/計數模式控制寄存器sfrTL0=0x8A; //定時/計數器0低字節(jié)sfrTH0=0x8C; //定時/計數器0高字節(jié)sfrTL1=0x8B; //定時/計數器1低字節(jié)sfrTH1=0x8D; //定時/計數器1高字節(jié)sfrT2H=0xD6;//定時器2重新裝載時間常數高字節(jié)sfrT2L=0xD7;//定時器2重新裝載時間常數低字節(jié)/*--------------串行口特殊功能寄存器------------------*/sfrSCON=0x98; //串行口控制寄存器sbitSM0=SCON^7;

//串行口工作方式設定控制位0(與FE功能復用)sbitFE=SCON^7;sbitSM1=SCON^6; //串行口工作方式設定控制位1sbitSM2=SCON^5; //UART的SM2設定sbitREN=SCON^4; //接收允許位sbitTB8=SCON^3; //發(fā)送數據的第九位sbitRB8=SCON^2; //接收數據的第九位sbitTI=SCON^1; //發(fā)送中斷標志sbitRI=SCON^0; //接收中斷標志sfrSBUF=0x99; //串口數據緩沖器sfrSADEN=0xB9;//從機地址掩碼寄存器sfrSADDR=0xA9;//從機地址寄存器sfrS2CON=0x9A;//串行口2控制寄存器sfrS2BUF=0x9B;//串行口2數據緩沖器/*----------------看門狗定時器寄存器------------------*/sfrWDT_CONTR=0xC1;//看門狗定時器控制寄存器/*----------------PCA寄存器-----------------*/sfrCCON=0xD8;//PCA控制寄存器sbitCF=CCON^7;

//PCA計數器溢出(CH,CL由FFFFH變?yōu)?000H)標志sbitCR=CCON^6;//PCA計數器計數允許控制位sbitCCF2=CCON^2;//PCA模塊2中斷標志sbitCCF1=CCON^1;//PCA模塊1中斷標志sbitCCF0=CCON^0;//PCA模塊0中斷標志sfrCMOD=0xD9;//PCA工作模式寄存器sfrCL=0xE9;//PCA計數器低8位sfrCH=0xF9;//PCA計數器高8位sfrCCAPM0=0xDA;//PAC模塊0的工作模式寄存器sfrCCAPM1=0xDB;//PAC模塊1的工作模式寄存器sfrCCAPM2=0xDC;//PAC模塊2的工作模式寄存器sfrCCAP0L=0xEA;//PAC模塊0捕捉/比較寄存器低8位sfrCCAP0H=0xFA;//PAC模塊0捕捉/比較寄存器高8位sfrCCAP1L=0xEB;//PAC模塊1捕捉/比較寄存器低8位sfrCCAP1H=0xFB;//PAC模塊1捕捉/比較寄存器高8位sfrCCAP2L=0xEC;//PAC模塊2捕捉/比較寄存器低8位sfrCCAP2H=0xFC;//PAC模塊2捕捉/比較寄存器高8位sfrPCA_PWM0=0xF2;//PCA模塊0PWM寄存器sfrPCA_PWM1=0xF3;//PCA模塊1PWM寄存器sfrPCA_PWM2=0xF4;//PCA模塊2PWM寄存器/*-----------------ADC寄存器-----------------*/sfrADC_CONTR=0xBC;//ADC控制寄存器,本寄存器不支持位操作sfrADC_RES=0xBD;//ADC轉換結果高8位寄存器sfrADC_RESL=0xBE;//ADC轉換結果低2位寄存器/*----------------SPI寄存器--------------------*/sfrSPSTAT=0xCD;

//SPI狀態(tài)寄存器,本寄存器不支持位操作sfrSPCTL=0xCE;//SPI控制寄存器sfrSPDAT=0xCF;//SPI數據寄存器/*-----------------ISP_IAP_EEPROM寄存器------------------*/sfrIAP_DATA=0xC2;//ISP/IAPFlash數據寄存器sfrIAP_ADDRH=0xC3;//ISP/IAPFlash地址高字節(jié)sfrIAP_ADDRL=0xC4;//ISP/IAPFlash地址低字節(jié)sfrIAP_CMD=0xC5;//ISP/IAPFlash命令寄存器sfrIAP_TRIG=0xC6;//ISP/IAPFlash命令觸發(fā)器sfrIAP_CONTR=0xC7;//ISP/IAP控制寄存器1、存儲區(qū)域(MemoryAreas)(4)特殊功能寄存器STC15F2K60S2單片機的頭文件stc15.h的內容,32/*---------8051內核特殊功能寄存器-------------*/sfr

ACC=0xE0;//累加器sfr

B=0xF0; //B寄存器sfr

PSW=0xD0;//程序狀態(tài)字寄存器sbit

CY=PSW^7; //進位標志位sbit

AC=PSW^6;//輔助進位標志位sbit

F0=PSW^5; //用戶標志位0sbit

RS1=PSW^4;//工作寄存器組選擇控制位sbit

RS0=PSW^3;//工作寄存器組選擇控制位sbit

OV=PSW^2;//溢出標志位sbitF1=PSW^1; //用戶標志位1sbit

P=PSW^0; //奇偶標志位sfr

SP=0x81; //堆棧指針寄存器sfr

DPL=0x82; //數據指針0低字節(jié)sfr

DPH=0x83; //數據指針0高字節(jié)/*------------系統(tǒng)管理特殊功能寄存器-------------*/sfrPCON=0x87; //電源控制寄存器sfrAUXR=0x8E;//輔助寄存器sfrINT_CLKO=0x8F;//外部中斷和時鐘輸出控制寄存器sfrAUXR1=0xA2;//輔助寄存器1sfrCLK_DIV=0x97;//時鐘分頻控制寄存器sfrBUS_SPEED=0xA1;//總線速度控制寄存器sfrWKTCL=0xAA;//掉電喚醒專用定時器低字節(jié)sfrWKTCH=0xAB;//掉電喚醒專用定時器高字節(jié)/*-----------中斷控制特殊功能寄存器--------------*/sfrIE=0xA8; //中斷允許寄存器sbitEA=IE^7; //總中斷允許位sbitELVD=IE^6; //低電壓檢測中斷控制位sbitEADC=IE^5; //ADC中斷允許控制位sbitES=IE^4; //串口1中斷允許位sbitET1=IE^3; //定時器1溢出中斷允許位sbitEX1=IE^2; //外部中斷1允許位sbitET0=IE^1; //定時器0溢出中斷允許位sbitEX0=IE^0; //外部中斷0允許位sfrIE2=0xAF;//中斷允許寄存器2sfrIP=0xB8; //中斷優(yōu)先級寄存器sbitPPCA=IP^7; //PCA中斷優(yōu)先級控制位sbitPLVD=IP^6;//低電壓檢測中斷優(yōu)先級控制位sbitPADC=IP^5;//ADC中斷優(yōu)先級控制位sbitPS=IP^4;//串口1中斷優(yōu)先級控制位sbitPT1=IP^3;//定時器1中斷優(yōu)先級控制位sbitPX1=IP^2;//外部中斷1優(yōu)先級控制位sbitPT0=IP^1;//定時器0中斷優(yōu)先級控制位sbitPX0=IP^0;//外部中斷0優(yōu)先級控制位sfrIP2=0xB5;//第二中斷優(yōu)先級寄存器低字節(jié)/*---------------I/O口特殊功能寄存器-------------------*/sfrP0=0x80; //P0口寄存器sfrP0M1=0x93;//P0口工作模式寄存器1sfrP0M0=0x94;//P0口工作模式寄存器0sfrP1=0x90;//P1口寄存器sfrP1M1=0x91;//P1口工作模式寄存器1sfrP1M0=0x92;//P1口工作模式寄存器0sfrP1ASF=0x9D;//P1口模擬量功能設置寄存器sfrP2=0xA0;//P2口寄存器sfrP2M1=0x95;//P2口工作模式寄存器1sfrP2M0=0x96;//P2口工作模式寄存器0sfrP3=0xB0; //P3口寄存器sbitT1=P3^5;//定時器1外部輸入sbitT0=P3^4;//定時器0外部輸入sbitINT1=P3^3;//外部中斷1sbitINT0=P3^2;//外部中斷0sbitTXD=P3^1; //串行輸入通道sbitRXD=P3^0; //串行輸出通道sfrP3M1=0xB1;//P3口工作模式寄存器1sfrP3M0=0xB2;//P3口工作模式寄存器0sfrP4=0xC0;//P4口寄存器sfrP4M1=0xB3;//P4口工作模式寄存器1sfrP4M0=0xB4;//P4口工作模式寄存器0sfrP5=0xC8;//P5口(只有P5.3P5.2P5.1P5.0)sfrP5M1=0xC9;//P5口工作模式寄存器1sfrP5M0=0xCA;//P5口工作模式寄存器0sfrP_SW2=0xBA; //外設功能切換控制寄存器/*-----------------定時器特殊功能寄存器-----------------*/sfrTCON=0x88; //定時/計數控制寄存器sbitTF1=TCON^7; //定時器1溢出中斷標志sbitTR1=TCON^6; //定時器1運行控制位sbitTF0=TCON^5; //定時器0溢出中斷標志sbitTR0=TCON^4; //定時器0運行控制位sbitIE1=TCON^3; //外部中斷1請求標志sbitIT1=TCON^2;//選擇外部中斷請求1為邊沿觸發(fā)方式的控制位sbitIE0=TCON^1; //外部中斷0請求標志sbitIT0=TCON^0;

//選擇外部中斷請求0為邊沿觸發(fā)方式的控制位sfrTMOD=0x89;//定時/計數模式控制寄存器sfrTL0=0x8A; //定時/計數器0低字節(jié)sfrTH0=0x8C; //定時/計數器0高字節(jié)sfrTL1=0x8B; //定時/計數器1低字節(jié)sfrTH1=0x8D; //定時/計數器1高字節(jié)sfrT2H=0xD6;//定時器2重新裝載時間常數高字節(jié)sfrT2L=0xD7;//定時器2重新裝載時間常數低字節(jié)/*--------------串行口特殊功能寄存器------------------*/sfrSCON=0x98; //串行口控制寄存器sbitSM0=SCON^7;

//串行口工作方式設定控制位0(與FE功能復用)sbitFE=SCON^7;sbitSM1=SCON^6; //串行口工作方式設定控制位1sbitSM2=SCON^5; //UART的SM2設定sbitREN=SCON^4; //接收允許位sbitTB8=SCON^3; //發(fā)送數據的第九位sbitRB8=SCON^2; //接收數據的第九位sbitTI=SCON^1; //發(fā)送中斷標志sbitRI=SCON^0; //接收中斷標志sfrSBUF=0x99; //串口數據緩沖器sfrSADEN=0xB9;//從機地址掩碼寄存器sfrSADDR=0xA9;//從機地址寄存器sfrS2CON=0x9A;//串行口2控制寄存器sfrS2BUF=0x9B;//串行口2數據緩沖器/*----------------看門狗定時器寄存器------------------*/sfrWDT_CONTR=0xC1;//看門狗定時器控制寄存器/*----------------PCA寄存器-----------------*/sfrCCON=0xD8;//PCA控制寄存器sbitCF=CCON^7;

//PCA計數器溢出(CH,CL由FFFFH變?yōu)?000H)標志sbitCR=CCON^6;//PCA計數器計數允許控制位sbitCCF2=CCON^2;//PCA模塊2中斷標志sbitCCF1=CCON^1;//PCA模塊1中斷標志sbitCCF0=CCON^0;//PCA模塊0中斷標志sfrCMOD=0xD9;//PCA工作模式寄存器sfrCL=0xE9;//PCA計數器低8位sfrCH=0xF9;//PCA計數器高8位sfrCCAPM0=0xDA;//PAC模塊0的工作模式寄存器sfrCCAPM1=0xDB;//PAC模塊1的工作模式寄存器sfrCCAPM2=0xDC;//PAC模塊2的工作模式寄存器sfrCCAP0L=0xEA;//PAC模塊0捕捉/比較寄存器低8位sfrCCAP0H=0xFA;//PAC模塊0捕捉/比較寄存器高8位sfrCCAP1L=0xEB;//PAC模塊1捕捉/比較寄存器低8位sfrCCAP1H=0xFB;//PAC模塊1捕捉/比較寄存器高8位sfrCCAP2L=0xEC;//PAC模塊2捕捉/比較寄存器低8位sfrCCAP2H=0xFC;//PAC模塊2捕捉/比較寄存器高8位sfrPCA_PWM0=0xF2;//PCA模塊0PWM寄存器sfrPCA_PWM1=0xF3;//PCA模塊1PWM寄存器sfrPCA_PWM2=0xF4;//PCA模塊2PWM寄存器/*-----------------ADC寄存器-----------------*/sfrADC_CONTR=0xBC;//ADC控制寄存器,本寄存器不支持位操作sfrADC_RES=0xBD;//ADC轉換結果高8位寄存器sfrADC_RESL=0xBE;//ADC轉換結果低2位寄存器/*----------------SPI寄存器--------------------*/sfrSPSTAT=0xCD;

//SPI狀態(tài)寄存器,本寄存器不支持位操作sfrSPCTL=0xCE;//SPI控制寄存器sfrSPDAT=0xCF;//SPI數據寄存器/*-----------------ISP_IAP_EEPROM寄存器------------------*/sfrIAP_DATA=0xC2;//ISP/IAPFlash數據寄存器sfrIAP_ADDRH=0xC3;//ISP/IAPFlash地址高字節(jié)sfrIAP_ADDRL=0xC4;//ISP/IAPFlash地址低字節(jié)sfrIAP_CMD=0xC5;//ISP/IAPFlash命令寄存器sfrIAP_TRIG=0xC6;//ISP/IAPFlash命令觸發(fā)器sfrIAP_CONTR=0xC7;//ISP/IAP控制寄存器2、_at_關鍵字若要實現變量的絕對定位(稱為絕對變量),可以直接在數據定義后加上“_at_常數地址”即可。注意:(1)絕對變量不能被初始化(不能賦初值);(2)bit型函數及變量不能用_at_指定。33例如:unsignedcharidataADCdata_at_0x40;//指定ADCdata變量在40H處unsignedcharxdatabuffer[20]_at_0x0010;//指定buffer數組從XRAM的0010H單元開始3、存儲模式存儲模式決定了沒有明確指定存儲類型的變量時、函數參數等的缺省存儲區(qū)域,有Small、Compact和Large三種模式。34指定存儲模式圖5-1指定存儲模式

3、存儲模式(1)Small模式在該模式中所有變量都默認位于單片機內部數據存儲器(00~7FH),這和使用data指定存儲器類型的方式一樣。此模式訪問變量的效率很高,但所有的數據對象和堆棧必須適合內部RAM堆棧的大小。如果將變量都能配置在內部數據存儲器內,Small模式是最佳選擇。該模式的優(yōu)點是訪問速度快,缺點是空間有限,只適用于小程序。35(2)Compact模式所有缺省變量均位于外部RAM區(qū)的一頁內(256字節(jié)),這和使用pdata指定存儲器類型一樣。該模式通過寄存器R0和R1(@R0,@R1)間接尋址。R0和R1只提供地址低字節(jié),如果COMPACT模式使用多于256字節(jié)的外部存儲區(qū),高字節(jié)地址或頁由8051的P2(口地址0A0H)提供;初始化PORT2及指定PDATA起始地址的工作可在起始代碼中STARTUP.A51文件中說明。該模式空間比Small寬裕,速度比Small慢,比Large快,是一種中間狀態(tài)。363、存儲模式(3)Large模式所有缺省變量可放在多達64KB的外部RAM區(qū),這和使用xdata指定存儲器類型一樣,使用數據指針DPTR進行尋址。通過數據指針訪問外部數據存儲器的效率較低,特別是當變量為2個字節(jié)或更多字節(jié)(用一般指針)時。Large模式的數據訪問比Small和Compact產生更多的代碼。優(yōu)點是空間大,可存變量多,缺點是速度較慢。374、變量或數據類型表5-1C51數據類型數據類型含義位數(bit)字節(jié)數(byte)取值范圍bit*位型11/80或1signedchar帶符號字符型81-128~+127unsignedchar無符號字符型810~255enum8/161or2-128~+127or-32768~+32767signedshort帶符號短型162-32768~+32767unsignedshort無符號短型1620~65535signedint帶符號整型162-32768~+32767unsignedint無符號整型1620~65535signedlong帶符號長整型324-2147483648~+2147483647unsignedlong無符號長整型3240~4294967295float浮點型324+1.175494E38~+3.402823E+38sbit*11/80-1sfr*810x80-0xffsfr16*1620x0000~0xffff38C51特有特殊功能寄存器類型4、變量或數據類型C51提供以下幾種擴展數據類型:

bit:位變量值為0或1。格式:bit位名[=value];

例:staticbit

done_flag=0;/*bitvariable*/

sbit:從可位尋址的字節(jié)中定義的位變量(0或1)。

sfr:sfr字節(jié)地址(0x80~0xff)。

sfr16:sfr字地址(0x80~0xff,其實占用兩個連續(xù)地址)。

例:sfr16DPTR=0x82h;其余數據類型如:char、enum、short、int、long、float等與ANSIC相同。下面著重介紹位變量及其聲明。390或1*圖3-10內部RAM中的位地址20H~2FH之間單元既可按字節(jié)存取,也可按位存取,共128位,位地址范圍:00H~7FH。位尋址區(qū)404、變量或數據類型

(1)bit型變量(1)bit型變量bit型變量可用于變量類型聲明、函數參數列表和函數返回值等,存儲于內部RAM的20H~2FH單元中。

例:bitflag1注意:

1)使用禁止中斷

(#pragmadisable)或用一個明確的寄存器組聲明

(usingn)的函數不能返回位值,否則,編譯器會識別出來并產生一個錯誤信息。

2)位不能聲明為一個指針。如bit*bit_poiter;是錯誤的。

3)不能有bit數組如:bitarr[5];是錯誤的。4)bit型函數及變量不能用'_at_'定位到一個絕對地址。41(#pragma的作用是設定編譯器的狀態(tài)或者指示編譯器完成一些特定的動作)此指令是給位變量Fg3賦值1(0x20非0是真,值=1)(2)可位尋址區(qū)的說明使用sbit聲明可獨立訪問可位尋址對象的位。sbit聲明要求基址對象的存貯器類型為“bdata”(特殊功能寄存器除外),否則只有絕對的位聲明方法是合法的。例:sbitFg1=0x20;//錯誤使用sbit,位地址須在80H~FFH之間sbitEA=0xAF;//位地址可大于80HsbitFg2=0x20^2;//錯誤使用sbit,

bitFg3=0x20;//既不能用bit定義Fg3的位地址是0x20,//也不能用sbit定義,除非用bdata聲明:intbdata

bitram

_at_0x20;//用“bdata”聲明后可用sbitsbitFg4=bitram^2;//相當于定義了Fg4=0x20^2bitFg4=bitram^2;//bit不能這樣使用,雖然sbit可以.4、變量或數據類型(2)可位尋址區(qū)的說明42sbit可絕對定位位變量,但bit不可總結(^1)4、變量或數據類型(2)可位尋址區(qū)的說明(2)可位尋址區(qū)的說明使用sbit聲明可獨立訪問可位尋址對象的位。sbit聲明要求基址對象的存貯器類型為“bdata”(特殊功能寄存器除外):int

bdata

bitram

_at_0x20;

//用“bdata”聲明后可用sbit位尋址sbitFg15=bitram^15;//相當于定義了Fg15=0x20^15位的位置(

‘^’操作符號后的數字)的最大值依賴于指定的基址變量類型:對于char/uchar而言是0~7,對于int/uint/short/ushort而言是0~15,對于long/ulong而言是0~31。434、變量或數據類型下面舉例說明位尋址的聲明方法。例,intbdata

bittest_at_

0x20;//也可省略“_at_0x20”

sbitbit0=bittest^0;//0x20單元的第0位(bittest的第8位)sbit

bit15=bittest^15;//0x21單元的第7位(bittest的第7位)參見“Cx51CompilerUser‘sGuide”--“Bit-AddressableObjects”

最后一段“Physicalbitposition0referstobitposition0ofthefirstbyte.Physicalbitposition8referstobitposition0ofthesecondbyte.Becauseintvariablesarestoredhigh-bytefirst,bit0oftheintegerislocatedinbitposition0ofthesecondbyte.Thisisphysicalbitposition8whenaccessedusingansbitdatatype.”注意:可位尋址對象的位的聲明只能放到main函數的外部,

作為全局變量使用,否則,編譯會出錯。bit無限制。44先存高字節(jié),再存低字節(jié)0x20單元的0~7位是bittest的第8~15位0x21單元的0~7位是bittest的第0~7位實際位的位置與位號bit0~7不相符定義為char就不存在此不對應問題5.2.2擴展I/O口的使用STC15F2K60S2單片機除了芯片上的I/O口外,還可在片外擴展I/O端口。由于使用C語言訪問外部I/O時用到指針的功能,因此,首先介紹K

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論