单片机通过串口与电脑通信

串口寄存器的配置及使用

可手动配置,也可用STC-ISP工具的波特率计算器生成配置函数

PCON寄存器的SMOD位置1,PCON |= 0x80,设置波特率倍增

因为波特率倍增了,所以TH1TL1设置波特率时,要比预设定的波特率小,如要得到9600,则TH1和TL1就要配成4800的,然后再经过倍增得到9600;想要得到4800,就要配置成2400

//串口初始化函数
void UartInit(void)		//4800bps@11.0592MHz
{
	PCON |= 0x80;		//使能波特率倍速位SMOD,波特率倍增
	SCON = 0x50;		//设定串行口的工作方式是:8位数据,可变波特率,这里RENw位置1,表示允许串行接收,不接收时置0
	TMOD &= 0x0F;		//清除定时器1模式位
	TMOD |= 0x20;		//设定定时器1为8位自动重装方式
	TL1 = 0xF4;		//设定定时初值,这里配置的是2400波特率,但使能了SMOD为1,波特率倍增,所以最终波特率为4800
	TH1 = 0xF4;		//设定定时器重装值,
	ET1 = 0;		//禁止定时器1中断
	TR1 = 1;		//启动定时器1
	
	EA = 1;			//开启总中断
	ES = 1;			//当需要接收电脑的数据时,是通过中断方式接收的,所以要开启串口中断
}

PCON寄存器的SMOD位置0,PCON |= 0x7F,设置波特率不倍增

想要什么波特率,TH1和TL1就配置成什么波特率初值

//串口初始化函数
void UartInit(void)		//4800bps@11.0592MHz
{
	PCON &= 0x7F;		//不使能波特率倍速位SMOD,波特率不倍增
	SCON = 0x50;		//设定串行口的工作方式是:8位数据,可变波特率,这里RENw置1,表示允许串行接收,不接收时置0
	TMOD &= 0x0F;		//清除定时器1模式位
	TMOD |= 0x20;		//设定定时器1为8位自动重装方式
	TL1 = 0xFA;		//设定定时初值,不倍增的话,想要多少波特率就配成多少,这里配置的是4800波特率
	TH1 = 0xFA;		//设定定时器重装值,
	ET1 = 0;		//禁止定时器1中断
	TR1 = 1;		//启动定时器1
	
	EA = 1;			//开启总中断
	ES = 1;			//当需要接收电脑的数据时,是通过中断方式接收的,所以要开启串口中断
}

在这里插入图片描述

单片机给电脑发送数据

配置好初始化函数后,可直接写一个发送数据的方法,比较简单

/**
  * @brief串口发送一个字符
  * @param要发送的数据
  * @retval无
  */
void Uart_SendByte(unsigned char dat)
{
	SBUF = dat;		//把数据放到SBUF缓冲器中,表示发送数据
	while(!TI);		//当发送标志TI仍为0时,条件为真则死循环,当TI标志置1,条件为假则退出循环
	TI = 0;			//数据发送完成后会硬件置1,为了下次发送需要软件置0
}

单片机通过串口发送字符串

/**
  * @brief串口发送一个字符
  * @param要发送的数据
  * @retval无
  */
void Uart_SendByte(unsigned char dat)
{
	SBUF = dat;
	while(!TI);
	TI = 0;
}
/**
  * @brief串口发送一个字符串
  * @param要发送的字符串
  * @retval无
  */
void Uart_SendString(char* str)
{
	while(*str != '\0')
	{
		Uart_SendByte(*str);
		str++;
	}
}
void main()
{
	UartInit();
	Uart_SendString("student\r\n");	//串口向电脑发送字符串
	Delay1ms(2000);
}

要实现在串口接收助手中换行显示,需要在字符后加上:\r\n,少一个都不行

发送字符串就是不断调用发送一个字符函数将字符逐个发送,遇到’\0’停止

电脑发送数据给单片机

需要开启串口中断接收数据,使能串口中断,即SCON寄存器的REN位置1

无论是发送还是接收都会触发中断,要在中断函数中处理

/**
  * @brief中断处理函数
  * @param无
  * @retval无
  */
void Uart_Routine(void)	interrupt 4
{
	re_dat = SBUF;		//定义一个全局变量接收电脑发来的数据
	while(RI == 0);
	RI = 0;				//RI软件置0
	P2 = ~re_dat;		//根据接收到的数据将LED灯点亮
	Uart_SendByte(re_dat);		//同时将接收到的数据再发送到电脑上显示
}

电脑发送字符串控制开关LED灯,开灯"open",关灯"close"

/**
  * @brief串口处理函数
  * @param无
  * @retval无
  */
void Uart_Rountine() interrupt 4
{
	static unsigned int p = 0;
	while(!RI);					//接收中断请求标志位,接收到RI=1,需要软件置0
	RI = 0;						//软件置0
	rec[p] = SBUF;				//每次进中断获取一个字节的数据放到rec数组中,然后下标后移,接收完一个字符串
	p++;
	if(p == size)				//判满操作
	{
		p = 0;
	}
	if(strstr(rec,"op"))		//如果RX收到的字符串有子串“op”则表示开灯
	{
		LED1 = 0;
		LED2 = 0;
		p = 0;
		memset(rec,'\0',size);	//清空rec数组的内容
	}
	if(strstr(rec,"clo"))		//如果RX收到的字符串有子串“clo”则表示关灯
	{
		LED1 = 1;
		LED2 = 1;
		p = 0;
		memset(rec,'\0',size);
	}
}

整体示例代码

#include "reg52.h"

unsigned char re_dat;

//串口初始化函数
void UartInit(void)		//4800bps@11.0592MHz
{
	PCON |= 0x80;		//使能波特率倍速位SMOD,也可选择不使能,不使能时是0x7F
	SCON = 0x50;		//设定串行口的工作方式是:8位数据,可变波特率,这里REN置1,表示允许串行接收,不接收时置0
	TMOD &= 0x0F;		//清除定时器1模式位
	TMOD |= 0x20;		//设定定时器1为8位自动重装方式
	TL1 = 0xF4;		//设定定时初值,这里配置的是2400波特率,但使能了SMOD为1,波特率倍增,所以最终波特率为4800
	TH1 = 0xF4;		//设定定时器重装值,可根据STC-ISP工具配置
	ET1 = 0;		//禁止定时器1中断
	TR1 = 1;		//启动定时器1
	
	EA = 1;			//开启总中断
	ES = 1;			//当需要接收电脑的数据时,是通过中断方式接收的,所以要开启串口中断
}

//发送数据函数
void Uart_SendByte(unsigned char dat)
{
	SBUF = dat;		//把数据放到SBUF缓冲器中,表示发送数据
	while(!TI);		//当发送标志TI仍为0时,条件为真则死循环,当TI标志置1,条件为假则退出循环
	TI = 0;			//数据发送完成后会硬件置1,为了下次发送需要软件置0
}

//中断处理函数
void Uart_Routine(void)	interrupt 4
{
	re_dat = SBUF;		//定义一个全局变量接收电脑发来的数据
	while(RI == 0);
	RI = 0;				//RI软件置0
	P2 = ~re_dat;		//根据接收到的数据将LED灯点亮
	Uart_SendByte(re_dat);		//同时将接收到的数据再发送到电脑上显示
}

int main()
{
	UartInit();
	while(1)
	{
	}
}
  • 6
    点赞
  • 59
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值