STC89C51——串行通信、串口介绍及配置

这篇具有很好参考价值的文章主要介绍了STC89C51——串行通信、串口介绍及配置。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

 前言

        本文介绍基于常见的51单片机,即如下图的芯片:

STC89C51——串行通信、串口介绍及配置

  •  AT89C51具备一个全双工串行通信接口。设有2个相互独立的接收、发送缓冲器,可以同时发送和接收数据。
  • 两个缓冲器(SBUF)共用一个物理地址即99H。如果CPU写SBUF,数据就会被送入发送寄存器准备发送;如果CPU读SBUF,则读入的数据来自接收缓冲器。发送缓冲器只能写入而不能读出,接收缓冲器只能读出而不能写入。
  •  串行通信设有4种工作方式,工作方式0和2波特率固定,方式1和3波特率可变。因为平时使用串口一般用于单片机和电脑调试,即使用串口打印功能,因此本文介绍工作方式1。其它工作方式的话很少用到就不做过多介绍了。

一、串口相关寄存器介绍

1.SCON : 串行控制寄存器

位地址 9FH 9EH 9DH 9CH 9BH 9AH 99H 98H
SCON SM0 SM1 SM2 REN TB8 RB8 T1 R1

        下面对寄存器控制位进行介绍:

①SM0和SM1

        两者不同的组合即可配置串行通信的工作方式,直接给出手册中的截图供各位参考

STC89C51——串行通信、串口介绍及配置

         波特率计算中的SMOD会在后文介绍,其作用是控制波特率倍增。

②SM2:多机控制位。在工作方式1时,该位置1的话,则在接收到有效的停止位时才至中断请求  . .             标志位RI为1,一般使用工作方式1的情况下,该位配置为0。

③REN:允许/禁止串行接收控制位。该位置1时,允许串行接收;为0时禁止接收。

④TB8:(与工作方式1无关,在此不介绍)

⑤RB8:在方式1中,若SM2=0,则RB8是接收到的停止位。

⑥TI:发送中断请求标志位。工作方式1下,停止位开始发送时由内部硬件置位为1,需要软件清0

⑦RI:接收中断请求标志位。工作方式1下,停止位接收的中间时刻由内部硬件置位为1,需要软件清0

           在实际应用工作方式1时,单片机如果只负责发送,则寄存器配置语句为:

SCON=0x40 ;

单片机如果负责发送和接收,则寄存器配置语句为:

SCON=0x50 ;

2.PCON:电源控制寄存器

D7 D6 D5 D4 D3 D2 D1 D0
PCON SMOD X X X X X X X

        对于PCON寄存器,只需要掌握该寄存器的最高位SMOD位,该位在工作方式1-3中,如果SMOD=1,串行口波特率加倍;SMOD=0,波特率不变。

        在实际应用工作方式1时,如果单片机不需要波特率加倍,则无需配置该寄存器。

        若波特率需要加倍,则寄存器配置语句为:

PCON |= 0x80;

        

3.波特率的计算

         波特率由内部定时器产生,配置波特率时需要配置定时器。

         以下波特率计算式基于工作方式1,定时器工作方式2。定时器方式2为8位自动重装定时器,其对于其它方式可以减小软件重装载产生的误差,一般应用中,也是这样的组合。

                

        其中 BPS 为波特率数值,f 为单片机晶振值,T 为定时器装载初值。实际配置中,需要知道单片机的晶振、预设的波特率,然后通过计算式求出定时器初值即可。

        下面举例说明更浅显易懂:

        假设在工作方式1下,定时器工作方式2,波特率为9600且无需增倍,单片机晶振为11.0592Mhz,单片机定时器初值为:

        

则 T = 253,转换为十六进制为0xFD

        在程序中,定时器初值配置语句为:

TH1 = TL1 =0xFD;

二、程序设计

        目前单片机一般用的是12M晶振和11.0592M晶振,晶振不同,配置波特率定时器的初始值就不同,下面介绍以上两种晶振下的代码示例。

        需要注意的是12M晶振不适合4800以上的波特率,可用2400或4800,因为超过4800会出现较大误差。但是11.0592M的晶振就不受那么多限制,因为其本身的值代入波特率计算公式中能得到一个整数。

        示例代码的功能是串口调试助手向单片机发送什么内容,单片机就返回什么内容,需要注意串口助手要勾选发送新行。文章来源地址https://www.toymoban.com/news/detail-448934.html

