Keil Cx5 1在激光测距机中的应用
Keil Cx5 1在激光测距机中的应用
作者:韩春生
1 引言
激光测距仪机在军用和民用方面具有广阔的应用前景。该机一般由激励源、发射机、光学系统、接收机、终端机等组成。由于其对各个分机的工作时序要求严格,所以核心控制部件8751单片机,软件以往都是采用汇编语言进行编程的。采用汇编语言编程研制周期长,调试和排错困难,程序的可读性和可移植性差。德国KeilSoftware公司开发的Keil Cx51是一种专为8051单片机设计的高效率C语言编译器,生成的程序代码运行速度高,所需要的存储器空间小,已广泛应用于单片机的开发。
2 Keil C语言的功能与特点
Keil C语言符合ANSI标准,既具有一般高级语言的特点,又能直接对计算机的硬件进行操作,表达和运算能力也较强。用KeilC语言编程有如下特点:
软件的结构清晰,有条理,便于移植;
· 可读性强,易于查错,易于维护;
· 生成代码效率高,同样的源文件在它的编译下生成最少的可执行代码;
· 支持字符型、浮点型、长整型、数组、指针、联合和结构体数据类型;
· 提供了与汇编语言程序的接121,实现与汇编语言的相互调用;
· 在项目管理和源程序编辑、编译、调试和注释方面接近于VC+ +编译器,支持重载和递归;
· 支持软件模拟仿真和用户目标板在线调试。
我们工程中应用的是Keil C开发软件V7.0的Cx51编译器,windows集成开发环境为/~Vision3。该版本支持Atmel,Analog Device,Dallas,Infineon,Philips,Temic,SST,TI等公司推出的各具特点的增强型8051系列单片机。
3 Keil C的应用技巧
本节介绍了在编写激光测距机程序过程中用到的几个技巧。
3.1 精确延时
1)应用void—nop一(void)函数实现,该函数声明包含在头文件INTRINS.H中,一nop一()产生一条8051单片机的NOP指令,该函数延时精度为一个机器周期。
2)对于较长时间软件精确延时的办法,我们在工程实践中对比了其它延时方式,认为相对于其它形式的延时,以下两种方式更有规律可循,也更容易计算使用。
a.对于小于515个机器周期的延时,函数形式为void delaychr(unsigned char i){while(一一i);}i< :=:255;延时时间为5+i×2个机器周期,延时精度为2个机器周期。以delaychr(2)为例,生成的源码如下:C:0x08F5 7F64 MOV R7,#0x02C:0x08F7 12000D LCALL delaychr(C:000D)C:0x000D DFFE DJNZ R7,delaychr(C:000D)C:0x000F 22 RET其中MOV,LCALL,RET 共耗费5个机器周期,DJNZ需要2×2共4个机器周期。
b.对于小于524542且大于515个机器周期的延时,函数形式为void delaylnt(unsigned int j){while(一一j);)j<一0xFFFF;延时时间约为8×j个机器周期,可实现几百毫秒以内的精确延时,延时精度为8个机器周期。
3.2 嵌入汇编
个别情况下,我们仍需要应用嵌入汇编的办法来解决问题,实际上可视为函数的调用,不过此时被调函数是采用汇编语言编写的而已。如创建myfunc.asm文件,内容如图l,将该文件加入到工程中来,则直接在C程序段中调用delay(i)函数即可。
NAM E MYFUNC
?PR?DELAY?MYFUNC SEGMENT CODE
PUBLIC DELAY
RSEG?PR?DELAY?MYFUNC
DELAY: INC R6
DELAY0: NOP
DJNZ R7.DELAY0
M OV R7.拌0FFH
DJNZ R6.DELAY0
RET
END
3.3 多字节数据输入输出
对两个以上字节组成的数据(即多个字节表示一个数),但一次只能传递一个字节时,输入输出操作用union方式较为方便。union由相关的变量组成,这些变量构成了联合的成员,但是这些成员只能有一个起作用,因为union的实质是对同一块内存进行不同方式的对待处理。所以union特别适合作输入输出时用,比如通过串口输入两字节的整型数,我们定义如图2的结构,分别把接收到的各个字节对应放入ch[]数组,我们计算时直接使用juli变量进行运算即可,输出的结果放入juli变量,然后分别对应输出ch[]数组各个字节即可。
union txdata
{
int juli;
unsigned char clh2】;
};
3.4 控制和状态字节操作
通常控制和状态字节,每一位对应某一状态,但输入与输出是按字节进行传输的,为方便操作,首先我们通过bdata关键字定义变量为“可位操作”,然后通过“位地址”变量来实现具体操作某一位。具体实例如下:
bdataunsigned char control;//开关状态存储变量,可位操作
sbit fs— control 0; //发射开关,0为不发射,1为发射
sbit gz===control 1; //工作自校开关,0为工作,1为自校
fs一1; //对control的第0位进行操作
3.5 中断处理
Keil C可直接编写8051单片机的中断服务函数程序,为此增加了一个扩展关键字inter—rupt。定义中断服务函数的一般形式为:函数类型函数名(形式参数表)[interruptn],其中n为中断号。例如void dingshi(void)interrupt 1{⋯ )即是一例。值得注意的是:中断函数不能进行参数传递,不能有返回值,不能被直接调用。
3.6 针对在应用Keil C是对激光测距机开发过程中。我们碰到的与一般C语言(尤其是大家熟悉的VC++)不同点如下:
1)Vc中的int类型的数据内存的排列为低位在前高位在后,而在Keil C中是高位在前低位在后,如整型变量值0x1234以图3所示的方式保存在内存中。这一点在使用union方式进行数据输入输出时应特别注意。
2)Vc中短整型、整型、长整型一般为2,4,4个字节。而在Keil C 中分别是2,2,4个字节。此外在Keil C中的float类型和double类型也相同,都为4个字节。
3)Vc中定义函数内的局部变量可以在任何地方定义,但在Keil C中需要一进入函数就定义局部变量。否则会编译出错。
4 在激光测距机中的应用
4.1 激光测距机的工作原理
脉冲激光测距机的激光器产生激光脉冲,照射被测目标,照射激光被目标反射,部分反射光回到探测点经光学天线接收进入接收机,经电路处理,测量出自激光发射到接收之间的时间间隔t,则被测距离为:R一(1/2)ct。c为光速。终端机作为激光测距机的控制与信息处理中心,接收上一级的控制命令,转化为内部指令分发给各分机,完成整机的时序控制、工作模式控制,完成距离测量、角度测量、图像生成,对各分机进行状态巡检,完成信息的汇总、分析、输出、显示等。其具体意义为:
· 控制功能:通过软件读取开关状态或通过通讯获得系统指令,决定终端机是处于自检状态还是工作状态,控制激光器是否发射激光,决定当
前激光的发射频率,控制激光的连续发射时间等。
· 测距功能:最常用的是直接计数法。直接计数法测量原理为:测距机发射激光时产生主波信号,接收激光时产生回波信号,让计数器以主波作为计数的开门信号、回波作为计数的关门信号,对计数时钟进行计数达到时间测量的目的。
4.2软件实现
单片机在读人数据时,包括两字节整型数据和可位寻址数据。两字节整型数据为系统的引导距离数据,可位寻址数据如系统的单字节指令、状态巡检字和按键输入字。对于多字节数据,采用3.3节union的方式读人,然后直接按整型数进行处理,尤其在各种数学计算中显得非常直观简单。对于系统指令等每一位都有具体含义的字节,采用3.4节介绍的bdata的方式,对各位变量直接判断操作即可。输出与输入采用的方式一样。
在测距过程中有严格的时序要求,利用3.1节介绍的C语言方式和3.2节介绍的嵌入汇编语言的方式来实现对各种长度的精确延时。在操作控制过程中,利用高级语言良好的结构性轻松实现对各种状态的判断,编写程序的各个分支,利用C语言的模块性来实现对各个分机的控制。
在计算过程中C语言的优点就更明显,汇编语言的除法有lO多种,并且仅双字节除以双字节的汇编子程序就要103行语句,而C语言的除法只有一种,只要一行语句,而且保证不会出错。在处理激光重频问题中,因为要求有准确的测距频率,我们还应用了3.5节介绍的技巧,应用定时中断函数加以解决。上述方法已应用于工程中,取得了良好的效果。
5 结束语
使用Keil C来开发激光测距机系统,既不会降低对硬件的控制能力,也不会使代码长度增加多少,非常利于维护与移植。此外,用Keil C编写程序比汇编更符合人们的思考习惯,开发者可以更专心于算法,减少了开发和调试的时间。总而言之,应用Keil C语言对激光测距机进行编程是可行的,是能适应测距机发展的一种方式。
本文章转自爱学术(aixueshu.com),如有侵权,请联系删除