您的当前位置:首页正文

单片机串口通信波特率自动识别

2024-07-16 来源:意榕旅游网

毕业设计说明书

设计题目:单片机串口通信波特率自动识别

计算机科学与信息工程学院

专业年级 自动化2008

学生姓名何泽宏 学号 2008133220

指导教师刘传文 职称 讲师

设计地点

重庆工商大学

2012.02.27——2012.05.18


单片机串口通讯波特率的自动识别

重庆工商大学自动化 20082班何泽宏

指导教师:刘传文

摘要:本设计是基于串口通信,设计能够自动识别上位机波特率的系统。要自动

识别串口通信波特率,通常的实现方法是,上位机首先发出规定的字符或数据,

系统收到该字符或数据后,下位机计算对方的波特率,以适应对方的波特率进行

工作。本系统正是利用这种方法,让上位机先发送一段字符,下位机使用软件的

方法检测出一位数据发送时间,从而计算出上位机发送数据波特率。

关键词:串行通信 波特率 自动识别 发送

检测


Abstact:The design is based on serial communication, designed toautomatically identify thebaud rate of the host computer system. Toautomatically identify the serial communication baud rate, the usualmethod, the host computer by first issuing acharacter or data, thesystem receives the character or data, the next bit machine, theotherbaud rate to adapt to each other's baud rate to work. The system tookadvantage ofthis method, the host computer first sends a character,the machine software to detect adata transmission time, in order toestimate the host computer to send data baud rate.

Keywords:serialcommunication baud rate automatically send detect

目录
第一章绪论...................................................................1 1.1课题研究背景..........................................................1 1.2 串口通信基础.........................................................2 1.2.1同步通信(SynchronousCommunication).............................2 1.2.2异步通信(AsynchronousCommunication)............................2 1.2.3串行通信波特率..................................................3 1.2.4串行通信制式....................................................3 1.2.5串行通信校验....................................................4 1.3波特率自动识别研究现状................................................5 1.3.1标准波特率穷举法................................................5 1.3.2码元宽度实时检测法..............................................5 1.3.3最大公约数法....................................................6 1.4设计任务及要求........................................................6第二章系统方案设计...........................................................7 2.1系统功能指标..........................................................7 2.2系统设计思路及方案论证................................................7 2.3系统方案确定.........................................................10第三章硬件设计..............................................................11 3.1设计系统框图.........................................................11 3.2芯片选择.............................................................12 3.2.1单片机选择.....................................................12 3.2.2串行总线通信芯片...............................................15 3.2.3显示芯片.......................................................15 3.3 其它模块电路图......................................................17 3.3.1电源电路.......................................................17 3.3.2复位电路.......................................................17 3.3.3时钟电路.......................................................19 3.3.4系统总电路.....................................................19第四章软件设计..............................................................21 4.1程序结构设计.........................................................21 4.2 程序流程图..........................................................21 4.2.1一位低电平脉宽测量程序框图.....................................21 4.2.2主函数框图.....................................................22 4.3 一位低电平脉宽测量程序..............................................22 4.4编译环境.............................................................24第五章系统调试及运行结果....................................................25 5.1硬件调试.............................................................25 5.1.1LCD 调试结果...................................................25 5.1.2单片机外围电路调试.............................................25 5.1.3串口调试.......................................................25 5.2软件调试.............................................................25 5.3联合调试.............................................................26 5.3.1生成HEX文件...................................................26

5.3.2将生成的HEX文件烧录到单片机...................................27
5.3.3联合调试效果...................................................28
第六章结论及总结............................................................30致谢.........................................................................31参考文献.....................................................................32附录:.......................................................................32

第一章绪论

1.1课题研究背景

近年来,随着科学技术的发展,PC机以其优越的性价比和丰富的软件资源

成为计算机应用的主流机种。在工业控制中单片机得到广泛的应用,现代化集中

管理需要对现场数据进行统计、分析、制表、打印、绘图、报警等。同时,又要

求对现场装置进行实时控制,完成各种规定操作,达到集中管理的目的。由于单

片机的计算能力有限,难以进行复杂的数据处理。因此在功能比较复杂的控制系

统中,通常以PC机为上位机,单片机为下位机,由单片机完成数据的采集及对

装置的控制,而由上位机完成各种复杂的数据处理及对单片机的控制,二者结合,

使得单片机的应用已不仅仅局限于传统意义上的自动监测或控制,而形成了向以

网络为核心的分布式多点系统发展的趋势。

现代信息网络技术的一个突出特点,就是使工业控制系统中的所有设备连接

成网,从而在一个核心软件管理下工作,形成一个有机的整体。这种整体网络方

式在现代工业控制系统具有传统独立控制系统所无法比拟的先进性,不仅能极大

地提高工业设备的生产效率,还可以大大提高系统的安全性和可靠性。

随着工业技术的发展,单片机广泛应用在工程控制领域,用单片机可以构成

形式多样的控制系统、。单片机的控制系统中,一般都通过串口和

上位机PC进行通信,这样不仅能够实现远程控制,而且能够利用PC机强大的

数据处理功能以及友好的控制界面。因此研究单片机与PC机串行通信具有重要

的现实及工业意义。

而对于异步串行通信,只有在通信双方波特率相同时,才能实现数据的正确

传输与接收,而一些系统总是希望能实现对各种波特率的兼容这就需要能够自动

识别上位机波特率。通常的实现方法是,要求上位机首先发出规定的字符或数据,

系统收到该字符或数据后,下位机计算对方的波特率,以适应对方的波特率进行

工作。

1.2 串口通信基础

计算机与外界的信息交换称为通信。通信的基本方式可分为并行通信和串

0(43)

行通信两种。

所谓并行通信是指数据的各位同时在多根数据线上发送或接收。串行通信是数据的各位在同一根数据线上依次逐位发送或接收。而串行通信按同步方式可分为异步通信和同步通信两种基本通信方式。

1.2.1同步通信(SynchronousCommunication)

同步通信是一种连续传送数据的通信方式,一次通信传送多个字符数据,称为一帧信息。数据传输速率较高,通常可达56000bps或更高。其缺点是要求发送时钟和接收时钟保持严格同步。

