历史上的今天

今天是:2024年11月19日(星期二)

2018年11月19日 | 单片机startup.a51文件内容的详解

发布者:钱币之歌 来源: eefocus关键字:单片机  startup  a51  文件内容 手机看文章 扫描二维码
随时随地手机看文章

1.标号


IDATALEN EQU 80H ; the length of IDATA memory in bytes.


这里IDATALEN只是一个标号而已,和idata不是一回事!你要是愿意,这段程序里的IDATALEN你完全可以改成dog呀,pig呀,playboy呀这些标号(其实我的理想是过猪一样的生活,不愁吃喝,无忧无虑,可惜做不到),上面的这一句是说程序里面凡是用到IDATALEN的地方其实就是可以看成是80H这个数,你用80H去代替IDATALEN是完全对的。


之所以取IDATALEN这么个名字,只是为了好记,表明和idata有一点点关系,不至于你的程序长了,假使你本来是用了playboy作为标号的,写到后来你就会忘了playboy到底是什么含义了。idata的范围是0~FFH。如果你想改成FFH,完全可以。


2。清零


IF IDATALEN <> 0


MOV R0,#IDATALEN - 1


CLR A


IDATALOOP: MOV @R0,A


DJNZ R0,IDATALOOP


关于这一段,很明显是在清零,如果上面idatalen=80H,那么是对0~7FH清零;如果


你的程序是改写成:


IDATALEN EQU 0100H ;


就是对0~FFH清零。


还要注意的是那条IF语句,下面再谈。


二、如何按你意愿加载这段程序


一般考虑到这个往往是你的设计中要区分上电复位和程序复位。有时候当程序复位时你不希望一些内存单元被清零了,那么你不对startup.a51作点修改,就不行了。


默认是自动加载这段startup.a51的。


所以你要这样做:


把lib目录下的原始startup.a51文件拷到你的项目所在目录下,再把你项目目录下的这个startup.a51加入到你的项目中(在keil的集成环境中,希望你对这个是知道如何做的),然后对这个startup.a51加以修改。


比如改成:


IDATALEN EQU 00H ; the length of IDATA memory in bytes.


然后编译链接。这样你的程序中就不会包含对idata清零的内码了。


为什么?上面提到的IF语句的作用呀!当定义IDATALEN=0时,清零代码被跳过!


////////////////////////////////////////////


Startup.a51的中文说明


;------------------------------------------------------------------------------


; STARTUP.A51: 用户上电初始化程序


;------------------------------------------------------------------------------


;


; 用户定义需上电初始化的内存空间


;


; 使用以下EQU命令可定义在CPU复位时需用0进行初始化的内存空间


;


;; ; IDATA 存储器的空间的绝对起始地址总是0.;


IDATALEN EQU 80H ; 需用0进行初始化的IDATA存储器空间的字节数


;


XDATASTART EQU 0H ; XDATA存储器空间的绝对起始地址


XDATALEN EQU 0H ; 需用0进行初始化的XDATA存储器的空间字节数.


;


PDATASTART EQU 0H ; PDATA存储器的空间的绝对起始地址


PDATALEN EQU 0H ; 需用0进行初始化的PDATA存储器的空间字节数.


;


; 注意: IDATA 存储器的空间在物理上包括了8051单片机的DATA和BIT存储器空间.

; 听 说 至少要保证与C51编译器运行库有关的存储器的空间进行0初始化 不知是否


;------------------------------------------------------------------------------


;


; 再入函数模拟初始化


;


; 以下用EQU指令定义了再入函数模拟堆栈指针的初始化


;


; 使用SMALL存储器模式时再入函数的堆栈空间 .


IBPSTACK EQU 0 ; 使用SMALL存储器模式再入函数时将其设置成1.


IBPSTACKTOP EQU 0FFH+1 ; 将堆栈顶设置为最高地址+1.


;

; 使用LARGE存储器模式时再入函数的堆栈空间.; 使用LARGE存储器模式时再入函数的堆栈空间.


XBPSTACK EQU 0 ; 使用LARGE存储器模式再入函数时将其设置成1.


XBPSTACKTOP EQU 0FFFFH+1; 将堆栈顶设置为最高地址+1.


;


; 使用COMPACT存储器模式时再入函数的堆栈空间.; 使用COMPACT存储器模式时再入函数的堆栈空间.


PBPSTACK EQU 0 ; 使用COMPACT存储器模式再入函数时将其设置成1.


PBPSTACKTOP EQU 0FFFFH+1; 将堆栈顶设置为最高地址+1.


;


;------------------------------------------------------------------------------


;


; 使用COMPACT存储器模式时64K字节XDATA存储器空间的分页定义


