C51單片機頭文件和啟動文件

2021-01-17 電子產品世界

//特殊寄存器的字節地址和位地址,sfr定義字節變量、sbit定義位變量,用通俗名作為變量名,並賦地址值,從而用名稱來使用這些特殊寄存器。

本文引用地址:

http://www.eepw.com.cn/article/201611/318419.htm

//定義了一些外部函數,在C51單片機編程中,頭文件INTRINS.H的函數使用起來,就會讓你像在用彙編時一樣簡便.

/*--
REG51.H

Header file for generic 80C51 and 80C31 microcontroller.
Copyright (c) 1988-2002 Keil Elektronik GmbH and Keil Software, Inc.
All rights reserved.
--*/

#ifndef __REG51_H__
#define __REG51_H__

/* BYTE Register */
sfr P0 = 0x80;
sfr P1 = 0x90;
sfr P2 = 0xA0;
sfr P3 = 0xB0;
sfr PSW = 0xD0;
sfr ACC = 0xE0;
sfr B = 0xF0;
sfr SP = 0x81;
sfr DPL = 0x82;
sfr DPH = 0x83;
sfr PCON = 0x87;
sfr TCON = 0x88;
sfr TMOD = 0x89;
sfr TL0 = 0x8A;
sfr TL1 = 0x8B;
sfr TH0 = 0x8C;
sfr TH1 = 0x8D;
sfr IE = 0xA8;
sfr IP = 0xB8;
sfr SCON = 0x98;
sfr SBUF = 0x99;


/* BIT Register */
/* PSW */
sbit CY = 0xD7;
sbit AC = 0xD6;
sbit F0 = 0xD5;
sbit RS1 = 0xD4;
sbit RS0 = 0xD3;
sbit OV = 0xD2;
sbit P = 0xD0;

/* TCON */
sbit TF1 = 0x8F;
sbit TR1 = 0x8E;
sbit TF0 = 0x8D;
sbit TR0 = 0x8C;
sbit IE1 = 0x8B;
sbit IT1 = 0x8A;
sbit IE0 = 0x89;
sbit IT0 = 0x88;

/* IE */
sbit EA = 0xAF;
sbit ES = 0xAC;
sbit ET1 = 0xAB;
sbit EX1 = 0xAA;
sbit ET0 = 0xA9;
sbit EX0 = 0xA8;

/* IP */
sbit PS = 0xBC;
sbit PT1 = 0xBB;
sbit PX1 = 0xBA;
sbit PT0 = 0xB9;
sbit PX0 = 0xB8;

/* P3 */
sbit RD = 0xB7;
sbit WR = 0xB6;
sbit T1 = 0xB5;
sbit T0 = 0xB4;
sbit INT1 = 0xB3;
sbit INT0 = 0xB2;
sbit TXD = 0xB1;
sbit RXD = 0xB0;

/* SCON */
sbit SM0 = 0x9F;
sbit SM1 = 0x9E;
sbit SM2 = 0x9D;
sbit REN = 0x9C;
sbit TB8 = 0x9B;
sbit RB8 = 0x9A;
sbit TI = 0x99;
sbit RI = 0x98;

#endif

/*--
INTRINS.H

Intrinsic functions for C51.
Copyright (c) 1988-2002 Keil Elektronik GmbH and Keil Software, Inc.
All rights reserved.
--*/

#ifndef __INTRINS_H__
#define __INTRINS_H__

extern void _nop_ (void);
extern bit _testbit_ (bit);
extern unsigned char _cror_ (unsigned char, unsigned char);
extern unsigned int _iror_ (unsigned int, unsigned char);
extern unsigned long _lror_ (unsigned long, unsigned char);
extern unsigned char _crol_ (unsigned char, unsigned char);
extern unsigned int _irol_ (unsigned int, unsigned char);
extern unsigned long _lrol_ (unsigned long, unsigned char);
extern unsigned char _chkfloat_(float);

#endif

關於sfr、sbit://如同int、char...

sfr 似乎不是標準C 語言的關鍵字,而是Keil 為能直接訪問80C51 中的SFR 而提供了一個新的關鍵詞,其用法是:sfrt 變量名=地址值。

