单片机原理与应用keil中的变量和常量定位问题

上传人:woxinch****an2018 文档编号:38984206 上传时间:2018-05-10 格式:DOC 页数:125 大小:453.06KB
返回 下载 相关 举报
单片机原理与应用keil中的变量和常量定位问题_第1页
第1页 / 共125页
单片机原理与应用keil中的变量和常量定位问题_第2页
第2页 / 共125页
单片机原理与应用keil中的变量和常量定位问题_第3页
第3页 / 共125页
单片机原理与应用keil中的变量和常量定位问题_第4页
第4页 / 共125页
单片机原理与应用keil中的变量和常量定位问题_第5页
第5页 / 共125页
点击查看更多>>
资源描述

《单片机原理与应用keil中的变量和常量定位问题》由会员分享,可在线阅读,更多相关《单片机原理与应用keil中的变量和常量定位问题(125页珍藏版)》请在金锄头文库上搜索。

1、/*keil 中的变量和常量定位问题中的变量和常量定位问题变量定位:char tab110 _at_ 0x200; 赋值:在函数中赋值,如 tab10=0x01; 常量定位及初始化: 新建一个 TABLE.C, 写入 char code table= 初始值; KEIL 定位:选择 optionBL51 Locate, 在 CODE:栏中写入如: ?CO?TABLE(0x7000) 这样,table表就定位到了 0x7000 开始的程序段。 /*如何在 KEIL C51(v6.21) 中调用汇编函数的一个示例 ycong_kuang有关 c51 调用汇编的方法已经有很多帖子讲到,但是一般只讲要

2、点,很少有对整个过程作详细描述,对于初学者是不够的,这里笔者通过一个简单例子对这个过程进行描述,希望能对初学者有所帮助。几年来,在这个论坛里笔者得到很多热心人指导,因此也希望藉此尽一点绵薄之力。在这个例子里,阐述了编写 c51 程序调用汇编函数的一种方法,这个外部函数的入口参数是一个字符型变量和一个位变量,返回值是一个整型变量。例中,先用 c51 写出这个函数的主体,然后用 SRC 控制指令编译产生 asm 文件,进一步修改这个 asm 文件就得到我们所要的汇编函数。该方法让编译器自动完成各种段的安排,提高了汇编程序的编写效率。step1. 按写普通 c51 程序方法,建立工程,在里面导入 m

3、ain.c 文件和 CFUNC.c 文件。相关文件如下:/main.c 文件#include #define uchar unsigned char#define uint unsigned intextern uint AFUNC(uchar v_achr,bit v_bflag);void main()bit BFLAG;uchar mav_chr;uint mvintrslt;mav_chr=0xd4; BFLAG=1;mvintrslt=AFUNC(mav_chr,BFLAG);/CFUNC.c 文件#define uchar unsigned char#define uint uns

4、igned intuint AFUNC(uchar v_achr,bit v_bflag)uchar tmp_vchr;uint tp_vint;tmp_vchr=v_achr;tp_vint=(uint)v_bflag;return tmp_vchr+(tp_vint#define uchar unsigned char#define uint unsigned intextern uint AFUNC(uchar v_achr,bit v_bflag);void main()bit BFLAG;uchar mav_chr;uint mvintrslt;mav_chr=0xd4; BFLAG

5、=1;mvintrslt=AFUNC(mav_chr,BFLAG);/a51FUNC.c#define uchar unsigned char#define uint unsigned intextern uint CFUNC(uint);uint AFUNC(uchar v_achr,bit v_bflag) /c51 写的汇编函数,最终要变成汇编代码uchar tmp_vchr;uint tp_vint;tmp_vchr=v_achr;tp_vint=(uint)v_bflag;return CFUNC(tp_vint); /这里调用一个 c51 函数/c51FUNC.c#define u

6、char unsigned char#define uint unsigned intuint CFUNC(uint v_int) /被汇编函数调用 c51 函数return v_int 0MOV R0,#IDATALEN - 1CLR AIDATALOOP: MOV R0,ADJNZ R0,IDATALOOPENDIF.可见,在执行到判断是否热启动的代码之前,起始代码已将所有内存单元清零。如何解决这个问题呢?好在启动代码是可以更改的,方法是:修改 startup.a51 源文件,然后用编译程序所附带的 a51.exe 程序对 startup.a51 编译,得到 startup.obj 文件,

7、然后用这段代码代替原来的起始代码。具体步骤是(设 C 源程序名为 HOTSTART.C):修改 startup.a51 源文件(这个文件在 C51LIB 目录下)。 执行如下命令: A51 startup.a51 得到 startup.obj 文件。将此文件拷入 HOTSTART.C 所在目录。将编好的 C 源程序用 C51.EXE 编译好,得到目标文件 HOTSTART.OBJ。 用 L51 HOTSTART, STARTUP.OBJ 命令连接,得到绝对目标文件 HOTSTART。 用 OHS51 HOTSTART 得到 HOTSTART.HEX 文件,即可。 对于 startup.a51

8、的修改,根据自已的需要进行,如将 IDATALEN EQU 80H 中的 80H 改为 70H,就可以使6F 到 7F 的 16 字节内存不被清零。二、直接调用 EPROM 中已固化的程序笔者用的仿真机,由 6 位数码管显示,在内存 DE00H 处放显示子程序,只要将要显示的数放入显示缓冲区,然后调用这个子程序就可以使用了,汇编指令为:LCALL 0DEOOH在用 C 语言编程时,如何实现这一功能呢?C 语言中有指向函数的指针这一概念,可以利用这种指针来实现用函数指针调用函数。指向函数的指针变量的定义格式为:类型标识符 (*指针变量名)();在定义好指针后就可以给指针变量赋值,使其指向某个函数

9、的开始存地址,然后用(*指针变量名)()即可调用这个函数。如下例:void main(void)void (*DispBuffer)(); /*定义指向函数指针*/DispBuffer=0xde00; /*赋值*/for(;) Key();DispBuffer();三、将浮点数转化为字符数组笔者在编制应用程序时有这样的要求:将运算的结果(浮点数)存入 EEPROM 中。我们知道,浮点数在C 语言中是以 IEEE 格式存储的,一个浮点数占用四个字节,例如浮点数 34.526 存为(160,26,10,66)这四个数。要将一个浮点数存入 EEPROM,实际上就是要存这四个数。那么如何在程序中得到一

