MCS51單片機(jī)C語言程序設(shè)計基礎(chǔ)_第1頁
MCS51單片機(jī)C語言程序設(shè)計基礎(chǔ)_第2頁
MCS51單片機(jī)C語言程序設(shè)計基礎(chǔ)_第3頁
MCS51單片機(jī)C語言程序設(shè)計基礎(chǔ)_第4頁
MCS51單片機(jī)C語言程序設(shè)計基礎(chǔ)_第5頁
已閱讀5頁,還剩30頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

第二章MCS51單片機(jī)C語言程序設(shè)計

C語言具有很強(qiáng)的表達(dá)能力,并具有較高的可移植性,提供了種類豐富的運(yùn)算符和數(shù)據(jù)類型,可以直接實現(xiàn)對系統(tǒng)硬件的控制。相對于匯編語言,使用C語言進(jìn)行系統(tǒng)開發(fā)可以大大縮短開發(fā)周期,明顯增強(qiáng)程序的可讀性,便于改進(jìn)和擴(kuò)充。本章就介紹使用C語言開發(fā)8051系列單片機(jī)程序的方法。;雙字節(jié)無符號數(shù)加法程序(R3R4+R6R7)=(R3R4)

;入口

:R3,R4,R6,R7

NADD

:MOV

A,R4

ADD

A,R7

MOV

R4,A

MOV

A,R3

ADDC

A,R6

MOV

R3,A

RETunsignedintval_1,val_2;