1. 12M晶振下 2400 / 4800 波特率(已验证)

#include <REGX51.H>
#include "string.h"
#include "intrins.h"
unsigned char Data[32];

void USART_SendByte(unsigned char byte)
{
	   SBUF = byte;
	   while(!TI);
	   TI = 0;
}
void USART_SendStr(unsigned char *p)
{   
        while( *p != '\0')
        {			
            USART_SendByte(*p);            
            p++;            
        }            
}
        
void USART( ) interrupt  4
{    
    static unsigned char i=0;
	if(RI==1)
	{	RI=0;
		if(i>=32)   //收到字符串超过数组长度
		{ 
			i=0;
			USART_SendStr("Data overflow !\r\n");
			memset(Data,0x00,sizeof(Data)); //数组清零
		}
        else
        {
			Data[i++]=SBUF;
			if( (Data[i-1]=='\n')  && (Data[i-2]=='\r') )  //判断结尾字符为回车换行符
			{
				USART_SendStr(Data) ;   //将收到的内容发送出去
                memset(Data,0x00,sizeof(Data));//数组清零
                i=0;                 
			}
        }
	}   
}

void main( )
{
	TMOD=0x20;	//定时器1工作方式2
	TH1=0XE6;	//当前是2400波特率 , F3是4800波特率
	TL1=0XE6;	//当前是2400波特率 , F3是4800波特率 
	SCON=0X50;	//串口工作方式1,接收REN位置1
	PCON=0x80;	//波特率加倍!
	TR1=1;		//开启定时器1
	ES=1;		//开启串口中断
	EA=1;		//允许总中断
	while(1);
}

2. 11.0592M晶振下 9600 波特率(因无设备原因未验证)

#include <REGX51.H>
#include "string.h"
#include "intrins.h"
unsigned char Data[32];


void USART_SendByte(unsigned char byte)
{
	   SBUF = byte;
	   while(!TI);
	   TI = 0;
}
void USART_SendStr(unsigned char *p)
{   
        while( *p != '\0')
        {			
            USART_SendByte(*p);            
            p++;            
        }            
}
        
void USART( ) interrupt  4
{    
    static unsigned char i=0;
	if(RI==1)
	{	RI=0;
		if(i>=32)   //收到字符串超过数组长度
		{ 
			i=0;
			USART_SendStr("Data overflow !\r\n");
			memset(Data,0x00,sizeof(Data)); //数组清零
		}
        else
        {
			Data[i++]=SBUF;
			if( (Data[i-1]=='\n')  && (Data[i-2]=='\r') )  //判断结尾字符为回车换行符
			{
				USART_SendStr(Data) ;   //将收到的内容发送出去
                memset(Data,0x00,sizeof(Data));//数组清零
                i=0;                 
			}
        }
	}   
}

void main( )
{
	TMOD=0x20;	//定时器1工作方式2
	TH1=0XFD;	//@11.0592M,9600波特率
	TL1=0XFD;	//@11.0592M,9600波特率
	SCON=0X50;	//串口工作方式1,接收REN位置1
	TR1=1;		//开启定时器1
	ES=1;		//开启串口中断
	EA=1;		//允许总中断
	while(1);
}

