51单片机串口通信原理、相关寄存器配置与简单串口收发程序代码

这篇具有很好参考价值的文章主要介绍了51单片机串口通信原理、相关寄存器配置与简单串口收发程序代码。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

1. 串口通信原理

2. 51单片机串口通信

 2.1 串口简要模式图

 2.2 相关寄存器

(1)PCON、SCON、SBUF

(2)IE、IPH、IP

(3)配置T1定时器

2.3 波特率和系统时钟和TH1和TL1计算

 3.串口通信简单收发使用代码

 3.1 在STC-isp使用端口助手,从单片机发送字节

 3.2 通过端口助手利用主机输入数据在中断中控制LED

 3.3 利用中断把主机发送来数据发送回主机


1. 串口通信原理

        串口通信是通信设备间在一条传输线上串行逐个比特的发送数据的通信方式。串行通信又可分为同步异步两种通信方式。同步通信是在同一时钟信号控制下进行收发信号,异步通信中需要双方规定一致发送和接收频率

        数据传输的方向可分为单工只能向一个方向传输)半双工(不同时间在一根线上向不同方向传输)全双工(可同时向不同方向传输)。

51单片机串口通信原理、相关寄存器配置与简单串口收发程序代码

图1.常见串行通信接口接口 

        UART是一种采用异步串行通信的通用异步收发器,在发送时将并行数据转换成串行数据,接收端则将串行数据转换成并行数据。此外UART一般需要两根数据,一根端口发送,一根端口接收。

51单片机串口通信原理、相关寄存器配置与简单串口收发程序代码

 图2.硬件连接

51单片机串口通信原理、相关寄存器配置与简单串口收发程序代码

        图3.一般协议层数据格式 

         常见串口通信速率为(9600、19200、38400、57600、115200)bps。

        UART串口物理层常用电平标准(51单片机使用TTL电平,由下不要直接将DB接口引线接到单片机会烧毁(15v > 5v)):

  • TTL电平:+5V 表示1,0V表示0
  • RS232电平(常用于DB 接口):-3~-15V表示1,+3~+15V表示0
  • RS485电平:两线压差+2~+6V表示1,-2~-6V表示0(差分信号)

2. 51单片机串口通信

51单片机串口通信原理、相关寄存器配置与简单串口收发程序代码

图2.1.CPU线路图 

51单片机串口通信原理、相关寄存器配置与简单串口收发程序代码

图2.2.USB转TTL 

  STC89C52rc有1个UART,有四种工作模式:(常用方式1)

51单片机串口通信原理、相关寄存器配置与简单串口收发程序代码

 2.1 串口简要模式图

51单片机串口通信原理、相关寄存器配置与简单串口收发程序代码

 图2.3 串口简要模式图51单片机串口通信原理、相关寄存器配置与简单串口收发程序代码

 图2.4 中断结构局部图

         SBUF为串口数据缓存寄存器,物理上是两个独立的寄存器,但占用相同的地址。写操作时,写入的是发送寄存器,读操作时,读出的是接收寄存器。SMOD控制控制是否加倍速(置1相当于加倍)

 2.2 相关寄存器

51单片机串口通信原理、相关寄存器配置与简单串口收发程序代码

(1)PCON、SCON、SBUF

        STC89C52RC及同系列单片机串行口设两个控制寄存器,串行控制寄存器SCON和 波特率选择特殊功能寄存器PCON

 PCON(不可位寻址):51单片机串口通信原理、相关寄存器配置与简单串口收发程序代码

SCON(可位寻址):

51单片机串口通信原理、相关寄存器配置与简单串口收发程序代码

51单片机串口通信原理、相关寄存器配置与简单串口收发程序代码

51单片机串口通信原理、相关寄存器配置与简单串口收发程序代码

