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亮灭、状态、显示二进制、位移

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

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

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

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

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

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

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

    2024年02月13日
    浏览(35)
  • 基于 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日
    浏览(40)
  • 基于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日
    浏览(43)
  • 基于AT89C51单片机的交通灯设计

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

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

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

    2024年02月05日
    浏览(42)
  • 基于AT89C51单片机的温度检测报警设计

    点击链接获取Keil源码与Project Backups仿真图: https://download.csdn.net/download/qq_64505944/87777752?spm=1001.2014.3001.5503 源码获取 主要内容: 基于51单片机设计一个温度检测报警器,至少具有以下功能:温度的检测和超过设定值时的报警功能 基本要求: 1、功能齐全,要配有功能说明;

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

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

    2024年02月03日
    浏览(46)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包