到了这里,关于STC89C51——串行通信、串口介绍及配置的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 单片机C51(STC89C52RC)独立按键控制LED亮灭、状态、显示二进制、位移

    单片机C51(STC89C52RC)独立按键控制LED亮灭、状态、显示二进制、位移

    目录 1.独立按键控制LED灯亮灭 2.独立按键控制LED灯状态 3.独立按键控制LED灯显示二进制 4.独立按键控制LED灯位移 5.附录 独立按键控制LED灯状态,在独立按键按下时,LED灯点亮,松手后LED灯熄灭。独立按键按下为0,松开为1,在STC89C52RC芯片上,P2为LED灯IO口,P2_0表示第一个LED灯

    2024年02月01日
    浏览(16)
  • 51单片机(At89C51)组成,引脚介绍

    51单片机(At89C51)组成,引脚介绍

    一,单片机的发展史 单片机是一种集成在电路芯片,是采用超大规模集成电路技术把具有数据处理能力的中央处理器CPU随机存储器RAM、只读存储器ROM、多种I/0口和中断系统、定时器/计时器等功能(可能还包括显示驱动电路、脉宽调制电路、模拟多路转换器、A/D转换器等电路

    2023年04月13日
    浏览(21)
  • 51单片机(二)8051内核及STC89C52介绍

    51单片机(二)8051内核及STC89C52介绍

    我们现在经常使用的STC89C52RC单片机就是基于8051内核的,它是深圳宏晶科技生产的一款单片机,它与MCS-51兼容,下面开始介绍STC89C52RC单片机。 1. STC89C52RC的兼容型号         STC89C52RC兼容 STC89C51RC,STCLE51RC,STC89C53RC,STC89LE52RC等。 以下是完整型号列表: 我们平时用的stc89c52已经能

    2024年02月06日
    浏览(18)
  • AT89C51单片机实现单片机串口互动(中断方式,单片机--单片机,应答)

    AT89C51单片机实现单片机串口互动(中断方式,单片机--单片机,应答)

     说一下功能:客户机发送0x01到服务机 2服务单片机应答0xf2到客户机 3客户机接收到0xf2,发送信息153432这6个数字到服务机 4client发送完信息后发送0xaa结束通信 5server接收到0xaa后回复0xaa结束通信,从此老死不相往来 看代码: 服务端代码:    

    2024年02月13日
    浏览(12)
  • 基于 AT89C51 单片机的数字时钟设计

    基于 AT89C51 单片机的数字时钟设计

    目录 1.设计目的、作用 2.设计要求 3.设计的具体实现 3.1 设计原理 3.2 硬件系统设计         3.2.1 AT89C51 单片机原理 3.2.2 晶振电路设计 3.2.3 复位电路设计 3.2.4 LED 数码管显示 3.3 系统实现 3.3.1 系统仿真与调试 3.3.2 演示结果 4.总结 附录 附录 1 附录 2 (1 )掌握 51 系列单片机的

    2024年02月01日
    浏览(10)
  • 基于AT89C51单片机的电子时钟设计

    基于AT89C51单片机的电子时钟设计

    点击链接获取Keil源码与Project Backups仿真图: https://download.csdn.net/download/qq_64505944/87695258?spm=1001.2014.3001.5503 源码获取 主要内容: 1.设计出电子数字钟的电路,并用protus进行仿真画出对应的电路图 2.设计出电子数字钟的源程序,并用Keil进行编辑生成HEX文件 3.在protus中进行测试。

    2024年02月09日
    浏览(13)
  • 基于AT89C51单片机的交通灯设计

    基于AT89C51单片机的交通灯设计

    点击链接获取Keil源码与Project Backups仿真图: https://download.csdn.net/download/qq_64505944/87779238?spm=1001.2014.3001.5503 源码获取 主要内容: 在日常生活中,交通灯是一项必不可少的公共设施,可 以维护道路的畅通和交通的秩序。如若交通灯发生故障,那 么后果可想而知。因此,交通灯

    2024年02月08日
    浏览(7)
  • 单片机AT89C51六位数码管秒表

    单片机AT89C51六位数码管秒表

    详细代码讨论加我QQ:1271370903   本设计的数字电子秒表系统采用AT89C51单片机为中心器件,利用其定时器/计数器定时和记数的原理,结合显示电路、LED数码管以及外部中断电路来设计计时器。将软、硬件有机地结合起来,使得系统能够实现LED显示,显示时间为0~9999.99秒,计时

    2024年02月03日
    浏览(205)
  • 自学笔记:89c51单片机最小系统Protues篇

    自学笔记:89c51单片机最小系统Protues篇

    什么是单片机最小系统? 单片机最小系统:单片机最小应用系统,使用 最少 的元件组成单片机能够工作的系统。 单片机最小系统 三要素 :电源模块,(晶振/时钟)振荡电路模块,复位电路模块 1,电源模块:供电。VCC端接正向5V电压,GND端接地。 51单片机全部引脚图(百

    2024年02月04日
    浏览(11)
  • 基于AT89C51单片机的温度计设计

    基于AT89C51单片机的温度计设计

    点击链接获取Keil源码与Project Backups仿真图: https://download.csdn.net/download/qq_64505944/87773445 源码获取 主要内容: 设计一个简易温度计;要求电路实现如下功能: 设计通过单片机和数码管、led灯等组成,可以显示温度,并且可以显示大于零度的温度和小于零度的温度,还可以超出

    2024年02月05日
    浏览(8)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包