51单片机串口通信原理、相关寄存器配置与简单串口收发程序代码51单片机串口通信原理、相关寄存器配置与简单串口收发程序代码
TI/RI为中断标志位,一般是当要发生中断事情发送才标志中断,所以一般初始化置051单片机串口通信原理、相关寄存器配置与简单串口收发程序代码

由上,当我们 想要简单的在模式1下向主机发送数据:

SCON(SM0=0,SM1=1,SM2=0,REN=0/1,TB8=0,RB8=0,T1=0,R1=0)=> 0x40

且因为需要分频,需要波特率加倍,不然速率太低。

PCON(SM0D=1,SMOD0=0)  =>  PCON | 0x80

SBUF串行口缓冲寄存器:

        虽然地址相同,但SBUF是2个缓冲器,写SBUF的操作完成待发送数据的加载,读SBUF的操作可获得已接收到的数据。两个操作分别对应两个不同的寄存器,1个是只写寄存器,1个是只读寄存器

        软件操作上,我们可以只操作SBUF,要发送时,将要发送数据赋值给SBUF,同时注意在停止位发送后将TI复位。

(2)IE、IPH、IP

        与串行口中断相关的寄存器有IE和IPH、IP。

        串行口中断允许位ES位于中断允许寄存器IE中;串行口中断优先级控制位PS/PSH位于中断优先级控制寄存器IP/IPH中

IE(可位寻址):

51单片机串口通信原理、相关寄存器配置与简单串口收发程序代码

 IP与PH(不可位寻址):

51单片机串口通信原理、相关寄存器配置与简单串口收发程序代码

 为了简单,可以仅考虑两个优先级,只操作PS=0/1

当我们不需要中断操作,也可以不设置中断EA、ES

(3)配置T1定时器

        串行通信模式1的波特率是可变的,可变的波特由定时器/计数器T1独立波特率发生器
