C51必读, Startup.A51作用

这里讲述一些初学者学习C51的一些误区和注意事项。高手的特别应用不包括在内。
   
C忌讳绝对定位
    常看见初学者要求使用_at_,这是一种谬误,把C当作ASM看待了。在C中变量的定位是编译器的事情,初学者只要定义变量和变量的作用域,编译器就把一个固定地址给这个变量。怎么取得这个变量的地址?要用指针。比如unsigned char data x;后,x的地址就是&x,你只要查看这个参数,就可以在程序中知道具体的地址了。所以俺一看见要使用绝对定位的人,第一印象就是:这大概是个初学者。

设置SP的问题
 
    原因和1差不对,编译器在把所有变量和缓冲区赋予地址后,自动把最后一个字节开始的地方,作为SP的开始位置,所以初学者是不必要去理会的。这体现C的优越性,很多事情C编译时候做了。

用C的主程序结构
 
#include <reg52.h>

void main(void)
{
   while(1);
}

    这是个最小的成功的C程序,包括头部文件和程序主体。
 
    头部文件的名词解释:引用的外部资源文件,这个文件包括了硬件信息和外部模块提供的可使用的函数和变量的说明。可以用文本方式打开reg52.h,仔细研究下,会有一些写程序的体会。

这样构成一个C项目
 
    在C中,常用项目来管理。项目一般分为两大块:C文件块和头部文件块。
 
    我们常把不同功能写在不同的C文件中,依靠项目的管理,最后把所有文件连接起来,这样就可以得到可以烧录的HEX文件或BIN文件。
 
    这些C文件中,有且只有唯一一个包括main()函数,和3)中一样的C文件。用头部文件把各个不同的C互相连接起来。一个C文件基本上要对应有一个H头部文件,这个H文件就包含本C文件中可以提供给外面使用的变量和函数,没有在H文件中列出的文件,可以算是该C文件的内部函数和变量,外部C不能使用。
 
例子:a.C:

unsigned char i;
unsigned char mWork;

void Test1(void)
{
    mWork++;
}

void Test2(void)
{
    i++;
}

a.h文件中:
extern unsigned char i;
extern void Test1(void);
 
这样主程序M.c中:
#include <reg52.h>  /*C编译器内部自带的H文件,使用<>*/

#include "a.h"  /*自定义的H文件,一般用""*/

void main(void)
{
    Test1();     /*使用a.c模块文件中的函数*/
    while(1){
        i++;    /*使用a.c模块文件中的变量*/
    }
}

51家族
 
    核心都是基于8031的,有很多在此核心上进行扩展,有的把程序存储器放在内部:89c(S)51..,有的增加了RAM:89c(S)52..,有的增加了一些专用硬件0C552...,有的改变时钟时序W77E58...。市面上现在常用的主要有ATMEL公司的AT89X系列,PHILIPS的P87(89)x,台湾WINBOND的w77(78)x系列,Cygnal的C8051Fx系列。

51单片机结构的C描述
 
    这里不讲51的具体结构,只是引导初学者快速理解51单片机的物理结构。寄存器和IO及其它硬件设备的地址名称,在相应的C头部文件中可以找到。51为reg51.h,52为reg52.h,以次类推,比如winbond的78E58就为w78e58.h这些H文件中的描述:
 
srf,定义一个8位的设备。
srf16,定义一个16位的设备。
sbit,定义一个位的设备。
用这些语句定义后,就可以在C中象汇编一样使用这些硬件设备,这是单片机应用比标准C特殊的地方,其它差别很少。

在51系列中data,idata,xdata,pdata的区别
 
     data:固定指前面0x00-0x7f的128个RAM,可以用acc直接读写的,速度最快,生成的代码也最小。
 
    idata:固定指前面0x00-0xff的256个RAM,其中前128和data的128完全相同,只是因为访问的方式不同。idata是用类似C中的指针方式 访问的。汇编中的语句为:mox ACC,@Rx.(不重要的补充:c中idata做指针式的访问效果很好)
 
    xdata:外部扩展RAM,一般指外部0x0000-0xffff空间,用DPTR访省?/P>

    pdata:外部扩展RAM的低256个字节,地址出现在A0-A7的上时读写,用movx ACC,@Rx读写。这个比较特殊,而且C51好象有对此BUG,建议少用。但也有他的优点,具体用法属于中级问题,这里不提。

