双机间波特率可选串行通行Word格式.docx
《双机间波特率可选串行通行Word格式.docx》由会员分享,可在线阅读,更多相关《双机间波特率可选串行通行Word格式.docx(21页珍藏版)》请在冰豆网上搜索。
13
附录·
15
一引言
1.1课题来源及意义
随着电子技术的飞速发展,单片机也步如一个新的时代,越来越多的功能各异的单片机为我们的设计提供了许多新的方法与思路。
对于一些场合,比如:
复杂的后台运算及通信与高实时性前台控制系统、软件资源消耗大的系统、功能强大的低消耗系统、加密系统等等。
如果合理使用多种不同类型的单片机组合设计,可以得到极高灵活性与性能价格比,因此,多种异型单片机系统设计渐渐成为一种新的思路,单片机技术作为计算机技术的一个重要分支,由于单片机体积小,系统运行可靠,数据采集方便灵活,成本低廉等优点,在通信中发挥着越来越重要的作用。
但在一些相对复杂的单片机应用系统中,仅仅一个单片机资源是不够的,往往需要两个或多个单片机系统协同工作。
这就对单片机通信提出了更高要求。
1.2研究现状及趋势
单片机之间的通信可以分为两大类:
并行通信和串行通信。
串行通信传输线少,长距离传输时成本低,且可以利用数据采集方便灵活,成本低廉等优点,在通信中发挥着越来越重要的作用。
所以本系统采用串行通信来实现单片机之间可靠的,有效的数据交换。
二系统设计
2.1概述
2.1.1串行通信的特点
在远程通信和计算机科学中,串行通信是指在计算机总线或其他数据通道上,每次传输一个位元数据,并连续进行以上单次过程的通信方式。
与之对应的是并行通信,它在串行端口上通过一次同时传输若干位元数据的方式进行通信。
一位接一位地顺序传送。
这样一个字节的数据要分8次由低位到高位按顺序一位位地传送。
由此可见,串行通信的特点如下:
1、节省传输线,这是显而易见的。
尤其是在远程通信时,此特点尤为重要。
这也是串行通信的主要优点;
2、数据传送效率低。
与并行通信比,这也这是显而易见的。
这也是串行通信的主要缺点。
串行通信被用于长距离通信以及大多数计算机网络,在这些应用场合里,电缆和同步化使并行通信实际应用面临困难。
凭借着其改善的信号完整性和传播速度,串行通信总线正在变得越来越普遍,甚至在短程距离的应用中,其优越性已经开始超越并行总线不需要串行化元件等缺点。
2.1.2串行通信的分类
(1)异步通信
所谓异步通信,是指数据传送以字符为单位,字符与字符间的传送是完全异步的,位与位之间的传送基本上是同步的.异步串行通信的特点可以概括为:
①以字符为单位传送信息;
②相邻两字符间的间隔是任意长;
③接收时钟和发送时钟只要相近就可以。
异步方式特点简单的说就是:
字符间异步,字符内部各位同步。
(2)同步通信
所谓同步通信,是指数据传送是以数据块(一组字符)为单位,字符与字符之间、字符内部的位与位之间都同步.同步串行通信的特点可以概括为:
①以数据块为单位传送信息;
②在一个数据块(信息帧)内,字符与字符间无间隔;
③接收时钟与发送进钟严格同步。
2.1.3串行通信技术标准
2.1.3.1数据传输率
(1)比特率和波特率:
比特率是指每秒传输的二进制位数,用bps(bit/s)表示。
波特率是指每秒传输的符号数,若每个符号所含的信息量为1比特,则波特率等于比特率。
在计算机中,一个符号的含义为高低电平,它们分别代表逻辑“1”和逻辑“0”,所以每个符号所含的信息量刚好为1比特,因此在计算机通信中,常将比特率称为波特率,即:
1波特(B)=1比特(bit)=1位/秒(1bps)例如:
电传打字机最快传输率为每秒10个字符/秒,每个字符包含11个二进制位,则数据传输率为:
11位/字符×
10个字符/秒=110位/秒=110波特(Baud)计算机中常用的波特率是:
110、300、600、1200、2400、4800、9600、19200、28800、33600,目前最高可达56Kbps.
(2)位时间Td:
位时间是指传送一个二进制位所需时间,用Td
表示。
Td
=
1/波特率
1/B
(3)发送时钟和接收时钟
在串行通信中,二进制数据以数字信号的信号形式出现,不论是发送还是接收,都必须有时钟信号对传送的数据进行定位。
在TTL标准表示的二进制数中,传输线上高电平表示二进制1,低电平表示二进制0,且每一位持续时间是固定的,由发送时钟和接收时钟的频率决定。
1)发送时钟
发送数据时,先将要发送的数据送入移位寄存器,然后在发送时钟的控制下,将该并行数据逐位移位输出。
通常是在发送时钟的下降沿将移位寄存器中的数据串行输出,每个数据位的时间间隔由发送时钟的周期来划分。
2)接收时钟
在接收串行数据时,接收时钟的上升沿对接收数据采样,进行数据位检测,并将其移入接收器的移位寄存器中,最后组成并行数据输出。
2.1.3.2波特率因子
接收时钟和发送时钟与波特率有如下关系:
F=n×
B(2-1)
这里F是发送时钟或接收时钟的频率;
B是数据传输的波特率;
n称为波特率因子。
设发送或接收时钟的周期为Tc,频率为F的位传输时间为Td,则:
Tc=1/F(2-2)
=1/B(2-3)
得到:
Tc=T/n(2-4)
在实际串行通信中,波特率因子可以设定。
在异步传送时,n
1,16,64实际常采n=16,即发送或接收时钟的频率要比数据传送的波特率高n倍。
在同步通信中波特率因子必等于1。
2.1.4串行通信与并行通信区别
计算机与外界的信息交换称为通信。
在通信领域内,有两种数据通信方式:
随着计算机网络化和微机分级分布式应用系统的发展,通信的功能越来越重要。
通信是指计算机与外界的信息传输,既包括计算机与计算机之间的传输,也包括计算机与外部设备,如终端、打印机和磁盘等设备之间的传输。
串行通信是指使用一条数据线,将数据一位一位地依次传输,每一位数据占据一个固定的时间长度。
其只需要少数几条线就可以在系统间交换信息,特别适用于计算机与计算机、计算机与外设之间的远距离通信。
在计算机和终端之间的数据传输通常是靠电缆或信道上的电流或电压变化实现的。
如果一组数据的各数据位在多条线上同时被传输,这种传输方式称为并行通信。
图2-1串行通信与并行通信的区别
2.1.5MCS-51串行接口的基本特点
MCS-51单片机的串行端口有4种基本工作方式,通过编程设置,可以使其工作在任一方式,以满足不同场合的需要。
其中,方式0主要用于外接移位寄存器,以扩展单片机的I/O电路;
工作方式1多用于双机之间或与外设电路的通信;
方式2、3除有方式1的功能外,还可以作多机通信,以构成分布式多微机系统。
串行端口有两个控制寄存器SCON、PCON,用于设置工作方式、发送或接收的状态、特征位、数据传送波特率[每秒传送的位数]以及作为中断标志等。
串行端口有一个数据寄存器SBUF在特殊功能寄存器中的字节地址为99H,该寄存器为发送和接收所共用。
串行端口的波特率可以用程序来控制。
在不同工作方式中,由时钟振荡频率的分频值或由定时器T1的定时溢出时间确定,使用十分方便灵活。
串口控制寄存器
输入:
在(REN)=1时,串行口采样RXD引脚,当采样到1至O的跳变时,确认是串行发送来的一帧数据的开始位0,从而开始接收一帧数据。
只有当8位数据接收完,并检测到高电平停止位后,只有满足①(R1)=0;
②(SM2)=0或接收到的第9位数据为1时,停止位才进入RB8,8位数据才能进入接收寄存器,并由硬件置位中断标志RI;
否则信息丢失。
所以在方式1接收时,应先用软件清零RI和SM2标志。
1.工作方式2
方式2为固定波特率的11位UART方式。
它比方式1增加了一位可程控为1或0的第9位数据。
输出:
发送的串行数据由TXD端输出一帧信息为11位,附加的第9位来自SCON寄存器的TB8位,用软件置位或复位。
它可作为多机通讯中地址/数据信息的标志位,也可以作为数据的奇偶校验位。
当CPU执行一条数据写入SUBF的指令且TI=0时,就启动发送器发送。
发送一帧信息后,置位中断标志TI。
在接收到附加的第9位数据后,当满足①(RI):
0;
②(SM2)=0或接收到的第9位数据为1时,第9位数据才进入RB8,8位数据才能进入接收寄存器,并由硬件置位中断标志Ri;
且不置位RI。
2.工作方式3
方式3为波特率可变的11位UART方式。
除波特率外,其余与方式2相同。
波特率的选择
如前所述,在串行通讯中,收发双方的数据传送率(波特率)要有一定的约定。
在MCS-51串行口的四种工作方式中,方式0和2的波特率是固定的,而方式1和3的波特率是可变的,由定时器T1的溢出率控制。
1>
方式1
方式1的波特率固定为主振频率的1/12。
2>
方式2
方式2的波特率由PCON中的选择位SMOD来决定,可表示为:
波特率=2sMoD×
fosc/64(2-5)
也就是当SMOD=1时,波特率为1/32×
fosc,当SMOD=0时,波特率为1/64×
fosc。
3>
方式1和方式3
定时器T1作为波特率发生器,其公式如下:
波特率=2SMOD/32×
定时器T1溢出率(2-6)
T1溢出率=T1计数率/产生溢出所需的周期数(2-7)
式中T1计数率取决于它工作在定时器状态还是计数器状态。
当工作于定时器状态时,T1计数率为Fosc/2,当工作于计数器状态时,T1计数率为外部输入频率,此频率应小于Fosc/24。
产生溢出所需周期与定时器T1的工作方式、T1的预置值有关。
定时器T1工作于方式O:
溢出所需周期数=8192-X
定时器T1工作于方式1:
溢出所需周期数=65536-X
定时器T1工作于方式2:
溢出所需周期数=256-X
因为方式2为自动重装入初值的8位定时器/计数器模式,所以用它来做波特率发生器最恰当。
这种方式下,T1的溢出率[次/秒]计算式可以表示为:
T1溢出率=Fsoc/12[256-X](2-7)
2.1.6波特率
波特率(BoudRate)就是在串口通信中每秒能够发送的位数(bits/second)。
MCS-51串行端口在四种工作模式下有不同的波特率计算方法。
其中,模式0和模式2波特率计算很简单;
模式1和模式3的波特率选择相同,故在此仅以工作模式1为例来说明串口通信波特率的选择。
在串行端口工作于模式1,其波特率将由计时/计数器1来产生,通常设置定时器工作于模式2(自动再加模式)。
在此模式下波特率计算公式为:
波特率=(1+SMOD)*晶振频率/(384*(256-TH1))(2-8)
其中,SMOD——寄存器PCON的第7位,称为波特率倍增位;
TH1——定时器的重载值。
在选择波特率的时候需要考虑两点:
首先,系统需要的通信速率。
这要根据系统的运作特点,确定通信的频率范围。
然后考虑通信时钟误差。
使用同一晶振频率在选择不同的通信速率时通信时钟误差会有很大差别。
为了通信的稳定,我们应该尽量选择时钟误差最小的频率进行通信。
2.1.7AT89C51单片机的结构和作用
AT89C51是一个低电压,低功耗,高性能CMOS8位单片机,40个引脚,32个外部双向输入/输出(I/O)端口,同时内含2个外设中断口,2个16位可编程定时计数器,2个全双工串行通信口。
AT89C51可以按照常规的方法进行编程,也可以在线编程。
片内含4kbytes的可反复擦写的Flash只读程序存储器和128bytes的随机存取数据存储器(RAM),器件采用ATMEL公司的高密度、非易失性存储技术生产,兼容标准MCS-51指令系统。
2.1.8双机通信
两台机器的通信方式可分为单工通信、半双工通信、双工通信,他们的通信原理及通信方式为:
单工通信:
是指消息只能单方向传输的工作方式。
单工通信信道是单向信道,发送端和接收端的身份是固定的,发送端只能发送信息,不能接收信息;
接收端只能接收信息,不能发送信息,数据信号仅从一端传送到另一端,即信息流是单方向的。
通信双方采用单工通信属于点到点的通信。
根据收发频率的异同,单工通信可分为同频通信和异频通信。
半双工通信:
这种通信方式可以实现双向的通信,但不能在两个方向上同时进行,必须轮流交替地进行。
也就是说,通信信道的每一段都可以是发送端,也可以是接端。
但同一时刻里,信息只能有一个传输方向。
如日常生活中的例子有步话机通信等。
双工通信:
双工通信是指在同一时刻信息可以进行双向传输,和打电话一样,说的同时也能听,边说边听。
这种发射机和接收机分别在两个不同的频率上能同时进行工作的双工机也称为异频双工机。
双工机的特点是使用方便,但线路设计较复杂,价格也较高。
利用AT89C51芯片、复位电路、时钟电路、开关组、发光二极管等,使A机和B机的波特率可选,完成串行通信。
图2-2系统框图
2.2方案的比较确定
本设计是基于Proteus与μVision仿真软件编程来设计方案,选择合适的编程语言是一个重序可读性和可移植性比较差。
而C语言虽然执行效率没有汇编语言高,但语言简洁,使用方便,灵活,运算方便,表达类型多样化,数据结构类型丰富,具有结构化的控制语句,程序设计自由度大,有很好的可重用性,可移植性等特点。
所以我们采用C语言编写了程序。
两个单片机间采用串行口方式1进行通信。
由于距离近可以直接采用输入输出直接相连通信。
三电路设计与调试
3.1设计方案
本次设计,对于两片AT89C51,发送方的数据由串行口TXD段输出,经过传输线将信号传送到接收方。
接收方接收后,在LED上显示接收的信息。
软件部分,通过通信协议进行发送接收,主机先送0xaa给从机,当从机接收到0xaa后,向主机反馈,主机收到反馈后停止发送数据给从机。
从机收到正确数据后送到LED显示。
3.2软件仿真
3.2.1电路设计
在桌面上双击图标打开ISIS7Professional窗口。
在器件选择按钮中单击“P”按钮,或执行菜单命令“库”→“拾取元件/符号”,添加如下表所示的元件。
表3-1元件选择表
单片机AT89C51二片
晶体CRYSTAL11.0592MHz二只
瓷片电容CAP22pF四只
电解电容CAP-ELEC1uF二只
电阻RES10K二只
电阻RES1K二只
开关Button六个
发光二极管LED八个
图3-1AT89C51管脚图
管脚说明:
VCC:
供电电压。
GND:
接地。
P0口:
P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL门电流。
当P0口的管脚第一次写1时,被定义为高阻输入。
P0能够用于外部程序数据存储器,它可以被定义为数据/地址的第八位。
在FIASH编程时,P0口作为原码输入口,当FIASH进行校验时,P0输出原码,此时P0外部必须被拉高。
P1口:
P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL门电流。
P1口管脚写入1后,被内部上拉为高,可用作输入,P1口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。
在FLASH编程和校验时,P1口作为第八位地址接收。
RST:
复位输入。
当振荡器复位器件时,要保持RST脚两个机器周期的高电平时间。
ALE/PROG:
当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的地位字节。
在FLASH编程期间,此引脚用于输入编程脉冲。
在平时,ALE端以不变的频率周期输出正脉冲信号,此频率为振荡器频率的1/6。
因此它可用作对外部输出的脉冲或用于定时目的。
然而要注意的是:
每当用作外部数据存储器时,将跳过一个ALE脉冲。
如想禁止ALE的输出可在SFR8EH地址上置0。
此时,ALE只有在执行MOVX,MOVC指令是ALE才起作用。
另外,该引脚被略微拉高。
如果微处理器在外部执行状态ALE禁止,置位无效。
/PSEN:
外部程序存储器的选通信号。
在由外部程序存储器取指期间,每个机器周期两次/PSEN有效。
但在访问外部数据存储器时,这两次有效的/PSEN信号将不出现。
/EA/VPP:
当/EA保持低电平时,则在此期间外部程序存储器(0000H-FFFFH),不管是否有内部程序存储器。
注意加密方式1时,/EA将内部锁定为RESET;
当/EA端保持高电平时,此间内部程序存储器。
在FLASH编程期间,此引脚也用于施加12V编程电源(VPP)。
XTAL1:
反向振荡放大器的输入及内部时钟工作电路的输入。
XTAL2:
来自反向振荡器的输出。
振荡器特性:
XTAL1和XTAL2分别为反向放大器的输入和输出。
该反向放大器可以配置为片内振荡器。
石晶振荡和陶瓷振荡均可采用。
如采用外部时钟源驱动器件,XTAL2应不接。
有余输入至内部时钟信号要通过一个二分频触发器,因此对外部时钟信号的脉宽无任何要求,但必须保证脉冲的高低电平要求的宽度。
设计电路详见附录图附-1。
3.2.2程序设计
主机程序流程图:
详见附录图附-2。
从机程序流程图:
详见附录图附-3。
主机程序详见附录。
从机程序详见附录。
3.2.3调试仿真
关于Proteus与Keil的联合仿真调试。
需注意Proteus的ISIS中A、B机的CPU属性中ProgramFile与Keil的μVision4中的路径和文件名要一致。
启动Proteus的ISIS,并将其放在屏幕的右上角(可将原理图放大到合适大小);
再启动Keil的μVision4,并将其放在屏幕的左下角。
在Keil中执行菜单命令“调试”→“启动/停止调试”,进入Keil调试环境。
同时,在ProteusISIS的窗口中可看出Proteus也进入了程序调试状态。
在Keil中点击“运行”快捷按钮,运行程序。
调试成功显示如图所示(详见附录图附-4)。
四总结
经过课程设计,在查阅资料的过程中,学习了基于单片机的C语言程序设计,了解了单片机串行通信的基本知识,对于以后的学习和工作都有很大的益处。
在学习的过程中,也遇到了一些困难,比如开始的时候,由于发送端和接收端的通信协议没有做好,导致数据不能正确的传输,在解决问题的过程中,对于通信协议的实现有了深刻的认识。
回顾起此课程设计,至今我仍感慨颇多,从理论到实践,在这段日子里,可以说得是苦多于甜,但是可以学到很多很多的东西,同时不仅可以巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。
通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。
参考文献
[1]张刚毅,基于Proteus的单片机课程的基础实验与课程设计[M].北京:
人民邮电出版社,2012
[2]韩毅刚,计算机通信技术[M].北京:
北京航空航天大学出版社,2007
[3]李朝青,单片机与PC机网络通信技术[M].北京:
[4]胡洪波,单片机原理与应用实验教程[M].湘潭大学出版社,2009
附录
主机程序:
master.c
#include<
reg51.h>
sbitkey0=P1^0;
sbitkey1=P1^1;
sbitkey2=P1^2;
sbitkey3=P1^3;
unsignedcharkeyscan()
{
unsignedcharkeyscan_num,temp;
P1=0xff;
temp=P1;
if(~(temp&
0xff))
{
if(key0==0)
keyscan_num=0;
}
elseif(key1==0)
keyscan_num=1;
elseif(key2==0)
keyscan_num=2;
elseif(key3==0)
keyscan_num=3;
else
returnkeyscan_num;
}
voidspi_init1200()
SCON=0x50;
PCON=0x80;
TI=0;
EA=1;
ET1=1;
TMOD=0x20;
TH1=0xe8;
TL1=0xe8;
TR1=1;
voidspi_init2400()
TH1=0xf4;
TL1=0xf4;
voidspi_init4800()
TH1=0xfa;
TL1=0xfa;
voidspi_init9600()
TH1=0xfd;
TL1=0xfd;
voidspi_send(unsignedcharch)
SBUF=ch;
while(TI==0);
voidmain()
u