例:sfr P1 = 0x90;

這樣的一行即定義P1 與地址0x90 對應,P1 口的地址就是0x90.

SFR的定義在頭文件reg51.h或reg52.h中。

在C51裡,利用sbit可訪問RAM中可尋址位或SFR中可尋址位。

如果直接寫P1.0,C 編譯器並不能識別,而且P1.0 也不是一個合法的C語言變量名,所以得給它另起一個名字,比如P1_0,可是P1_0 是不是就是P1.0呢?C 編譯器可不這麼認為,所以必須給它們建立聯繫,這裡使用了Keil C的關鍵字sbit 來定義,sbit 的用法有三種:

第一種方法:sbit 位變量名=地址值

第二種方法:sbit 位變量名=SFR 名稱^變量位地址值

第三種方法:sbit 位變量名=SFR 地址值^變量位地址值

例如,定義P1 中的P1.1腳可以用以下三種方法:

sbit P1_1=0x92 (1)說明:0x92是P1.1 的位地址值

sbit P1_1=P1^1 (2)說明:其中P1必須先用sfr 定義好

sbit P1_1=0x90^2 (3)說明:0x90 就是P1的地址值

因此這裡用sfr P1_0=P1^0;就是定義用符號P1_0 來表示P1.0 引

sfr是定義8位(範圍0~255)的特殊功能寄存器而sfr16則是用來定義16位特殊功能寄存器,如8052的T2定時器,可以定義為:
sfr16T2=0xCC;//這裡定義8052定時器2,地址為T2L=CCH,T2H=CDH

在KEIL中,彙編是從ORG H開始啟動,那麼它在C51中是如何啟動MAIN()函數的呢?實際上是C51中有一個啟啟動程序STARTUP.A51,它總是和C程序一起編譯和連結的.

啟動文件STARTUP.A51中包含目標板啟動代碼,可在每個project中加入這個文件,只要復位,則該文件立即執行,其功能包括:

z 定義內部RAM大小、外部RAM大小、可重入堆棧位置

z 清除內部、外部或者以此頁為單元的外部存儲器

z 按存儲模式初使化重入堆棧及堆棧指針

z 初始化8051硬體堆棧指針

z 向main( )函數交權

開發人員可修改以下數據從而對系統初始化

常數名 意義

IDATALEN 待清內部RAM長度

XDATA START 指定待清外部RAM起始地址

XDATALEN 待清外部RAM長度

IBPSTACK 是否小模式重入堆棧指針需初始化標誌,1為需要。預設為0

IBPSTACKTOP 指定小模式重入堆棧頂部地址

XBPSTACK 是否大模式重入堆棧指針需初始化標誌,預設為0

XBPSTACKTOP 指定大模式重入堆棧頂部地址

PBPSTACK 是否Compact重入堆棧指針,需初始化標誌,預設為0

PBPSTACKTOP 指定Compact模式重入堆棧頂部地址

PPAGEENABLE P2初始化允許開關

PPAGE 指定P2值

PDATASTART 待清外部RAM頁首址

經常可能需要修改的地方:(紅色)

XDATASTART EQU 0H ; the absolute start-address of XDATA memory

XDATALEN EQU 0H ; the length of XDATA memory in bytes.

XBPSTACK EQU 0 ; set to 1 if large reentrant is used.

XBPSTACKTOP EQU 0FFFFH+1; set top of stack to highest location+1.

PPAGEENABLE EQU 0 ; set to 1 if pdata object are used.

PPAGE EQU 0 ; define PPAGE number.

當在kiel C中新建項目時,會問:Copy standard 8051 Starup Code to Project Forder and add file to Project?翻譯為:8051啟動代碼到項目並和添加文件到項目?其實無論您選是還是否,您的代碼中都將包含該文件。該文件的作用是 初始化 內外部 RAM使其清零,另外還初始化SP等。如果上述提示框您選否,對哪些RAM清零將採用默認的方式。如果您想改變RAM清零區域(假如希望復位時某些RAM不被清零時會很有用。),您可以選是,這樣該文件的一個副本將添加到您的項目,您可以根據需要改寫此文件。其他SP,SAMLL/COMPACT、LARGE模式的重入函數的堆棧和指針的初始化等和RAM的道理是一樣的。

