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

🎊专栏【51单片机

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

🎆音乐分享【Promise

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

目录

🍔串口通信

😎代码 

 🍔串口初始化

⭐分析 

🏳️‍🌈确定T1的工作方式

🎈TMOD=0X20; 

🏳️‍🌈确定T1的初值

🎈TH1=0XF3;  TL1=0XF3;

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

🎈PCON=0X80;

🏳️‍🌈启动T1 

🎈TR1=1

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

🎈SCON=0x50

🏳️‍🌈打开中断 

🎈ES=1;  EA=1 

🍔中断分析

🍔串口通信控制LED灯

😎效果

😎代码


 

🍔串口通信

e4ea308c724d4cf19ff564840e26ab9a.png

😎代码 

#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

0733baa2cd2a42068ff7af191fd0607a.png

 28a587bb35c744dc962c6a83f1f4ae26.png

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

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


🏳️‍🌈确定T1的初值

🎈TH1=0XF3;  TL1=0XF3;

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

1de561f00d024776913831f149995de9.png

 通过上图,可以读出是F3H

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


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

🎈PCON=0X80;

867cb435a3b04f05a69072dc379e7dad.png

 通过上图,发现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

30eeffdcfb174ef894ca2537b479cc1e.png

b68e268612aa40f2a16f18fded0591af.png​ 

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

a61c18bd4ef04e838d939b47ed68ae25.png

⭐⭐⭐所以高四位是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

a0cf0ffd1d0043af91afb6a13a2e6f09.png

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

发射完成后,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
	}
	
}

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

 

  • 18
    点赞
  • 88
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 7
    评论
以下是使用C51单片机控制串口发送指令控制LED闪烁的示例代码: ```c #include <reg51.h> sbit LED = P1^0; // LED连接到P1.0 sbit SM0 = PCON^0; // 定义串口工作方式寄存器位 sbit SM1 = PCON^1; void InitUART() // 初始化串口 { SCON = 0x50; // 8位数据,无校验位,1位停止位,允许接收 SM0 = 0; // 设置串口工作方式为模式1 SM1 = 1; TMOD |= 0x20; // 设置计数器1为8位自动重载模式 TH1 = 0xFD; // 波特率设置为9600 TL1 = 0xFD; TR1 = 1; // 启动计数器1 TI = 0; // 清除发送中断标志 } void UARTSendByte(unsigned char byte) // 串口发送一个字节 { SBUF = byte; while(!TI); // 等待发送完成 TI = 0; // 清除发送中断标志 } void main() { InitUART(); // 初始化串口 LED = 0; // 初始状态为灭 while(1) { if(RI) // 如果收到了数据 { unsigned char command = SBUF; // 读取串口接收到的数据 RI = 0; // 清除接收中断标志 if(command == '1') // 如果收到的是'1',则打开LED { LED = 1; UARTSendByte('L'); } else if(command == '0') // 如果收到的是'0',则关闭LED { LED = 0; UARTSendByte('D'); } } } } ``` 在此示例代码中,我们通过串口接收指令来控制LED的开关状态,如果接收到的指令是'1',则LED被打开,反之如果是'0'则LED被关闭。同时,我们通过串口发送一个'L'或'D'来表示LED状态的变化情况。 注意,此示例代码中使用的波特率为9600,如果你的串口终端工具设置的波特率不一样,需要相应地调整TH1和TL1的值来匹配其波特率。同样,串口终端工具需要发送ASCII码,而不是二进制码。
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

在下小吉.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值