工业领域的测控系统,用作操作、监视的上位PC和用作控制的下位单片机之间必须要进行信息交换,串行通讯是两者之间常用的通讯方式。Atmel公司开发的AT90系列8位单片机是真正的RISC单片机,具备可多次编程的Flash程序存储器、EPROM数据存储器、可编程的URAT串行口及外部中断等,再加上使用方便的SL-AVR程序开发软件,可以在成本很低的情况下开发小型控制系统。本文主要介绍单片机AT90S8515与PC之间的串行通讯方法以及应用VB在PC上实现串行通讯的编程方法。
1 串行通讯的接口电路
PC的串行通讯可以采用Modern方式或零调制方式,采用Modern方式时,通讯伙伴必须有调制解调器,这也是标准的RS232方式;采用零调制方式时,通讯伙伴没有调制解调器,通讯时,双方保证各自输出的电平满足RS232接口的逻辑要求。
单片机AT90S8515的PD0和PD1口分别为有串行通讯功能的RXD和TXD,但是其输入/出是TTL电平,而PC的串行口是按照RS232标准设计的,两者的电平不匹配,不能直接连接。需要中间接口电路来完成电平转换。RS232电平与TTL电平转换用芯片MAX232E实现,电路如图1所示。
在图1中,芯片MAX232E的T1OUT、R1IN和GND分别与PC串口以232电平对应连接;而T1IN、R1OUT为TTL/CMOS电平,与单片机AT90S8515的PD0(RXD)和PD1(TXD)对应连接。该电路为+5 V电源供电,其作用一方面使单片机发送的TTL信号转化为RS232的电平信号;另一方面使PC进来的RS232电平转换为单片机可接收的TTL/CMOS电平信号[1]。
2 单片机AT90S8515串行通讯原理及编程
2.1 单片机AT90S8515串行通讯原理
AT90系列的单片机带有一个全双工通用串行异步收发器(UART)。通讯时使用4个寄存器:(1)数据寄存器UDR,该寄存器是两个物理分离的、但分享同一个I/O地址的寄存器。当写入UDR寄存器时,UART的发送数据寄存器被写入;当读UDR寄存器时,读的是UART的接收数据寄存器。(2)状态寄存器USR,该寄存器是一个只读的寄存器,提供UART的状态信息。数据接收完成标志为RXC、发送完成标志为TXC,数据寄存器清空标志为UDRE、帧出错标志为FE、超时标志为OR。(3)控制寄存器UCR,该寄存器是一个读/写寄存器,用来设定是否启动发送或接收、定义数据位数、接收或发送造成的中断是否触发等控制逻辑。(4)波特率寄存器UBR,该寄存器是一个读/写寄存器,用来设定通讯的波特率。UBR通过公式UBR=FCK/BAUD/16-1确定,其中FCK为单片机的晶振频率,UBR表示波特率寄存器UBR中的值。
2.2 单片机AT90S8515串行通讯编程
单片机AT90S8515芯片的通讯编程按如下步骤进行[2]:
(1)对涉及通讯的数据、状态、控制寄存器和波特率寄存器进行初始化,若使用中断方法进行通讯,需同时对中断进行定义。
(2)发送数据编程,根据数据寄存器的清空标志UDRE,判断是否该发送下一个数据。语句如下:
Sbi UCR, TXEN; 启动数据发送
Out UDR, u_buffer; 发送数据
Wait: sbis USR, UDRE; 等待数据寄存器清空
Rjmp wait
(3)接收数据编程,通过循环检测数据接收完成标志RXC,确定是否可以读取新的数据。语句如下:
Sbi UCR, RXEN; 启动数据接收
Idle: sbis USR, RXC; 等待接收
Rjmp idle
In u_buffer, UDR 读入数据
3 PC的串行通讯及编程方法
3.1 PC的串行通讯方法
PC的VB软件为用户提供了串口通讯使用的专用MSComm控件,MSComm控件唯一的事件是OnComm事件,对应的CommEvent属性是MSComm控件记录事件发生和错误的唯一属性,该属性用来配置通讯端口、传输数据、使用握手信号以及识别控件。使用该控件进行通讯时,有两种方法可以选择,查询方式或事件触发方式。其中,查询方式是通过周期性地检测CommEvent属性的数值代码判断发生了哪种通讯错误或者事件;而事件触发方式是利用OnComm事件的触发器进行事件捕获和处理,OnComm对输入数据进行连续检查,查明远端的接收者是否准备好接收新的数据,当满足OnComm的事件发生时,应用程序会自动设置CommEvent属性,跳到控件的OnComm通讯子程序。
3.2 PC的串行通讯编程步骤
(1)通过CommEvent属性设置各通讯参数,打开通讯端口,其中各参数定义如下:
CommPort :设置通讯口号
Settings:设置波特率、奇偶校验、数据位和停止位参数
HandShaking:设置硬件握手协议
InBufferSize和OutBufferSize:设置输入、输出缓冲区的大小
InputLen:设置接收缓冲区中读出的字符数
InputMode:设置接收缓冲区的数据类型
RThreshold:设置要接收的字符数
SThreshold:设置接收允许的最小字符数
PortOpen:打开或关闭串口
(2)通过CommEvent属性的Output项发送数据。如果数据为文本数据,Output项定义为一个包含一个字符串的变量;如果数据为二进制格式,Output项则需定义为一个包含字节数组的变量。MSComm控件为字符串中的每个字符传输8位ANSI编码。如果发送一个ANSI字符串到应用程序,可以用文本数据格式发送,如果发送包含嵌入控制字符等数据,必须用二进制数据格式发送。
(3)发送信息编程。首先,在工程窗体上添加一个多行显示文本框,内容为待发送的信息,定义其名称属性为SendTxt;其次,在工程窗体添加一发送信息的控件按钮,定义按钮名称属性为TxdCmd;最后,双击控件按钮TxdCmd,对其编程如下:
Private Sub TxdCmd Click
Dim Bufs As Variant
Bufs=S1vNo.Text
MSComm. Output’Bufs
EndSub
(4)接收信息编程。首先,在工程窗体上添加一个多行显示文本框,定义名称属性为ReTxt;然后双击控件MSComm,对其编程如下:
Private Sub MSComm_OnComm
Dim ComEventMessage As String
Select Case MSComm.CommEvent
Case commEvReceive
CommEventMessage=Receive buffer has RThreshold number of characters.
ReTxt.Text= MSComm.Input
End Select
MsgBox(CommEventMessage)
EndSub
单片机技术已发展多年,在工业和民用多个领域仍有广阔的前景。本文阐述了用VB语言使Atmel公司的AT90S8515单片机与PC通讯的技术。但是由于篇幅所限,再加涉及软件编程,难以给出具体的细节,请读者参考本文时,同时详细参考有关的技术手册,便于更深刻地理解及实际应用。