單片機C語言教程(六)

2021-01-08 電子產品世界

  如果省略存儲器類型,系統則會按編譯模式SMALL,COMPACT或LARGE所規定的默認存儲器類型去指定變量的存儲區域。無論什麼存儲模式都可以聲明變量在任何的8051存儲區範圍,然而把最常用的命令如循環計數器和隊列索引放在內部數據區可以顯著的提高系統性能。還有要指出的就是變量的存儲種類與存儲器類型是完全無關的。
  SMALL存儲模式把所有函數變量和局部數據段放在8051系統的內部數據存儲區這使訪問數據非常快,但SMALL存儲模式的地址空間受限。在寫小型的應用程式時,變量和數據放在data內部數據存儲器中是很好的因為訪問速度快,但在較大的應用程式中data區最好只存放小的變量、數據或常用的變量(如循環計數、數據索引),而大的數據則放置在別的存儲區域。
  COMPACT存儲模式中所有的函數和程序變量和局部數據段定位在8051系統的外部數據存儲區。外部數據存儲區可有最多256位元組(一頁),在本模式中外部數據存儲區的短地址用@R0/R1。
  LARGE存儲模式所有函數和過程的變量和局部數據段都定位在8051系統的外部數據區,外部數據區最多可有64KB,這要求用DPTR數據指針訪問數據。

之前提到簡單提到sfr,sfr16,sbit定義變量的方法,下面我們再來仔細看看。
  sfr和sfr16可以直接對51單片機的特殊寄存器進行定義,定義方法如下:
  sfr 特殊功能寄存器名= 特殊功能寄存器地址常數;
  sfr16 特殊功能寄存器名= 特殊功能寄存器地址常數;
我們可以這樣定義AT89C51的P1口:
  sfr P1 = 0x90; //定義P1 I/O口,其地址90H
  

sfr關鍵字後面是一個要定義的名字,可任意選取,但要符合標識符的命名規則,名字最好有一定的含義如P1口可以用P1為名,這樣程序會變的好讀好多。等號後面必須是常數,不允許有帶運算符的表達式,而且該常數必須在特殊功能寄存器的地址範圍之內(80H-FFH),具體可查看附錄中的相關表。sfr是定義8位的特殊功能寄存器而sfr16則是用來定義16位特殊功能寄存器,如8052的T2定時器,可以定義為:
    sfr16 T2 = 0xCC; //這裡定義8052定時器2,地址為T2L=CCH,T2H=CDH
用sfr16定義16位特殊功能寄存器時,等號後面是它的低位地址,高位地址一定要位於物理低位地址之上。注意的是不能用於定時器0和1的定義。
  sbit可定義可位尋址對象。如訪問特殊功能寄存器中的某位。其實這樣應用是經常要用的如要訪問P1口中的第2個引腳P1.1。我們可以照以下的方法去定義:
(1)sbit 位變量名=位地址
  sbit P1_1 = Ox91;
這樣是把位的絕對地址賦給位變量。同sfr一樣sbit的位地址必須位於80H-FFH之間。
(2)Sbit 位變量名=特殊功能寄存器名^位位置
sft P1 = 0x90;
  sbit P1_1 = P1 ^ 1; //先定義一個特殊功能寄存器名再指定位變量名所在的位置
當可尋址位位於特殊功能寄存器中時可採用這種方法
(3)sbit 位變量名=字節地址^位位置
  sbit P1_1 = 0x90 ^ 1;
  這種方法其實和2是一樣的,只是把特殊功能寄存器的位址直接用常數表示。
  在C51存儲器類型中提供有一個bdata的存儲器類型,這個是指可位尋址的數據存儲器,位於單片機的可位尋址區中,可以將要求可位錄址的數據定義為bdata,如:
unsigned char bdata ib; //在可位錄址區定義ucsigned char類型的變量ib
int bdata ab[2]; //在可位尋址區定義數組ab[2],這些也稱為可尋址位對象
sbit ib7=ib^7 //用關鍵字sbit定義位變量來獨立訪問可尋址位對象的其中一位
sbit ab12=ab[1]^12;
  操作符"^"後面的位位置的最大值取決於指定的基址類型,char0-7,int0-15,long0-31。
下面我們用上一課的電路來實踐一下這一課的知識。同樣是做一下簡單的跑馬燈實驗,項目名為RunLED2。程序如下:

sfr P1 = 0x90; //這裡沒有使用預定義文件,
sbit P1_0 = P1 ^ 0; //而是自己定義特殊寄存器
sbit P1_7 = 0x90 ^ 7; //之前我們使用的預定義文件其實就是這個作用
sbit P1_1 = 0x90 ^ 1; //這裡分別定義P1埠和P10,P11,P17引腳

void main(void)
{
unsigned int a;
unsigned char b;
do{
for (a=0;a<50000;a++);
P1_0 = 0; //點亮P1_0
for (a=0;a<50000;a++);
P1_7 = 0; //點亮P1_7
for (b=0;b<255;b++)
{
for (a=0;a<10000;a++);
P1 = b; //用b的值來做跑馬燈的花樣
}
P1 = 255; //熄滅P1上的LED
for (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);
}

相關焦點

  • 單片機c語言教程:建立你的第一個KeilC51項目
    隨著單片機技術的不斷發展,以單片機C語言為主流的高級語言也不斷被更多的單片機愛好者和工程師所喜愛。使用C51肯定要使用到編譯器,以便把寫好的C程序編譯為機器碼,這樣單片機才能執行編寫好的程序。
  • 單片機c語言教程:C51變量
    存儲器類型的說明就是指定該變量在單片機c語言硬體系統中所使用的存儲區域,並在編譯時準確的定位。表6-1中是KEIL uVision2所能認別的存儲器類型。注意的是在AT89c51晶片中RAM只有低128位,位於80H到FFH的高128位則在52晶片中才有用,並和特殊寄存器地址重疊。
  • 51單片機C語言延時函數
    以某晶振為12MHz的單片機為例,晶振為12MHz即一個機器周期為1us。>{unsigned char i,j,k;for(i=5;i>0;i--)for(j=4;j>0;j--)for(k=248;k>0;k--);} 51單片機相關文章
  • 單片機C語言程序設計:LED 模擬交通燈
    =10) return; //閃爍 5 次Flash_Count=0;Operation_Type=3; break; c語言相關文章:c語言教程
  • C語言教程
    ,又具有彙編語言的特點。2.C語言教程--C語言有哪些特點?  編輯、編譯、連接、運行一個C語言程序的具體過程如下:  (1)編輯源程序,完成之後將源程序以擴展名.c存檔。  (2)對源程序進行編譯,即將源程序轉換為擴展名為.obj的二進位代碼。
  • PIC單片機C語言程序設計(8)
    即可用MPLAB IDE7.40 對PIC 單片機建立彙編語言或C 語言的源程序、創建項目(project)、對源程序進行彙編(使用彙編語言時)或編譯(使用C 語言時),彙編或編譯通過後,會生成目標碼。hex 文件。有了目標碼。hex 文件,就可對PIC 單片機編程(燒寫)和對源程序進行模擬調試了。
  • 單片機c語言教程:C51運算符和表達式(指針和地址運算符)
    指針是單片機C語言中一個十分重要的概念,也是學習單片機C語言中的一個難點。對於指針將會在第九課中做詳細的講解。在這裡我們先來了解一下單片機C語言中供給的兩個專門用於指針和地址的運算符:本文引用地址:http://www.eepw.com.cn/article/170885.htm* 取內容 取地址取內容和地址的一般形式分別為:變量 = * 指針變量 指針變量 = 目標變量取內容運算是將指針變量所指向的目標變量的值賦給左邊的變量;取地址運算是將目標變量的地址賦給左邊的變量
  • 單片機C語言延時分析
    標準的C語言中沒有空語句。但在單片機的C語言編程中,經常需要用幾個空指令產生短延時的效果。這在彙編語言中很容易實現,寫幾個nop就行了。
  • 單片機C語言精確延時值的計算
    關於單片機C語言的精確延時,網上很多都是大約給出延時值沒有準確那值是多少,也就沒有達到精確高的要求,而51hei給出的本函數克服了以上缺點,能夠精確計數出要延時值且精確達到1us,本舉例所用CPU為STC12C5412系列12倍速的單片機,只要修改一下參數值其它系例單片機也通用
  • 單片機基本結構及C語言編程基礎
    RXD、TXD、INT0、INT1、T0、T1   單片機內部I/O部件:(所為學習單片機,實際上就是編程控制以下I/O部件,完成指定任務) 1、 四個8位通用I/O埠,對應引腳P0、P1、P2和P3; 2、 兩個16位定時計數器;(TMOD,TCON,TL0,TH0,TL1,TH1) 3、 一個串行通信接口;(SCON,SBUF) 4、 一個中斷控制器;(
  • 51單片機教程之基礎編(基於C語言)
    很多初學者有很多的疑惑,我究竟是先學C語言,還是彙編語言?其實我告訴你,本人認為,先學C語言!為什麼呢?C語言是目前使用最廣泛的中級語言,就連現在的windows7也是C語言編寫的,C語言易讀性好,無需對單片機內部結構十分熟悉即會編程,可移植性高,便於維護。C語言只有32個關鍵字,9種控制語句,而且編譯器提供了很多函數庫,使用十分方便。
  • PIC單片機C語言編程教程(1)
    > 語言來開發單片機系統軟體最大的好處是編寫代碼效率高、軟體調試直觀、維護升級方便、代碼的重複利用率高、便於跨平臺的代碼移植等等,因此 C 語言編程在單片機系統設計中已得到越來越廣泛的運用。寫單片機的 C 程序最關鍵的一點是單片機內的資源非常有限,控制的實時性要求又很高,因此,如果沒有對單片機體系結構和硬體資源作詳盡的了解,以筆者的愚見認為是無法寫出高質量實用的 C 語言程序。
  • C語言程序設計教程
    導讀:C語言是一門通用的計算機程式語言,應用非常得廣泛,在計算機、單片機以及工業上都有的莫大的貢獻,今天我們來學習如何進行C語言程序設計。
  • 單片機提高C語言代碼效率的方法
    單片機的ROM和RAM的空間都很有限,當您編程時遇到單片機的ROM和RAM的不夠用的時候,或者您的程序要求較高的執行速度時,我們就得面對解決代碼效率問題了。如何提高代碼效率?現筆者以一個LED閃爍的程序為例與您探討。
  • c語言入門教程
    它由美國貝爾研究所的D.M.Ritchie於1972年推出,它可以作為工作系統設計語言,編寫系統應用程式。它的應用範圍廣泛,具備很強的數據處理能力,不僅僅是在軟體開發上,而且各類科研都需要用到C語言,適於編寫系統軟體,三維,二維圖形和動畫,具體應用比如單片機以及嵌入式系統開發。
  • 單片機c語言教程:C51數據類型
    每寫一個程序,總離不開數據的應用,在學習 c51 語言的過程中掌握理解數據類型也是 很關鍵的。先看表 3-1,表中列出了 KEIL uVision2 單片機c語言編譯器所支持的數據類型。在標準C語言中基本的數據類型為 char,int,short,long,float 和 double,而在c51編譯器中int 和 short 相同,float 和 double 相同,這裡就不列出說明了。
  • 單片機C語言教程(一)
    使用C語言肯定要使用到C編譯器,以便把寫好的C程序編譯為機器碼,這樣單片機才能執行編寫好的程序。KEIL uVISION2是眾多單片機應用開發軟體中優秀的軟體之一,它支持眾多不同公司的MCS51架構的晶片,它集編輯,編譯,仿真等於一體,同時還支持,PLM,彙編和C語言的程序設計,它的界面和常用的微軟VC++的界面相似,界面友好,易學易用,在調試程序,軟體仿真方面也有很強大的功能。因此很多開發51應用的工程師或普通的單片機愛好者,都對它十分喜歡。
  • 單片機C語言教程-基礎語句
    C語言入門之基礎語句  從程序流程的角度來看,程序可以分為三種基本結構,即順序結構、分支結構、循環結構。這三種基本結構可以組成所有的各種複雜程序。c語言提供了多種語句來實現這些程序結構。
  • 51單片機C語言教程(四) 數據類型
    先來簡單說說C語言的標識符和關鍵字。標識符是用來標識源程序中某個對象的名字的,這些對象可以是語句、數據類型、函數、變量、數組等等。C語言是大小字敏感的一種高級語言,如果我們要定義一個定時器1,可以寫做"Timer1",如果程序中有"TIMER1",那麼這兩個是完全不同定義的標識符。
  • 單片機中C語言延時函數
    單片機C語言延時程序計算2009-11-02 22:15單片機C語言延時程序用C語言寫出來程序非常的簡練,它是一種模塊化的語言,一種比彙編更高級的語言,但是就是這樣一種語言也還是有它不足之處:它的延時很不好控制