采用RS232接口的数码电压表外文翻译资料

 2022-01-07 09:01

英语原文共 257 页,剩余内容已隐藏,支付完成后下载完整资料


12

采用RS232接口的数码电压表

12.1本章讲什么

本章包含了一个关于如何使用我们在第10章所描述的AVR开发板,并将之作为一个可通过RS232接口访问的8通道数码电压表的教学用例。串行线路上接收到的信号被翻译成模拟通道的地址以备读取和记录。

12.2硬件设备

A/D转换器要求的电压范围是[0,],而与有关。多个模拟输入信号先输送一组正电压信号到连接器X100的1-8节点。X100-9接地,然后再通过设置在R11--R26和C11--C19的R--C滤波电路滤波。最后施加在单片机的AD0--AD7的模拟输入端。

ADC系统的输出,是一个随变化的10位的二进制数值。

(12.1)

因为,举个例子,输入电压,转换为十进制为634,由此可导出ADC系统输出值是16进制数$27A

这一章节中所举出的例子只使用了串行接口RS232来记录ADC系统读取的值。但是如果任选一个本地显示,比如附录A14中的一个,就可以通过同步外设接口SPI连接到开发板上。

12.3软件设备

软件应用是根据第10章所述的原则所架构的。经过初始化设备后,程序便进入了一个无限循环,在此循环中,程序会反复读取所有的ADC模拟输入端,然后将扫描结果存储在一个RAM缓冲器中。如果异步串行接口接收到了一个在0到7范围内的ASCⅡ码,该数据需要从两个字节转换为响应模拟输入端的10位的值,此时接收到的ASCⅡ码会被转换成4位ASCⅡ数字码并且在串行输入输出线上传送。

如下是一张主函数模块列表(文件名VMMAIN.ASM)

.include lsquo;lsquo;8535def.incrsquo;rsquo;

.include lsquo;lsquo;map.asmrsquo;rsquo; ; 定位变量

.cseg

.org 0

reset:

rjmp init

.org $10

init:

.include lsquo;lsquo;init.asmrsquo;rsquo; ;调用初始化子函数

sei

main_loop:

rcall get_adc ;读取模拟输入

rcall get_cmd ;检查来自UART模块的数据

brcc main_loop

rcall exec_cmd ;响应访问完成

;串行线路

rjmp main_loop

.include lsquo;lsquo;uart.asmrsquo;rsquo; ;UART专用子函数

.include lsquo;lsquo;lib.asmrsquo;rsquo; ;媒体子函数

.include lsquo;lsquo;adc.asmrsquo;rsquo; ;ADC系统专用子函数

请注意,主函数的循环只包括了对3个子程序的调用。Get_adc读取所有的模拟输入端,get_cmd检查UART接收器对于一个0到7之间的ASCⅡ码的数据注册,如果有符合要求的数据被接受,便返回CARRY 标志集。最后,exec_cmd取出受到命令符指示的模拟线路的值,将之转换成4个ASCⅡ数码,并将转换结果输送至串行线路中去。

其他的函数模块包含了变量定义模块(MAP.ASM),初始化模块(INIT.ASM),专用外设函数(UART.ASM,SDC.ASM)和集成数据转换和执行函数(LIB.ASM)

MAP.ASM模块包含了大量的常量定义以及RAM变量的定义:

.def rint=r1 ;为变量指定别名

.def rsav=r2

.def tmp1=r16

.def tmp2=r17

.def tmp3=r18

.def op1l=r19

.equ prescaler_adc=7 ;ADC 时钟=系统时钟/128

.equ adc_max_ch=7 ;ADC系统通道的最大值

.equ f_baud=51 ;9600 波特每秒

.dseg ;RAM变量

buf_adc: .byte 16 ; ADC 数据的缓冲区间

.equ f_baud=51 ;9600波特每秒

INIT.ASM模块是一个编码块,包含了栈指针SP的初始化,以及调用该程序需要使用到的外设接口的初始化子函数。专用资源的初始化函数位于UART.ASM中的init_uart和ADC.ASM中的init_adc。 而INIT.ASM内包含的整个编码块都被指令.include插入在了主函数当中。

init_sp:

ldi tmp1,high(ramend)

out sph,tmp1

ldi tmp1,low(ramend)

out spl,tmp1

rcall init_uart

rcall init_adc

end_init:

UART初始化函数init_uart我们在前面的章节已经讲解过。下面是ADC子系统初始化的函数清单。

init_adc:

ldi tmp1,0 ;首先是0通道

out admux,tmp1

ldi tmp1,prescaler_adc ;ADC 时钟=系统时钟/128

