您现在的位置是:首页 >技术教程 >【51单片机】串口通信&&使用串口通信控制LED灯网站首页技术教程

【51单片机】串口通信&&使用串口通信控制LED灯

在下小吉. 2024-06-17 10:26:03
简介【51单片机】串口通信&&使用串口通信控制LED灯

?专栏【51单片机

?喜欢的诗句:更喜岷山千里雪 三军过后尽开颜。

?音乐分享【51单片机

?大一同学小吉,欢迎并且感谢大家指出我的问题?

目录

?串口通信

?代码 

 ?串口初始化

⭐分析 

?️‍?确定T1的工作方式

?TMOD=0X20; 

?️‍?确定T1的初值

?TH1=0XF3;  TL1=0XF3;

?️‍?波特率加倍(操作SMOD)

?PCON=0X80;

?️‍?启动T1 

?TR1=1

?️‍?确定串行口控制(编程SCON寄存器)

?SCON=0x50

?️‍?打开中断 

?ES=1;  EA=1 

?中断分析

?串口通信控制LED灯

?效果

?代码


?串口通信

?代码 

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

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


void UsartInit()
{
	SCON=0X50;			//设置为工作方式1      
	TMOD=0X20;			//设置计数器工作方式2
	PCON=0X80;			//波特率加倍
	TH1=0XF3;				//计数器初始值设置,注意波特率是4800的
	TL1=0XF3;
	ES=1;						//打开接收中断
	EA=1;						//打开总中断
	TR1=1;					//打开计数器
}

void main()
{	
	UsartInit();  //	串口初始化
	while(1);		
}

void Usart() interrupt 4
{
	u8 receiveData;

	receiveData=SBUF;    //出去接收到的数据
	RI = 0;            //清除接收中断标志位
	SBUF=receiveData;    //将接收到的数据放入到发送寄存器
	while(!TI);			 //等待发送数据完成
	TI=0;						 //清除发送完成标志位
}

 ?串口初始化

void UsartInit()
{
    SCON=0X50;            //设置为工作方式1      看视频P62  4:30
    TMOD=0X20;            //设置计数器工作方式2
    PCON=0X80;            //波特率加倍
    TH1=0XF3;                //计数器初始值设置,注意波特率是4800的
    TL1=0XF3;
    ES=1;                        //打开接收中断
    EA=1;                        //打开总中断
    TR1=1;                    //打开计数器
}

⭐分析 

?️‍?确定T1的工作方式

?TMOD=0X20; 


为什么是20

 

 M1 M0 这两位控制的是工作方式,是方式2,M1 M0 是10

对应到前面就是0010,那么高四位对应的就是2


?️‍?确定T1的初值

?TH1=0XF3;  TL1=0XF3;

根据下面的软件,设置 TH1 TL1

 通过上图,可以读出是F3H

那么 TH1=0XF3;  TL1=0XF3;


?️‍?波特率加倍(操作SMOD)

?PCON=0X80;

 通过上图,发现SMOD是在PCON这个寄存器里面,

由于SMOD在最高位,二进制中最高位一般表示符号位,所以SMOD不能进行位操作

所以要对这整个寄存器进行操作,

由于SMOD=0,波特率不加倍,否则加倍

所以设置PCON=0X80;就是1000 0000 相当于对SMOD进行操作


?️‍?启动T1 

?TR1=1

就是编程TCON的TR1位,打开计数器


?️‍?确定串行口控制(编程SCON寄存器)

?SCON=0x50

为什么是5

我们选择方式1,那么波特率就是可变的,

由图可知,方式1的SM0=0 SM1=1

SM2我们设置为0

REN,是允许串行接收位,我们设置为1

 

由下图可知,后四位都是0

⭐⭐⭐所以高四位是5,所以是0x50 


?️‍?打开中断 

?ES=1;  EA=1 

ES=1;          串口中断
EA=1;         打开总中断


?中断分析

void Usart() interrupt 4
{
    u8 receiveData;

    receiveData=SBUF;    //出去接收到的数据
    RI = 0;            //清除接收中断标志位
    SBUF=receiveData;    //将接收到的数据放入到发送寄存器
    while(!TI);             //等待发送数据完成
    TI=0;                         //清除发送完成标志位
}

使用SBUF寄存器来存储数据

为什么要RI=0 TI=0

 清零后,等待下一次的接收

发射完成后,TI为1,那么 !TI为0,就会跳出while循环

假设发射没有完成,那么TI为0,就不会跳出while循环

?串口通信控制LED灯

?效果

串口通信控制LED灯

?代码

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

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


void UsartInit()
{
	SCON=0X50;			//设置为工作方式1      
	TMOD=0X20;			//设置计数器工作方式2
	PCON=0X80;			//波特率加倍
	TH1=0XF3;				//计数器初始值设置,注意波特率是4800的
	TL1=0XF3;
	ES=1;						//打开接收中断
	EA=1;						//打开总中断
	TR1=1;					//打开计数器
}


void main()
{	
	UsartInit();  //	串口初始化
	while(1);		
}

void UART_SendByte(unsigned char Byte)
{
	SBUF = Byte;
	while (!TI);
	TI = 0;
}

void Usart() interrupt 4
{

	if (RI == 1)					//如果接收标志位为1,接收到了数据
	{
		P2 = ~SBUF;				//读取数据,取反后输出到LED
		UART_SendByte(SBUF);	//将受到的数据发回串口
		RI = 0;					//接收标志位清0
	}
	
}

?如果大家有不明白的地方,或者文章有问题,欢迎大家在评论区讨论,指正? 

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。