;


; 以下用EQU指令定义PDATA类型变量在XDATA存储器空间的页地址


; 使用EQU指令定义PFAGE时必须与L51连接定位器PDATA指令的控制参数一致


;


PPAGEENABLE EQU 0 ; 使用PDATA类型变量时将其设置成1.


PPAGE EQU 0 ; 定义页号.


;


;------------------------------------------------------------------------------


NAME ?C_STARTUP; 模块名为 ?C_STAUTUP


?C_C51STARTUP SEGMENT CODE ; 代码


?STACK SEGMENT IDATA ; 堆栈


RSEG ?STACK ; 堆栈


DS 1


EXTRNEXTRN CODE ((?C_START)) ; 程序开始地址


PUBLIC ?C_STARTUP


CSEG AT 0x8000 ; 定义用户程序的起始地址,用MON51仿真器时可能有用


?C_STARTUP: LJMP STARTUP1


RSEG ?C_C51STARTUP


STARTUP1::


;


; 初始化串口


MOV SCON,#40H


MOV TMOD,#20H


MOV TH1,#0fdH


SETB TR1


CLR TI


; 单片机上电IDATA内存清零 如果不需要上电清零IDATA 可以注销IF到IFEDN之间的话句


; 或者修改IDTALEN的长度 为了具有掉电保护功能 不知IDTALEN多长为好


IF IDATALEN <> 0


MOV R0,#IDATALEN - 1


CLR A


IDATALOOP: MOV @R0,A


DJNZ R0,IDATALOOP


ENDIF


;


; 单片机上电XDATA内存清零 如果不需要上电清零XDATA 可以注销IF到IFEDN之间的话句


; 或者修改XDATALEN的长度


IF XDATALEN <> 0


MOV DPTR,#XDATASTART


MOV R7,#LOW ((XDATALEN)


IF (LOW (XDATALEN) <> 0


MOV R6,#(HIGH (XDATALEN) +1


ELSE


MOV R6,,#HIGH ((XDATALEN)


ENDIF


CLR A


XDATALOOP: MOVX @DPTR,A


INC DPTR


DJNZ R7,XDATALOOP


DJNZ R6,XDATALOOP


ENDIF


;


; 送PDATA存储器页面高位地址


IF PAGEENABLE <> 0


MOV P2,#PPAGE


ENDIF


;


; 单片机上电PDATA内存清零 如果不需要上电清零XDATA 可以注销IF到IFEDN之间的话句


; 或者修改PDATALEN的长度


IF PDATALEN <> 0


MOV R0,#PDATASTART


MOV R7,#LOW (PDATALEN)


CLR A


PDATALOOP: MOVX @R0,A


INC R0


DJNZ R7,PDATALOOP


ENDIF


;

; 设置使用SMALL存储器模式时再入函数的堆栈空间.


IF IBPSTACK <> 0


EXTRN DATA (?C_IBP)


MOV ?C_IBP,#LOW IBPSTACKTOP


ENDIF


;


; 设置使用LARGE存储器模式时再入函数的堆栈空间.


IF XBPSTACK <> 0


EXTRN DATA (?C_XBP)


MOV ?C_XBP,#HIGH XBPSTACKTOP


MOV ?C_XBP+1,#LOW XBPSTACKTOP


ENDIF


;


; 设置使用COMPACT存储器模式时再入函数的堆栈空间.


IF PBPSTACK <> 0


EXTRN DATA (C_PBP)


MOV ?C_PBP,#LOW PBPSTACKTOP


ENDIF


;


; 设置堆栈的起始地址


MOV SP,#?STACK-1 ; 例如 MOV SP,#4FH;


; This code is required if you use L51_BANK.A51 with Banking Mode 4


; 如果你的程序使用了Mode 4 程序分组技术 请启动下面的程序,不会吧你的程序超过64K 利害


; EXTRN CODE (?B_SWITCH0)


; CALL ?B_SWITCH0 ; init bank mechanism to code bank 0


;; 程序从第一组bank 0 块开始执行


; 跳转到用户程序MAIN函数


LJMP ?C_START


END


;lINSHENGFENG


关键字:单片机  startup  a51  文件内容 引用地址:单片机startup.a51文件内容的详解

上一篇:单片机有源蜂鸣器驱动之效率编程
下一篇:教你给51单片机扩展片外RAM

推荐阅读

由欧盟电信标准研究院(ETSI)主办,中国密码学会、重庆大学以及加拿大滑铁卢大学承办的第六届量子安全国际会议上周刚刚在北京召开,会议吸引了华为、阿里巴巴、亚马逊、IBM等国际知名企业高管,国内正在积极开展量子研究或研发的高校、企业,以及全球量子安全领域的专家学者300人出席。该会议是第一次在中国举办,这既体现了中国量子信息产业和量子安全密...
整个新能源汽车的发展步入新常态,拿到朋友给我的部分10月上险数据,我们以比亚迪为例来看看,从 7 月份起的变化。 1)销售结构总体的情况今年 1-10 月,比亚迪的车子一共上牌 31.02 万台,其中燃油车 15.5 万,纯电动 11.62 万台,PHEV 4.34 万台。整个比例结构如下: 但是 10 月份,这个数据是这样的,燃油车 1.96 万,纯电动 0.58 ...
XP Power正式宣布推出SVR表面贴装和VR通孔、非绝缘DC-DC开关稳压器。这两款负载点(PoL)产品效率高达96%,工作温度为-40°C至+85°C,是低效率线性稳压器的理想替代品。它们的工作电压范围很宽,最高可达36V,并具有低静态电流的特点,因此适用于各种应用和电池供电的电子设备。 SVR系列有两个版本,每个版本提供不同的最大输出电流。SVR05系列0.5A产品提...
11月18日,中环半导体DW智慧工厂(三期)项目在滨海高新区开工。滨海发布消息显示,中环半导体DW智慧工厂(三期)项目总占地面积160亩,投资总额预计将超过30亿元,规划产能25GW,达产后年产值将超百亿元。项目建成后,中环半导体在滨海高新区的G12光伏硅片总体产能将超过50GW,成为全球最大的光伏单晶硅片生产基地。据介绍,该项目将继续发挥中环半导体G1...

