引言 Atmel公司的控制器以其集成度高、在线调试方便等特点广泛应用于工程实践领域,文中以某武器系统的前期预研为背景,讨论了数字仪表系统的软硬件实现过程,其主要功能包含:实时采集配电箱系统的6路正负模拟电压值及作战环境温度,并通过MSl2232B型液晶模块动态式显示。 1 软件特性 随着C语言在嵌入式系统中的广泛运用,软件系统的实时性、复杂性设计要求也越来越高,用通常的单任务无限循环结构与中断服务子程序相配合的编程思想已难以完成相关的软件设计或实现较为困难,RTOS(多任务实时操作系统)是现阶段较为流行的处理方式。
RTOS的基本设计思想是将多种系统输入和处理要求,按功能做成不同的任务函数体,并分配适当的优先级,参考Windows系统的多线程处理机制,将 CPU执行时间划分成若干区段,每个任务函数体对应一个时间片段.在规定的时间内执行完后允许切换到另一个任务,因各时间段非常短,表现的是多任务实时处理特性。因为任务并非同时执行且具备跳转特性,所以整个项目管理文件内可以有多个无限循环结构,且省略了main入口函数,这是RTOS最大的特色。文中以Keil集成开发环境为平台,利用RTX5l Tiny版本来完成整个软件设计过程。 ISP(在系统可编程)是一种适合Atmel系列器件的Flash技术,通过PC的LPT标准并行接口,能实时地将Intel格式的源程序代码下载到微控制器的相应存储区域。ISP的最大特点是简化了调试过程,提高了软件系统的可维护性,使其具备了在线升级特性。而且整个开发过程省去了反复插拔电路的操作。 2 系统硬件构成 本系统硬件主要包括如下几个模块:AT89S52型主控制器、ADC0809型模/数转换、MSl2232B型液晶显示器、温度传感器及语音报警等。其中 AT89S52型微处理器主要完成外围器件的硬件控制及相关数据解算,ADC0809采集6路模拟信号并输入主控制器,MSl2232B完成数字及相关标识字符的显示,配电系统的电压波动超出预定指标时由语音模块给出相应的报警信息。
2.1主控制器模块 主控制器是Atmel公司生产的AT89S52型单片微控制器,与常规C51系列相比,其突出特点是具有8KB闪速式存储器(降低了对外扩存储器的要求)、256B RAM内存(可容纳更多局部变量)、8个中断源及ISP在线可编程特性。 2.2液晶显示模块 MSl2232B属于图形点阵系列的显示器件,具有双行显示功能,其点阵结构为122%26;#215;32,通过AT89s52给出必要的数据和指令来操作MSl2232B主、辅控制器,从而完成图形、字符等相关信息的显示。该液晶显示模块还具有较强的通用性.用户用少量元件就可以构成一个完整的LCD 系统。电路连接如图1所示。 2.3 A/D数据采集模块 由于本系统涉及多路模拟信号,故选择了AD(20809型通用模/数转换器,它采用逐次逼近方式完成A/D转换过程,其片内带有8路模拟开关,能自动锁存信号,输入电压范围是0V~+5V,因为该器件的输出具有1TrL三态锁存缓冲器结构,所以可以直接连人单片微控制器的I/O口。相关的接口连接如图2所示。 需要说明的是,在本系统6路电源信号中只有一路负电源信号符合ADC0809 0V~5v的输入特性,因此必须配备相应的反相电路,则通过LM358型运算放大器来完成。利用LM358还可以扩展监测范围(以降低测量精度为前提),这对于精度要求不太高的场合是可行的。图2中PC817型光耦用于检测负电压信号,当IN4为低电平信号时对应负电压信号,此时在MSl2232B的相应行位置给出“-”号标志,这不仅解决了正负电压同行显示的兼容性问题,而且减少了软件设计量(由6路简化为3路),同时使系统实时性相应提升。 2.4温度传感器模块 DSl8820是Dallas公司推出的l—Wire式数字温度传感器,它能实时采集现场环境的温度数据,并将相应的值转换为数字量输出。该温度传感器与 AT89S52的连接如图3所示。 2.5语音报警模块 该模块主要实现异常情况下告警信息的输出,只要配电箱电压信号的波动值超出一定的范围,音频告警装置即给出不同的频率信号使蜂鸣器发声,以提示相关操作人员注意。
3 系统软件设计 按RTOS系统的程序结构要求,软件工程主要由如下4部分组成:初始化、数据采集与A/D转换、显示子程序、温度监测与告警模块。 如果将初始化设置为任务0,那么除了要完成相应的硬件配置与变量赋初值外,还必须启动所有其他任务,另外,因为初始化过程只须进行一次,所以Task 0还应当删除其自身。具体的程序代码如下所示: void Init(void)_task_Intial { variable=0; LcdInitialO; ClrScreenO; 0s_create_task(AI)C0809I)ata); os_create_task(DSl8820Temperate); 0s_create_task(LCMI)isplay); 0s_delete_task(Intial); } 其中相关的宏定义变量值为: #define Intial O #define ADC0809Data 1 #define DSl 8820Temperate 2 #define LCMDisplay 3 在Keil集成开发环境下调试本程序时,除了要包括相应的头文件(rtx51tny.h)外,还必须设置好相应的环境参数值。 3.1数模转换子程序 数据采集与A/I)转换子程序主要对配电箱传来的模拟信号进行采样、量化及返回值处理。软件编程时的电气时序及相关技术要求如图4所示。
在时序图中,上升沿清空量化结果寄存器内的值,下降沿启动,A/D转换;采样启动脉冲的高电平状态至少应维持100μs;EOC变为低电平表示转换过程正在进行,且启动信号的硬件迟滞效应时间至少应为10μs;MSB对应AT89S52并口的:P0.7,LSB对应P0.0。 关键部分的程序源代码及注释如下: unsigned int AI)C0809(void) { unsigned int wait=3; ChannelChooseA=1; ChannelChooseB=0; ChannelChooseC=0; ADStartPulse=0; ADStartPulse=1;//产生A/D转换的启动脉冲 (上升沿部分) delay();//保证启动脉冲的高电平宽度 至少大于100μs ADStartPulse=0;//产生A/D转换的启动脉冲 (下降沿部分) wait--; wait--; //指令延时以保证达到:EOC 变为低电平所需的硬件迟滞要求。 ‘whilefADConvertEOC==0): return(Result);/将A/[)转换后的量化值返 回到主函数中。 } 3.2液晶显示模块 MSl2232B型图形点阵液晶显示(LCM)模块左右分为Master和Slave控制器,上下共分4页,左边列地址为0-61,右边列地址为 0-61,对该器件的操作关键是按时序图正确配置好主、辅控制器的工作状态。利用AT89S52访问LCM时有二种常用的方法,即存储器映射寄存器寻址和模拟接口时序,本系统采用后一种方法。主要函数模块源代码分析: void MasterWriteD(unsigned char Ramdata) //向Master控制器写数据 { ReadOrWrite=0; InstructionOrData=1; MasterEl=1; P0=Ramdata; MasterEl:0; } void MasterWriteI(unsigned char Ramdata) //向Master控制器写指令 { ReadOrWrite=0; InstructionOrData=0; MasterEl=1; P0=Ramdata; MasterE1=O; } void ReadState(void) //检测主、辅控制器工作状态 { ReadOrWrite=1; InstructionOrData=0; MasterEl=1: SlaveE2=1; PO=0xff; while(BusStateBusy==1); } void SetPage(unsigned char page0,unsigned char pagel) { MasterWriteI(0xb8 | pagel); SlaveWriteI(0xb8 | page0); } void SetColumn(unsigned char address0,unsigned char addressl) { MasterWriteI(0x3f %26;amp; addressl); SlaveWfiteI(0x3f %26;amp; address0); } //在主控制器操作的左边LCM屏上显示一列信息(由8个像素点构成) void MasterPutChar(unsigned char masterchar) { ReadState(); MasterWriteD(masterchar); } 一般说来。AT89S52的RAM存储空间是有限的,而图形或字符的点阵代码(可以下载相关的应用插件,由.bmp文件或字符自动生成)如果太大,放置到 RAM区会出现内存不足的告警提示,为此可按如下方式处理: unsigned char code Dotn[]=lOxOO,Ox00,0x30, 0x00,0x30,Ox00,Ox00,0x00}; 即将点阵代码通过code关键字限定后放于ROM区域内。
3.3 DSl8820的1-Wire子程序 DSl8820的突出优点是将现场采集的环境温度直接以数字形式输出,这样可以省去后续的信号放大及模/数转换部分,构建外围电路的元件少且相对简单,系统成本低廉;1-Wire接口与AT89S52通信,其结构便于多点测量且易于扩展;测温范围宽(-550℃~1250℃)且精度高。 对l-Wire的操作关键是软件时序的处理,对于不同的晶体振荡器其延时参数是不同的,本系统以12MHz为例给出如下主要程序代码: bit DallassReset(void) { unsigned char presence=0; DallassDataout=1; //发出复位脉冲前先释 放总线 delay(10); DallassDataout=0; delay(240);//保证延时在4801μs~9601μs之间 DaUassDataout=1; delay(35); Dresence=DallassDataout; delay(60); return(presence); } //写时序从主控制器把总线拉低时开始 void writeCommand(unsigned char command) { unsigned char count; for(count=O;count<8;count++) { DallassDataout=0; if(command%26;amp;0x01==1) { DallassDataout=1; //写“1”时序在将总线拉低后,AT89S52主控制器必须在15μs内释放总线,所以此语句之前不能有较长时间的延时语句 } delay(35);//无论写“1”还是写“0”时序都必须有至少601as的低电平 DallassDataout=1;//总线恢复的过程 command=command>>1; } } //读时序从主控制器将总线拉低至少1μs后释放总线的时刻开始 unsigned char readdata(void) { unsigned char value; unsigned char midtemp=0; for(value=0;value<8;Value++) { I DallassDataout=0; midtemp=midtemp>>1; -nop_O; _nop_O; DallassDataout=1; //读时序时,控制器必须在15μs内释放总线,然后采样总线状态,所以此语句之前不能延时太长的时间的延时语句 if(DallassDataout==1) { midtemp=midtemp | 0x80; //因为midtemp初始被赋值为0,所以如果采样总线状态为0则不必处理,0会自动被返回 } delay(35); //延时70μs完成此次Bit 位读时序过程,为下一次读作准备 } return(midtemp); } void delay(unsigned char out) { unsigned char in; for(in=out;in>O;in--); } 4 ISP的结构原理 将ISP功能集成到成型的PCB上就可以实现程序的实时更新与升级操作,其结构原理如图5所示,这对于复杂工程系统设计显然是很方便的,也是切实可行的。 5 结论 随着智能仪器仪表技术的发展,显示模块的液晶化已成为一种较为流行的趋势。本文给出的软硬件设计方案已在某武器系统的调试过程中得到正确、可靠、稳定的运行。它不仅克NT模似仪表体积大、故障率高的缺陷,而且由于运用了RTOS技术,使数据检测的敏捷度得到大幅提升。另外,ISP功能的在线集成也为系统功能的扩充预留了空间。