unsignedintval_add;val_add=val_1+val_2;本章主要內(nèi)容C51變量聲明C51的IO口操作C51的中斷響應(yīng)方法C51的定時器操作C51的串行口操作C51的外部總線擴(kuò)展操作2.1C51語言變量聲明但在C語言編程中,對數(shù)據(jù)類型與變量的定義必須要與單片機(jī)的存儲結(jié)構(gòu)相關(guān)聯(lián),否則編譯器就不能正確的映射。所以用C語言編寫單片機(jī)應(yīng)用程序是要根據(jù)單片機(jī)的結(jié)構(gòu)及內(nèi)部資源定義相應(yīng)的C語言中的數(shù)據(jù)類型和變量。用C語言編寫的應(yīng)用程序必須經(jīng)單片機(jī)的C語言編譯器,將源代碼轉(zhuǎn)換成單片機(jī)的可執(zhí)行程序。支持MCS-51系列單片機(jī)的編譯器有很多,比較著名也是實際應(yīng)用最多的是KEIL/Franklin編譯器。這也是這門課使用的編譯器。一、C51數(shù)據(jù)類型數(shù)據(jù)類型長度(bit)長度(byte)值域bit110,1unsignedchar81[0,255]signedchar81[-128,127]unsignedint162[0,65535]signedint162[-32768,32767]unsignedlong324[0,4294967295]signedlong324[-2147483648,2147483647]float324±1.176E-38~±3.40E+38(6位有效數(shù)字)double648±1.176E-38~±3.40E+38(10位有效數(shù)字)指針2430~65535(存儲空間)表2.1C51支持的數(shù)據(jù)類型二、C51數(shù)據(jù)類型修飾符存儲類型與存儲空間的對應(yīng)關(guān)系data直接尋址片內(nèi)數(shù)據(jù)存儲區(qū),訪問速度快(128字節(jié)),值域0~127bdata可位尋址片內(nèi)數(shù)據(jù)存儲區(qū),允許位與字節(jié)混合訪問(16字節(jié),值域0~127idata間接尋址片內(nèi)數(shù)據(jù)存儲區(qū),可訪問片內(nèi)全部RAM地址空間(256字節(jié),值域0~255pdata分頁尋址片外數(shù)據(jù)存儲區(qū),,由MOVX@Ri訪問(i=0,1),值域0~255xdata片外數(shù)據(jù)存儲區(qū)(64KB)由MOVX@DPTR訪問,值域0~65535code程序存儲器64KB空間,由MOVC@DPTR訪問,值域0~65535表2.2C51存儲類型修飾符二、C51數(shù)據(jù)修飾符修飾符名稱功能const指示被修飾的變量或者指針是常量volatile指示被修飾的變量或者指針可由多種原因被修改,禁止優(yōu)化。常用于修飾多個函數(shù)公用的變量。表2.3其他修飾符三、C51變量聲明舉例C51變量聲明格式:[存儲類型]+[類型說明]+[修飾符]+[標(biāo)示符]=[初值]autoregisterstaticexterncharunsignedcharintunsignedintlongunsignedlongfloatdoublebitsfrsfr16sbitdatabdataidatapdataxdatacodeconstvolatilevalue=初值unsignedcharxdataval;signedchardatastring;bitbdataval_bit;unsignedcharxdata*pval;unsignedcharcode*pcode;code應(yīng)用舉例

unsignedcharcodetab[4]={0x00,0x01,0x02,0x03};voidmain(void){unsignedchari,j=0;for(i=0;i<4;i++){j=j+tab[i];}}9:for(i=0;i<4;i++){MOVR6,A10:j=j+tab[i];MOVA,R6MOVDPTR,#tab(0x001E)MOVCA,@A+DPTRADDA,R7MOVR7,A11:}三、C51存儲模式存儲模式說明SMALL參數(shù)及局部變量放入可直接尋址的片內(nèi)存儲區(qū)(最大128個字節(jié)),默認(rèn)存儲類型是data,訪問方便。所有對象都嵌入片內(nèi)RAM中。COMPACT參數(shù)及局部變量放入分頁片外存儲區(qū)(最大256個字節(jié)),默認(rèn)存儲類型是pdata,通過寄存器R0和R1間接尋址,??臻g位于8051系統(tǒng)內(nèi)部數(shù)據(jù)區(qū)。LARGE參數(shù)及局部變量都放入片外數(shù)據(jù)存儲器(最大64K),默認(rèn)存儲類型為xdata,使用DPTR訪問。訪問效率較低。表2.4存儲模式說明四、C51特殊功能寄存器(SFR)的C51定義MCS-51單片機(jī)中除了PC和4組工作寄存器外,其他的所有寄存器均為特殊功能寄存器(SFR),分散在片內(nèi)RAM區(qū)的高128字節(jié)中,地址范圍為80H~0FFH。為能直接訪問SFR,F(xiàn)ranklinC51提供了自動定義方法,與標(biāo)準(zhǔn)C語言不兼容,只適用于MSC-51單片機(jī)進(jìn)行編程。一般將特殊功能寄存器定義放在頭文件中,一般為reg51.h。特殊功能寄存器的定義語法為: sfrsfr_name=intconstant例如:sfrSCON=0x98; /*串行口控制寄存器地址98H*/SCON=0x01;四、C51特殊功能寄存器(SFR)的C51定義sbit定義位尋址單元第一種定義格式:sbitbit_name=sfr_name^intconstant;sbit是定義語句的關(guān)鍵字bit_name為位尋址符號名sfr_name為已經(jīng)定義過的特殊功能寄存器名intconstant為欲尋址的特殊功能寄存器在sfr_name中的位號sfrPSW=0xD0; /*定義PSW寄存器地址為D0H*/sbitOV=PSW^2; /*定義OV位為PSW.2,地址為D2H*/SbitCY=PSW^7; /*定義CY位為PSW.7,地址為D7H*/四、C51特殊功能寄存器(SFR)的C51定義第二種定義格式:sbitbit_name=constant_1^constant_2;sbit是定義語句的關(guān)鍵字bit_name為位尋址符號名constant_1為特殊功能寄存器的字節(jié)地址constant_2為欲尋址位在特殊功能寄存器中的位號sbitOV=0xD0^2; /*定義OV位為PSW.2,地址為D2H*/SbitCY=0xD0^7; /*定義CY位為PSW.7,地址為D7H*/sbit定義位尋址單元第三種定義格式:sbitbit_name=int_constant;sbit是定義語句的關(guān)鍵字bit_name為位尋址符號名int_constant為絕對位地址sbitOV=0xD2; /*定義OV位為PSW.2,地址為D2H*/SbitCY=0xD7; /*定義CY位為PSW.7,地址為D7H*/sbit定義位尋址單元四、C51特殊功能寄存器(SFR)的C51定義2.251單片機(jī)IO口操作的C語言編程方法#include<reg51.h>sbitDIPCK=P2^6;unsignedcharDIP_state;voidmain(){unsignedchartemp;

P0=0xff;

DIPCK=0;/*打開273*/

temp=P0;/*讀取DIP開關(guān)狀態(tài)*/DIPCK=1;/*關(guān)閉273*/}2.251單片機(jī)IO口操作的C語言編程方法6:unsignedchartemp;7:P0=0xff;MOVP0(0x80),#0xFF8:DIPCK=0;

CLRDIPCK(0xA0.6)9:temp=P0;

MOV0x09,P0(0x80)10:DIPCK=1;

SETBDIPCK(0xA0.6)#include<reg51.h>sbitDIPCK=P2^6;unsignedcharDIP_state;voidmain(){unsignedchartemp;

P0=0xff;

DIPCK=0;/*打開273*/

temp=P0;/*讀取DIP開關(guān)狀態(tài)*/DIPCK=1;/*關(guān)閉273*/}2.251單片機(jī)IO口操作的C語言編程方法讀IO口:value=P0;寫IO口:P0=value;讀IO端腳:value_pin=P0^0;寫IO端腳:P0^0=value_pin;C51語言操作IO端口方法:2.351單片機(jī)中斷的C語言編程方法C51編譯器支持在C源程序中直接開發(fā)中斷程序。中斷程序是通過按照編譯器規(guī)定的語法格式定義的一個函數(shù)。C51中斷服務(wù)程序的函數(shù)定義的語法格式如下:void函數(shù)名()interruptm[usingn]{ /*函數(shù)體*/}中斷服務(wù)函數(shù)沒有返回值也沒有參數(shù)m為服務(wù)的中斷源編號,與中斷入口對應(yīng)n為中斷服務(wù)程序選用的寄存器組編號編號中斷源入口地址0外部中斷00003H1定時器/計數(shù)器0000BH2外部中斷10013H3定時器/計數(shù)器1001BH4串行口中斷0023H表2.551單片機(jī)中斷源編號一、C51中斷系統(tǒng)編程一、C51中斷系統(tǒng)編程匯編語言中斷服務(wù)程序的—般格式如下:

CLREA;關(guān)中斷PUSHPSW;保護(hù)現(xiàn)場PUSHA…SETBEA;

開中斷…;服務(wù)程序CLREA ;關(guān)中斷POPA;恢復(fù)現(xiàn)場POPPSW…SETBEA;開中斷RETI;中斷返回

C語言中斷服務(wù)程序的一般格式如下:voidinterrupt_server()interruptmusingn{/*中斷服務(wù)程序*/}外部中斷0的C語言中斷服務(wù)程序:voidint0_interrupt_server()interrupt0using0{/*中斷服務(wù)程序*/}二、外部中斷的服務(wù)程序編寫方法#include<reg51.h>sbitP1_1=P1^1;sbitP1_0=P1^0;voidmain(){IT0=1;

IT1=1;IE0=1;IE1=1;EA=1;while(1){}}voidint0_server()interrupt0using0{P1_1=0;P1_0=1;}voidint0_server()interrupt2using1{P1_1=1;P1_0=0;}2.451單片機(jī)定時器C語言編程一、定時器查詢方式程序編寫方法編寫定時器中斷服務(wù)程序,使P1.0引腳上輸出周期為4ms,占空比為1:1的方波。晶振12MHz。#include<reg52.h>sbitp10=p1^0;voidclock_initial(){ TR0=0; TF0=0; TH0=0xF8; TL0=0x30; TR0=1;}voidmain(){ TMOD=0x01; for(;;) { clock_initial(); do{} while(!TF0); p10=!p10; }}二、定時器中斷的服務(wù)程序編寫方法#include<reg52.h>voidmain(){TMOD=0x01;P1^0=0;TF0=0;TR0=0;/*關(guān)閉定時器0*/TH0=0xF8;/*裝載級數(shù)初值*/TL0=0x30;TR0=1;/*啟動定時器1*/ET0=1;/*允許定時器中斷*/EA=1;for(;;){}}