out adcsr,tmp1

sbi adcsr,aden ;激活ADC系统

sbi adcsr,adsc ;开始第一次

;转换

ret

此编码通过写入模拟多路分接器对通道0进行选择,然后通过对预定标器进行编程来将系统时钟划分成128份实现对ADC时钟的选择,并通过设定控制/状态寄存器ADCSR中的ADEN端口的位数来激活ADC系统。最后,编码便通过对控制/状态寄存器ADCSR中的ADSC端口的位数设定,开始对选中通道的数据进行转换。

子函数get_adc通过检查ADIF端口的位数确定是否已经完成最后一步转换。如果ADIF=1,那么ADC的结果值(以两字节形式读取)便被存储在RAM缓冲器buf_adc中,该缓冲器使用通道序号进行对应的检索。之后在下一个通道就会形成新一轮的转换过程。

get_adc:

sbis adcsr,adif ;如果ADIF=0则退出

ret

in tmp1,admux ;否则,读取通道编号

andi tmp1,0b00000111

ldi xl,low(buf_adc) ;x指向缓冲区的起始

ldi xh,high(buf_adc)

clr tmp2

push tmp1 ;存储通道编号

add tmp1,tmp1 ;每个通道两字节

add xl,tmp1 ;为x加上起始地址

adc xh,tmp2

in tmp1,adcl ;取得ADC 转换结果

in tmp2,adch

st x ,tmp1 ;将结果存储在缓冲区中

st x,tmp2

pop tmp1 ;重新存储通道编号

inc tmp1 ;增量

cpi tmp1,adc_max_ch 1 ;检查是否为最后一个通道

brlo getadc1

clr tmp1 ;如果是,返回通道0

getadc1:

out admux,tmp1 ;选择新通道

sbi adcsr,adsc ;开始新的转换过程

ret

RS232输入输出呈现在主函数循环中调用的两个子函数中(get_cmd和exec_cmd),而这两个子函数都位于函数模组LIB.ASM中。

Get_cmd是检查UART接收器是否存在0到7之间的ASCII码的数据注册,如果没有接收到信号,或者ASCII码不在允许范围内,get_cmd就会返回为CARRY=0,否则它将返回处在记录r16中的一则明确编码,并且返回CARRY=1。

get_cmd:

rcall get_uart ;检查是否接收到信号

brcs getcmd1 ;如果未接收到信号则退出

ret

getcmd1:

clc

cpi tmp1,$30 ;$30 是0 的 ASCII 码

brlo exit_gcmd

cpi tmp1,$38 ;$38 是8 的ASCII 码

brsh exit_gcmd

sec ;设置进位

exit_gcmd:

ret

Exec_cmd将一个数据包发送至串行线路,具有如下结构:

N : AAAA CR LF

其中,N是通道编号的ASCII编码,“:”用作分界符号,AAAA是所选中通道中最后一个被转换的16进制数值,CR,LF分别是回车($0D)和换行($0A)的ASCII编码。这允许任何ASCII终端模拟器使用,比如说 HyperTerminal来进行程序代码测试。

请注意exec_cmd调用了一个子函数hex_asc,该函数是将tmp1中的内容转换成ASCII数据,该数据是根据输入的半字节值的不同返回于tmp1和tmp2中的。

因此,在exec_cmd读取通道3的二进制数值1100100111b的例子中,字符串的输出结果就是:3:0C27

如下是子函数exec_cmd:

exec_cmd:

rcall put_uartw ;显示通道编号

rcall asc_hex ;转换为16进制数

ldi xl,low(buf_adc) ;x 指向缓冲区的起始位置

ldi xh,high(buf_adc)

clr tmp2

add tmp1,tmp1 ;计算buf_adc中的缓冲区补偿

add xl,tmp1

adc xh,tmp2

adiw xh:xl,2

ldi tmp1,rsquo;:rsquo; ;发送lsquo;:rsquo; 作为分界符号

rcall put_uartw

ld tmp1,-x ;取得缓冲区的高字节

rcall hex_asc ;转换为ASCII码

rcall put_uartw ;发送第一个字符

mov tmp1,tmp2

rcall put_uartw ;发送第二个字符

ld tmp1,-x ;取得低字节

rcall h

全文共12785字,剩余内容已隐藏,支付完成后下载完整资料


资料编号:[1949]

原文和译文剩余内容已隐藏,您需要先支付 30元 才能查看原文和译文全部内容!立即支付

以上是毕业论文外文翻译,课题毕业论文、任务书、文献综述、开题报告、程序设计、图纸设计等资料可联系客服协助查找。