当前位置:首页 > 单片机 > 单片机
[导读] 1.标号IDATALEN EQU 80H ; the length of IDATA memory in bytes.这里IDATALEN只是一个标号而已,和idata不是一回事!你要是愿意,这段程序里的IDATALEN你完全可以改成dog呀,pig呀,playboy呀这些标号(其实我的理想

 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

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: 驱动电源

在工业自动化蓬勃发展的当下,工业电机作为核心动力设备,其驱动电源的性能直接关系到整个系统的稳定性和可靠性。其中,反电动势抑制与过流保护是驱动电源设计中至关重要的两个环节,集成化方案的设计成为提升电机驱动性能的关键。

关键字: 工业电机 驱动电源

LED 驱动电源作为 LED 照明系统的 “心脏”,其稳定性直接决定了整个照明设备的使用寿命。然而,在实际应用中,LED 驱动电源易损坏的问题却十分常见,不仅增加了维护成本,还影响了用户体验。要解决这一问题,需从设计、生...

关键字: 驱动电源 照明系统 散热

根据LED驱动电源的公式,电感内电流波动大小和电感值成反比,输出纹波和输出电容值成反比。所以加大电感值和输出电容值可以减小纹波。

关键字: LED 设计 驱动电源

电动汽车(EV)作为新能源汽车的重要代表,正逐渐成为全球汽车产业的重要发展方向。电动汽车的核心技术之一是电机驱动控制系统,而绝缘栅双极型晶体管(IGBT)作为电机驱动系统中的关键元件,其性能直接影响到电动汽车的动力性能和...

关键字: 电动汽车 新能源 驱动电源

在现代城市建设中,街道及停车场照明作为基础设施的重要组成部分,其质量和效率直接关系到城市的公共安全、居民生活质量和能源利用效率。随着科技的进步,高亮度白光发光二极管(LED)因其独特的优势逐渐取代传统光源,成为大功率区域...

关键字: 发光二极管 驱动电源 LED

LED通用照明设计工程师会遇到许多挑战,如功率密度、功率因数校正(PFC)、空间受限和可靠性等。

关键字: LED 驱动电源 功率因数校正

在LED照明技术日益普及的今天,LED驱动电源的电磁干扰(EMI)问题成为了一个不可忽视的挑战。电磁干扰不仅会影响LED灯具的正常工作,还可能对周围电子设备造成不利影响,甚至引发系统故障。因此,采取有效的硬件措施来解决L...

关键字: LED照明技术 电磁干扰 驱动电源

开关电源具有效率高的特性,而且开关电源的变压器体积比串联稳压型电源的要小得多,电源电路比较整洁,整机重量也有所下降,所以,现在的LED驱动电源

关键字: LED 驱动电源 开关电源

LED驱动电源是把电源供应转换为特定的电压电流以驱动LED发光的电压转换器,通常情况下:LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: LED 隧道灯 驱动电源
关闭