10、个浮点数的组成数呢?浮点数在存储时,是存储连续的字节中的,只要设法找到存储位置,就可以得到这些数了。可以定义一个void 的指针,将此指针指向需要存储的浮点数,然后将此指针强制转化为 char 型,这样,利用指针就可以得到组成该浮点数的各个字节的值了。具体程序如下:#define uchar unsigned char#define uint unsigned intvoid FtoC(void) float a;uchar i,*pxuchar x4; /*定义字符数组,准备存储浮点数的四个字节*、void *pf;px=x; /*px 指针指向数组 x*/pf= /*void 型指针指向浮

11、点数首地址*/a=34.526;for(i=0;i”出现),则当中断申请时,显示中断源信息。比如当中断发生时会显示:“interrupt Timer 0 occured”等A/D converter:显示 A/D 转换器状态无时,则提示“无”。Serial:串口信息显示,包括串口模式、波特产等Other:其它器件,如为 8031 则显示“ 无”3. (3) 单步或“Go”执行“F8”单步执行, “F5”全速执行到断点。或选主菜单中 Trace 单步执行 CPU 中的 Go 全速执行。4. (4) 存储器寄存器及变量访问外部存储器管理 MAP 菜单:设置(set)、取消(reset)、显示(Di

12、splay)处理可用存储空间。修改 Code 代码:ASM 命令存储器显示命令:D 类别为(X、D、I、B、C)修改存储器命令:E 有以下几种命令 EB、EC、EI、EL、EF、EP复杂数据类型显示:Object 命令;用以显示结构或数组的内容。欲使此命令有效,C51 编译器必须有 DB及 OBJECTEXTEND 两条。反汇编命令:U5. (5) “Watch”表达式之值在 View 菜单的“Watch”一栏中有四项:其中包括定义 Watch Point(Define)、删除 Watch Point(remove,kill all),及自动更新选项。也可用 WS、WK 等命令代替,下面具体看

13、“表达式”类型:dScope51 一次最多可设 16 个 WtchPoint 表达式,显示于 Watch Window 之中,表达式可以是简单变量,也可是复杂数据类型如结构、数组和指向结构的指针等,例如:WS *ptimeWS ptimehourWS some_recordo,analog 等等6. (6) 关于.IOF 文件启动 DS51 后必须装入.IOF 文件才能使 CPU 及 Peripheral 各项起作用,这个函数的使用是依据 8051 系列CPU 的不同特点,装入 8051 各 CPU 硬件设备模拟驱动文件,比如 8031CPU 就必须 load DS51 目录下的8051.IO

14、F。2. 2. dScope for WindowsdScope for windows 具有 dScope for dos 的全部功能,此外,它还具有以下明显的优点:(1) 标准的 Windows 界面,操作更容易更简单; (2) 常用操作多用对话框,而非 Dos 的行命令方式;(3) 窗口资源更加丰富:存储器窗口、覆盖率分析、运行状态分析窗口,加强了调试功能;因为 dScope for Windows 功能强大,具体操作在第八章详细介绍。3. 第三节 Monitor51 及其使用1. 1. Monitor51 对硬件的要求(1) 硬件系统为 51 系列 CPU;(2) 带 5K 外部程序存

15、储器(从 O 地址开始),存放 Monitor51 程序;(3) 256Bytes 的外部数据存储器以及 5K 的跟踪缓冲区,此外,外部数据存储器必须足够容纳所有应用程序代码及数据,且所有外部数据存储器必须为冯诺伊曼存储器,即能一致访问 XDATA 与 Code 空间。(4) 一个定时器作为波特率发生器供串口使用;(5) 6 Bytes 的空余堆栈。2. 2. Mon51 的使用Mon51 的使用途径有三种方式:(1) Dos 行命令方式即先用 install 对 MON51 进行配置,然后用 MON51 进入 Monitor 状态,启用各种命令对 Monitor51 进行调试。(2) tScope51 方式启动 tScope51 装入 TS51 目录下的 MON51.IOT 驱动文件,与目标板通信。(3) dScope51 for Windows 方式在选 CPU 驱动文件时,选“MON51.dll”,则检查目标板并进入 MON51 状态。3. 3. MON51 的配置(1) MON51 for Dos 的配置运行 install 文件(在 MON51 目录下),不同的参数可以配置不同的硬件环境。INSTALL Serialtype xdstastartcodestartbankPROMCHECK,具体

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 中学教育 > 其它中学文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号