startup.a51的作用
 
    和汇编一样,在C中定义的那些变量和数组的初始化就在startup.a51中进行,如果你在定义全局变量时带有数值,如unsigned char
data xxx=100;,那startup.a51中就会有相关的赋值。如果没有=100,startup.a51就会把他清0。(startup.a51==变量的初始化)。
 
    这些初始化完毕后,还会设置SP指针。对非变量区域,如堆栈区,将不会有赋值或清零动作。
 
    有人喜欢改startup.a51,为了满足自己一些想当然的爱好,这是不必要的,有可能错误的。比如掉电保护的时候想保存一些变量,但改startup.a51来实现是很笨的方法,实际只要利用非变量区域的特性,定义一个指针变量指向堆栈低部:0xff处就可实现,为什么还要去改?
 
    可以这么说:任何时候都可以不需要改startup.a51,如果你明白它的特性。

本文来自:我爱研发网(52RD.com) - R&D大本营
详细出处:
http://www.52rd.com/Blog/Archive_Thread.asp?SID=4954

### 回答1: 首先,A51是一种基于8051微控制器的汇编语言。在8051微控制器上编写程序时,可以使用汇编语言编写程序,并将其编译为二进制机器代码,然后将其烧录到芯片中。 startup.a51文件是8051微控制器启动代码的源文件,用于在8051芯片上运行汇编程序时初始化系统设置和设置寄存器。这个文件通常由芯片制造商提供,并包含一些系统级别的功能,例如初始化存储器、设置时钟频率和配置中断向量等。 startup.a51文件通常会在整个程序开发过程中保持不变,因为它是8051芯片的系统级别代码。因此,程序员可以专注于编写应用程序代码,而不必关心芯片启动和系统初始化的细节。 在编写8051微控制器程序时,程序员可以将startup.a51文件包含在他们的项目中,并且将其链接到他们的代码中,以确保系统初始化代码能够在8051芯片上正确运行。 ### 回答2: 51单片机启动文件startup.a51是一种汇编语言文件,用于初始化并启动51单片机。它包含了51单片机的启动代码,负责进行硬件初始化和设置。 首先,startup.a51文件会设置栈指针,即初始化堆栈。堆栈用来保存程序运行时的临时变量和函数调用的返回地址。 接下来,启动文件会初始化外部存储器(如RAM和ROM)的地址和数据线,并将它们连接到相应的片内内存和外设。 然后,启动文件会对中断进行设置和初始化。它会定义中断向量表,即将中断向量的地址和中断服务程序的入口地址联系起来。这样,在发生中断时,单片机就可以根据中断向量表找到和执行对应的中断服务程序。 此外,启动文件还会对时钟和定时器进行初始化。它会设置定时器的初始值和工作模式,使得单片机能够按照指定的时间间隔产生定时中断。 最后,启动文件会执行主程序的入口函数。主程序是由开发者编写的应用程序代码,它包含了处理输入输出、逻辑运算、控制流程等功能。 总之,startup.a51文件是51单片机启动时必要的代码文件。它通过执行初始化步骤,为单片机的正常工作做好准备,并将控制权交给应用程序。 ### 回答3: startup.a51是51单片机启动文件,它起着非常重要的作用。在单片机上电时会首先执行这个文件中的代码。下面我来详细解释它的功能和作用。 首先,startup.a51文件包含了一些必要的初始化代码,用于设置单片机的基本工作环境。它会设置机器模式、堆栈指针、内存空间等。这些设置对于单片机正常工作是必不可少的。 其次,startup.a51文件还包含了中断向量表的定义。中断向量表是用来保存中断地址的一个表格。当中断事件发生时,单片机会自动跳转到对应中断向量的处理程序去执行。startup.a51文件会为每个中断向量分配一个处理程序的地址。 此外,startup.a51文件中还包含了一些初始化数据和变量的定义。在程序运行之前,这些数据和变量会被存储在相应的内存地址中。这些数据和变量的定义可以在程序中使用,提供了方便的操作。 最后,startup.a51文件还会跳转到主程序的入口点,将控制权交给主程序。主程序是用户自己编写的,是实际执行功能的核心代码。 总之,startup.a51是51单片机启动文件,负责进行一系列的初始化设置和准备工作。它定义了中断向量表、初始化数据和变量,并将控制权交给主程序。没有这个文件,单片机将无法正常启动和运行。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值