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

51单片机学习--串口通信_第1张图片
首先需要配置寄存器:
51单片机学习--串口通信_第2张图片
下面这里SCON配0x40和0x50都可以,因为暂时还不需要接受信息,所以REN置1置0都可

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

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

#include 
#include "Delay.h"

unsigned char Sec;

void Uart_Init(void)		//[email protected]
{
	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,中断系统需要重新配置
51单片机学习--串口通信_第4张图片

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

在这里插入图片描述
在接收到信息之后RI会置1,此时进行处理,结束之后记得手动清零

#include 
#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,左边全灭右边全亮啦
51单片机学习--串口通信_第5张图片
插入一条提醒:一个函数不能即在主函数中调用又在中断函数中调用!

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

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

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

你可能感兴趣的:(51单片机,51单片机,学习,单片机,嵌入式硬件)