ADμC812的数据采集子系统及其系统编程技术
目前,由于ADμC812只提供表贴封装形式,因而在用仿真器进行程序调试时将会带来一些问题。为方便调试,ADμC812A片内除集成了各具特色的硬件模块外,还因化了方便实用的监控调试软件,使其只需少量的外围器件即可实现联机调试,从而大大方便了用户的使用,缩短了产品的研制周期。启用调试方式的电路连接如图3所示。
在上电复位的瞬间,使EA引脚接高电平,PSEN引脚接一下拉电阻,即可使ADμC812进入监控调试支援方式。在此方式下,通过基于PC的Quick Start开发工具包,即可下载用户程序。通过运行于Microsoft Windows系统下的下的ADμC.exe调试软件,可实时调试用户程序。
该调试软件支持单步、断点和连续运行等工作方式,可方便地观察MCU的运行结果,包括内部RAM、SFR、程序Flash EEPROM和数据Flash EEPROM等单元的内容。从而提高了工作效率,缩短了产品的开发周期。图3中MAX232为RS232电平转换器,用于将TTL电平转换成RS232电平,以便直接连至PC的串行口,进行联机调试或下载程序。

Quick Start还提供了工作于DOS环境下的串行下载软件DownLoad.exe。运行该软件可直接将用户程序编程到ADμC812芯片中的程序Flash存储器中,免除了需用编程器和封装适配器的麻烦,真正实现了在系统可编程。Quick Start开发工具软件包可从www.analog.com/microconverter/quick-start.html下载得到。
三、定时ADC编程举例
该例程主要说明如何利用ADC的单次转换功能实现定时采样的目的。定时器T0用于1.25ms定时,8个通道完成一次数据采集需要10ms。为增加抗干扰的能力,软件中还加入了数字滤波功能。每个通道连续采样16次后再进行平均处理,然后将高8位结果送出,其汇编语言源程序清单如下:
$NOMOD51$INCLUDE() ;使用ADμC812预定义符
Timer_ms_const equ(65536-9216/8);当晶振频率为11.0592MHz时,10ms对应9216个周期ADC_tlag equ 20H.0;AD转换标志,=1时表示采样的8路AD值有效ADC_coun equ 30H;用于指示当前正在处理的ADC通道ADC_result equ 38H;38H~3FH存入0~7通道的ADC结果ADC_acc equ 40H;40~4FH存入0~7通道的累加值ORG 0000Hstart:jmp BeginORG start+0BHJmp Timer0_interruptORG start+100hBegin;mov SP,#60Hmov R0,#20H;清工作单元mov R7,#40Hclr AiRAM_init;mov @R0,Ainc R0djnz R7,iRAM_initcall Timer0_init;初始化T0为1.25ms中断一次call ADC_init;初始化ADC为单次转换setb EAControlloop:Jnb ADC_flag,Controlloop…… ;将AD转换的结果取走clr ADC_flag;允许开始下一次转换jmp ControlloopADC_init:mov ADCCON1,#01101100B;
上电ADCmov ADCCON2,ADC_count;选择转换通道retTimer0_interrupt:
setb SCONV;开始单次ADC转换mov TL0,#LOW(Timer_ms_const);装入定时常数mov TH0,#HIGH(Timer_ms_const)push PSWmov PSW,#00001000B;使用page1mov R2,A;暂存A累Timer0_int_ADC:jb ADC_flag,Timer0_int_ADC_end;数据未取走则退出Mov A,ADCCON3;
读ADC状态jb ACC.7,Timer0_int_ADCmov A,ADC_countanl A,#07Hrl Aadd A,#ADC_accmov R0,Amov A,ADCDATAL;将ADC转换结果加入累加单元add A,@R0mov @R0,Ainc R0mov A,ADCDATAHanl A,#0FHaddc A,@R0mov #R0,Ainc ADC_countmov A,ADC_countanl A,#07Hmov ADCCON2,A;选择下一通道mov A,ADC_countcjne A,#80H,Timer0_int_ADC_endmov ADC_count,#0mov R0,#ADC_acc;数字滤波后存入ADC结果mov R1,#ADC_resultmov R7,#08Timer0_int_save_ADC:
clr Amov #R0,Ainc R0xch A,#R0mov @R1,Ainc R0inc R1djnz,R7,Timer0_int_save_ADCsetb ADC_flagTimer0_int_ADC_end:Mov A,R2Pop PSWRetiTimer0_init;mov TH0,#HIGH(Timer_ms_const);装入定时常数mov TL0,#LOW(Timer_ms_const)anl TMOD,#11110000Borl TMDD,#00000001BSetb ET0;允许T0中断Setb TR0;T0开始运行RetEND
评论