课设基于单片机的RS232C串行通讯接口设计Word格式文档下载.docx
《课设基于单片机的RS232C串行通讯接口设计Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《课设基于单片机的RS232C串行通讯接口设计Word格式文档下载.docx(15页珍藏版)》请在冰豆网上搜索。
数据接收;
LED显示;
单片机与PC机串行通信。
0.前言
电脑的发展对通信起了巨大的推动作用,电脑和通信紧密结合构成了灵活多样的通信控制系统,也可以构成强有力的信息处理系统,这样对社会的发展产生了深远的影响。
随着电子技术和电脑技术的发展,特别是单片机的发展,使传统的测量仪器在原理、功能、精度及自动化水平等方面发生了巨大的变化,形成了一种完全突破传统概念的新一代测试仪器——智能仪器。
智能仪器是以微处理器为核心的电子仪器,它不仅要求设计者熟悉电子仪器的工作原理,而且还要求其掌握微型电脑硬件和软件的原理。
目前,有很多的传统电子仪器已有相应的替代产品,而且还出现不少全新的仪器类型和测试系统体系。
在科学技术高速发展的今天,如何用简单廉价、性能良好的元器件制造出对人类生活有用的产品,已经成为人们研究的主要趋势。
在自动化技术中,无论是过程控制技术还是数据采集技术还是测控技术,都离不开单片机,在工业自动化的领域中,机电一体化技术发挥越来越重要的作用,在通信方面,单片机得到了广泛运用。
在实现电脑与电脑、电脑与外设的串行通讯时,通常采用标准的通讯接口。
所谓标准的通讯接口,就是明确定义假设干信号线的机械、电器特性,使接口电路标准化、通用化,这样就能方便地把不同的电脑、外设等有机地连接起来,进行串行通讯。
RS-232C是由美国电子工业协会〔EIA〕制定的用于串行通信的标准通信接口,利用它可以很方便地把各种电脑、外围设备、测量仪器等有机地连接起来,进行串行通信。
它包括按位传输的电气和机械方面的规定,适用于短距离或带调制解调器的通信场合。
RS-232C标准适用于DCE和DTE之间的串行二进制通信,最高的数据速率为19.2Kbit/s,在使用此波特率进行通信时,最大传输距离在20m之内。
降低波特率可以增加传输距离。
对于RS-232C标准接口的使用是非常灵活的,实际通信中经常采用9针接口进行数据通信。
1.总体方案设计
在本次设计中,硬件部分,对于一片89C51和PC机,采用RS232进行通信,硬件的连接方法如图1所示。
电平转换芯片采用MAX232,传输距离一般不超过15m,传输小于20kbit/s。
发送方的数据由串行口TXD段输出,经过电平转换芯片MAX232将TTL电平转换为RS232电平输出,经过传输线将信号传送到接收端。
为提高抗干扰能力,还可以在输入输出端加光耦合进行光电隔离。
软件部分,通过通信协议进行发送接收。
串行口的工作方式为8位UART,波特率可变〔T1溢出率/n〕。
定时器的工作方式为工作方式2。
TXDT2INT2OUTTXD
AT89C51MAX232A串行接口
RXDR2OUTR2INRXD
图1RS-232C电平信号传输的连接图
2.硬件电路的设计
单片机系统
标准型89系列单片机是与MCS-51系列单片机兼容的。
在内部含有4KB或8KB可重复编程的Flash存储器,可进行1000次擦写操作。
全静态工作为0~33MHz,有3级程序存储器加密锁定,内含有128~256字节的RAM、32条可编程的I/O端口、2~3个16位定时器/计数器,6~8级中断,此外有通用串行接口、低电压空闲模式及掉电模式。
AT89C51相当于将8051中的4KBROM换成相应数量的Flash存储器,其余结构、供电电压、引脚数量及封装均相同,使用时可直接替换。
AT89C51在内部采用40条引脚的双列直插式封装,引脚排列如图2所示:
图2AT89C51芯片引脚
在自动化测量和控制系统中,各台仪表之间需要不断地进行各种信息的交换和传输,这种信息的交换和传输是通过仪表的通信接口,按照一定的协议进行的。
通信接口是各台仪表之间或者是仪表与电脑之间进行信息交换和传输的联络装置。
电脑与外界的信息交换称为通信,常用的通信方式有两种:
并行通信和串行通信。
所谓并行通信是指数据的各位同时在多根数据线上发送或接收,其特点是传输信号的速度快,但所用的信号线较多,成本高,传输的距离较近。
串行通信是指将构成字符的每个二进制数据位,依照一定的顺序逐位进行传送的通信方式,其特点是只用两条信号线〔一条信号线,再加一条地线作为信号回路〕即可完成通信,成本低,传输的距离较远。
51单片机内部有一个可编程全双工串行通信接口。
该部件不仅能同时进行数据的发送和接收,也可作为一个同步移位寄存器使用。
51单片机串行接口的结构如下:
〔1〕串行数据缓冲器〔SBUF〕
接受或发送的数据都要先送到SBUF缓存。
SBUF包括缓存寄存器和发送寄存器,以便能以全双工方式进行通信。
此外,在接收寄存器之前还有移位寄存器,从而构成了串行接收的双缓冲结构,这样可以防止在数据接收过程中出现帧重叠错误。
发送数据时,由于CPU是主动的,不会发生帧重叠错误,因此发送电路不需要双重缓冲结构。
在逻辑上,SBUF只有一个,它既表示发送寄存器,又表示接收寄存器,具有同一个单元地址99H。
但在物理结构上,则有两个完全独立的SBUF,一个是发送缓冲寄存器SBUF,另一个是接收缓冲寄存器SBUF。
如果CPU写SBUF,数据就会被送入发送寄存器准备发送;
如果CPU读SBUF,则读入的数据一定来自接收缓冲器。
即CPU对SBUF的读写,实际上是分别访问上述两个不同的寄存器。
〔2〕串行控制寄存器〔PCON〕
串行控制寄存器SCON用于设置串行口的工作方式、监视串行口的工作状态、控制发送与接收的状态等。
它是一个既可以字节寻址又可以位寻址的8位特殊功能寄存器。
其格式如表1所示:
表1串行口控制寄存器SCON
位地址
9FH
9EH
9DH
9CH
9BH
9AH
99H
98H
SCON
SM0
SM1
SM2
REN
TB8
RB8
T1
R1
SM2:
多机通信控制位。
REN:
接收允许控制位。
软件置1允许接收;
软件置0禁止接收。
TB8:
方式2或3时,TB8为要发送的第9位数据,根据需要由软件置1或清0。
RB9:
在方式2或3时,RB8位接收到的第9位数据,实际为主机发送的第9位数据TB8,使从机根据这一位来判断主机发送的时呼叫地址还是要传送的数据。
TI:
发送中断标志。
发送完一帧数据后由硬件自动置位,并申请中断。
必须要软件清零后才能继续发送。
RI:
接收中断标志。
接收完一帧数据后由硬件自动置位,并申请中断。
必须要软件清零后才能继续接收。
SM0,SM1:
串行口工作方式选择位,这两位组合成00,01,10,11对应于工作方式0、工作方式1、工作方式2、工作方式3。
串行接口工作方式如表2:
表2串行工作方式
工作方式
功能
波特率
0
8位同步移位寄存器〔用于I/O扩展〕
fORC/12
1
10位异步串行通信〔UART〕
可变〔T1溢出率*2SMOD/32〕
2
11位异步串行通信〔UART〕
fORC/64或fORC/32
3
〔3〕输入移位寄存器
接收的数据先串行进入输入移位寄存器,8位数据全移入后,再并行送入接收SBUF中。
〔4〕波特率发生器
波特率发生器用来控制串行通信的数据传输速率的,51系列单片机用定时器T1作为波特率发生器,T1设置在定时方式。
波特率是用来表示串行通信数据传输快慢程度的物理量,定义为每秒钟传送的数据位数。
〔5〕电源控制寄存器PCON
波特率系数控制寄存器PCON的最高位为Smod,仅仅是最高位与串行口有关。
在工作方式1~工作方式3时,假设SMOD=1,则串行口波特率增加一倍。
假设SMOD=0,波特率不加倍。
系统复位时,SMOD=0。
PCON字节地址为87H,不能位寻址。
PCON的格式如表3
PCON
D7
D6
D5
D4
D3
D2
D1
D0
位名称
SMOD
-
GF1
GF0
PD
IDL
表3特殊功能寄存器PCON的格式
〔6〕波特率计算
串行口每秒钟发送〔或接收〕的位数称为波特率。
设发送一位所需要的时间为T,则波特率为1/T。
对于不同方式,得到的波特率的范围是不一样的,这是由定时器/计数器T1在不同方式下计数位数的不同所决定的。
串行口工作在方式1或方式3时,常用定时器T1作为波特率发生器,关系式为:
波特率=2SMOD×
(T1溢出率)/32。
2.2MAX232芯片
在电气特性上RS-232C采用负逻辑,要求高、低两信号间有较大的幅度,标准规定为:
逻辑‘1’:
-5~-15V,逻辑‘0’:
+5~+15V。
而单片机的信号电平与TTL电平兼容,逻辑1大于+2.4V,逻辑0为0.4V以下。
很显然,RS-232C信号电平与TTL电平不匹配,为了实现两者的连接,必须进行电平转换。
MAX232C为单一+5V供电,内置自升压电平转换电路,一个芯片能同时完成发送转换和接收转换的双重功能。
其引脚如图3:
图3电平转换芯片MAX232
(1)C1+,C1-,C2+,C2-;
外接电容端。
(2)R1IN,R2IN:
两路RS-232C电平信号输入端,可接传输线。
(3)R1OUT,R2OUT:
两路转换后的TTL电平输出端,可接单片机的RXD端。
(4)T1OUT,T2OUT:
两路转换后的RS-232C电平信号输出端,可接传输线。
(5)T1IN,T2IN:
两路TTL电平输入端,可接单片机的TXD端。
(6)Vs+,Vs-:
分别经电容接电源和地。
整体电路设计
最终设计电路如图4所示,发送方的数据由串行口TXD段输出,经过电平转换芯片MAX232将TTL电平转换为RS232电平输出,经过传输线将信号传送到接收端。
接收方也使用MAX232芯片进行电平转换后,信号到达接收方串行口的接收端。
接受方接收后,通过P0口在数码管上显示接收的信息。
图4串行通信电路
3软件设计
通过通信协议进行发送接收,主机先送AAH给从机,当从机接收到AAH后,向主机答复BBH。
主机收到BBH后就把数码表TAB[16]中的16个数据送给从机,并发送检验和。
从机收到16个数据并计算接收到数据的检验和,与主机发送来的检验和进行比较,假设检验和相同则发送00H给主机;
否则发送FFH给主机,重新接受。
从机收到16个正确数据后送到一个数码管显示。
3.1串行通信软件实现
〔1〕串行口工作于方式1;
用定时器1产生9600bit/s的波特率,工作于方式2。
〔2〕功能:
将本机ROM中数码表TAB[16]中的16个数发送到从机,并保存在从机内部ROM中,从机收到这16个数据后送到一个数码管循环显示。
〔3〕通信协议:
主机首先发送连络信号(AAH),从机接收到之后返回一个连络信号(BBH)表示从机已准备好接收。
〔4〕通信过程使用第九位发送奇偶校验位。
〔5〕从机接收到一个数据后,立即进行奇偶校验,假设数据没有错误,则返回00H,否则返回FFH。
〔6〕主机发送一个数据后,等待从机返回数据;
假设为00H,则继续发送下一个数据,假设为FFH,则重新发送数据。
3.2程序流程图
开始
初始化
发送数据
按键按下?
否
是
接收数据
结束
图5单片机向PC机发送数据流程图
3.2.1PC机向单片机发送数据流程图
结束
图6PC机向单片机发送数据流程图
在protues上进行仿真实验。
首先使用KeiluVsion2将编写完成的程序编译生成HEX文件,将HEX文件烧录单片机中,进行仿真实验,结果如图7所示,可以看到,接收端已将接收到的数据完整的显示出来。
图7仿真图一
图8仿真图二
5.课设小结及进一步设想
通过这次紧张的课程设计,我学到了很多,尤其是对串行通信这方面有了新的认识,加深了对单片机知识点的理解。
在繁忙的一个学期即将结束之时,我的思想成熟了,这次的课设让我找到了方向,让我懂得了很多,有知识方面的,但大部分还是人格方面的。
我相信,只要不放弃,只要努力,就一定可以!
本文采用的RS-232标准实现单片机与PC机之间的串行通信。
RS-232是目前最常用的一种串行通讯接口。
由于RS-232-C接口标准出现较早,难免有不足之处。
主要表现在:
1、接口的信号电平值较高,易损坏接口电路的芯片,又因为与TTL电平不容,故需使用电平转换电路才能与TTL电路连接。
2、传输速率较低,在异步传输时,波特率为20Kbps。
3、接口使用一根信号线和一根信号返回线而构成共地的传输形式,这种共地
传输容易产生共模干扰,所以抗噪声干扰性弱。
4、传输距离有限,最大传输距离标准值为50英尺,实际上也只能用在50米
左右。
因此建议使用RS-485标准实现,RS-485接口具有良好的抗噪声干扰性,长的传输距离和多站能力等优点就使其成为首选的串行接口。
参考文献
[1]方彦君.智能仪器技术及其应用.北京:
化学工业出版社,2007.9
[2]—
[3]何立民.单片机应用技术选编.北京:
北京航天航空大学出版,2002.5
附录
元件清单
元件名称
型号
数量
单片机
AT89C51
接口芯片
MAX232A
串行接口
机械开关
导线
假设干
附录
整体电路图
源程序清单
#include<
reg52.h>
#defineuintunsignedint
#defineucharunsignedchar
ucharReceive_Buffer[101];
ucharBuf_Index=0;
ucharcodeDSY_CODE[]=
{
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00
};
voidDelay(uintx)
uchari;
while(x--)
{
for(i=0;
i<
120;
i++);
}
}
voidmain()
P0=0x00;
Receive_Buffer[0]=i;
SCON=0x50;
TMOD=0x20;
PCON=0x00;
TH1=0xfd;
TL1=0xfd;
EA=1;
EX0=1;
IT0=1;
ES=1;
IP=0x01;
TR1=1;
while
(1)
100;
i++)
{
if(Receive_Buffer[i]==-1)
break;
P0=DSY_CODE[Receive_Buffer[i]];
Delay(200);
}
Delay(200);
voidSerial_INT()interrupt4
ucharc;
if(RI==0)
return;
ES=0;
RI=0;
c=SBUF;
if(c>
='
0'
&
&
c<
9'
)
Receive_Buffer[Buf_Index]=c-'
;
Receive_Buffer[Buf_Index+1]=-1;
Buf_Index=(Buf_Index+1)%100;
voidEX_INT0()interrupt0
uchar*s=("
STC89C51\r\n"
);
uchari=0;
while(s[i]!
\0'
SBUF=s[i];
while(TI==0);
TI=0;
i++;