AVR单片机ATmega16与计算机串行通信的实现
扫描二维码
随时随地手机看文章
摘 要:介绍AVR单片机ATmega16和计算机的串行通信的软、硬件设计,采用Visual Basic6.0中的MSComm通信控件实现计算机与单片机ATmega16之间的串行通信。文章详细阐述了程序的设计流程,并给出了部分程序代码。实验证明该系统可以实现ATmega16与计算机之间的通信。
关键词: ATmega16;计算机;串行通信;Visual Basic6.0
AVR单片机[1]是美国ATMEL公司的精简指令集单片机,大多数是单周期指令,运行速度快。AVR单片机带有Flash程序存储器,擦写方便,支持ISP(串行在线下载),便于产品的调试、开发和更新。ATmega16是AVR单片机家族中的高档产品,是目前占主流、高信价比的AVR芯片之一。ATmega16的主要特点有:功耗低,在正常模式下只有1.1 mA;最高工作频率可达16 MHz;具有可擦写的16 KB的可编程Flash;内含8路10 bit ADC;具有高度灵活的串行通信设备USART,使用时只需设置相关的寄存器参数就可以实现串行通信。
EIA-232是常用的串行通信[2]技术标准之一,是目前通信工业中应用最广泛的一种串行接口,这是由于工业领域对产品的可靠性和稳定性的要求更高,EIA标准下的串行通信技术完全可以满足人们对工业设备传输的各种性能要求,使得EIA串口通信在系统控制[3-5]的范畴中一直占据着极其重要的地位。计算机和单片机的EIA-232串行通信是许多测控系统常用的一种通信解决方案。本文介绍了计算机和单片机ATmega16之间EIA-232串行通信的实现。计算机作为上位机,单片机作为下位机。
1 硬件设计
图1为EIA-232串行通信系统的结构框图。
EIA-232用正、负电压来表示逻辑状态,有效负电平的状态为逻辑1,有效正电平的状态为逻辑0;而单片机使用的TTL电平是以高、低电平表示1和0两种逻辑状态,因此将两者相连必需进行电平逻辑关系的变换。图1中的芯片MAX232就是将TTL和RS232电平相互转换的器件。
图2为EIA-232串行通信电原理图。电压VCC可采用5 V供电。
图2中的D Connector9是用于连接计算机串行口的接插件,5脚是接地端,3脚是发送端TXD,2脚是接收端RXD。TXD端的电平经MAX232转换为TTL电平后送给单片机的接收端;单片机发送出的TTL电平的数据经MAX232转换为RS232电平经RXD传送给计算机。ATmega16工作时使用系统内部时钟8 MHz,不需外接晶振,只需在烧录程序时设置相关参数即可使用内部时钟。图2中标号为UP的是一个10脚的接插件,通过这个接插件与程序烧录器相连即可实现单片机程序的烧录操作,方便产品升级。
2 上位机程序设计
上位机程序的编写采用Visual Basic6.0的编程环境。使用Visual Basic6.0的MSComm串行通信控件,非常容易实现串口通信,使用时要对串行通信的信息格式和协议进行设置。每个通信控件对应一个串口, 如果要访问多个通信口, 则要设计多个通信控件。
计算机与单片机之间的通信采用查询的工作方法,计算机作为上位机,单片机作为下位机。计算机主要负责发送控制命令以及数据的发送、接收、处理、计算和显示等功能。计算机的程序设计包括界面设计以及程序代码的编写。图3为设计的程序界面,图3中含有发送数据的输入框、接收数据的显示框和命令控件按钮。用鼠标点击“发送/接收”按钮后程序开始运行,接收数据与发送数据一致时说明通信成功,否则失败。
图4为程序设计的流程图。具体的程序代码包括串口的初始化及数据的发送与接收。初始化代码主要对串行通信的信息格式和协议进行设置,串口的初始化代码如下:
MSComm1. CommPort = 1 //使用COM1串口
MSComm1. Settings="9600,n,8,1"
//数据格式:波特率9600 b/s,无奇偶
校验,8 bit数据位,1 bit停止位
MSComm1. OutBufferCount = 0 //清空发送缓冲区
MSComm1. InBufferCount = 0 //清空接收缓冲区
MSComm1. InputMode = 1 //以二进制形式取回数据
MSComm1. InputLen=0 //一次读取缓冲区内全部数据
If MSComm1.PortOpen = False Then
MSComm1.PortOpen = True
End If //打开串口
数据的发送和接收主要用到下面两句代码:
MSComm1.Output = outdata
backdata = MSComm1.Input
由于篇幅的限制,其他代码不再给出。
3 下位机程序设计
Atmega16内部的USART是一个通用的同步和异步串行接收器和发送器,其高度灵活,使用非常方便。与USART相关的寄存器有:UDR、UCSRA、UCSRB、UCSRC、UBRRH和UBRRL。UDR是USART发送数据和接收数据共享的数据寄存器,将数据写入UDR时实际操作的是通过UDR发送数据,读UDR时实际返回的是UDR中的数据。UCSRA、UCSRC和UCSRB为控制和状态寄存器,串行口的通信模式的设置可通过对UCSRA和UCSRB的相关数据位进行写操作来实现。数据帧包含的数据位数也是由UCSRB来确定,并与上位机保持一致。UBRRH和UBRRL为波特率寄存器,UBRRH和UBRRL是16位寄存器UBRR的高8位和低8位。UBRR的值是用于确定串行通信的波特率,对于异步正常模式(由UCSRA和UCSRB确定),波特率的计算公式为,对于9 600 b/s的波特率(和上位机一致),在fosc=8 MHz的情况下,通过计算得UBRR的值为51。对UBRR进行写操作时注意要先写高8位UBRRH,后写低8位UBRRL,否则写入无效。
程序流程如图5所示。判断接收是否结束依据UCSRA中的标志位RXC,当RXC=1时表示接收没有结束,继续接收;当RXC=0时表示接收结束,可以从UDR中读出接收到的数据。判断发送是否结束依据UCSRA中的标志位TXC,当TXC=1时表示发送没有结束;当TXC=0时表示发送结束。