51单片机07 串口通信

串口是一种应用十分广泛的通讯接口,串口成本低、容易使用、通信线路简单,可实现两个设备的互相通信。单片机的串口可以使单片机与单片机、单片机与电脑、单片机与各式各样的模块互相通信。51单片机内部自带UART(Universal Asynchronous Receiver Transmitter,通用异步收发器),可实现单片机的串口通信。

一、串口向电脑发送数据

SCON=0x40; 这里用的是8位自动重装模式

cs 复制代码
#include <STC89C5xRC.H>
#include "Delay.h"

void UART_Init()
{
	SCON=0x40;  //这里不使能 STC给的代码是50 REN位0/1
	PCON &= 0x7F;		//波特率不倍速
	TMOD &= 0x0F;		//设置定时器模式
	TMOD |= 0x20;		//设置定时器模式(用定时器1,8位自动重装)
	TL1 = 0xFA;		//设置定时初值
	TH1 = 0xFA;		//设置定时重装值
	//这里UpTL/TH两个都是0xF3,试过了不行
	TR1 = 1;		//定时器1开始计时
	ET1 = 0;		//禁止定时器1中断,确保定时器只用来控制波特率
}

void UART_SendByte(unsigned char Byte)
{
	SBUF=Byte;
	while(TI==0);
	TI=0;//刚开始发送数据是0,发送成功自动置1,跳出while需要人工置0
}

void main()
{
	UART_Init();
	
	while(1)
	{
		UART_SendByte(0x47);
		Delay(500);
	}
}

以上代码为了方便看没有模块化。

二、电脑通过串口控制LED

SCON=0x50;单片机发送不需要中断,是因为电脑程序员可以循环读取缓冲区,接收需要中断,因为不知道什么时候接收到,因此需要通过串口接收中断来及时响应接收到的数据,接收到的时候触发中断,需要打开中断的相应配置(ESEA和优先级)。

EA=1;ES=1

测试代码(已经模块化后)

cs 复制代码
void UART_Init()
{
	SCON=0x50;  //这里不使能 STC给的代码是50 REN位0/1(表示接收)
	PCON &= 0x7F;		//波特率不倍速
	TMOD &= 0x0F;		//设置定时器模式
	TMOD |= 0x20;		//设置定时器模式(用定时器1,8位自动重装)
	TL1 = 0xFA;		//设置定时初值
	TH1 = 0xFA;		//设置定时重装值
	//这里UpTL/TH两个都是0xF3,试过了不行
	TR1 = 1;		//定时器1开始计时
	ET1 = 0;		//禁止定时器1中断,确保定时器只用来控制波特率
	EA = 1;
	ES = 1;
}
cs 复制代码
#include <STC89C5xRC.H>
#include "Delay.h"
#include "UART.h"

unsigned char sec;

void main()
{
	UART_Init();
	
	while(1)
	{

	}
}

void UART_Routine() interrupt 4
{
	P2=0x00;
}

问了一下GPT,它意思也可以用如下方式类似TI进行中断处理,但是会浪费大量资源。

cs 复制代码
 while(1)
    {
        // 监测接收标志位 RI,等待接收到数据
        while(RI == 0);  // 等待数据接收完成
        RI = 0;  // 清除接收中断标志位

        unsigned char received_data = SBUF;  // 读取接收到的数据
        // 处理接收到的数据
    }

cs 复制代码
#include <STC89C5xRC.H>
#include "Delay.h"
#include "UART.h"

unsigned char sec;

void main()
{
	UART_Init();
	
	while(1)
	{

	}
}

void UART_Routine() interrupt 4
{
	if(RI==1) //排除是发送的干扰
	{
		P2=~SBUF;
		UART_SendByte(SBUF); //这个不能既在主函数main出现又在中断中出现
		RI=0;
	}
}

三、波特率(TLTH)

以老师的0xF3为例,243 256溢出-每13us就溢出 1/13us:定时器T1溢出频率 0.07692Mhz

设置倍速走上面1; 0.07692除以16 就是实际波特率 0.00480769Mhz 4807.69hz

四、数据显示模式

HEX模式/十六进制模式/二进制模式:以原始数据的形式显示

文本模式/字符模式:以原始数据编码后的形式显示

相关推荐
周周记笔记1 小时前
GD32F450xx MCU Datasheet 解读:硬件测试工程师的测试方法论
单片机·嵌入式硬件
潘潘的嵌入式日记3 小时前
I²C 从机接收总被覆盖?双缓冲要在 STOP 时交接
c语言·开发语言·单片机
AOI小白新手上路5 小时前
江科协51单片机16-1 AD/DA ADC 三通道综合显示(LCD1602 版)改造说明
单片机·嵌入式硬件·51单片机
HUI-4745 小时前
EG1135|SSOP‑16 同步整流降压控制器,大功率外置 MOS 降压优选
单片机·嵌入式硬件·硬件工程
单片机仿真设计6 小时前
【proteus仿真】基于 STM32 单片机恒温箱控制系统设计(仿真图+程序)
stm32·单片机·嵌入式硬件·proteus·毕设
国科安芯6 小时前
星载CAN总线通信网络中抗辐射MCU的通信可靠性设计分析
网络·人工智能·分布式·单片机·嵌入式硬件·架构
新晨单片机设计7 小时前
S003A-基于STM32单片机温度计(数码管显示)【Proteus仿真+Keil程序+原理图】
stm32·单片机·stm32单片机功能定制
AOI小白新手上路8 小时前
江科协51单片机16-1 DA数模转换实验(PWM 呼吸灯)
单片机·嵌入式硬件·51单片机
hongmai6668888 小时前
告别Wi-Fi,专注Mesh:ESP32-H2-MINI-1U-H2S模组规格与应用
单片机·嵌入式硬件·物联网·5g·h.265
Yiran_G8 小时前
BLE通信距离怎么判断?从发射功率、PHY到天线设计分析
单片机·嵌入式硬件