C51单片机头文件和启动文件 原标题:C51单片机头文件和启动文件 STARTUP.A51// . 清理RAM.设置堆栈等.即执行完start.a51后跳转到.c文件的main函数 <reg51.h> //特殊寄存器的字节地址和位地址,定义字节变量、sbit定义位变量,用通俗名作为变量名,并赋地址值,从而用名称来使用这些特殊寄存器。 <intrins.h> //定义了一些外部函数,在中,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 定时器,可以定义为: sfr16 T2 = 0xCC; //这里定义8052 ,地址为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 an dd file to Project? 翻译为:8051启动代码到项目并和添加文件到项目? 其实无论您选是还是否,您的代码中都将包含该文件。 该文件的作用是 初始化 内外部 RAM使其清零,另外还初始化SP等。 如果上述提示框您选否,对哪些RAM清零将采用默认的方式。 如果您想改变RAM清零区域(假如希望复位时某些RAM不被清零时会很有用。),您可以选是,这样该文件的一个副本将添加到您的项目,您可以根据需要改写此文件。 其他SP,SAMLL/COMPACT、LARGE模式的重入函数的堆栈和指针的初始化等和RAM的道理是一样的。 原文链接:返回搜狐,查看更多 责任编辑:
2024最新激活全家桶教程,稳定运行到2099年,请移步至置顶文章:https://sigusoft.com/99576.html
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。 文章由激活谷谷主-小谷整理,转载请注明出处:https://sigusoft.com/72324.html