voidclk_int(void)interrupt1using0{TR0=0;/*關(guān)閉定時器0*/TH0=0xF8;/*裝載級數(shù)初值*/TL0=0x30;TR0=1;/*啟動定時器1*/P10=!P10;}編寫定時器中斷服務(wù)程序,使P1.0引腳上輸出周期為4ms,占空比為1:1的方波。晶振12MHz。2.551單片機(jī)串行口C語言編程一、串行口查詢方式程序編寫方法設(shè)串行口數(shù)據(jù)傳送的波特率為4800,晶振11.0592MHz。采用查詢方式,接收到數(shù)據(jù)后,立即發(fā)送。#include<reg51.h>voidinit_serialcomm(void){SCON=0x50;//8N1TMOD|=0x20;//定時器設(shè)置PCON|=0x80;//SMOD=1;//Baud:4800fosc=11.0592MHzTH1=0xF4;IE|=0x90;//使能外部中斷

TR1=1;//timer1run}voidmain(){ init_serialcomm(); while(1) { while(RI==0); a=SBUF; SBUF=a; while(TI==0); TI=0; }}四、串行口中斷的服務(wù)程序編寫方法設(shè)串行口數(shù)據(jù)傳送的波特率為4800,編寫串口接收中斷服務(wù)程序。串口接收到數(shù)據(jù)后,立即通過串口發(fā)送出去。#include<reg51.h>voidinit_serialcomm(void){SCON=0x50;//8N1TMOD|=0x20;//定時器設(shè)置PCON|=0x80;//SMOD=1;//Baud:4800fosc=11.0592MHzTH1=0xF4;IE|=0x90;//使能外部中斷