生 ,因此我们需要配置T1定时器,常选用定时器计数器T1的工作方式2(8位自动重装) 作为波特率的溢出率。

        对于TMOD,T1模式控制为前四位:(x,x,1,0)=> (TMOD & 0x0f) | 0x02

        对于TCNO模式1控制位:

                不需要计时器发送中断,只需要它的溢出:ET1 = 0;

                允许T1开始计时:TR1 = 1;

 (4)使用STC-ISP配置寄存器51单片机串口通信原理、相关寄存器配置与简单串口收发程序代码

  本系列单片机没有AUXR,系统时钟为11.0592MHZ(因为串口通信要求较精准,如果使用12mhz与板子晶振频率不符传输错误率较大,此外通信两端波特率也要一致

51单片机串口通信原理、相关寄存器配置与简单串口收发程序代码

2.3 波特率和系统时钟和TH1和TL1计算

建议使用STC-ISP设置TH1和TL1

对于串口模式1,定时器1使用模式2(8位自动重装)。利用公式逆着推从溢出率推出波特率。

51单片机串口通信原理、相关寄存器配置与简单串口收发程序代码

  1. 当TL1 = 0xf4
  2. (ff +1)- f4 = 12          //计数12次溢出
  3. 1 /(11.0592MHZ/12)= 1.0850694444444us    //定时器12分频下计数一次的时间
  4. 12*1.0850694444444us  = 13.0208333333328us
  5. 溢出率:1/13.0208333333328us = 0.07680000000000314572800000012885
  6.  波特率 = 2^1/32 * 溢出率 = 0.00480000000000019660800000000805HZ 约等于4800MHZ
  7. 误差 = (0.00480000000000019660800000000805-0.0048)/0.0048 约等于0

51单片机串口通信原理、相关寄存器配置与简单串口收发程序代码

 3.串口通信简单收发使用代码

3.1 在STC-isp使用端口助手,从单片机发送字节

#include <REGX52.H>
void UartInit(void)		//4800bps@11.0592MHz
{
	PCON |= 0x80;		//使能波特率倍速位SMOD
	SCON  = 0x40;		//8位数据,可变波特率
	TMOD &= 0x0F;		//设置定时器模式
	TMOD |= 0x20;		//设置定时器模式
	TL1 = 0xF4;			//设置定时初始值
	TH1 = 0xF4;			//设置定时重载值
	ET1 = 0;			//禁止定时器中断
	TR1 = 1;			//定时器1开始计时
    
    //中断加不加都行,因为我们不需要中断操作
    //EA =1;
	//ES =1;
}

//发送一个字节数据经过SBUF缓存并到达主机
void UART_SendByte(unsigned char byte) {
	SBUF = byte;
    //当发送完成,TI位硬件自动置1
	while(TI == 0);
	TI = 0;
}

int main()
{
	UartInit();
	UART_SendByte(0x66);
	while(1)
	{

	}		
	
}

 3.2 通过端口助手利用主机输入数据在中断中控制LED

51单片机串口通信原理、相关寄存器配置与简单串口收发程序代码

#include <REGX52.H>
void UartInit(void)		//4800bps@11.0592MHz
{
	PCON |= 0x80;		//使能波特率倍速位SMOD
	SCON  = 0x50;		//8位数据,可变波特率
	TMOD &= 0x0F;		//设置定时器模式
	TMOD |= 0x20;		//设置定时器模式
	TL1 = 0xF4;			//设置定时初始值
	TH1 = 0xF4;			//设置定时重载值
	ET1 = 0;			//禁止定时器中断
	TR1 = 1;			//定时器1开始计时
    
    //我们尝试利用发送中断,所以需要中断操作,即电脑发送数据来,申请中断来接受数据和其他操作
    EA =1;
	ES =1;
    //为了简便,不配置优先级,选用默认优先级
}


int main()
{
	UartInit();
	while(1)
	{

	}		
	
}

void UART_Routine() interrupt 4 {
    //主机发送数据到SBUF后,RI会置1
    //单片机发送也会触发中断,为TI且占用同一中断,所以判断RI
    if(RI == 1)
    {
        //中断后响应的操作
        //利用主机发送给SBUF中数控制LED,如发送1就是除了LED1,其他都点亮
        P2 = SBUF;
        //RI必须软件复位
        RI = 0;
    }
    
}

 3.3 利用中断把主机发送来数据发送回主机

中断逻辑在注释中解释

#include <REGX52.H>
void UartInit(void)		//4800bps@11.0592MHz
{
	PCON |= 0x80;		//使能波特率倍速位SMOD
	SCON  = 0x50;		//8位数据,可变波特率
	TMOD &= 0x0F;		//设置定时器模式
	TMOD |= 0x20;		//设置定时器模式
	TL1 = 0xF4;			//设置定时初始值
	TH1 = 0xF4;			//设置定时重载值
	ET1 = 0;			//禁止定时器中断
	TR1 = 1;			//定时器1开始计时
    
    //我们尝试利用发送中断,所以需要中断操作,即电脑发送数据来,申请中断来接受数据和其他操作
    EA =1;
	ES =1;
    //为了简便,不配置优先级,选用默认优先级
}

//发送一个字节数据经过SBUF缓存并到达主机
void UART_SendByte(unsigned char byte) {
	SBUF = byte;
    //当发送完成,TI位硬件自动置1
	while(TI == 0);
	TI = 0;
}

int main()
{
	UartInit();
	while(1)
	{

	}		
	
}

void UART_Routine() interrupt 4 {
    //主机发送数据到SBUF后,RI会置1
    //单片机发送也会触发中断,为TI且占用同一中断,所以判断RI
    if(RI == 1)
    {
        //中断后响应的操作
        //此时SBUF内容为主机发来的数据,通过UART_SendByte函数发送回到主机
        //因为该中断由接受端发起,发送操作已经中断,所以现在不会有接收操作与发送操作冲突
        UART_SendByte(SBUF);
        //RI必须软件复位
        RI = 0;
    }
    
}

51单片机串口通信原理、相关寄存器配置与简单串口收发程序代码文章来源地址https://www.toymoban.com/news/detail-447908.html

到了这里,关于51单片机串口通信原理、相关寄存器配置与简单串口收发程序代码的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 51单片机学习--串口通信

    首先需要配置寄存器: 下面这里SCON配0x40和0x50都可以,因为暂时还不需要接受信息,所以REN置1置0都可 在main中调用SendByte函数,每按下一次复位键,接收缓冲区就会收到一个11 这就是单向发送的一个简单实例,接下来实现每隔一秒发送一个递增的数据,只需要添加一个全局变

    2024年02月14日
    浏览(38)
  • 51单片机(八)串口通信

    ❤️ 专栏简介:本专栏记录了从零学习单片机的过程,其中包括51单片机和STM32单片机两部分;建议先学习51单片机,其是STM32等高级单片机的基础;这样再学习STM32时才能融会贯通。 ☀️ 专栏适用人群 :适用于想要从零基础开始学习入门单片机,且有一定C语言基础的的童鞋

    2024年02月05日
    浏览(43)
  • 51单片机(串口通信、蓝牙)

    串行接口简称串口,也称 串行通信接口 或串行通讯接口(通常指COM接口),是采用串行通信方 式的扩展接口。串行接口(Serial Interface)是指 数据一位一位地顺序传送。 其特点是通信线路简 单,只要一对传输线就可以实现 双向通信( 可以直接利用电话线作为传输线),从

    2024年02月15日
    浏览(33)
  • 【51单片机】串口通信&&使用串口通信控制LED灯

    🎊专栏【51单片机】 🍔喜欢的诗句:更喜岷山千里雪 三军过后尽开颜。 🎆音乐分享【Promise】 🥰大一同学小吉,欢迎并且感谢大家指出我的问题🥰 目录 🍔串口通信 😎代码   🍔串口初始化 ⭐分析  🏳️‍🌈确定T1的工作方式 🎈TMOD=0X20;  🏳️‍🌈确定T1的初值 🎈

    2024年02月17日
    浏览(38)
  • 【51单片机系列】proteus仿真单片机的串口通信

    本文参考:https://zhuanlan.zhihu.com/p/425809292。 在proteus之外使用串口软件和单片机通信。通过在proteus设计一个单片机接收PC发送的数据,并将接收的数据发送出去,利用软件【Configure Virtual Serial Port Driver】创建一对虚拟串口,利用软件【串口助手】向单片机发送数据。 proteus仿真

    2024年01月17日
    浏览(43)
  • 【PROTEUS-51单片机串口通信仿真】

    本次实验对51单片机的串口进行了双机通信的仿真,实现了51单片机的简单双机通信;现对本次仿真的结构及实现的功能做简要的介绍, 本次仿真主要构成:主机U1-MASTER、从机U2-SLAVE、以及LED显示部分(第一部分显示主机接收到的信息、第二部分显示从机接收到的信号); 实

    2024年01月15日
    浏览(64)
  • c51单片机串口通信(中断方式接收数据)(单片机--单片机通信)示例代码 附proteus图

         单片机一般采用中断方式接受数据,这样便于及时处理 其中发送数据段采用的是查询方式,接收端采用了中断方式, 要注意的地方有: 在中断处理函数int_0()内,处理数据前要先关闭中断,否则中断可能会不断传过来, EA=0; 然后退出中断处理函数前恢复中断处理能力:

    2024年02月13日
    浏览(46)
  • 51单片机编程应用(C语言):串口通信

    目录 通信的基本概念和种类    1.1串行通信与并行通信 ​编辑 1.2同步通信与异步通信 1.3单工,半双工,全双工   1.4通信速率  二、波特率和比特率的关系 串口通信简介: 1.接口标准 RS-232 2、D型9针接口定义 3.通信协议: 2.串口内部结构  51单片机串口相关寄存器   1.80c

    2024年02月19日
    浏览(33)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包