日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

當(dāng)前位置:首頁 > 單片機 > 單片機
[導(dǎo)讀]  變量就是一種在程序執(zhí)行過程中其值能不斷變化的量。要在程序中使用變量必須先用標識符作為變量名,并指出所用的數(shù)據(jù)類型和存儲模式,這樣編譯系統(tǒng)才能為變量分配相應(yīng)的存儲空間。定義一個變量的格式如下:  [存

  變量就是一種在程序執(zhí)行過程中其值能不斷變化的量。要在程序中使用變量必須先用標識符作為變量名,并指出所用的數(shù)據(jù)類型和存儲模式,這樣編譯系統(tǒng)才能為變量分配相應(yīng)的存儲空間。定義一個變量的格式如下:
  [存儲種類] 數(shù)據(jù)類型 [存儲器類型] 變量名表
  在定義格式中除了數(shù)據(jù)類型和變量名表是必要的,其它都是可選項。存儲種類有四種:自動(auto)、外部(extern)、靜態(tài)(static)和寄存器(register),缺省類型為自動(auto)。這些存儲種類的具體含義和使用方法,將在第七課《變量的存儲》中進一步進行學(xué)習(xí)。
  而這里的數(shù)據(jù)類型則是和我們在第四課中學(xué)習(xí)到的名種數(shù)據(jù)類型的定義是一樣的。說明了一個變量的數(shù)據(jù)類型后,還可選擇說明該變量的存儲器類型。存儲器類型的說明就是指定該變量在單片機c語言硬件系統(tǒng)中所使用的存儲區(qū)域,并在編譯時準確的定位。表6-1中是KEIL uVision2所能認別的存儲器類型。注意的是在AT89c51芯片中RAM只有低128位,位于80H到FFH的高128位則在52芯片中才有用,并和特殊寄存器地址重疊。

存儲器類型

說 明

data

直接訪問內(nèi)部數(shù)據(jù)存儲器(128字節(jié)),訪問速度最快

bdata

可位尋址內(nèi)部數(shù)據(jù)存儲器(16字節(jié)),允許位與字節(jié)混合訪問

idata

間接訪問內(nèi)部數(shù)據(jù)存儲器(256字節(jié)),允許訪問全部內(nèi)部地址

pdata

分頁訪問外部數(shù)據(jù)存儲器(256字節(jié)),用MOVX @Ri指令訪問

xdata

外部數(shù)據(jù)存儲器(64KB),用MOVX @DPTR指令訪問

code

程序存儲器(64KB),用MOVC @A+DPTR指令訪問

  如果省略存儲器類型,系統(tǒng)則會按編譯模式SMALL、COMPACT或LARGE所規(guī)定的默認存儲器類型去指定變量的存儲區(qū)域。無論什么存儲模式都能聲明變量在任何的8051存儲區(qū)范圍,然而把最常用的命令如循環(huán)計數(shù)器和隊列索引放在內(nèi)部數(shù)據(jù)區(qū)能顯著的提高系統(tǒng)性能。還有要指出的就是變量的存儲種類與存儲器類型是完全無關(guān)的。

  數(shù)據(jù)存儲模式
存儲模式?jīng)Q定了沒有明確指定存儲類型的變量,函數(shù)參數(shù)等的缺省存儲區(qū)域,共三種:
Small模式:所有缺省變量參數(shù)均裝入內(nèi)部RAM,優(yōu)點是訪問速度快,缺點是空間有限,只適用于小程序。
Compact模式:所有缺省變量均位于外部RAM區(qū)的一頁(256Bytes),具體哪一頁可由P2口指定,在STARTUP.A51文件中說明,也可用pdata指定,優(yōu)點是空間較Small為寬裕速度較Small慢,較large要快,是一種中間狀態(tài)。
large模式:所有缺省變量可放在多達64KB的外部RAM區(qū),優(yōu)點是空間大,可存變量多,缺點是速度較慢。
  提示:存儲模式在單片機c語言編譯器選項中選擇。

  之前提到簡單提到sfr,sfr16,sbit定義變量的方法,下面我們再來仔細看看。sfr和sfr16能直接對51單片機的特殊寄存器進行定義,定義方法如下:
sfr 特殊功能寄存器名= 特殊功能寄存器地址常數(shù);
sfr16 特殊功能寄存器名= 特殊功能寄存器地址常數(shù);
我們能這樣定義AT89c51的P1口

sfrP1=0x90;//定義P1I/O口,其地址90H

  sfr關(guān)鍵定后面是一個要定義的名字,可任意選取,但要符合標識符的命名規(guī)則,名字最好有一定的含義,如P1口能用P1為名,這樣程序會變的好讀好多。等號后面必須是常數(shù),不允許有帶運算符的表達式,而且該常數(shù)必須在特殊功能寄存器的地址范圍之內(nèi)(80H-FFH),具體可查看附錄中的相關(guān)表。sfr是定義8位的特殊功能寄存器,而sfr16則是用來定義16位特殊功能寄存器,如8052的T2定時器,能定義為:

sfr16T2=0xCC;//這里定義8052定時器2,地址為T2L=CCH,T2H=CDH

  用sfr16定義16位特殊功能寄存器時,等號后面是它的低位地址,高位地址一定要位于物理低位地址之上。注意的是不能用于定時器0和1的定義。

  sbit可定義可位尋址對象。如訪問特殊功能寄存器中的某位。其實這樣應(yīng)用是經(jīng)常要用的如要訪問P1口中的第2個引腳P1.1。我們能照以下的方法去定義:
(1)sbit 位變量名=位地址

sbitP1_1=0x91;

這樣是把位的絕對地址賦給位變量。同sfr一樣sbit的位地址必須位于80H-FFH之間。
(2)Sbit 位變量名=特殊功能寄存器名^位位置

sfrP1=0x90;sbitP1_1=P1^1;//先定義一個特殊功能寄存器名再指定位變量名所在的位置

  當(dāng)可尋址位位于特殊功能寄存器中時可采用這種方法
(3)sbit 位變量名=字節(jié)地址^位位置

sbitP1_1=0x90^1;

  這種方法其實和2是一樣的,只是把特殊功能寄存器的位址直接用常數(shù)表示。
  在單片機c語言存儲器類型中供給有一個bdata的存儲器類型,這個是指可位尋址的數(shù)據(jù)存儲器,位于單片機的可位尋址區(qū)中,能將要求可位錄址的數(shù)據(jù)定義為bdata,如:

unsignedcharbdataib;  //在可位錄址區(qū)定義ucsignedchar類型的變量ibintbdataab[2];      //在可位尋址區(qū)定義數(shù)組ab[2],這些也稱為可尋址位對象sbitib7=ib^7        //用關(guān)鍵字sbit定義位變量來獨立訪問可尋址位對象的其中一位sbitab12=ab[1]^12;

  操作符"^"后面的位位置的最大值取決于指定的基址類型,char0-7,int0-15,long0-31。
  

  下面我們用上一課的電路來實踐一下這一課的知識。同樣是做一下簡單的跑馬燈實驗,項目名為RunLED2。程序如下:

sfrP1=0x90;//這里沒有使用預(yù)定義文件,sbitP1_0=P1^0;//而是自己定義特殊寄存器sbitP1_7=0x90^7;//之前我們使用的預(yù)定義文件其實就是這個作用sbitP1_1=0x91;//這里分別定義P1端口和P10,P11,P17引腳voidmain(void){unsignedinta;unsignedcharb;do{for(a=0;a<50000;a++)P1_0=0;//點亮P1_0for(a=0;a<50000;a++)P1_7=0;//點亮P1_7for(b=0;b<255;b++){for(a=0;a<10000;a++)P1=b;//用b的值來做跑馬燈的花樣}P1=255;//熄滅P1上的LEDfor(b=0;b<255;b++){for(a=0;a<10000;a++)//P1_1閃爍P1_1=0;for(a=0;a<10000;a++)P1_1=1;}}while(1);}

Keil c51指針變量
單片機c語言支持一般指針(Generic Pointer)和存儲器指針(Memory_Specific Pointer).
1. 1. 一般指針
一般指針的聲明和使用均與標準C相同,不過同時還能說明指針的存儲類型,例如:

long*state;  //為一個指向long型整數(shù)的指針,而state本身則依存儲模式存放。char*xdataptr;//ptr為一個指向char數(shù)據(jù)的指針,而ptr本身放于外部RAM區(qū),以上的long,char等指針指向的數(shù)據(jù)可存放于任何存儲器中。

一般指針本身用3個字節(jié)存放,分別為存儲器類型,高位偏移,低位偏移量。
2. 2. 存儲器指針
基于存儲器的指針說明時即指定了存貯類型,例如:

chardata*str;//str指向data區(qū)中char型數(shù)據(jù)intxdata*pow;//pow指向外部RAM的int型整數(shù)。

這種指針存放時,只需一個字節(jié)或2個字節(jié)就夠了,因為只需存放偏移量。
3. 3. 指針轉(zhuǎn)換
即指針在上兩種類型之間轉(zhuǎn)化:
當(dāng)基于存儲器的指針作為一個實參傳遞給需要一般指針的函數(shù)時,指針自動轉(zhuǎn)化。
如果不說明外部函數(shù)原形,基于存儲器的指針自動轉(zhuǎn)化為一般指針,導(dǎo)致錯誤,因而請用“#include”說明所有函數(shù)原形。
能強行改變指針類型。

變量的存儲類別

一、static(

本站聲明: 本文章由作者或相關(guān)機構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內(nèi)容真實性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

嵌入式開發(fā)作為一種專業(yè)且技術(shù)密集型的領(lǐng)域,涵蓋了從硬件底層驅(qū)動、中間件到應(yīng)用層軟件開發(fā)等多個層面的工作,其所需的工具種類繁多,各有針對性,旨在提升開發(fā)效率、保證代碼質(zhì)量以及簡化調(diào)試過程。

關(guān)鍵字: 嵌入式開發(fā) keil

單片機內(nèi)部有很多的特殊功能寄存器,每個寄存器在單片機內(nèi)部都分配有唯一的地址,一般我們會根據(jù)寄存器功能的不同給寄存器賦予各自的名稱,當(dāng)我們需要在程序中操作這些特殊功能寄存器時,必須要在程序的最前面將這些名稱加以聲明,聲明的...

關(guān)鍵字: C51 數(shù)據(jù)類型 擴充定義

數(shù)據(jù)元(Data Element),也稱為數(shù)據(jù)元素,是用一組屬性描述其定義、標識、表示和允許值的數(shù)據(jù)單元,在一定語境下,通常用于構(gòu)建一個語義正確、獨立且無歧義的特定概念語義的信息單元。數(shù)據(jù)元可以理解為數(shù)據(jù)的基本單元,將若...

關(guān)鍵字: C51 數(shù)據(jù)類型

之后新建新的工程,添加.a文件就可以使用了,當(dāng)然也可以使用keil來添加,但是keil默認的是用.lab,需要自己配置一下文件屬性,改為lib文件即可。一半release sdk的時候用這種方式很關(guān)鍵的,畢竟自己的核心代...

關(guān)鍵字: keil 文件屬性 lib文件

▼點擊下方名片,關(guān)注公眾號▼歡迎關(guān)注【玩轉(zhuǎn)單片機與嵌入式】公眾號,回復(fù)關(guān)鍵字獲取更多免費資料?;貜?fù)【加群】,限時免費進入知識共享群;回復(fù)【3D封裝庫】,常用元器件的3D封裝庫;回復(fù)【電容】,獲取電容、元器件選型相關(guān)的內(nèi)容...

關(guān)鍵字: C51 MDK RealView

在Keil C51軟件中51單片機的中斷服務(wù)和外設(shè)驅(qū)動程序的開發(fā)

關(guān)鍵字: keil5 編譯 C51

Intel公司1980年推出了MCS-51系列單片機:集成 8位CPU、4K字節(jié)ROM、128字節(jié)RAM、4個8位并口、1個全雙工串行口、2個16位定時/計數(shù)器。尋址范圍64K,并有控制功能較強的布爾處理器。 80C5...

關(guān)鍵字: C51 KEIL 編程

c上標3下標5怎么算用計算機,c上標3下標5怎么算

關(guān)鍵字: C51 KEIL

DSP28335與AD7606通過SPI的串行數(shù)據(jù)交互

關(guān)鍵字: keil C
關(guān)閉