TR1=1;//timer1run}voidmain(void){init_serialcomm();for(;;){}}voidserial_server()interrupt4using3{unsignedch;RI=0;ch=SBUF;SBUF=ch;While(TI==0);TI=0;}2.651單片機(jī)外部擴(kuò)展的C語言編程方法xdata片外數(shù)據(jù)存儲區(qū)(64KB)由MOVX@DPTR訪問,值域0~65535charxdatacom;com=0x01;charxdatacom;com=0x01;MOVDPTR,#0x0000MOVA,#0x01MOVX@DPTR,AC語言程序匯編程序如何確定DPTR值?一、C51指針類型1、基于存儲器的指針指針?biāo)赶虻牡刂吩诰幾g時確定。charxdatacom;com=0x01;2、通用指針三字節(jié)組成。第一個字節(jié)為:指針類型第二和第三字節(jié)為:16位地址高8位和低8位。通用指針的形式為:#defineXBYTE((char*)0x20000L)指向xdata,偏移量為0的通用指針指針類型:1為idata,2為xdata,3為pdata,4為data,5為code二、通用指針例:將常數(shù)0x41寫入地址為0x8057的外部數(shù)據(jù)存儲器#defineXBYTE((char*)0x20000L)XBYTE[0x8057]=0x41;10:XBYTE[0x8057]=0x41;MOVDPTR,#0x8057MOVA,#0x41MOVX@DPTR,A偏移量三、absacc.h#defineCBYTE((unsignedcharvolatilecode*)0)#defineDBYTE((unsignedcharvolatiledata*)0)#definePBYTE((unsignedcharvolatilepdata*)0)#defineXBYTE((unsignedcharvolatilexdata*)0)#defineCWORD((unsignedintvolatilecode*)0)#defineDWORD((unsignedintvolatiledata*)0)#definePWORD((unsignedintvolatilepdata*)0)#defineXWORD((unsignedintvolatilexdata*)0)#defineXBYTE((char*)0x20000L)XBYTE[0x8057]=0x41;#include<reg51.h>#include<absacc.h>voidmain(void){

XBYTE[0x8057]=0x41;}#include<reg51.h>#include<absacc.h>#defineCOMXBYTE[0x8057]voidmain(void){

COM=0x41;}2.5幾類重要的庫函數(shù)C51提供了豐富的庫函數(shù)資源,包括大量的關(guān)于I/O操作、內(nèi)存分配、字符串操作、據(jù)類型轉(zhuǎn)換、數(shù)學(xué)計算等函數(shù)庫。它們是以執(zhí)行代碼的形式出現(xiàn),供用戶在連接定位時用。在用預(yù)處理器命令#include包含相應(yīng)的頭文件后,就可以在程序中使用這些函數(shù)。一、硬件地址定義頭文件reg5x.h定義了特殊功能寄存器的地址。在文件開頭首先要包含該文件。/*BYTERegister*/sfrP0=0x80;sfrP1=0x90;sfrP2=0xA0;sfrP3=0xB0;sfrPSW=0xD0;sfrACC=0xE0;sfrB=0xF0;sfrSP=0x81;sfrDPL=0x82;這個庫中提供的是一些用匯編語言編寫的函數(shù)。用匯編語言編寫非常直接簡單且目代碼很短,而用C51編寫則代碼很長。這些函數(shù)主要有:_crol_/_cror_無符號字符型變量左/右移位函數(shù)_irol_/_iror_無符號整型變量左/右移位函數(shù)_lrol_/_lror_無符號長整型變量左/右移位函數(shù)_nop_空操作函數(shù)_testbit_位測試函數(shù)一、內(nèi)部函數(shù)庫intrins.h#inclucle<intrins.h>voidmain(){ unsignedinty;

y=0x00ff;

y=_irol_(y,4);}舉例:運(yùn)行后,y=0x0ff0。一、內(nèi)部函數(shù)庫intrins.h二、絕對地址訪問函數(shù)absacc.h用預(yù)處理器偽指令#defi

溫馨提示

  • 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. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(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

提交評論