版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
2023/6/71第4章80C51的C語言程序設計單片機C語言概述4.1C51的數據類型與運算4.2C51流程控制語句4.3C51的指針類型4.4C51的函數4.5C51編程實例4.62023/6/7210.1單片機C語言概述10.1.1C51程序開發(fā)過程編譯器能自動完成變量的存儲單元的分配對常用功能模塊和算法編制相應的函數,方便移植采用C51的優(yōu)點C語言具有良好的可讀性、可移植性和基本的硬件操作能力。
C51程序開發(fā)過程編寫源程序建立工程,加入源程序編譯生產目標程序仿真調試、寫存儲器2023/6/732023/6/7410.2.1C51的數據類型10.2
C51的數據類型與運算數據類型決定其取值范圍、占用存儲器的大小及可參與哪種運算。
數據類型長度(位)取值范圍字符型signedchar8-128~127unsignedchar80~255整型signedint16-32768~32767unsignedint160~65535長整型signedlong32-21474883648~21474883647unsignedlong320~4294967295浮點型float32±1.75494E-38~±3.402823E+38位型bit10,1sbit10,1訪問SFRsfr80~255sfr16160~655352023/6/75盡可能采用無符號格式bit用于定義位變量的名字,編譯器會對其分配地址(RAM的20H~2FH區(qū)域)sbit用于定義位變量的名字和地址,地址是確定的且不用編譯器分配(SFR及RAM的20H~2FH區(qū)域)C51編譯器在編譯時會自動進行類型轉換幾點說明:2023/6/7610.2.2C51數據的存儲類型C51的存儲器類型存儲器類型長度(位)對應單片機存儲器bdata1片內RAM位尋址區(qū),共128位。(亦能字節(jié)訪問)data8直接尋址,共128字節(jié)。idata8間接尋址,共256字節(jié)。pdata8片外
RAM分頁間址,共256字節(jié)。(MOVX@Ri)xdata16間接尋址,共64k字節(jié)。(MOVX@DPTR)code16ROM間接尋址,共64k字節(jié)。(MOVCA,@A+DPTR)2023/6/77經常使用的變量應該置于片內RAM中,要用bdata、data、idata來定義。不經常使用的變量或規(guī)模較大的變量應該置于片外RAM中,要用pdata、xdata來定義。默認存儲器類型由編譯控制命令的存儲模式指令限制。
存儲模式默認存儲類型特點SMALLdata小模式。變量默認在片內RAM。空間小,速度塊。COMPACTpdata緊湊模式。變量默認在片外RAM的頁(256字節(jié),頁號由P2口決定)。LARGExdata大模式。變量默認在片外RAM的64KB范圍??臻g大,速度慢。2023/6/7810.2.380C51硬件結構的C51定義特殊功能寄存器的聲明sfr
特殊功能寄存器名=地址常數;格式:例如:sfrSCON=0x90;sfrP0=0x80;2023/6/79特殊功能寄存器中特定位的聲明sbit位變量名=特殊功能寄存器名^位的位置(0~7)例如:
sfrPSW=0xD0;sbitOV=PSW^2;
sbit位變量名=字節(jié)地址^位的位置(0~7)例如:
sbitOV=0xD0^2;sbitCY=0xD0^7;
sbit位變量名=位地址
例如:
sbitOV=0xD2;sbitCY=0xD7;
2023/6/710內部RAM中可位尋址對象的定義先定義變量的數據類型和存儲類型例如:
intbdataibase;charbdataarray[4];
再利用sbit進行聲明
例如:
sbitmybit0=ibase^0;
sbitmybit15=ibase^15;
sbitary07=array[0]^7;
訪問示例:ibase=-1;array[2]=‘a’;
2023/6/711算術運算符和算術表達式10.2.4C51的運算符和表達式基本算術運算符例如:
+加法運算符;
-減法(取負)運算符;*乘法運算符;/除法運算符;%取余數運算符。
示例:25.0/20.0=1.2525/20=125%20=5
取負運算優(yōu)先級最高。2023/6/712自增、自減運算符(僅能用于變量)例如:
++自增運算符;
--自減運算符;類型轉換運算符自動轉換,順序:bit→char→int→long→float
強制類型轉換,如:(double)a
2023/6/713關系運算符和關系表達式關系運算符
<小于;<=小于等于;>大于;>=大于等于;==等于;!=不等于。關系表達式關系表達式的值為邏輯值:真(1)和假(0)2023/6/714邏輯運算符和邏輯表達式邏輯運算符
&&邏輯與||邏輯或!邏輯非邏輯表達式邏輯表達式的值為邏輯值:真(1)和假(0)例:5||0結果為1,2&&0結果為02023/6/715位運算符&按位與|按位或^按位異或~按位取反<<左移>>右移例:P1=P1<<1表示對P1口的所有位左移1位
2023/6/716賦值和復合賦值運算符復合賦值運算符+=加法賦值;-=減法賦值;*=乘法賦值;/=除法賦值;%=取模賦值;符號“=”稱為賦值運算符
<<=左移位賦值;>>=右移位賦值;&=邏輯與賦值;|=邏輯或賦值;^=邏輯異或賦值;~=邏輯非賦值
例:a*=5相當于a=a*5;b&=0x80相當于b=b&0x80。2023/6/71710.3
C51流程控制語句10.3.1C51選擇語句
條件語句if(條件表達式)語句
例如:if(p1!=0){c=20;}
if(條件表達式)語句1else語句2例如:if(p1!=0){c=20;}else{c=0;}
2023/6/718if(條件表達式1)語句1elseif(條件表達式2)語句2elseif(條件表達式3)語句3
…
…elseif(條件表達式n)語句nelse語句n+1
2023/6/719開關語句switch(表達式){case常量表達式1:語句1;break;case常量表達式2:語句2;break;
…
…case常量表達式n:語句n;break;default:語句n+1;}2023/6/72010.3.2C51循環(huán)語句while語句一般形式為:
while(條件表達式)語句;如果條件表達式的結果一開始就為假,則后面的語句一次也不能執(zhí)行。Do-while語句一般形式為:
do語句
while(條件表達式);任何條件下,循環(huán)體語句至少會被執(zhí)行一次。2023/6/721for語句一般形式為:for([初值表達式];[條件表達式];[更新表達式])語句if語句與goto語句結合
當型循環(huán)
形式為:
loop:if(表達式)
{語句
gotoloop;
}2023/6/722直到型循環(huán)
形式為:
loop:{語句
if(表達式)gotoloop;
}continue是一種循環(huán)中斷語句,它并不跳出循環(huán)體;break語句只能跳出它所處的那一層循環(huán);goto語句可以用于跳出多重循環(huán)(從內層到外層)。注意:2023/6/72310.4
C51的指針類型有一個變量a,利用&a表示變量a的地址。則語句p=&a;把a的地址賦給了指針變量p,則“p指向了變量a”。
*P表示變量a的內容指針變量的定義chardata*p/*定義指針變量*/p=30H/*為指針變量賦值,30H為片內RAM地址*/x=*p/*30H單元的內容送給變量x*/2023/6/724定義時未指定它所指向的對象的存儲器類型
10.4.1一般指針一般指針占3個字節(jié)第一字節(jié)存放該指針的默認存儲器類型編碼(見表)第二字節(jié)存放該指針的高位地址偏移量第三字節(jié)存放該指針的低位地址偏移量
存儲器類型編碼
存儲器類型bdata/data/idataxdatapdatacode編碼0x000x010xfe0xff2023/6/725一般指針定義示例:char*xdatastrptr;
/*指針本身存于xdata空間,它指向char型數據*/int*datanumber;/*指針本身存于data空間,它指向int型數據*/由于指向對象的存儲空間在編譯時無法確定(運行時確定),因此必須生成一般代碼以保證對任意空間的對象進行存取。所以一般指針所產生的代碼速度較慢。2023/6/72610.4.2基于存儲器的指針定義時就指定它所指向的對象的存儲器類型
指針占1個字節(jié)(idata*,data*,pdata*)或2個字節(jié)(code*,xdata*)
基于存儲器指針定義示例:chardata*str;
/*指針指向的char型數據存于data空間
*/intxdata*num;/*指針指向的int型數據存于xdata空間
*/
基于存儲器的指針長度比一般指針短,可以節(jié)省存儲器空間,運行速度快,但它所指對象具有確定的存儲器空間,兼容性不好。2023/6/72710.5
C51的函數10.5.1C51函數的定義一般形式:返回值類型函數名(形式參數列表)[編譯模式][reentrant][interruptn][usingn]{
函數體}編譯模式為SMALL、COPACT或LARGEreentrant用于定義可重入函數interruptn用于定義中斷函數,n為中斷號,可以為0~31usingn確定工作寄存器組,取值為0~3
2023/6/72810.5.2C51函數的調用與參數傳遞主調函數要向被調函數傳遞所需的參數傳遞給被調函數的數據稱為實際參數,即實參實參向形參的傳遞是單向的參數傳遞可以采用寄存器、固定存儲器位置方式
參數傳遞寄存器參數傳遞傳遞的參數char、1字節(jié)指針int、2字節(jié)指針long、float一般指針參數1R7R6、R7R4~R7R1、R2、R3參數2R5R4、R5R4~R7R1、R2、R3參數3R3R2、R3R1、R2、R32023/6/729SMALL模式下,在內部RAM中完成COMPACT模式下,在外部RAM中完成LARGER模式下,在外部RAM中完成固定存儲器位置參數傳遞80C51單片機不采用堆棧傳遞參數。但C51提供一種模擬堆棧,從而支持可重入函數的遞歸調用。
10.5.3C51的庫函數常用的C51庫函數參見附錄B.2
2023/6/7304.5 編程舉例
4.5.1用C語言實現I/O編程1端口輸入/輸出(I/O)操作下面的代碼顯示如何讀和寫I/O端口(引腳)。sfr P1=0x90; //P1的SFR定義sfr P3=0xB0; //P3的SFR定義unsignedcharval1;unsignedcharval2;unsignedcharval3;……P1=0xff; //讀操作前,置位端口val1=P1; //將P1口的數據傳遞給變量val1val2=P1&0x0f;//將P1口的低4位數據傳遞給變量val2P3=P1<<4; //P1左移4位后再從P3.4~P3.7引腳輸出2023/6/7312I/O端口的位操作指令由于I/O端口具有位尋址功能,因此有關位操作的指令也都適用于它們。sfr P1=0x90; //P1的SFR定義sbit DIPswitch=P1^4; //定義P1口位4為DIP開關輸入sbit greenLED=P1^5; //定義P1口位5為LED輸出……If(DIPswitch==1) //檢查P1.4輸入是否為高{ greenLED=0; //置P1.5輸出為低,LED滅}else //若P1.4輸入是否為低{ greenLED=1; //置P1.5輸出為高,LED亮}2023/6/732【例】利用單片機的P1.4~P1.7接4個發(fā)光二極管,P1.0~P1.3接4個開關,要求當開關動作時,對應(低位對低位,即P1.0對應P1.4、P1.1對應P1.5…)的發(fā)光二極管亮或滅,請編程實現。3并行口(字節(jié)尋址)應用舉例
2023/6/733匯編參考程序如下:
ORG 0000HLJMP LOOP ORG 0060HLOOP: MOV P1,#0FH ;設定P1端口低4位為輸入狀態(tài)MOV A,P1SWAP AMOV P1,ASJMP LOOPC51參考程序如下:#include<reg51.h>#include<stdio.h>sfrP1=0x90;voidmain(void){ for(;;) { P1=0x0F; //設定P1端口低4位為輸入狀態(tài)
P1=P1<<4; //左移4位后再從P1.4~P1.7引腳輸出
}}2023/6/734【例4-32】根據圖4-8所示電路,設計閃爍亮燈程序,要求8只發(fā)光二極管閃爍點亮,點亮和熄滅時間都為200ms。解:根據硬件電路圖可知,當P1.x輸出高電平時,LED燈亮。2023/6/735匯編參考程序如下:
ORG 0000HLJMP LOOP ORG 0060HLOOP:MOV A,#00H MOV P1,A ;熄滅LED LCALL DELAY MOV A,#0FFH LCALL DELAY ;點亮LED SJMP LOOPDELAY:…… ;200ms延時子程序2023/6/736C51參考程序如下:#include<reg51.h>voiddelay02s(void) //延時0.2s子程序{ ……}voidmain(void){ while(1) { P1=0x00; //熄滅LED delay02s(); P1=0xff; //點亮LED delay02s(); }}2023/6/737【例4-33】根據圖4-8所示電路,設計一個程序,在這些LED上顯示計數值,從0x00到0xFF(二進制值00000000到11111111),計數時間間隔為1s。2023/6/738解:匯編參考程序如下:
ORG 0000HLJMP START ORG 0060HSTART:MOV P1,#0 ;熄滅LED LCALL DELAYLOOP:INC P1 ;增量P1 LCALL DELAY ;點亮LED SJMP LOOPDELAY:…… ;1s延時子程序2023/6/739C51參考程序如下:#include<reg51.h>#define LED P1;voiddelay02s(void) //延時1s{ ……}voidmain(void){ LED=0; //清零P1 while(1) { LED++; //增量P1 delay02s(); }}2023/6/740【例4-34】設計一個程序,從P1獲取一個字節(jié),等待一段時間,然后將它發(fā)送到P2,等待時間間隔為500ms。匯編參考程序如下:
ORG 0000HLJMP START ORG 0060HSTART: MOV A,#00H ;清ACCMOVP1,#FF ;使P1成為輸入LOOP:MOV A,P1 LCALLDELAY MOV P2,A SJMPLOOPDELAY:…… ;500ms延時子程序2023/6/741C51參考程序如下:#include<reg51.h>#define LED P1;voiddelayMS(unsignedint); //延時n×1mSvoidmain(void){ unsignedcharmybyte; P1=0xFF; //使P1成為輸入
while(1) { mybyte=P1; //從P1獲取一個字節(jié)
delay(200); P2=mybyte; //將該字節(jié)發(fā)送到P2 }}2023/6/742【例4-35】設計一個程序,從P0獲取一個字節(jié),若小于100,將它發(fā)送到P1;否則,發(fā)送到P2。匯編參考程序如下:
ORG 0000HLJMP START ORG 0060HSTART:MOV A,#00;清ACC MOV P0,#FFH;使P0成為輸入LOOP:MOVA,P0 CJNZA,#100,PD ;與100進行比較PD: JCPD1 ;CY=1表示小于100 MOV P2,A SJMPLOOPPD1: MOVP1,A SJMPLOOP2023/6/743C51參考程序如下:#include<reg51.h>#define IN P0;#define OUT1 P1;#define OUT2 P2;voidmain(void){ unsignedcharmybyte; P0=0xFF; //使P0成為輸入
while(1) { mybyte=P0; //從P0獲取一個字節(jié)
if(mybyte<100) OUT1=mybyte;//若該字節(jié)小于100,則將它發(fā)送到P1 else OUT2=mybyte;//否則,將該字節(jié)發(fā)送到P2 }}2023/6/7444位可尋址的I/O編程
P0~P3的I/O端口是位可尋址的。能夠對單個位進行存取而不干擾端口的其余位。使用sbit數據類型對P0~P3的單個位進行存取。做到這點的方法是利用Px^y格式,其中x是端口0、1、2、3,y是該端口的位0~7。例如,P1^7指示P1.7。當使用這些方法時,需要將頭文件reg51.h(或reg52.h)包含進來?!纠?-36】設計一個程序,用以監(jiān)控P1.5位。若該位為高電平,則發(fā)送55H到P0;否則,AAH發(fā)送到P2。2023/6/745匯編參考程序如下:
ORG 0000HLJMP START ORG 0060HSTART:SETB P1.5 ;使P1.5成為輸入LOOP:JB P1.5,LP1 ; MOV P2,#0AAH SJMP LOOPLP1: MOV P0,#55H SJMP LOOP2023/6/746C51參考程序如下:#include<reg51.h>sbit mybit=P1^5; //聲明單個位voidmain(void){ mybit=1; //使P1.5稱為輸入
while(1) { if(mybit==1) P0=0x55; else P2=0xAA; }}2023/6/747【例4-37】一扇屋門的傳感器連接到P1.1引腳,而蜂鳴器連接到P1.7。試設計一個程序,用以監(jiān)控這扇門的傳感器,當此門開著(P1.1引腳為高電平),蜂鳴器響(P1.7引腳為高電平)。匯編參考程序如下:
ORG 0000HLJMP START ORG 0060HSTART: SETB P1.5 ;使P1.5成為輸入
LOOP: JB P1.5,LP1 ;SETB P1.7
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年房產交易委托協議
- 2024年式遠程辦公系統使用協議
- 2024年新修訂:個人借款協議標準版
- 2024年教育機構全職教師聘用協議
- 2024年房屋拆遷補償安置房買賣協議
- 2024年攜手發(fā)展:房地產掛靠公司聯盟協議
- 我的發(fā)作文500字7篇
- 草船借箭讀后感400字7篇
- 酒店圣誕晚會策劃方案兩篇
- 老舊小區(qū)乳膠漆施工改造方案
- 倉儲物流中心物業(yè)安全管理
- 醫(yī)療器械注冊專員培訓
- 期末復習重要考點03 《一元一次方程》十大考點題型(熱點題型+限時測評)(原卷版)
- 生物丨金太陽(25-69C)廣東省2025屆高三10月大聯考生物試卷及答案
- 車隊車輛掛靠合同模板
- 期中 (試題) -2024-2025學年人教PEP版英語四年級上冊
- 動物疫病防治員(高級)理論考試題及答案
- 跨境電商行業(yè)研究框架專題報告
- 提升初中生英語寫作
- 2024年深圳市優(yōu)才人力資源有限公司招考聘用綜合網格員(派遣至吉華街道)高頻500題難、易錯點模擬試題附帶答案詳解
- 高中政治必修四哲學與文化知識點總結
評論
0/150
提交評論