1.2.2异步通信(AsynchronousCommunication)

在异步通信中,数据通常是以字符或字节为单位组成数据帧进行传送的。收、发端各有一套彼此独立,互不同步的通信机构,由于收发数据的帧格式相同,因此可以相互识别接收到的数据信息。

1-1异步串行通信帧格式

1.起始位

在没有数据传送时,通信线上处于逻辑“1”状态。当发送端要发送1个字符数据时,首先发送1个逻辑“0”信号,这个低电平便是帧格式的起始位。其作用是向接收端表示发送端开始发送一帧数据。接收端检测到这个低电平后,就准备接收数据信号。

2.数据位

在起始位之后,发送端发出(或接收端接收)的是数据位,数据的位数没有严格的限制,58位均可。由低位到高位逐位传送。

1(43)

3.奇偶校验位

数据位发送完(接收完)之后,可发送一位用来检验数据在传送过程中是否出错的奇偶校验位。奇偶校验是收发双方预先约定好的有限差错检验方式之一。有时也可不用奇偶校验。

4.停止位

字符帧格式的最后部分是停止位,逻辑“1”电平有效,它可占1/2位、1位或2位。停止位表示传送一帧信息的结束,也为发送下一帧信息作好准备。

1.2.3串行通信波特率

波特率(BaudRate)是串行通信中一个重要概念,它是指传输数据的速率。波特率的定义是每秒传输二进制数码的位数。如:波特率为1200bps是指每秒钟能传输1200位二进制数码。

波特率的倒数即为每位数据传输时间。例如:波特率为9600bps,每位的传输时间为:

Td

1

s

0 . 000104

s



9600





………………1

1.2.4串行通信制式

在串行通信中,数据是在两个站之间传送的。按照数据传送方向,串行通信可分为三种制式。

1.单工制式(Simplex)

单工制式是指甲乙双方通信只能单向传送数据。单工制式如图3所示。

发送器A 接收器B

1-2串行通信单工制式

2.半双工制式

半双工制式是指通信双方都具有发送器和接收器,双方既可发送也可接收,但接收和发送不能同时进行,即发送时就不能接收,接收时就不能发送。

2(43)



发送 发送

接收 接收

1-3串行通信半双工制式

3.全双工制式

全双工制式是指通信双方均设有发送器和接收器,并且将信道划分为发送

信道和接收信道,两端数据允许同时收发,因此通信效率比前两种高。

发送 接收

接收发送

1-4全双工通信制式

1.2.5串行通信校验

串行通信的目的不只是传送数据信息,更重要的是应确保准确无误地传送。

因此必须考虑在通信过程中对数据差错进行校验,因为差错校验是保证准确无误

地通信的关键。常用差错校验方法有奇偶校验、累加和校验以及循环冗余码校验

等。

1.奇偶校验

奇偶校验的特点是按字符校验,即在发送每个字符数据之后都附加一位奇偶

校验位(10),当设置为奇校验时,数据中1的个数与校验位1的个数之和应为

奇数;反之则为偶校验。收、发双方应具有一致的差错检验设置,当接收1帧字

符时,对1的个数进行检验,若奇偶性(收、发双方)一致则说明传输正确。奇偶

校验只能检测到那种影响奇偶位数的错误,比较低级且速度慢,一般只用在异步

通信中。

2.累加和校验

3(43)

累加和校验是指发送方将所发送的数据块求和,并将“校验和”附加到数据

块末尾。接收方接收数据时也是先对数据块求和,将所得结果与发送方的“校验

和”进行比较,若两者相同,表示传送正确,若不同则表示传送出了差错。“校

验和”的加法运算可用逻辑加,也可用算术加。累加和校验的缺点是无法检验出

字节或位序的错误。

3.循环冗余码校验

循环冗余码校验的基本原理是将一个数据块看成一个位数很长的二进制数,

然后用一个特定的数去除它,将余数作校验码附在数据块之后一起发送。接收端

收到该数据块和校验码后,进行同样的运算来校验传送是否出错。目前CRC

广泛用于数据存储和数据通信中,并在国际上形成规范,市面上已有不少现成的

CRC软件算法。

1.3波特率自动识别研究现状

串行通信的数据是按位顺序传输的,而异步串行通信由于没有位定时时钟,

因此各个数据位之间需要严格的定时,才能保证正确的通信。也就是说,只有在

通信双方波特率相同时,才能实现数据的正确传输与接收。传统的波特率自动识

别的方法主要有两种:

1.3.1标准波特率穷举法

标准波特率穷举法适用于主机侧的波特率必须在有限的几个固定数值之间

变化,如300~19 200 之间的标准值;且从机侧的工作振荡频率已知且稳定。从机

启动通信程序后,逐个尝试以不同的波特率接收主机发出的特定字符,直到能正

确接收为止,因此,该方法的运用有一定的局限性。

1.3.2码元宽度实时检测法

该方法要求主机按照约定发送某一数据,从机通过单片机的定时器测量RXD

引脚上输人数据的码元宽度,而后计算出待测系统通信的波特率。该方法目前应

用比较广泛。如某GMS模块在计时为了适应各种通信波特率,要求其通信的系统

首先发送08H,之后发送指令,它就是依靠数据08H的码元宽度计算出对方波特

率的.

4(43)

1.3.3最大公约数法

传统的方法对待测系统发送的数据都有一定的限制或要求才能够实现波特率的识别,但有些时候是无法约束待测系统首先发送特定字符的。这里,根据不同的应用需求,提出更为通用的波特率识别方法——最大公约数法。该方法不对待测系统发送的数据进行特殊要求即可实现波特率识别,且保证了波特率识别的有效性和可靠性。

1.4设计任务及要求

根据串口通讯的原理,利用软件的办法,设计出能够自动识别串口通讯波特率的系统,给出完整的设计方案、注意事项,并利用单片机实验系统完成系统的基本演示。

需要串口通讯的原理及进行波特率判断的原理进行介绍,并说明设计的过程, 要求能够给出所设计系给出系统的电路图以及与单片机的接口部分等设计说明。

统性能指标(即能够判断多大范围的波特率)

需要以实际的结果验证设计系统的正确性及准确性。即当上位机(可以使用PC)的波特率变化时,单片机应能够自动识别出变化后的波特率。

需要对系统使用中易出现的问题进行说明。分析自己所设计的系统需要作哪些方面的改进和完善,才可以更好地发挥作用。

可执行代在系统的程序软件设计说明中还应当描述出程序的编译环境配置,
码的运行环境要求说明。

5(43)

第二章系统方案设计

2.1系统功能指标

本设计主要完成能够自动识别串口通信波特率的系统,系统指标主要分为以下几点:
1.系统能够进行串口通信;
2.系统应有显示波特率的模块;
3.能够自动识别的波特率范围为300——9600bps

2.2系统设计思路及方案论证

由设计任务可以确定,本系统主要分为通信模块、显示模块两部分。其中,显示模块已有比较成熟的设计,而本设计通信部分最核心的又是波特率自动识别的算法,故在此着重论证波特率识别方法。

方案一:
查表:首先在已知主机发送波特率的情况下,单片机根据在RXD端接收到的主机波特率检测字符0x01的电平变化,控制定时器T0的开启和关闭,进而获得计数Num。这里,Num值为单片机在接收主机1位数据的时间内,定时器T0的计数值。然后,串口选择工作于方式一,即一帧数据包括一位起始位,八位数据位和一位停止位。UART总是先发送数据低位(LSB
,后发送数据高位(MSB),我们总会 检测字符0x01的数据格式如看见数据的停止位。则我们可以选择一个检测字符,
下图。当RXD端没有数据时,接收到的是空闲位高电平,随后,在接收数据时首先收到起始位低电平,这样可在下降沿处启动定时器T0计数;随后又接收到检测字符的第一位数据高电平,并在上升沿处停止定时器T0,从而获取Num值。故选择了检测字符为0x01

2-1波特率与计数值的对应关系

这是在实际应用中,单片机在未知主机波特率的情况下,将实际获得的Num

6(43)

与图2中的Num的范围相比较,从而检测出主机的发送波特率。

主要应用于调试和测试环节,显示出所测试的中间变量值以及最终检测到的主机波特率值。同时,确定出波特率发生器T1在实现匹配时重新装载的计数初值。

2-2检测字符0x01数据格式
方案二:
计算:计算法的主要特点就是通过复杂的数学公式进行推导,找出定时器T0的计数值X16与波特率发生器T1的装载初值X8之间的数学关系。在接收主机波特率检测字符的过程中,
此方法与方法一雷同。但要确定从机自动匹配时定时器T1装载的计数初值,计算法更为简便。根据公式推导,可以得出从机T1装载初值为

X


256

2

s

mod

X

16


8






32

N


……………………2这里,注意到N= 8,分母为256,除以256,在程序中只须将分子右移8,而这里分子恰好为定时器T0的计数值X16(TH0TL0),所以从机波特率发生器的装载初值X8只和X16的高字节TH0有关,因为外界干扰一般只影响TL0,对高字节的影响很小,大大提高了系统的抗干扰能力。同时可见X8的确定与晶体振荡器的频率fosc无关,因而系统的通用性更强。在程序中,需要用到一个移位运算和一个减法运算,可见其较为简便、易行。

方案三:
最大公约数法:为了便于说明问题,设主机的波特率为BPS,位传输时间为t1bit,测试系统测得的波特率为BAUD,位传输时间为txbit。以l位起始位、8位数据位、1位停止位、无奇偶校验位为例,通信数据格式如图l所示。除了起始位始终为0,停止位始终为1外,8位数据位的电平高低是由传输的数据决定的,要 根据波特率的实际意义BPS=lt1bit,只要检测出待测测得待测系统的波特率,

7(43)

系统通信数据的位传输时间t1bit即可。

位传输时间t1bit对应的就是单位码元宽度时间,只要知道单位码元宽度时间,系统波特率就很容易计算出来了。由于不能要求待测系统按照规定发出特定 要将单的数据或字符,因此这里使用码元宽度捕捉的方法来查找码元宽度时间,片机挂入待测系统的通信线路,采用对待测系统TXD(RXD)引脚的高、低电平脉冲持续时间不断采集的方式,来捕捉单位码元宽度时间t1bit,显然单片机直接采集到的单个高、低电平脉冲持续时间可能是nt1bit,其中1≤n≤9。如何从采集到的nt1bit找出t1bit,成为波特率识别的关键。

经过对串行通信数据格式的特点进行分析,本文提出了码元宽度最大公约数法来从捕捉到的码元宽度时间中计算单位码元宽度时间,也就是位传输时间t1bit。具体实现方法如下:在待测系统正常工作后,将测试单片机挂入其通信线路;首先对正、负脉冲宽度都进行计时,分别采集n次,剔除正脉冲溢出的部分后,把所有不相等的有效脉冲宽度时间从小到大排序(△t<5μs就认为两个时间相等,这一点在后面将有说明),假设依次为t1t2t3,…,tm(1≤m≤9);由于采集到的时间一定是t1bit的整数倍,计算出t1t2t3,…,tm的最大公这里计约数为txbit,那么txbit就可以作为系统的最小脉冲宽度来计算波特率。

算得到的txbit可能等于t1bit,也可能不等于t1bit。下面分类讨论其作为位传输时间t1bit来计算波特率的可靠性及依据。

1种情况,txbit=t1bit:待测系统通信过程中出现最窄正脉冲或最窄负脉冲,得到的txbit等于t1bit,那么使用txbit计算波特率是可靠的;待测系统通信过程中未出现最窄正脉冲或最窄负脉冲,但系统通信过程中出现的脉冲宽度的最大公约数为最窄脉冲宽度,如待测系统处出现了2t1bit3t1bit脉冲时间或者待测系统出现了4t1bit7t1bit8t1bit脉冲时间,此时最大公约数txbit仍等于t1bit,这种情况下波特率是可以可靠识别的。

2种情况,txbit≠t1bit,即txbit=N’t1bit(2≤N’≤9):若系统通信过程中出现的脉冲宽度时间都是N’t1bit的整数倍,以N’=2为例,待测系统通信过程中可能只出现类似图2(a)所示的数据,求得的最大公约数txbit=2t1bitBAUD=BPS2,实际测得的波特率是被测系统波特率的12。但我们注意到,测得的数据如图2(b)所示,依次为FFHFEHFDHFCHFBHFAHF9HF8H,尽管测得的波特率并不是被测系统波特率,但是并不会导致信息丢失,
所有的数据都可以正确还原,因此这种情况下使用最大公约数法计算波特率也是完全可靠的。

8(43)

上面讲了那么多,其实简言之,也是要检测上位机发送的一位数据(低电平)

宽度,然后求出波特率。当然,单片机在采集低电平时,可能采集到2个、3个甚

至更多连续低电平,这就需要使用软件处理来求最得小值。假设求得的最小值为

baud,则根据波特率定义,通信波特率BAUD

BAUD




1

1000000



10

6

baud


baud

………………3

为什么公式中要乘以10-6呢?这是因为我们所求的baud是单位是us(即10-6s),

故得到以上结果。

2.3系统方案确定

方案一操作简单易行,没有复杂的计算,但是软件中需要用到两个定时器,

且上位机必须发送指定字符,实际运用时有一定限制;方案二计算较为复杂,能

确定从机自动匹配时定时器T1装载的计数初值,关键是能准确确定上位机发送波

特率大小,较方案一更具实用性,但同样需要发送指定字符。方案三原理简单,

计算也不复杂,能较准确识别上位机发送波特率,关键是不需要上位机发送指定

字符,通用性较强,故选择方案三,但再次基础上加了一点小改动,就是只采集

了上位机发送数据的低电平。

9(43)

第三章硬件设计

由前面章节已经知道,要实现串口通信,则至少需要一个上位机、一个下位机,在此,上位机选择普通PC机,下位机则选择MCS-51系列单片机;另外需一片显示芯片,以满足系统系那是波特率的要求。

但是单片机中的数据信号电平都是TTL电平,这种电平采用正逻辑标准, 这种信号只适用于通信距离很即约定≥2.4V表示逻辑1,而≤0.5V表示逻辑0
短的场合,若用于远距离传输必然会使信号衰减和畸变。因此,在实现PC机与单片机之间通信或单片机与单片机之间远距离通信时,通常采用标准串行总线通信接口,比如RS-232CRS-422RS-423RS-485等。但由于RS-232C信号电平(EIA)与单片机信号电平(TTL)不一致,因此,必须进行信号电平转换。实现这种 一种是采用运算放大电平转换的电路称为RS-232C接口电路。一般有两种形式:
器、晶体管、光电隔离器等器件组成的电路来实现;另一种是采用专门集成芯片(MC1488MC1489MAX232)来实现。MAX232芯片是MAXIM公司生产的具有两路接收器和驱动器的IC芯片,其内部有一个电源电压变换器,可以将输入+5V的电压变换成RS-232C输出电平所需的+10V电压。所以采用这种芯片来实现接口电路特别方便,只需单一的+5V电源即可。

3.1设计系统框图

单片机

串行总线

PC

通信芯片

3-1单片机与PC机串口通信波特率自动识别系统框图

10(43)

3.2芯片选择

3.2.1单片机选择
STC89C52RC单片机是宏晶科技推出的新一代高速/低功耗/超强抗干扰的单片机,是标准的MCS-51单片机,指令代码完全兼容传统8051单片机,且市场占有量大,容易购买,故设计选择此种单片机。鉴于设计要求,现着重介绍其串行口:
STC89C52内部有一个可编程全双工串行通信接口。该部件不仅能同时进行数据的发送和接收,也可作为一个同步移位寄存器使用。下面将对其内部结构、工作方式以及波特率进行介绍。

3-2AT89C51 串行口结构框图

1.串行数据缓冲器SBUF
SBUF是串行口缓冲寄存器,包括发送寄存器和接收寄存器,以便能以全双工方式进行通信。此外,在接收寄存器之前还有移位寄存器,从而构成了串行接收的双缓冲结构,这样可以避免在数据接收过程中出现帧重叠错误。发送数据时,由于CPU是主动的,不会发生帧重叠错误,因此发送电路不需要双重缓冲结构。

逻辑上,SBUF只有一个,它既表示发送寄存器,又表示接收寄存器,具有同一个单元地址99H。但在物理结构上,则有两个完全独立的SBUF,一个是发送缓冲寄存器SBUF,另一个是接收缓冲寄存器SBUF。如果CPUSBUF,数据就会

11(43)

被送入发送寄存器准备发送;如果CPUSBUF,则读入的数据一定来自接收缓冲器。即CPUSBUF的读写,实际上是分别访问上述两个不同的寄存器。

2.串行控制寄存器SCON
串行控制寄存器SCON用于设置串行口的工作方式、监视串行口的工作状态、控制发送与接收的状态等。它是一个既可以字节寻址又可以位寻址的8位特殊功能寄存器。其格式如图4所示,其中各位功能再次就不再鏊述。

3-3串行口控制寄存器SCON

3.电源控制寄存器PCON

PCON

D7

D6

D5

D4

D3

D2

D1

D0

位名称

SMOD

GF1

GF0

PD

IDL

3-1电源控制寄存器PCON的格式

SMOD:串行口波特率倍增位。在工作方式1~工作方式3时,若SMOD=1,则串行口波特率增加一倍。若SMOD=0,波特率不加倍。系统复位时,SMOD=0

STC89C52 串行通信共有4种工作方式,它们分别是方式0、方式1、方式2和方式3,由串行控制寄存器SCON中的SM0SM1 决定,如表4所示.

SM0SM1

工作方式

功能描述

波特率

12(43)


00

方式0

8 位同步移位寄存器

Fosc/12

01

方式1

10 UART

可变,由定时器控制

10

方式2

11 UART

Fosc/64 fosc/32

11

方式3

11 UART

可变,由定时器控制

3-2单片机串行口工作方式

各方式下波特率计算方法分别为:
方式02的波特率是固定的,而方式13的波特率是可变的,由定时器T1的溢出率来决定
方式0波特率= fosc/12 ………4 方式2波特率=2SMOD/64·fosc ………5 方式1波特率=2SMOD/32·T1溢出率) ………(6 方式3波特率=2SMOD/32·T1溢出率) ………(7 其中,T1溢出率=fosc /{12×[256 -(TH1]} ………8 T1方式2TR1=1(以启动定时器)
由于本设计将需要串行口工作于工作方式1,故着重介绍一下方式一。 方式1是一帧10位的异步串行通信方式,包括1个起始位(0)8个数据位和一个停止位(1),其帧格式如下

起始位 0

D0

D1

D2

D3

D4

D5

D6

D7

停止位 1

3-3方式1数据帧格式

数据发送:当TI=0时,执行“MOVSBUFA”指令后开始发送,由硬件自动加入起始位和停止位,构成一帧数据,然后由TXD端串行输出。发送完后,TXD输出线维持在“1”状态下,并将SCON中的TI1,表示一帧数据发送完毕。

数据接收:RI=0REN=1时,接收电路以波特率的16倍速度采样RXD引脚,如出现由“1”变“0”跳变,认为有数据正在发送。在接收到第9位数据(即停止位)时,必须同时满足以下两个条件:RI=0SM2=0或接收到的停止位为“1”,才把接收到的数据存入SBUF中,停止位送RB8,同时置位RI。若上述条件不满足,接收到的数据不装入SBUF被舍弃。在方式1下,SM2应设定为0

13(43)

3.2.2串行总线通信芯片

MAX232芯片是MAXIM公司生产的、包含两路接收器和驱动器的IC芯片,它的内部有一个电源电压变换器,可以把输入的+5V电源电压变换成为RS-232输出电平所需的+10V电压。所以采用此芯片接口的串行通信系统只需单一的+5V电源就可以了。对于有+12V电源的场合,其适应性更强,加之其价格适中,硬件接口简单而被广泛采用,故本设计采用此种芯片。MAX232芯片引脚结构和外围连接如图3-4(a)(b)

b

a)

3-4MAX232 引脚、内部结构及外接电路
MAX232的外围电路连接如图3-4(b).

其数据传输过程如下:MAX23211T1IN接单片机的TXDP3.1TTL T1OUT平从单片机TXD端发出,经过MAX232转换为RS-232电平后从MAX23214

发出,再连接到实验板上串口座的第2脚,在经过平行串口线连接至PC机的串口座第2个脚RXD端,至此计算机接收数据。PC机发送数据时从PC机串口座第3TXD端发出数据,再逆向流向单片机的RXDP3.0接收数据。

3.2.3显示芯片

1602液晶也叫1602字符型液晶它是一种专门用来显示字母、数字、符号等的点阵型液晶模块它有若干个5X7或者5X11等点阵字符位组成,每个点阵字符位都可以显示一个字符。每位之间有一个点距的间隔每行之间也有也有间隔 起到了字符间距和行间距的作用,正因为如此所以他不能显示图形(用自定义

14(43)


CGRAM,显示效果也不好)。LCD1602 的这些性能完全满足设计需求,故选择之。

1602LCD是指显示的内容为16X2,即可以显示两行,每行16个字符液晶模块(显示字符和数字)。1602可由4总线驱动或8总线驱动,本设计I/O口够用,采用8线数据传输。

LCD1602有以下特性:
1.+5V电压,对比度可调
2.内含复位电路
:清屏、字符闪烁、光标闪烁、显示移位等多种功能3.提供各种控制命令,
4.80字节显示数据存储器DDRAM
5.内建有1605X7点阵的字型的字符发生器CGROM
6.8个可由用户自定义的5X7的字符发生器CGRAM
7.字符型LCD1602通常有14条引脚线或16条引脚线的LCD,多出来的2条线是背光电源线VCC(15)和地线GND(16)

8.其引脚功能如下:

引脚号

引脚名

电平

输入/输出

作用

1

VCC



电源地

2

VSS



电源(+5V

3

VEE



对比调整电压

4

RS

0/1

输入

0=输入指令,1=输入数据

5

R/W

0/1

输入

0=LCD 输入指令或数据1=LCD 读取信息

6

E

1,1 0

输入

使能信号,1 读取信息,下降沿执行指令

7

DB0

0/1

输入/输出

数据总线line0(最低位)

8

DB1

0/1

输入/输出

数据总线line1

9

DB2

0/1

输入/输出

数据总线line2

10

DB3

0/1

输入/输出

数据总线line3

11

DB4

0/1

输入/输出

数据总线line4

12

DB5

0/1

输入/输出

数据总线line5

13

DB6

0/1

输入/输出

数据总线line6

14

DB7

0/1

输入/输出

数据总线line7(最高位)

15

A

+VCC



16

K

接地



3-4LCD1602引脚功能图

15(43)

3-5LCD1602引脚图

3.3 其他模块电路图

3.3.1电源电路

首先220v高电压经过变压器将转换成12v,但此时的12V仍是交流电压,要想得到设计需要的直流电,还需通过整流桥将得到的12v电压整流成直流电压,最后通过电容滤波以及稳压芯片78057805输入12V,输出为5V)得到+5v电源,供给单片机以及其他模块的电。电路中串接限流电阻R1,以防止二极管被烧坏。电源电路如图11所示。

鉴于成本及效果都相差不多,本设计在实物中采用+5V集成电源。

3-6电源电路

16(43)

3.3.2复位电路

单片机在启动时都需要复位,以使CPU及系统各部件处于确定的初始状态,并从初态开始工作。89系列单片机的复位信号是从RST引脚输入到内的施密特中的。当系统处于正常工作状态时,且稳定后,如果RST引脚上有一个高电平并维持2个机器周期(24个振荡周期)以上,则CPU就可以响应并将系统复位。单片机系统的复位方式有:手动按钮复位和上电复位。

1、手动按钮复位
手动按钮复位需要人为在复位输入端RST上加入高电平。一般采用的办法是在RST端和正Vcc之间接一个按钮。当人为按下按钮时,则Vcc+5V电平就会直接加到RST端。手动按钮复位的电路如所示。由于人的动作再快也会使按钮保持接通达数十毫秒,所以,完全能够满足复位的时间要求。

2、上电复位
的上电复位电路如图3-5所示,只要在RST复位输入引脚上接一电容至Vcc端,下接一个到地即可。对于C型单片机,由于在RST端内部有一个下拉电阻,故可将外部电阻去掉,而将外接电容减至1uF。上电复位的工作过程是在加电时,复位电路通过电容加给RST端一个短暂的高电平信号,此高电平信号随着Vcc对电容的充电过程而逐渐回落,即RST端的高电平持续时间取决于电容的充电时间。为了保证系统能够可靠地复位,RST端的高电平信号必须维持足够长的时间。上电时,Vcc的上升时间约为10ms,而振荡器的起振时间取决于振荡频率,如频率为10MHz,起振时间为1ms;晶振频率为1MHz,起振时间则为10ms。在图12的复位电路中,当Vcc掉电时,必然会使RST端电压迅速下降到0V以下,但是,由于内部电路的限制作用,这个负电压将不会对器件产生损害。另外,在复位期间,端口引脚处于随机状态,复位后,系统将端口置为全“l”态。如果系统在上电时得不到有效的复位,则程序PC将得不到一个合适的初值,因此,CPU可能会从一个未被定义的位置开始执行程序。本设计采用上电复位方式。

3-7上电复位电路

17(43)

3.3.3时钟电路

晶振的作用是给单片机提供稳定的时钟信号,在单片机XTAL1XTAL2引脚

间接一晶振,其典型电路如下图。但是,.即使去掉晶振,电路照样的能振荡,

并且如果把那两个电容改成可调电容的话也能得到想要的某个频率,那还要晶振

干什么:晶振、陶瓷谐振槽路、RC振荡器以及硅振荡器是适用于微控制器的四

种时钟源。针对具体应用优化时钟源设计依赖于以下因素:成本、精度和环境参

数。RC振荡器能够快速启动,成本也比较低,但通常在整个温度和工作电源电

压范围内精度较差,会在标称输出频率的5%50%范围内变化;但相对RC振荡

器而言,基于晶振与陶瓷谐振槽路的振荡器通常能提供非常高的初始精度和较低

的温度系数。

XTAL2

30pF

XTAL1

GND

3-8时钟电路

18(43)

3.3.4系统总电路

3-9设计系统电路图

19(43)

第四章软件设计

4.1程序结构设计

由前文已知本系统,本设计主要分为通信模块及显示模块。故编程也可根据这种思想,主要有波特率自动识别程序和LCD1602显示程序。

波特率自动识别程序核心思路是检测一位低电平传送时间,主要分为以下几步:
1.检测N个连续低电平各自传送时间,并保存于一个自定义数组;
2.将这N个时间值按顺序排列,找出其中最小值;
3.根据所得数据求最大公约数,得到更为准确的最小值。

显示模块已经有比较成熟的程序设计,在此不再详细介绍。

4.2 程序流程图

4.2.1一位低电平脉宽测量程序框图
设置检测低电平个数count

一个连续低电平检测

T1初值为0


RXD=0 T1清零,TR11


T1停止计数


Count个数据测完?

count个时间值排序,从而求的最小值,即一位低电平脉宽

将求得的最小公约数取倒,然后乘以
10-6再求倒便得到通信波特率

20(43)

4.2.2主函数

初始化LCD

初始化T1SMOD=0x10

检测主机发送数据波特率

将所得波特率作最后修正

调用显示

4.3 一位低电平脉宽测量程序
unsignedint Auto_baud(void)
{
unsignedint tmplen=count; //定义检测连续低电平个数 unsignedlong sum;
unsignedint i,p,j,n;
unsignedint temp;
TL1=0;
//T1赋初值 TH1=0;
for(i=0;i<count;i++)
{
while(FM_IN==0);
TR1=0;
ary[i]=((TH1*256+TL1)); //化成十进制
while(FM_IN==1)
{
TL1=0;

21(43)

TH1=0;
TR1=1;
}
}
n=tmplen;
for(i=0;i<n-1;i++)
{ //将所得时间值从小到大排序 p=i;
for(j=i+1;j<n;j++)
{
if(ary[p]>ary[j])
{
p=j;
}
if(p!=i)
{
temp=ary[p];
ary[p]=ary[i];
ary[i]=temp;
}
}
}

temp=ary[3];sum=0;j=0;
for(i=0;i<tmplen;i++) //求更加准确的最小宽度
{
if((ary[i]>temp*3/4)&& (ary[i]<temp*5/4))
{
sum+=ary[i];
j++;
}

22(43)

elseif(ary[i]>2*temp)break;
}
temp= sum/j; //求平均值,j有效数据个数,sum有效数据和 temp=(1000000)/temp; //晶振12M,机器周期为1us
return temp;
}
4.4编译环境
本设计软件采用C语言编程,使用keil-C51软件编译。

4-1keil-C51如那件界面

23(43)

第五章系统调试及运行结果

5.1硬件调试

5.1.1LCD调试结果

首先,LCD上电不加任何程序,能够显示较暗的阴影,说明电路没有问题。调节滑动变阻器使LCD亮度合适。

5.1.2单片机外围电路调试

判断单片机芯片及时钟系统是否正常工作有一个简单的办法,就是用万用表测量单片机晶振引脚(1819脚)的对地电压,以正常工作的单片机用数字万用表测量为例:18脚对地约2.24V19脚对地约2.09V。若是复位电路故障而不能正常工作的单片机也可以采用模拟复位的方法来判断,单片机正常工作时第9脚对地电压为零,可以用导线短时间和+5V连接一下,模拟一下上电复位,如果单片机能正常工作了,说明这个复位电路有问题。

通过测试,单片机的外围电路完全正确。

5.1.3串口调试

将单片机、MAX232PC机按如下方式连线:
MCUTX----232---PC RX
MCURX----232---PC TX
利用串口调试助手给单片机发送一数据,测试单片机RX引脚电平变化,若与发送数据吻合,则电路没有问题。

5.2软件调试

程序编写过程及建立keil工程等就不在此鏊述,下面就主要介绍一下编译调试过程。

24(43)

5-1程序编译界面

程序编写完毕,点击“编译”,便出现如下界面,当然我这是已经编译通过

的程序,所以是没有“error”的,实际情况若出现“errors”或“warnings”

则需要根据keil提示的错误信息加以改正。

5-2程序编译完成

5.3联合调试

若上述软硬件调试结果都符合要求,则接下来就是软硬件联合调试了。

5.3.1生成HEX文件

如上5.2keil-C51软件编译,右击“Target1”,单机第一行选项弹出如下

对话框,单击output选项,在“CreateHex File”前划勾。再重新编译一次,便

25(43)

生成了HEX文件。

5-3生成HEX文件界面

5.3.2将生成的HEX文件烧录到单片机

首先选择对应的单片机型号。打开编译生成的HEX文件。选择连接的串口号,

就是在设备管理器里看里的COM4口。选择通讯波特率,单片机目标板上有晶振

的,这一项基本可以不用设置,系统会自动适应合适的波特率。如果目标板使用

的是内部振荡,由于内部制造误差,自动波特率可能会连接不成功,这时就要手

工设置,一个一个试,直到连接成功为止。最后一项就是烧录了,先点击“下载”,

然后再给单片机目标板供电,当烧录软件显示如下界面,便表示程序已经烧录成

功。

26(43)

5-4烧录程序界面

5.3.3联合调试效果

完成上述步骤后,便可以观察实际效果了。当然,联合调试并非一步就能到位,往往会有不少问题,如程序代码虽然语法没有错误,但无法实现指定功能等,在此就不再叙述本设计的反复调试过程,直接将调试结果附上。

1.上电效果

5-5单片机上电效果图

27(43)

2.利用串口调试助手发送信息

5-5串口调试助手

3.不同波特率时,LCD显示结果

5-6LCD显示不同波特率

28(43)

第六章结论及总结

本设计基于单片机控制技术设计、C语言、数字电路、模拟电路等知识综合设计了一个串口通信波特率的自动识别系统。系统在设计过程中,翻阅了大量相关资料及借鉴了前人的成熟经验。经过一段时间的设计、调试,得出如下结论: 1.串口通信波特率是一个衡量通信速度的参数。它表示每秒钟传送的bit的个数,实际运用时要特别注意其单位。

2.本设计所能识别的波特率范围为“300——9600bps”
该系统的设计工作已经基本完成,由于时间关系再加上本人知识水平有限,本系统仍存在以下一些不完善的地方,需要进一步改进完善。

1.单片机P1口内部有弱拉电阻,所以外部电路没有接上拉电阻。但单片机的I/O上拉能力不强,接上拉电阻会更好,可以增强上拉能力。

复位就会2.本设计的复位电路用的是上电自动复位,若改成按键自动复位,
更方便一些。

3.本设计显示波特率有可能与上位机实际波特率又一定出入,这是因为单片机采集的所有低电平有可能没有一个单位脉宽。

29(43)

致谢
毕业设计即将结束,在此衷心地感谢老师的悉心指导及同学的热心帮助。

毕业设计,帮助我们总结大学四年收获、认清自我。同时,还帮助我们改变一些处理事情时懒散的习惯。从最开始时的搜集资料,整理资料,到方案比选,确定方案,再到着手开始进行硬件设计、软件设计和实物调试,每一步环环相扣,衔接紧密,其中任何一个步骤产生遗漏或者疏忽,
就会对以后的设计带来很多的不便。

在设计初期,感到比较茫然,无从下手,也后悔大学四年学到的东西实在太少。后来在导师的指导帮助下,查阅了大量资料,并认真对比,终于有了些眉目。此次设计中,让我最头疼的还是程序设计及调试,由于基础较差,我还曾有过放弃的念头,但在同学老师的鼓励帮助下,最终还是完成了设计任务。

通过此次设计,我的动手能力和资料搜集能力得到了真正的提升。设计中很多数值、公式、算法都需要我们去耐心地查阅书籍,浏览资料,设计中需要用到辅助设计软件的地方,也需要我们耐心的学习。掌握其使用的要领,运用到设计当中去。最后汇总的时候,需要将前期各个阶段的工作认真整理。

毕业设计结束了,通过设计,我深刻领会到基础知识的重要性以及学科之间的关联性,毕业设计不仅能帮助学生检验大学四年的学习成果,更多的是可以帮助我们更加清楚的认识自我,磨练我们自身的意志与耐性,
这会为日后的工作和生活带来很大的帮助。通过毕业设计,学生对自己大学四年以来所学的知识有更多的认识。

再次感谢我的导师及同学们!

30(43)

参考文献
1】刘燕,陈兴文.串行通信波特率自动检测方法的实现.辽宁:大连民族学院学报,2008
2】李学海.PIC单片机原理[M].北京:北京航空航天大学出版社,2006

3】孙红波等.ARM与嵌入式系统[M].北京:电子工业出版社,2006.【4】田泽.嵌入式系统开发与应用[M].北京:北京航空航天大学出版社2005

5】谭浩强等.C程序设计(第三版)[M].北京:清华大学出版社2005

6】先锋工作室.单片机程序设计实例[M].北京:清华大学出版社20037】赵亮、侯国瑞.单片机C语言编程与实例.人民邮电出版社2003
8】张迎新.单片微型计算机原理、应用及接口技术.国防工业出版社20029广州周立功单片机发展有限公司.自动检测80C51串行通讯中的波特率【10】乔渠赵国豪 王文记.串行通信波特率的自动识别.防空兵指挥学院2008

附录:
程序清单

#include<REG52.H>
#include<intrins.h>

sbit FM_IN

=

P3^0;

//信号接收端口

sbit LcdRs

= P2^0;

sbit LcdRw

= P2^1;

sbit LcdEn

= P2^2;

#define DBPort P1

//数据端口

#definecount 60

codetable[]={300,600,1200,2400,4800,9600,14400,19200,38400};
unsignedchar TempBuffer[10];
unsignedint idata ary[count]; //捕获数组

voidTimerInit( void ) //定时器1初始化
{
TMOD=0X10; //定时器1工作方式1计数}

31(43)

//内部空指令函数
**************************************************************************unsigned char LCD_Wait(void)
{
LcdRs=0;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
LcdRw=1; _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
LcdEn=1;
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_(); while(DBPort&0x80);//在用Proteus仿真时,注意用屏蔽此语句,
//实际硬件时打开此语句
LcdEn=0; _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
returnDBPort;
}
//LCD写入命令或数据
************************************************************
#defineLCD_COMMAND 0 //Command
#defineLCD_DATA 1 //Data
#defineLCD_CLEAR_SCREEN 0x01
//清屏#defineLCD_HOMING 0x02 //光标返回原点
voidLCD_Write(bit style, unsigned char input)
{
LcdEn=0; _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
LcdRs=style;
LcdRw=0; _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
DBPort=input;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();//注意顺序 LcdEn=1; _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();//注意顺序 LcdEn=0; _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
LCD_Wait();
}

//设置显示模式************************************************************

#define LCD_SHOW

0x04

//显示开

#define LCD_HIDE

0x00

//显示关

#define LCD_CURSOR

0x02

//显示光标

#define LCD_NO_CURSOR

0x00

//无光标

#define LCD_FLASH

0x01

//光标闪动

#define LCD_NO_FLASH

0x00

//光标不闪动

voidLCD_SetDisplay(unsigned char DisplayMode)
{
LCD_Write(LCD_COMMAND,0x08|DisplayMode);
}

32(43)

//设置输入模式************************************************************

#define LCD_AC_UP

0x02

// default

#define LCD_AC_DOWN

0x00

#define LCD_MOVE

0x01

// 画面可平移

#define LCD_NO_MOVE

0x00

//default

voidLCD_SetInput(unsigned char InputMode)
{
LCD_Write(LCD_COMMAND,0x04|InputMode);
}

//移动光标或屏幕************************************************************/*
#defineLCD_CURSOR 0x02
#defineLCD_SCREEN 0x08
#defineLCD_LEFT 0x00
#defineLCD_RIGHT 0x04
voidLCD_Move(unsigned char object, unsigned char direction)
{
if(object==LCD_CURSOR)
LCD_Write(LCD_COMMAND,0x10|direction);
if(object==LCD_SCREEN)
LCD_Write(LCD_COMMAND,0x18|direction);
}
*/
//初始化LCD************************************************
voidLCD_Initial()
{
LcdEn=0;
LCD_Write(LCD_COMMAND,0x38); //8位数据端口,2行显示,5*7点阵 LCD_Write(LCD_COMMAND,0x38);
LCD_SetDisplay(LCD_SHOW|LCD_NO_CURSOR); //开启显示,无光标 LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN); //清屏
LCD_SetInput(LCD_AC_UP|LCD_NO_MOVE); //AC递增,画面不动}

//*********************************************************

//在指定位置写字符
voidGotoXY(unsigned char x, unsigned char y)
{
if(y==0)

33(43)

LCD_Write(LCD_COMMAND,0x80|x);
if(y==1)
LCD_Write(LCD_COMMAND,0x80|(x+0x40));
}

//显示
voidPrint(unsigned char *str)
{
while(*str!='\0')
{
LCD_Write(LCD_DATA,*str);
str++;
}
}
/************************************************************************单片机数据发送
***********************************************************************/void send_BR11(void)
{unsignedchar buff_BR;
buff_BR='A';
SBUF=buff_BR;
while(TI==0);
TI=0;

}//************************************************************************voidIntToStr(unsigned int t, unsigned char *str, unsigned char n)
{ //取得整数值到数组高位在低字节
chari, j;
unsignedchar a[5];
a[0]=(t/10000)%10; //数据最高位
a[1]=(t/1000)%10;
a[2]=(t/100)%10;
a[3]=(t/10)%10;
a[4]=(t/1)%10; //数据最低位

for(i=0;i<5; i++) //转成ASCII
a[i]=a[i]+'0';

for(i=0;a[i]=='0' && i<=3; i++);//去掉高位无效0

for(j=5-n;j<i; j++) //填充空格
{*str=' ';
str++;
}

34(43)

for(;i<5; i++)
{*str=a[i];
str++;
} //加入有效的数字
*str='\0';
}
//检测低电平宽度
unsignedint Auto_baud(void)
{
unsignedint tmplen=count;
unsignedlong sum;
unsignedint i,p,j,n;
unsignedint temp;
TL1=0;
TH1=0;
for(i=0;i<count;i++)
{
while(FM_IN==0);
TR1=0;
ary[i]=((TH1*256+TL1));
while(FM_IN==1)
{
TL1=0;
TH1=0;
TR1=1;
}
}
//将收集到的数据从小到大排序
n=tmplen;
for(i=0;i<n-1;i++)
{
p=i;
for(j=i+1;j<n;j++)
{
if(ary[p]>ary[j])
{
p=j;
}
if(p!=i)
{
temp=ary[p];
ary[p]=ary[i];
ary[i]=temp;
}

35(43)

}
}

//求最小宽度,如何根据捕获数组求得最小公约数值
temp=ary[3];sum=0;j=0;
for(i=0;i<tmplen;i++)
{
if((ary[i]>temp*3/4)&& (ary[i]<temp*5/4))
{
sum+=ary[i];
j++;
}
elseif(ary[i]>2*temp)break;
}
temp= sum/j;//temp为目标1B
temp=(1000000)/temp;
return temp;
}

main()
{
unsignedint baud;
chari;
unsignedint Correct;
LCD_Initial();
GotoXY(0,0);
Print("Baudis:(bps) ");
GotoXY(0,1);
Print(" ");
TimerInit();
while(1)
{
baud=Auto_baud();
for(i=0;i<9;i++)
//误差处理 {
if(i<5)
Correct=150;
else
Correct=1000;
if(baud>table[i])
{
if((baud-table[i])<Correct)
{
baud=table[i];

36(43)

break;
}
}
else
{
if((table[i]-baud)<Correct)
{
baud=table[i];
break;
}
}
}
//baud=Auto_baud();
IntToStr(baud,&TempBuffer[0],5);
GotoXY(5,1);
Print(&TempBuffer[0]);
set_BR=256-28800/baud;
UartInit();
TH1=set_BR;
TL1=set_BR;
TR1=1;
send_BR11();
last_baud=baud;
}
}

37(43)

显示全文