用C语言编程,要看一下C语言编译器对的处理方法。我们在前面定义变量的时候,省略了存储种类和存储器类型。存储种类有四种:自动(auto)、外部(extern)、静态(stat)和寄存器(register),省略时默认为自动。
同时KEILC51把存储器分为六种类型:
DATA——直接寻址的片内数据存储器(128B),访问速度最快
BDATA——可位寻址的片内数据存储器(16B)。允许位与字节混合访问
IDArA——间接访问的片内数据存储器(2568),允许访问全部片内地址
PDATA——分页寻址的片外数据存储器(256B),用MOVX@Ri指令访问
XDATA——片外数据存储器(64KB),用MOVX@DPTR指令访问
CODE——程序存储器(64KB),用MOVC@A+DPTR指令访问
如果定义变量时能准确地说明其存储器类型,就能够在系统内准确定位。如果省略,则按编译模式SMALL(片内数据存储器)、COMT(分页寻址的片外数据存储器)或LARGE(片外数据存储器)所规定的默认存储器类型去指定变量的存储区域。
在C语言程序中可以采用扩展关键字“一aI-”来制定存储器空间的绝对地址,也可以用指针来定义存储器的绝对地址。我们现在采用预定义宏来指定绝对地址。在C51编译器的运行库中提供了一套预定义宏,这些宏定义包含在头文件“ABSAH”中,比如XBYTE(地址]就是访问XDATA区或1/O端口的。在C51源程序中可以利用这些宏来指定变量的绝对地址,比如定义一个端口地址:
#define 0832 XBYTE [0x7FFF]
那么程序中所有出现DAC0832的地方,就是对地址为0x7FFF的1/0端口进行访问。这是一个输出固定的程序,我们定义一个转换接口地址,每向该地址写入一个数据,即可完成一次D/A转换。
#inclUde <reg51.h>
#include <ABSACC.H>
#define DAC0832 XBYTE [Ox7fff] //
定义DAC0832端口地址
还可以用延时程序改变方波的延时时间,这样就可以控制机器战士以各种速度做各种动作,机器人的效果就出来了。