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

下載本文檔

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

文檔簡(jiǎn)介

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

C語(yǔ)言具有很強(qiáng)的表達(dá)能力,并具有較高的可移植性,提供了種類(lèi)豐富的運(yùn)算符和數(shù)據(jù)類(lèi)型,可以直接實(shí)現(xiàn)對(duì)系統(tǒng)硬件的控制。相對(duì)于匯編語(yǔ)言,使用C語(yǔ)言進(jìn)行系統(tǒng)開(kāi)發(fā)可以大大縮短開(kāi)發(fā)周期,明顯增強(qiáng)程序的可讀性,便于改進(jìn)和擴(kuò)充。本章就介紹使用C語(yǔ)言開(kāi)發(fā)8051系列單片機(jī)程序的方法。;雙字節(jié)無(wú)符號(hào)數(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的定時(shí)器操作C51的串行口操作C51的外部總線(xiàn)擴(kuò)展操作2.1C51語(yǔ)言變量聲明但在C語(yǔ)言編程中,對(duì)數(shù)據(jù)類(lèi)型與變量的定義必須要與單片機(jī)的存儲(chǔ)結(jié)構(gòu)相關(guān)聯(lián),否則編譯器就不能正確的映射。所以用C語(yǔ)言編寫(xiě)單片機(jī)應(yīng)用程序是要根據(jù)單片機(jī)的結(jié)構(gòu)及內(nèi)部資源定義相應(yīng)的C語(yǔ)言中的數(shù)據(jù)類(lèi)型和變量。用C語(yǔ)言編寫(xiě)的應(yīng)用程序必須經(jīng)單片機(jī)的C語(yǔ)言編譯器,將源代碼轉(zhuǎn)換成單片機(jī)的可執(zhí)行程序。支持MCS-51系列單片機(jī)的編譯器有很多,比較著名也是實(shí)際應(yīng)用最多的是KEIL/Franklin編譯器。這也是這門(mén)課使用的編譯器。一、C51數(shù)據(jù)類(lèi)型數(shù)據(jù)類(lèi)型長(zhǎng)度(bit)長(zhǎng)度(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(存儲(chǔ)空間)表2.1C51支持的數(shù)據(jù)類(lèi)型二、C51數(shù)據(jù)類(lèi)型修飾符存儲(chǔ)類(lèi)型與存儲(chǔ)空間的對(duì)應(yīng)關(guān)系data直接尋址片內(nèi)數(shù)據(jù)存儲(chǔ)區(qū),訪(fǎng)問(wèn)速度快(128字節(jié)),值域0~127bdata可位尋址片內(nèi)數(shù)據(jù)存儲(chǔ)區(qū),允許位與字節(jié)混合訪(fǎng)問(wèn)(16字節(jié),值域0~127idata間接尋址片內(nèi)數(shù)據(jù)存儲(chǔ)區(qū),可訪(fǎng)問(wèn)片內(nèi)全部RAM地址空間(256字節(jié),值域0~255pdata分頁(yè)尋址片外數(shù)據(jù)存儲(chǔ)區(qū),,由MOVX@Ri訪(fǎng)問(wèn)(i=0,1),值域0~255xdata片外數(shù)據(jù)存儲(chǔ)區(qū)(64KB)由MOVX@DPTR訪(fǎng)問(wèn),值域0~65535code程序存儲(chǔ)器64KB空間,由MOVC@DPTR訪(fǎng)問(wèn),值域0~65535表2.2C51存儲(chǔ)類(lèi)型修飾符二、C51數(shù)據(jù)修飾符修飾符名稱(chēng)功能const指示被修飾的變量或者指針是常量volatile指示被修飾的變量或者指針可由多種原因被修改,禁止優(yōu)化。常用于修飾多個(gè)函數(shù)公用的變量。表2.3其他修飾符三、C51變量聲明舉例C51變量聲明格式:[存儲(chǔ)類(lèi)型]+[類(lèi)型說(shuō)明]+[修飾符]+[標(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存儲(chǔ)模式存儲(chǔ)模式說(shuō)明SMALL參數(shù)及局部變量放入可直接尋址的片內(nèi)存儲(chǔ)區(qū)(最大128個(gè)字節(jié)),默認(rèn)存儲(chǔ)類(lèi)型是data,訪(fǎng)問(wèn)方便。所有對(duì)象都嵌入片內(nèi)RAM中。COMPACT參數(shù)及局部變量放入分頁(yè)片外存儲(chǔ)區(qū)(最大256個(gè)字節(jié)),默認(rèn)存儲(chǔ)類(lèi)型是pdata,通過(guò)寄存器R0和R1間接尋址,??臻g位于8051系統(tǒng)內(nèi)部數(shù)據(jù)區(qū)。LARGE參數(shù)及局部變量都放入片外數(shù)據(jù)存儲(chǔ)器(最大64K),默認(rèn)存儲(chǔ)類(lèi)型為xdata,使用DPTR訪(fǎng)問(wèn)。訪(fǎng)問(wèn)效率較低。表2.4存儲(chǔ)模式說(shuō)明四、C51特殊功能寄存器(SFR)的C51定義MCS-51單片機(jī)中除了PC和4組工作寄存器外,其他的所有寄存器均為特殊功能寄存器(SFR),分散在片內(nèi)RAM區(qū)的高128字節(jié)中,地址范圍為80H~0FFH。為能直接訪(fǎng)問(wèn)SFR,F(xiàn)ranklinC51提供了自動(dòng)定義方法,與標(biāo)準(zhǔn)C語(yǔ)言不兼容,只適用于MSC-51單片機(jī)進(jìn)行編程。一般將特殊功能寄存器定義放在頭文件中,一般為reg51.h。特殊功能寄存器的定義語(yǔ)法為: sfrsfr_name=intconstant例如:sfrSCON=0x98; /*串行口控制寄存器地址98H*/SCON=0x01;四、C51特殊功能寄存器(SFR)的C51定義sbit定義位尋址單元第一種定義格式:sbitbit_name=sfr_name^intconstant;sbit是定義語(yǔ)句的關(guān)鍵字bit_name為位尋址符號(hào)名sfr_name為已經(jīng)定義過(guò)的特殊功能寄存器名intconstant為欲尋址的特殊功能寄存器在sfr_name中的位號(hào)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是定義語(yǔ)句的關(guān)鍵字bit_name為位尋址符號(hào)名constant_1為特殊功能寄存器的字節(jié)地址constant_2為欲尋址位在特殊功能寄存器中的位號(hào)sbitOV=0xD0^2; /*定義OV位為PSW.2,地址為D2H*/SbitCY=0xD0^7; /*定義CY位為PSW.7,地址為D7H*/sbit定義位尋址單元第三種定義格式:sbitbit_name=int_constant;sbit是定義語(yǔ)句的關(guān)鍵字bit_name為位尋址符號(hào)名int_constant為絕對(duì)位地址sbitOV=0xD2; /*定義OV位為PSW.2,地址為D2H*/SbitCY=0xD7; /*定義CY位為PSW.7,地址為D7H*/sbit定義位尋址單元四、C51特殊功能寄存器(SFR)的C51定義2.251單片機(jī)IO口操作的C語(yǔ)言編程方法#include<reg51.h>sbitDIPCK=P2^6;unsignedcharDIP_state;voidmain(){unsignedchartemp;

P0=0xff;

DIPCK=0;/*打開(kāi)273*/

temp=P0;/*讀取DIP開(kāi)關(guān)狀態(tài)*/DIPCK=1;/*關(guān)閉273*/}2.251單片機(jī)IO口操作的C語(yǔ)言編程方法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;/*打開(kāi)273*/

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

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

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

C語(yǔ)言中斷服務(wù)程序的一般格式如下:voidinterrupt_server()interruptmusingn{/*中斷服務(wù)程序*/}外部中斷0的C語(yǔ)言中斷服務(wù)程序:voidint0_interrupt_server()interrupt0using0{/*中斷服務(wù)程序*/}二、外部中斷的服務(wù)程序編寫(xiě)方法#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ī)定時(shí)器C語(yǔ)言編程一、定時(shí)器查詢(xún)方式程序編寫(xiě)方法編寫(xiě)定時(shí)器中斷服務(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; }}二、定時(shí)器中斷的服務(wù)程序編寫(xiě)方法#include<reg52.h>voidmain(){TMOD=0x01;P1^0=0;TF0=0;TR0=0;/*關(guān)閉定時(shí)器0*/TH0=0xF8;/*裝載級(jí)數(shù)初值*/TL0=0x30;TR0=1;/*啟動(dòng)定時(shí)器1*/ET0=1;/*允許定時(shí)器中斷*/EA=1;for(;;){}}

voidclk_int(void)interrupt1using0{TR0=0;/*關(guān)閉定時(shí)器0*/TH0=0xF8;/*裝載級(jí)數(shù)初值*/TL0=0x30;TR0=1;/*啟動(dòng)定時(shí)器1*/P10=!P10;}編寫(xiě)定時(shí)器中斷服務(wù)程序,使P1.0引腳上輸出周期為4ms,占空比為1:1的方波。晶振12MHz。2.551單片機(jī)串行口C語(yǔ)言編程一、串行口查詢(xún)方式程序編寫(xiě)方法設(shè)串行口數(shù)據(jù)傳送的波特率為4800,晶振11.0592MHz。采用查詢(xún)方式,接收到數(shù)據(jù)后,立即發(fā)送。#include<reg51.h>voidinit_serialcomm(void){SCON=0x50;//8N1TMOD|=0x20;//定時(shí)器設(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ù)程序編寫(xiě)方法設(shè)串行口數(shù)據(jù)傳送的波特率為4800,編寫(xiě)串口接收中斷服務(wù)程序。串口接收到數(shù)據(jù)后,立即通過(guò)串口發(fā)送出去。#include<reg51.h>voidinit_serialcomm(void){SCON=0x50;//8N1TMOD|=0x20;//定時(shí)器設(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語(yǔ)言編程方法xdata片外數(shù)據(jù)存儲(chǔ)區(qū)(64KB)由MOVX@DPTR訪(fǎng)問(wèn),值域0~65535charxdatacom;com=0x01;charxdatacom;com=0x01;MOVDPTR,#0x0000MOVA,#0x01MOVX@DPTR,AC語(yǔ)言程序匯編程序如何確定DPTR值?一、C51指針類(lèi)型1、基于存儲(chǔ)器的指針指針?biāo)赶虻牡刂吩诰幾g時(shí)確定。charxdatacom;com=0x01;2、通用指針三字節(jié)組成。第一個(gè)字節(jié)為:指針類(lèi)型第二和第三字節(jié)為:16位地址高8位和低8位。通用指針的形式為:#defineXBYTE((char*)0x20000L)指向xdata,偏移量為0的通用指針指針類(lèi)型:1為idata,2為xdata,3為pdata,4為data,5為code二、通用指針例:將常數(shù)0x41寫(xiě)入地址為0x8057的外部數(shù)據(jù)存儲(chǔ)器#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幾類(lèi)重要的庫(kù)函數(shù)C51提供了豐富的庫(kù)函數(shù)資源,包括大量的關(guān)于I/O操作、內(nèi)存分配、字符串操作、據(jù)類(lèi)型轉(zhuǎn)換、數(shù)學(xué)計(jì)算等函數(shù)庫(kù)。它們是以執(zhí)行代碼的形式出現(xiàn),供用戶(hù)在連接定位時(shí)用。在用預(yù)處理器命令#include包含相應(yīng)的頭文件后,就可以在程序中使用這些函數(shù)。一、硬件地址定義頭文件reg5x.h定義了特殊功能寄存器的地址。在文件開(kāi)頭首先要包含該文件。/*BYTERegister*/sfrP0=0x80;sfrP1=0x90;sfrP2=0xA0;sfrP3=0xB0;sfrPSW=0xD0;sfrACC=0xE0;sfrB=0xF0;sfrSP=0x81;sfrDPL=0x82;這個(gè)庫(kù)中提供的是一些用匯編語(yǔ)言編寫(xiě)的函數(shù)。用匯編語(yǔ)言編寫(xiě)非常直接簡(jiǎn)單且目代碼很短,而用C51編寫(xiě)則代碼很長(zhǎng)。這些函數(shù)主要有:_crol_/_cror_無(wú)符號(hào)字符型變量左/右移位函數(shù)_irol_/_iror_無(wú)符號(hào)整型變量左/右移位函數(shù)_lrol_/_lror_無(wú)符號(hào)長(zhǎng)整型變量左/右移位函數(shù)_nop_空操作函數(shù)_testbit_位測(cè)試函數(shù)一、內(nèi)部函數(shù)庫(kù)intrins.h#inclucle<intrins.h>voidmain(){ unsignedinty;

y=0x00ff;

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

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論