英语原文共 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]
以上是毕业论文外文翻译,课题毕业论文、任务书、文献综述、开题报告、程序设计、图纸设计等资料可联系客服协助查找。