51单片机串口通.docx

上传人:b****4 文档编号:12201096 上传时间:2023-04-17 格式:DOCX 页数:18 大小:229.59KB
下载 相关 举报
51单片机串口通.docx_第1页
第1页 / 共18页
51单片机串口通.docx_第2页
第2页 / 共18页
51单片机串口通.docx_第3页
第3页 / 共18页
51单片机串口通.docx_第4页
第4页 / 共18页
51单片机串口通.docx_第5页
第5页 / 共18页
点击查看更多>>
下载资源
资源描述

51单片机串口通.docx

《51单片机串口通.docx》由会员分享,可在线阅读,更多相关《51单片机串口通.docx(18页珍藏版)》请在冰豆网上搜索。

51单片机串口通.docx

51单片机串口通

一、串口通信原理

    串口通讯对单片机而言意义重大,不但可以实现将单片机的数据传输到计算机端,而且也能实现计算机对单片机的控制。

由于其所需电缆线少,接线简单,所以在较远距离传输中,得到了广泛的运用。

串口通信的工作原理请同学们参看教科书。

    以下对串口通信中一些需要同学们注意的地方作一点说明:

    1、波特率选择

    波特率(BoudRate)就是在串口通信中每秒能够发送的位数(bits/second)。

MSC-51串行端口在四种工作模式下有不同的波特率计算方法。

其中,模式0和模式2波特率计算很简单,请同学们参看教科书;模式1和模式3的波特率选择相同,故在此仅以工作模式1为例来说明串口通信波特率的选择。

    在串行端口工作于模式1,其波特率将由计时/计数器1来产生,通常设置定时器工作于模式2(自动再加模式)。

在此模式下波特率计算公式为:

              波特率=(1+SMOD)*晶振频率/(384*(256-TH1))

    其中,SMOD——寄存器PCON的第7位,称为波特率倍增位;

             TH1——定时器的重载值。

    在选择波特率的时候需要考虑两点:

首先,系统需要的通信速率。

这要根据系统的运作特点,确定通信的频率范围。

然后考虑通信时钟误差。

使用同一晶振频率在选择不同的通信速率时通信时钟误差会有很大差别。

为了通信的稳定,我们应该尽量选择时钟误差最小的频率进行通信。

   下面举例说明波特率选择过程:

假设系统要求的通信频率在20000bit/s以下,晶振频率为12MHz,设置SMOD=1(即波特率倍增)。

则                                    TH1=256-62500/波特率

    根据波特率取值表,我们知道可以选取的波特率有:

1200,2400,4800,9600,19200。

列计数器重载值,通信误差如下表:

    因此,在通信中,最好选用波特率为1200,2400,4800中的一个。

    2、通信协议的使用

    通信协议是通信设备在通信前的约定。

单片机、计算机有了协议这种约定,通信双方才能明白对方的意图,以进行下一步动作。

假定我们需要在PC机与单片机之间进行通信,在双方程式设计过程中,有如下约定:

 0xA1:

单片机读取P0端口数据,并将读取数据返回PC机;0xA2:

单片机从PC机接收一段控制数据;    0xA3:

单片机操作成功信息。

    在系统工作过程中,单片机接收到PC机数据信息后,便查找协议,完成相应的操作。

当单片机接收到0xA1时,读取P0端口数据,并将读取数据返回PC机;当单片机接收到0xA2时,单片机等待从PC机接收一段控制数据;当PC机接收到0xA3时,就表明单片机操作已经成功。

    3、硬件连接

    51单片机有一个全双工的串行通讯口,所以单片机和计算机之间可以方便地进行串口通讯。

进行串行通讯时要满足一定的条件,比如计算机的串口是RS232电平的,而单片机的串口是TTL电平的,两者之间必须有一个电平转换电路,我们采用了专用芯片MAX232进行转换,虽然也可以用几个三极管进行模拟转换,但是还是用专用芯片更简单可靠。

我们采用了三线制连接串口,也就是说和计算机的9针串口只连接其中的3根线:

第5脚的GND、第2脚的RXD、第3脚的TXD。

这是最简单的连接方法,但是对我们来说已经足够使用了,电路如下图所示,MAX232的第10脚和单片机的11脚连接,第9脚和单片机的10脚连接,第15脚和单片机的20脚连接。

                                       使用MAX232串口通信电路图(9孔串口接头)

    串口通讯的硬件电路如上图所示为了能够在计算机端看到单片机发出的数据,我们必须借助一个WINDOWS软件进行观察,这里利用如下图标的一个免费计算机串口调试软件来观察。

                                                   串口调试助手窗口

SBUF 数据缓冲寄存器 这是一个可以直接寻址的串行口专用寄存器。

有朋友这样问起过“为何在串行口收发中,都只是使用到同一个寄存器SBUF?

而不是收发各用一个寄存器。

”实际上SBUF包含了两个独立的寄存器,一个是发送寄存,另一个是接收寄存器,但它们都共同使用同一个寻址地址-99H。

CPU在读SBUF时会指到接收寄存器,在写时会指到发送寄存器,而且接收寄存器是双缓冲寄存器,这样可以避免接收中断没有及时的被响应,数据没有被取走,下一帧数据已到来,而造成的数据重叠问题。

发送器则不需要用到双缓冲,一般情况下我们在写发送程序时也不必用到发送中断去外理发送数据。

操作SBUF寄存器的方法则很简单,只要把这个99H地址用关键字sfr定义为一个变量就可以对其进行读写操作了,如sfrSBUF=0x99;当然你也可以用其它的名称。

通常在标准的reg51.h或at89x51.h等头文件中已对其做了定义,只要用#include引用就可以了。

SCON 串行口控制寄存器 通常在芯片或设备中为了监视或控制接口状态,都会引用到接口控制寄存器。

SCON就是51芯片的串行口控制寄存器。

它的寻址地址是98H,是一个可以位寻址的寄存器,作用就是监视和控制51芯片串行口的工作状态。

51芯片的串口可以工作在几个不同的工作模式下,其工作模式的设置就是使用SCON寄存器。

它的各个位的具体定义如下:

(MSB)

(LSB)

SM0

SM1

SM2

REN

TB8

RB8

TI

RI

表8-1 串行口控制寄存器SCON

SM0、SM1为串行口工作模式设置位,这样两位可以对应进行四种模式的设置。

看表8-2串行口工作模式设置。

SM0

SM1

模 式

功 能

波特率

0

0

0

同步移位寄存器

fosc/12

0

1

1

8位UART

可变

1

0

2

9位UART

fosc/32或fosc/64

1

1

3

9位UART

可变

表8-2 串行口工作模式设置

在这里只说明最常用的模式1,其它的模式也就一一略过,有兴趣的朋友可以找相关的硬件资料查看。

表中的fosc代表振荡器的频率,也就是晶振的频率。

UART为(UniversalAsynchronousReceiver)的英文缩写。

SM2在模式2、模式3中为多处理机通信使能位。

在模式0中要求该位为0。

REM为允许接收位,REM置1时串口允许接收,置0时禁止接收。

REM是由软件置位或清零。

如果在一个电路中接收和发送引脚P3.0,P3.1都和上位机相连,在软件上有串口中断处理程序,当要求在处理某个子程序时不允许串口被上位机来的控制字符产生中断,那么可以在这个子程序的开始处加入REM=0来禁止接收,在子程序结束处加入REM=1再次打开串口接收。

大家也可以用上面的实际源码加入REM=0来进行实验。

TB8发送数据位8,在模式2和3是要发送的第9位。

该位可以用软件根据需要置位或清除,通常这位在通信协议中做奇偶位,在多处理机通信中这一位则用于表示是地址帧还是数据帧。

RB8接收数据位8,在模式2和3是已接收数据的第9位。

该位可能是奇偶位,地址/数据标识位。

在模式0中,RB8为保留位没有被使用。

在模式1中,当SM2=0,RB8是已接收数据的停止位。

TI发送中断标识位。

在模式0,发送完第8位数据时,由硬件置位。

其它模式中则是在发送停止位之初,由硬件置位。

TI置位后,申请中断,CPU响应中断后,发送下一帧数据。

在任何模式下,TI都必须由软件来清除,也就是说在数据写入到SBUF后,硬件发送数据,中断响应(如中断打开),这时TI=1,表明发送已完成,TI不会由硬件清除,所以这时必须用软件对其清零。

RI接收中断标识位。

在模式0,接收第8位结束时,由硬件置位。

其它模式中则是在接收停止位的半中间,由硬件置位。

RI=1,申请中断,要求CPU取走数据。

但在模式1中,SM2=1时,当未收到有效的停止位,则不会对RI置位。

同样RI也必须要靠软件清除。

常用的串口模式1是传输10个位的,1位起始位为0,8位数据位,低位在先,1位停止位为1。

它的波特率是可变的,其速率是取决于定时器1或定时器2的定时值(溢出速率)。

AT89C51和AT89C2051等51系列芯片只有两个定时器,定时器0和定时器1,而定时器2是89C52系列芯片才有的。

波特率 在使用串口做通讯时,一个很重要的参数就是波特率,只有上下位机的波特率一样时才可以进行正常通讯。

波特率是指串行端口每秒内可以传输的波特位数。

有一些初学的朋友认为波特率是指每秒传输的字节数,如标准9600会被误认为每秒种可以传送9600个字节,而实际上它是指每秒可以传送9600个二进位,而一个字节要8个二进位,如用串口模式1来传输那么加上起始位和停止位,每个数据字节就要占用10个二进位,9600波特率用模式1传输时,每秒传输的字节数是9600÷10=960字节。

51芯片的串口工作模式0的波特率是固定的,为fosc/12,以一个12M的晶振来计算,那么它的波特率可以达到1M。

模式2的波特率是固定在fosc/64或fosc/32,具体用那一种就取决于PCON寄存器中的SMOD位,如SMOD为0,波特率为focs/64,SMOD为1,波特率为focs/32。

模式1和模式3的波特率是可变的,取决于定时器1或2(52芯片)的溢出速率。

那么我们怎么去计算这两个模式的波特率设置时相关的寄存器的值呢?

可以用以下的公式去计算。

波特率=(2SMOD÷32)×定时器1溢出速率

上式中如设置了PCON寄存器中的SMOD位为1时就可以把波特率提升2倍。

通常会使用定时器1工作在定时器工作模式2下,这时定时值中的TL1做为计数,TH1做为自动重装值 ,这个定时模式下,定时器溢出后,TH1的值会自动装载到TL1,再次开始计数,这样可以不用软件去干预,使得定时更准确。

在这个定时模式2下定时器1溢出速率的计算公式如下:

溢出速率=(计数速率)/(256-TH1)

上式中的“计数速率”与所使用的晶体振荡器频率有关,在51芯片中定时器启动后会在每一个机器周期使定时寄存器TH的值增加一,一个机器周期等于十二个振荡周期,所以可以得知51芯片的计数速率为晶体振荡器频率的1/12,一个12M的晶振用在51芯片上,那么51的计数速率就为1M。

通常用11.0592M晶体是为了得到标准的无误差的波特率,那么为何呢?

计算一下就知道了。

如我们要得到9600的波特率,晶振为11.0592M和12M,定时器1为模式2,SMOD设为1,分别看看那所要求的TH1为何值。

代入公式:

11.0592M

9600=(2÷32)×((11.0592M/12)/(256-TH1))

TH1=250 //看看是不是和上面实例中的使用的数值一样?

12M

9600=(2÷32)×((12M/12)/(256-TH1))

TH1≈249.49

上面的计算可以看出使用12M晶体的时候计算出来的TH1不为整数,而TH1的值只能取整数,这样它就会有一定的误差存在不能产生精确的9600波特率。

当然一定的误差是可以在使用中被接受的,就算使用11.0592M的晶体振荡器也会因晶体本身所存在的误差使波特率产生误差,但晶体本身的误差对波特率的影响是十分之小的,可以忽略不计。

下位机:

51单片机实现RS232串口通信

上一期,我们已经利用增强型51实验板学会了单片机控制步进电机转动的方法,这一期,我们将一起来学习一下单片机如何与PC机进行通信,一起来完成一个简单的RS232通信实例,我们不做太多的理论,从实例出发,相信能够给大家一个比较通俗、透彻地认识,掌握了它的原理,那你就可以编出任何和PC机进行通信的程序了。

前几期,我们学习和介绍的内容都是以单机的形式,即所有的功能都是在一块增强型51实验板上得以实现。

当单片机技术具体应用到工厂、企业及各类工业、民用领域中,它肯定要与外部设置作数据传输,其交互性也使得单片机的应用越来越广泛,我们可以利用它来传数据,传控制命令等等。

因此,单片机与PC机的通信是我们学习单片机技术所经历的必要环节,由此,也使我们的学习更具趣味性。

下面我们一起来完成一个用单片机从串行口接收PC机数据,并在数码管上显示出来的实验。

先介绍一下串口通信基本知识。

目前较为常用的串口有9针串口(DB9)和25针串口(DB25)。

最为简单且常用的是三线制接法,即地、接收数据和发送数据三脚相连,本文只涉及到最为基本的接法,且直接用RS232相连。

串口引脚定义如图1所示。

9针串口(DB9)

25针串口(DB25)

针号

功能说明

缩写

针号

功能说明

缩写

1

数据载波检测

DCD

8

数据载波检测

DCD

2

接收数据

RXD

3

接收数据

RXD

3

发送数据

TXD

2

发送数据

TXD

4

数据终端准备

DTR

20

数据终端准备

DTR

5

信号地

GND

7

信号地

GND

6

数据设备准备好

DSR

6

数据准备好

DSR

7

请求发送

RTS

4

请求发送

RTS

8

清除发送

CTS

5

清除发送

CTS

9

振铃指示

DELL

22

振铃指示

DELL

图1DB9和DB25的常用信号脚说明 

    我们来看一下本次实验的电路图,如图2所示,即增强型51实验板实现串口通信及数码管显示的电路部分。

图2中的4个三极管分别与4个共阳数码管相连,是各个数码管的使能端,分别通过单片机的P2.0,P2.1,P2.2,P2.3来控制,数码管显示的详细工作原理,我们已在前几期杂志中作过介绍,有兴趣的朋友可以去看一下以前几期的内容。

图2中MAX232芯片起到RS232与TTL电平转换的作用,我们通过9芯串口与PC机相连。

图2硬件电路原理图

下面是我们完成本次实验的源程序代码,使用Keil编译软件,将其编译生成HEX文件,然后,通过A51编程器烧入AT89S51芯片即可。

#include"reg51.h"

#include

unsignedcharcodetab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};

unsignedchardat;

voidInit_Com(void)

{

TMOD=0x20;//定时器工作方式2,初值自动装入

PCON=0x00;//波特率不增倍

SCON=0x50;//串行工作方式设定

TH1=0xFd;//定时器初值高位

TL1=0xFd;//定时器初值低位

TR1=1;//启动定时器

}

/*函数功能:

LED数码管延时程序*/

voiddelay(void)

{

intk;

for(k=0;k<600;k++);

}

/*函数功能:

LED数码管显示程序*/

voiddisplay(intk)

{

P2=0xfe;//位选

P0=tab[k/1000];//显示千位数字

delay();//延时

P2=0xfd;//位选

P0=tab[k%1000/100];//显示百位数字

delay();//延时

P2=0xfb;//位选

P0=tab[k%100/10];//显示十位数字

delay();//延时

P2=0xf7;//位选

P0=tab[k%10];//显示个位数字

delay();//延时

P2=0xff;//位选

}

/*函数功能:

主程序*/

voidmain()

{

P2=0xff;//端口初始化,关LED显示

P0=0xff;

Init_Com();//调用串口初始化程序

while

(1)//主循环

{

if(RI)//判断是否收到数据

{

dat=SBUF;//接收数据

RI=0;//软件清除标志位

}

display(dat-48);//显示收到的数据

}

}

我们来一起分析一下程序代码,main主程序首先将P2口和P0口全部输出高电平,即数据管不显示任何内容,Init_Com函数用来初始化串口设置,如波特率设置,工作方式的设置,这些都是程序运行的一切初始化设置。

然后,我们看到了一个while

(1)语句,该语句的作用是产生死循环,即单片机上电复位后,我们就不断地去接收由PC机发过来的串口数据,同时将接收到的数据放在dat这个变量中,每接收完一次数据,我们需要执行RI=0这条语句,用来清除串口数据接收标志位,现在我们已经收到了PC机传过来的数据了,余下的任务就是要将数字通过数码管显示出来,我想大家看了我们前几期的介绍,已经并不陌生数码管的使用了,在这里,我们也写得非常简洁,通过display这个函数将数字显示出来,因为我们收到的是字符型的ASCII码数据,如数字“0”的ASCII码值是48,所以,我们要显示“0”的话,还需要将其值减去48后才是真正要显示的数据。

数码管我们采用动态扫描法进行显示,delay函数的作用是产生一定时间的延时,对于人眼来说是分辨不出来的,在display的函数体内,我们先将数据装载到P0口,如我们在程序开始时定义的:

unsignedcharcodetab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}语句,意思相当于:

数字“0”对应的数码管段码值为“0xc0”,数字“1”对应的数码管段码值为“0xf9”,数字“2”对应的数码管段码值为“0xa4”……以此类推,最后通过数码管的使能端来显示各位数码管的值。

至此,整个程序的功能就轻松地实现了我们所需要的功能,看到这里相信你现在对串行通信感到并不是原来想的那么深奥了吧。

现在我们已经将程序写好,并烧入了单片机芯片,下面我们要做的就是用串口线将增强型51实验板和PC机相连起来,同时给实验板接上电源,然后就是通过PC机软件来发数据了,要在PC机上向串口发送数据一定要借助相应软件,打开光盘内附带的串口调试软件,它设置方便、灵活,界面简洁明。

因为我们得告诉实验板来显示哪些数字,程序的功能是发送“1”、“2”、“3”......“8”、“9”、“0”等字符,增强型51实验板收到数据后通过数码管显示出来,所以我们得在软件发送区内填上我们所需要发送的数字,如图3所示。

图3

串口调试软件中,设置参数如下:

串口:

COM1;波特率:

9600;校验位:

无;数据位:

8位;停止位:

1位;发送内容:

5

当我们点击“手动发送”按钮后,我们可以看到增强型51实验板上的数码管已显示数字“5”的字样,如图4所示。

当然,我们也可以选择“自动发送”,即每隔一定的时间,由软件自动发送“发送缓冲区”内的数据,时间周期可以在软件界面中设置。

现在,你已经可以自由发挥来接收PC机发过来的数据了,只要发挥你的想象力,定义好PC机和单片机两端的数据通信协议,你可以做出任何通过电脑来对单片机进行控制的程序,实现各种各样的数据传输,远程控制功能,比如通过PC机来控制液晶显示、控制步进电机的转动、控制蜂鸣器奏乐等等,您也可以将本期所讲的知识与前几期所讲的关联起来,完成功能更多,更实用的具体应用实例。

因此,到本期的学习,我们已经可以将单片机与PC相连,借助PC机强大而灵活的功能,就可以为我们解决各类实际生产及应用型问题提供了方便。

这一期的内容我

 

RS232串口通信详解(引脚定义,电气特性,传输格式,接收过程,单片机晶振,RS485,RS422)-转

串口是计算机上一种非常通用的设备通信协议。

串口的引脚定义:

9芯

信号方向来自

缩写

描述

1

调制解调器

CD

载波检测

2

调制解调器

RXD

接收数据

3

PC

TXD

发送数据

4

PC

DTR

数据终端准备好

5

GND

信号地

6

调制解调器

DSR

通讯设备准备好

7

PC

RTS

请求发送

8

调制解调器

CTS

允许发送

9

调制解调器

RI

响铃指示器

两个串口连接时,接收数据针脚与发送数据针脚相连,彼此交叉,信号地对应相接即可。

串口的电气特性:

1)RS-232串口通信最远距离是50英尺=15m

2)RS232可做到双向传输,全双工通讯,最高传输速率20kbps

3)RS-232C上传送的数字量采用负逻辑,且与地对称

逻辑1:

-3~-15V  

逻辑0:

+3~+15V

所以与单片机连接时常常需要加入电平转换芯片:

串口通信参数:

a)波特率:

RS-232-C标准规定的数据传输速率为每秒50、75、100、150、300、600、1200、2400、4800、9600、19200波特。

b)数据位:

标准的值是5、7和8位,如何设置取决于你想传送的信息。

比如,标准的ASCII码是0~127(7位);扩展的ASCII码是0~255(8位)。

c)停止位:

用于表示单个包的最后一位,典型的值为1,1.5和2位。

由于数是在传输线上定时的,并且每一个设备有其自己的时钟,很可能在通信中两台设备间出现了小小的不同步。

因此停止位不仅仅是表示传输的结束,并且提供计算机校正时钟同步的机会。

d)奇偶校验位:

在串口通信中一种简单的检错方式。

对于偶和奇校验的情况,串口会设置校验位(数据位后面的一位),用一个值确保传输的数据有偶个或者奇个逻辑高位。

例如,如果数据是011,那么对于偶校验,校验位为0,保证逻辑高的位数是偶数个。

如果是奇校验,校验位位1,这样就有3个逻辑高位。

串口通信的传输格式:

串行通信中,线路空闲时,线路的TTL电平总是高,经反向RS232的电平总是低。

一个数据的开始RS232线路为高电平,结束时Rs232为低电平。

数据总是从低位向高位一位一位的传输。

示波器读数时,左边是数据的高位。

例如,对于16进制数据55aaH,当采用8位数据位、1位停止位传输时,它在信号线上的波形如图1(TTL电平)和图2(RS-232电平)所示。

55H=01010101B,取反后10101010B,加入一个起始位1,一个停止位0,55H的数据格式为

0101010101,55H

aaH=10101010B,取反后01010101B,加入一个起始位1,一个停止位0,55H的数据格式为

0010101011,aaH

串口通信的接收过程:

(异步通信:

接收器和发送器有各自的时钟;同步通信:

发送器和接收器由同一个时钟源控制。

RS232是异步通信)

(1)开始通信时,信号线为空闲(逻辑1),当检测到由1到0的跳变时,开始对“接收时钟”计数。

 

(2)当计到8个时钟时,对输入信号进行检测,若仍为低电平,则确认这是“起始位”,而不是干扰信号。

(3)接收端检测到起始位后,隔16个接收时钟,对输入信号检测一次,把对应的值作为D0位数据。

若为逻辑1,作为数据位1;若为逻辑0,作为数据位0。

(4)再隔16个接收时钟,对输入信号检测一次,把对应的值作为D1位数据。

….,直到全部数据位都输入。

(5)检测校验位P(如果有的话)。

(6)接收到规定的数据位个数和校验位后,通信接口电路希望收到停止位S

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 幼儿教育 > 育儿理论经验

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1