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

首先需要配置寄存器:

下面这里SCON配0x40和0x50都可以,因为暂时还不需要接受信息,所以REN置1置0都可

c 复制代码
void Uart_Init(void)		//4800bps@11.0592MHz
{
	PCON |= 0x80;		//使能波特率倍速位SMOD
	SCON = 0x50;		//8位数据,可变波特率
	TMOD &= 0x0F;		//清除定时器1模式位
	TMOD |= 0x20;		//设定定时器1为8位自动重装方式
	TL1 = 0xF4;		//设定定时初值
	TH1 = 0xF4;		//设定定时器重装值
	ET1 = 0;		//禁止定时器1中断
	TR1 = 1;		//启动定时器1
}


在main中调用SendByte函数,每按下一次复位键,接收缓冲区就会收到一个11
这就是单向发送的一个简单实例,接下来实现每隔一秒发送一个递增的数据,只需要添加一个全局变量Sec,再把SendByte放到循环中即可

c 复制代码
#include <REGX52.H>
#include "Delay.h"

unsigned char Sec;

void Uart_Init(void)		//4800bps@11.0592MHz
{
	PCON |= 0x80;		//使能波特率倍速位SMOD
	SCON = 0x50;		//8位数据,可变波特率
	TMOD &= 0x0F;		//清除定时器1模式位
	TMOD |= 0x20;		//设定定时器1为8位自动重装方式
	TL1 = 0xF4;		//设定定时初值
	TH1 = 0xF4;		//设定定时器重装值
	ET1 = 0;		//禁止定时器1中断
	TR1 = 1;		//启动定时器1
}

void Uart_SendByte(unsigned char Byte)
{
	SBUF = Byte; //写入
	while(TI == 0); //直到发送成功,TI变成1,跳出循环
	TI = 0; //复位
}


void main()
{
	Uart_Init();
	while(1)
	{
		Uart_SendByte(Sec);
		Sec ++;
		Delay(1000);
	}
}

最后需要做的是把这个串口模块化,方便以后直接使用
下面实现电脑端向单片机发送数据,单片机需要利用中断来检测是否有数据发送过来,在中断函数里面来进行数据处理,接收功能需要把SCON的REN给置1,所以SCON = 0x50,中断系统需要重新配置

所以ES = 1;
EA = 1;
最后一个优先级开关可以先不管
写在Uart串口控制的初始化函数里
最后还要在main.c写中断函数 函数名后面要跟上interrupt 4代表串口接收/发送中断


在接收到信息之后RI会置1,此时进行处理,结束之后记得手动清零

c 复制代码
#include <REGX52.H>
#include "Delay.h"
#include "Uart.h"

unsigned char Sec;

void main()
{
	Uart_Init();
	while(1)
	{
		
	}
}

void Uart_Routine() interrupt 4
{
	if(RI == 1) //串口接收到数据后会自动将RI置1
	{
		P2 = SBUF; //读取缓冲区
		RI = 0;
	}
}

此时在输入区发送0f,左边全灭右边全亮啦

插入一条提醒:一个函数不能即在主函数中调用又在中断函数中调用!

在中断函数中调用SendByte即可让单片机在读取电脑发来的数据的同时,还能将这个数据Send回来

c 复制代码
void Uart_Routine() interrupt 4
{
	if(RI == 1) //串口接收到数据后会自动将RI置1
	{
		P2 = SBUF; //读取缓冲区
		Uart_SendByte(SBUF);
		RI = 0;
	}
}

最后把串口中断函数放到之前的Uart模块里面,方便以后使用。。

相关推荐
dengqingrui1233 小时前
【树形DP】AT_dp_p Independent Set 题解
c++·学习·算法·深度优先·图论·dp
我的心永远是冰冰哒3 小时前
ad.concat()学习
学习
ZZZ_O^O3 小时前
二分查找算法——寻找旋转排序数组中的最小值&点名
数据结构·c++·学习·算法·二叉树
FreakStudio5 小时前
全网最适合入门的面向对象编程教程:56 Python字符串与序列化-正则表达式和re模块应用
python·单片机·嵌入式·面向对象·电子diy
slomay5 小时前
关于对比学习(简单整理
经验分享·深度学习·学习·机器学习
hengzhepa5 小时前
ElasticSearch备考 -- Async search
大数据·学习·elasticsearch·搜索引擎·es
小小洋洋7 小时前
BLE MESH学习1-基于沁恒CH582学习
学习
EVERSPIN8 小时前
分享国产32位单片机的电机控制方案
单片机·嵌入式硬件
每天一杯冰美式oh8 小时前
51单片机的家用煤气报警系统【proteus仿真+程序+报告+原理图+演示视频】
嵌入式硬件·51单片机·proteus
Ace'8 小时前
每日一题&&学习笔记
笔记·学习