相關焦點

  • 【單片機筆記】keil c51編譯環境不能跳轉函數的解決辦法
    #include <reg52.h>//頭文件#define uchar unsigned char//宏定義#define uint unsigned int//宏定義uchar shi,fen,nshi,nfen,ma 發表於 2020-12-17
  • 單片機下載文件:HEX文件和BIN文件的區別
    單片機程序寫好之後,我們都要把程序下載到單片機的內存中,單片機才會按照程式設計師的邏輯執行命令實現功能。之前也講過下載單片機的幾種方式,比如ISP下載,JTAG下載,下載文件的格式最常見的是hex文件,這個格式大家都是知道的,還有一種bin文件是單片機的下載文件。下面介紹這兩種格式的區別。本文引用地址:http://www.eepw.com.cn/article/201901/396291.htm  HEX文件和BIN文件是我們經常碰到的2種文件格式。
  • 單片機c語言教程:C51數據類型
    每寫一個程序,總離不開數據的應用,在學習 c51 語言的過程中掌握理解數據類型也是 很關鍵的。先看表 3-1,表中列出了 KEIL uVision2 單片機c語言編譯器所支持的數據類型。在標準C語言中基本的數據類型為 char,int,short,long,float 和 double,而在c51編譯器中int 和 short 相同,float 和 double 相同,這裡就不列出說明了。
  • 單片機C語言編程中reg52.h頭文件的作用
    前言:本人出於愛好將不定期發送電氣電工、前端、單片機等內容,可能會無法顧及關注我的所有人需求,請大家按需收藏自己想要知識,有用則收之,無用則棄之,不系統更新,僅供零星學習O(∩_∩)O哈哈~在代碼的開頭中引用頭文件,其作用就是將這個頭文件中的全部內容放到引用頭文件的位置處,也就是用include<reg52.h>和 34;reg52.h&include<reg51.h>和34;reg52.h"的區別 reg51內部規定的SFR寄存器的地址與INTEL
  • 51單片機介紹及頭文件
    上次買晶片無意間發現STC也有8個腳的單片機,在我印象中貌似只有ATMEAG有8隻腳的。於是乎買了幾個回來,今天下了手冊研究以下。
  • Stm32單片機開發KEIL啟動文件彙編語言詳解
    文章目錄簡介啟動文件彙編代碼相關指令堆棧空間的定義初始化中斷向量表復位中斷函數中斷函數的弱(WEAK)聲明用戶棧和堆初始化簡介我們在做單片機編程的時候,大部分都是用KEIL自帶的啟動文件來使程序進入C語言main函數,然後進行C語言編程開發的工作。那麼這個啟動文件到底做了什麼呢?相信朋友們肯定和我一樣好奇,想弄明白啟動文件到底都幹了些什麼。
  • 單片機keil 常見問題
    一、混合編程1、模塊內接口:使用如下標誌符:#pragma asm彙編語句#pragma endasm注意:如果在c51程序中使用了彙編語言
  • 單片機c語言教程:建立你的第一個KeilC51項目
    隨著單片機技術的不斷發展,以單片機C語言為主流的高級語言也不斷被更多的單片機愛好者和工程師所喜愛。使用C51肯定要使用到編譯器,以便把寫好的C程序編譯為機器碼,這樣單片機才能執行編寫好的程序。
  • 圖形化編程玩51單片機(十三)簡單實用門鈴實驗
    特別提示:從本期起,將原來的文章標題「零基礎學51單片機」更改為「圖形化編程玩51單片機」本期實驗:模擬簡易門鈴;且有關閉門鈴功能。實驗步驟:1,首先打開上次收藏的「c51代碼生成器」在線編譯器網頁。只要按照圖一裡面的步驟搭建就都可以完成。如圖一所示2,搭建好的積木點擊保存並複製代碼。3,打開keil編譯器軟體,在文本框裡粘貼,生成hex文件。
  • 圖形化編程玩51單片機(十八)-電子廣告顯示屏
    實驗步驟:1,首先打開上次收藏的「c51代碼生成器」在線編譯器網頁。只要按照圖一裡面的步驟搭建就都可以完成(不清楚的可以後臺留言諮詢)。3,打開keil編譯器軟體,在文本框裡粘貼,生成hex文件。4,打開燒錄軟體,找到剛剛的hex文件,下載到單片機。
  • C51單片機延時程序原始碼
    C51單片機(STC11L32/48/60XE)的延時程序:void delay_us(U8 us){delay_ms(250);delay_ms(250);delay_ms(250);s--;}while(s);}其中_nop_()定義在intrins.h頭文件中
  • 51單片機玩轉物聯網基礎篇01-開發環境搭建
    前言上至航天,下至兒童玩具,凡事沾一點智能的東西,都離不開單片機的身影......,本文開始,我們學習STC89C52單片機,這款單片機屬於8051系列單片機,51單片機作為入門級單片機不僅在教學實驗中應用廣泛,在實際項目中應用亦是十分廣泛。
  • 燒錄Hex文件到Silabs單片機
    通常我們會用燒錄器EC5或者EC6在Silabs IDE下載程序但是有很多人會比較習慣用Keil生成Hex文件再燒錄其實這也是可以的Silabs也提供了下載的工具
  • 單片機燒錄用的hex文件,長什麼樣子?
    含有單片機的電子產品在量產的時候會用到.hex文件或者.bin。hex是十六進位的,包含地址信息和數據信息,而bin文件是二進位的,只有數據而不包含地址。任何文件都有一定的格式規範,hex文件同樣具有完整的格式規範。今天和大家分享一下,hex是如何解析的。
  • extern和頭文件
    所以想把所有的文件整理成條理清晰,功能獨立的一個個模塊。而原先的程序當中,每一個簡單的源文件都包涵了十幾個頭文件,因為一個頭文件中包涵了其它的幾個頭文件,而其它的頭文件又包涵了幾個頭文件。也許對於某一個源文件來說,這個頭文件有必要包涵另外的幾個頭文件,可對於另外一些源文件來說卻沒有必要。而這樣的結果就是編譯連接後,每個源文件下都包涵了十幾個頭文件,最後成為了一張蜘蛛網,你連減都減不掉。
  • 圖形化編程玩51單片機(十四)模擬工廠裡產品掃描計數器實驗一
    【使用說明】:選用51單片機實驗板上的S2和S3鍵。其中S2用於模擬代替掃描開關,當有產品經過時,會使S2送出低電平(本程序中使用手按下S2來模擬)S2每按一下,便會使數碼管上的計數器加一,達到一萬的時候全部清零,重新計數。
  • 單片機原理|C51程序設計基礎複習題
    A、idata B、code C、pdata D、xdata11 單片機能直接運行的程序叫( C)。A、源程序 B、彙編程序 C、目標程序 D、編譯程序12 C51編譯器提供了一組宏定義來對code、data、pdata和xdata空間進行絕對尋址,其定義的頭文件為( B)。
  • 從零開始學習51單片機(八)獨立按鍵S1實驗3:一鍵控制N個設備
    上期內容回顧:從零開始學習51單片機(六)獨立按鍵S1實驗1:按下S1點亮LED1 鬆手熄滅LED1從零開始學習51單片機(七)獨立按鍵實驗2:一鍵控制兩個設備根據我們進一步的學習,就會發現我們身邊好多設備其實都是可以用單片機來控制的
  • keil4中頭文件路徑設置的方法匯總
    keil是從project文件所在目錄找頭文件,頭文件的相對目錄是相對.uvproj文件的。目前我的個人習慣是建立:Doc、Listing、Output、Project、User幾個文件夾Doc放文檔和readmeListing設置為配置中的清單選項卡輸出文件夾Output設置為輸出文件夾Project放建立的工程文件User放自己寫的.c和.h(這部分後期可能做更改)還可以有OS
  • 第2課 keil軟體及工程文件的建立
    單片機系統設計主要包括硬體設計和軟體設計,對於單片機初者來說主要在於軟體的學習,也就是程序設計,等大家程序這塊掌握得差不多了,再去結合具體的項目學習做硬體,最終掌握單片機系統設計的方法。