史海拾趣

问答坊 | AI 解惑

IM3、IIP3、OIP3等的计算

Pin:Input powerPout:Output powerIM3:3rd order intermodulation productIIP3:Input 3rd order intercept pointOIP3:Output 3rd order intercept pointG:GainP1dB:1dB&n ...…

查看全部问答∨

《程序员》杂志,合适我们做嵌入式开发的么?

《程序员》杂志,最近要100期了,关注了一下。 不知道这本杂志,合适我们做嵌入式开发的么?有没有相关的WinCE嵌入式专题? 值得订阅么?…

查看全部问答∨

求 ps2鼠标和cpu的连线图!

求 ps2鼠标和cpu的连线图!   小弟过2天就要交毕业设计了,老师非得让我加个图.我的论文题目是基于嵌入式的PS/2鼠标接口设计.   拜托各位大哥大姐帮我下.   小弟不胜感激!在线等图.   把图发上 ...…

查看全部问答∨

手机模块没有返回结果,请问这是什么原因呢?

使用同样的AT指令分别在超级终端下和用代码方式发向手机模块,结果前者可以收到结果而后都却收不到。 请问这是什么原因呢?我估计是配置问题,像波特率等。你的看法呢?谢谢。 …

查看全部问答∨

想找本已s3c44b0为例子的书入门,请推荐。

弄了块三星原厂的s3c44b0开发板,想找本书看下入门。…

查看全部问答∨

串口开发小小心得

串口开发小小心得 本人新入行,写的也只是很肤浅的自己的一点点理解。欢迎批评指正,qq:15065328.email:zxiki@163.com。msn:zxiki@hotmail.com。如果这些经验能对您有所帮助,我将非常荣幸。欢迎转载(可能抬举自己了),但请把以上文字一并保 ...…

查看全部问答∨

触摸屏技术

本帖最后由 jameswangsynnex 于 2015-3-3 19:58 编辑 “伸出手臂,触摸世界”。即使是对工程师来讲,如此简单的模拟通话也因此马上变得去繁变简。但是,有时电话交流还是不够,在这种情况下,一图胜千言,所以有了界面友好的触摸屏。   想象一 ...…

查看全部问答∨

我的定时器启动后先进一次中断

大家好 我用的stm32单片机,我已经做了其他可能的排除,最好确定 定时器使能后先进入一次中断。 我感觉应该是有些标志位没有清除,希望各位大侠帮我看看。 void TIM_Configuration(void) { TIM_TimeBaseInitTypeDef  TIM_TimeB ...…

查看全部问答∨

请教怎么整一个能通过JTAG带源码级仿真调试的汇编框架?

整了很多天的STM32 汇编,想通过HJTAG 进行源码级调试,一直未成功。 有什么法子?还是HJTAG不支持STM32的源码级调试?真闷啊!…

查看全部问答∨

PIC官网活动,开发工具有折扣

PIC官网的优惠信息,需要的可以去看看http://www.microchip.com.cn/community/Dragon/ …

查看全部问答∨
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

更多每日新闻

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved