电工学习网

 找回密码
 立即注册
查看: 2797|回复: 1
打印 上一主题 下一主题

51单片机串口通信例程

[复制链接]
跳转到指定楼层
楼主
发表于 2020-3-3 22:11:47 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
51单片机的串口通信,是全双工的,就是可以同时收/发的,互相不影响的。
串口是可以同时收/发的,虽然都是用SBUF,但却是两个独立的寄存器,互不影响,只是都叫一个名,SBUF。
但是,对于接收或发送,确实是接收到一个字节以后才能接收下一个,不可能同时接收几个。对于送,也是同样的,发送一个字节数据后,要等发送完成了,才能再发下一个。
接收和发送,可先定义一两个变量,如,接收用rec变量保存,发送数据在send变量中。
发送时,SBUF=send;while(TI==0);TI=0;//这是用查询方式发送的。当一个字节的数据发送完成后,就会自动置TI=1,所以,可以查询TI=1时,就说明是发送结束了。如果是允许中断,就是会产生中断,判断TI=1,就是发送中断,要用指令清0,就是TI=0;
接收时, 当收到一个数据后,也会自己置RI=1,通常,接收都是中断方式,所以, 当RI=1, 就会产生中断。而响应中断,执行中断程序,就要用指令清0,即中断中判断是RI=1,说明是接收中断,RI=0; 清除RI。
接 收数据:rec=SBUF; 就行了。如果是接收一组数据,可以定义一个数组,用数组保存接收一组数据就行了。
SBUF中不能存放数据,收到后必须立即读取,否则,下一个数据到了就被替代了。RI和TI置1,是硬件自动的,就是这么设计的,想改也改不了的。
多个字节发送和接收,可以用循环控制次数。
下面附上代码:(具体原理不再讲述可以自己搜一下学一学)

/**************************************************************************************
*                              串口通信实验                                                                                                  *
实现现象:下载程序后打开串口调试助手,将波特率设置为4800,选择发送的数据就可以显示
                        在串口助手上。
注意事项:无。                                                                                                                                                                  
***************************************************************************************/

#include "reg52.h"                         //此文件中定义了单片机的一些特殊功能寄存器

typedef unsigned int u16;          //对数据类型进行声明定义
typedef unsigned char u8;


/*******************************************************************************
* 函数名         :UsartInit()
* 函数功能                   :设置串口
* 输入           : 无
* 输出                  : 无
*******************************************************************************/
void UsartInit()
{
        SCON=0X50;                        //设置为工作方式1
        TMOD=0X20;                        //设置计数器工作方式2
        PCON=0X80;                        //波特率加倍
        TH1=0XF3;                                //计数器初始值设置,注意波特率是9600的
        TL1=0XF3;
        ES=1;                                                //打开接收中断
        EA=1;                                                //打开总中断
        TR1=1;                                        //打开计数器
}

/*******************************************************************************
* 函 数 名       : main
* 函数功能                 : 主函数
* 输    入       : 无
* 输    出             : 无
*******************************************************************************/
void main()
{       
        UsartInit();  //        串口初始化
        while(1);               
}

/*******************************************************************************
* 函数名         : Usart() interrupt 4
* 函数功能                  : 串口通信中断函数
* 输入           : 无
* 输出                  : 无
*******************************************************************************/
void Usart() interrupt 4
{
        u8 receiveData;

        receiveData=SBUF;//出去接收到的数据
        RI = 0;//清除接收中断标志位
        SBUF=receiveData;//将接收到的数据放入到发送寄存器
        while(!TI);                         //等待发送数据完成
        TI=0;                                                 //清除发送完成标志位
}
我的单片机是STC90C516RD+属于51系列的,我的晶振频率是11.899MHZ。
对于初值的计算机可以使用如下软件:
51单片机串口通信例程
其中注意:(1)计算初值时,波特率是加倍之前(对于SMOD=1时这种情况)的波特率。
(2)软件是51波特率初值计算,还有一个是定时器初值计算,不要下载错误
下面就是烧录程序了,连接好USB线,打开串口助手软件,设置波特率4800
如下图:
51单片机串口通信例程
枣红色框框里面是波特率设置的地方,波特率为4800,绿色框框和红色框框(挨着绿色的那个)是模式的设置,文本模式如图,hex模式则是数字(16进制的)。


回复

使用道具 举报

沙发
 楼主| 发表于 2020-3-3 22:12:59 | 只看该作者
  串行接口是一种可以将接受来自CPU的并行数据字符转换为连续的串行数据流发送出去,同时可将接受的串行数据流转换为并行的数据字符供给CPU的器件。一般完成这种功能的电路,我们称为串行接口电路。
  本文主要介绍单片机上串口的工作原理和如何通过程序来对串口进行设置,并根据所给出的实例实现与PC 机通信。
   51单片机串口通信例程
  一、原理简介
  51 单片机内部有一个全双工串行接口。什么叫全双工串口呢?一般来说,只能接受或只能发送的称为单工串行;既可接收又可发送,但不能同时进行的称为半双工;能同时接收和发送的串行口称为全双工串行口。串行通信是指数据一位一位地按顺序传送的通信方式,其突出优点是只需一根传输线,可大大降低硬件成本,适合远距离通信。其缺点是传输速度较低。
  与之前一样,首先我们来了解单片机串口相关的寄存器。
  SBUF 寄存器:它是两个在物理上独立的接收、发送缓冲器,可同时发送、接收数据,可通过指令对SBUF 的读写来区别是对接收缓冲器的操作还是对发送缓冲器的操作。从而控制外部两条独立的收发信号线RXD(P3.0)、TXD(P3.1),同时发送、接收数据,实现全双工。
  串行口控制寄存器SCON(见表1) 。
   51单片机串口通信例程
  表中各位(从左至右为从高位到低位)含义如下。
  SM0 和SM1 :串行口工作方式控制位,其定义如表2 所示。
   51单片机串口通信例程
  其中,fOSC 为单片机的时钟频率;波特率指串行口每秒钟发送(或接收)的位数。
  SM2 :多机通信控制位。 该仅用于方式2 和方式3 的多机通信。其中发送机SM2 = 1(需要程序控制设置)。接收机的串行口工作于方式2 或3,SM2=1 时,只有当接收到第9 位数据(RB8)为1 时,才把接收到的前8 位数据送入SBUF,且置位RI 发出中断申请引发串行接收中断,否则会将接受到的数据放弃。当SM2=0 时,就不管第位数据是0 还是1,都将数据送入SBUF,并置位RI 发出中断申请。工作于方式0 时,SM2 必须为0。
  REN :串行接收允许位:REN =0 时,禁止接收;REN =1 时,允许接收。
  TB8 :在方式2、3 中,TB8 是发送机要发送的第9 位数据。在多机通信中它代表传输的地址或数据,TB8=0 为数据,TB8=1 时为地址。
  RB8 :在方式2、3 中,RB8 是接收机接收到的第9 位数据,该数据正好来自发送机的TB8,从而识别接收到的数据特征。
  TI :串行口发送中断请求标志。当CPU 发送完一串行数据后,此时SBUF 寄存器为空,硬件使TI 置1,请求中断。CPU 响应中断后,由软件对TI 清零。
  RI :串行口接收中断请求标志。当串行口接收完一帧串行数据时,此时SBUF 寄存器为满,硬件使RI 置1,请求中断。CPU 响应中断后,用软件对RI 清零。
  电源控制寄存器PCON(见表3) 。
   51单片机串口通信例程
  表中各位(从左至右为从高位到低位)含义如下。
  SMOD :波特率加倍位。SMOD=1,当串行口工作于方式1、2、3 时,波特率加倍。SMOD=0,波特率不变。
  GF1、GF0 :通用标志位。
  PD(PCON.1) :掉电方式位。当PD=1 时,进入掉电方式。
  IDL(PCON.0) :待机方式位。当IDL=1 时,进入待机方式。
  另外与串行口相关的寄存器有前面文章叙述的定时器相关寄存器和中断寄存器。定时器寄存器用来设定波特率。中断允许寄存器IE 中的ES 位也用来作为串行I/O 中断允许位。当ES = 1,允许 串行I/O 中断;当ES = 0,禁止串行I/O 中断。中断优先级寄存器IP的PS 位则用作串行I/O 中断优先级控制位。当PS=1,设定为高优先级;当PS =0,设定为低优先级。
  波特率计算:在了解了串行口相关的寄存器之后,我们可得出其通信波特率的一些结论:
  ① 方式0 和方式2 的波特率是固定的。
  在方式0 中, 波特率为时钟频率的1/12, 即fOSC/12,固定不变。
  在方式2 中,波特率取决于PCON 中的SMOD 值,即波特率为:
   51单片机串口通信例程
  当SMOD=0 时,波特率为fosc/64 ;当SMOD=1 时,波特率为fosc/32。
  ② 方式1 和方式3 的波特率可变,由定时器1 的溢出率决定。
   51单片机串口通信例程
  当定时器T1 用作波特率发生器时,通常选用定时初值自动重装的工作方式2( 注意:不要把定时器的工作方式与串行口的工作方式搞混淆了)。其计数结构为8 位,假定计数初值为Count,单片机的机器周期为T,则定时时间为(256 ?Count)×T 。从而在1s内发生溢出的次数(即溢出率)可由公式(1)所示:
   51单片机串口通信例程
  从而波特率的计算公式由公式(2)所示:
   51单片机串口通信例程
  在实际应用时,通常是先确定波特率,后根据波特率求T1 定时初值,因此式(2)又可写为:
   51单片机串口通信例程
  二、电路详解
  下面就对图1 所示电路进行详细说明。
   51单片机串口通信例程
  最小系统部分(时钟电路、复位电路等)第一讲已经讲过,在此不再叙述。我们重点来了解下与计算机通信的RS-232 接口电路。可以看到,在电路图中,有TXD 和RXD 两个接收和发送指示状态灯,此外用了一个叫MAX3232 的芯片,那它是用来实现什么的呢?首先我们要知道计算机上的串口是具有RS-232 标准的串行接口,而RS-232 的标准中定义了其电气特性:高电平“1”信号电压的范围为-15V~-3V,低电平“0”
  信号电压的范围为+3V~+15V。可能有些读者会问,它为什么要以这样的电气特性呢?这是因为高低电平用相反的电压表示,至少有6V 的压差,非常好的提高了数据传输的可靠性。由于单片机的管脚电平为TTL,单片机与RS-232 标准的串行口进行通信时,首先要解决的便是电平转换的问题。一般来说,可以选择一些专业的集成电路芯片,如图中的MAX3232。MAX3232 芯片内部集成了电压倍增电路,单电源供电即可完成电平转换,而且工作电压宽,3V~5.5V 间均能正常工作。其典型应用如图中所示,其外围所接的电容对传输速率有影响,在试验套件中采用的是0.1μF。
  值得一提的是MAX3232 芯片拥有两对电平转换线路,图中只用了一路,因此浪费了另一路,在一些场合可以将两路并联以获得较强的驱动抗干扰能力。此外,我们有必要了解图中与计算机相连的DB-9型RS-232的引脚结构(见图2)。
   51单片机串口通信例程
  其各管脚定义如下(见表4)。
   51单片机串口通信例程
  三、程序设计
  本讲设计实例程序如下:
  #include “AT89X52.h” (1)
  void Init_Com(void) ( 2)
  {
  TMOD = 0x20; ( 3)
  PCON = 0x00; ( 4)
  SCON = 0x50; ( 5)
  TH1 = 0xE8; ( 6)
  TL1 = 0xE8; ( 7)
  TR1 = 1; ( 8)
  }
  void main(void) ( 9)
  {
  unsigned char dat; ( 10)
  Init_Com(); ( 11)
  while(1) ( 12)
  程序详细说明:
  (1)头文件包含。
  (2)声明串口初始化程序。
  (3)设置定时器1 工作在模式2,自动装载初值(详见第二讲)。
  (4)SMOD 位清0,波特率不加倍。
  (5)串行口工作在方式1,并允许接收。
  (6)定时器1 高8 位赋初值。波特率为1200b/s(7)定时器1 低8 位赋初值。
  (8)启动定时器。
  (9)主函数。
  (10)定义一个字符型变量。
  (11)初始化串口。
  (12)死循环。
  (13)如果接收到数据。
  (14)将接收到的数据赋给之前定义的变量。
  (15)将接收到的值输出到P0 口。
  (16)对接收标志位清0,准备再次接收。
  (17)将接收到的数据又发送出去。
  (18)查询是否发送完毕。
  (19)对发送标志位清0。
  四、调试要点与实验现象
  接好硬件,通过冷启动方式将程序所生成的。hex文件下载到单片机运行后,打开串口调试助手软件,设置好波特率1200,复位单片机,然后在通过串口调试助手往单片机发送数据(见图3),可以观察到在接收窗口有发送的数据显示,此外电路板上的串行通信指示灯也会闪烁,P0 口所接到LED 灯会闪烁所接收到的数据。
   51单片机串口通信例程
  另外串口调试助手软件使用时应注意的是,如果单片机开发板采用串口下载而且和串口调试助手是使用同一串口,则在打开串口软件的同时不能给单片机下载程序,如需要下载,请首先点击“关闭串口”,做发送实验的时候,注意如果选中16 进制发送的就是数字或者字母的16 进制数值,比如发送“0”,实际接收的就应该是0x00,如果不选中,默认发送的是ASCII 码值,此时发送“0”,实际接收的就应该是0x30,这点可以通过观察板子P0 口上的对应的LED 指示出来。
  五、总结
  本讲介绍了单片机串口通信的原理并给出了实例,通过该讲,读者可以了解和掌握51 单片机串口通信的原理与应用流程,利用串口通信,单片机可以与计算机相连,也可以单片机互联或者多个单片机相互通信组网等,在实际的工程应用中非常广泛。从学习的角度来说,熟练的利用串口将单片机系统中的相关信息显示在计算机上可以很直观方便的进行调试和开发。

回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

电工学习网 ( )

GMT+8, 2024-4-27 14:27

Powered by © 2011-2022 www.diangon.com 版权所有 免责声明 不良信息举报

技术驱动未来! 电工学习网—专业电工基础知识电工技术学习网站。

栏目导航: 工控家园 | 三菱plc | 西门子plc | 欧姆龙plc | plc视频教程

快速回复 返回顶部 返回列表