51单片机串口通信

51单片机串口通信

​ 51单片机通过串口与PC通信

1.发送一个字符a给PC

#include "reg52.h"
#include "intrins.h"

sfr AUXR = 0x8E;

void UartInit(void)		//9600bps@11.0592MHz
{
	AUXR = 0x1;
	SCON = 0x40;//选择串口工作方式1
	TMOD &= 0x0F;
	TMOD |= 0x20; //定时器1工作在8位自动重载
	
	TH1 = 0xFD;
	TL1 = 0xFD; //9600波特率根据公式算出的初始值
	TR1 = 1; //定时器开始工作!
//	ES = 1;
//	EA = 1;
}

void Delay1000ms()		//@11.0592MHz
{
	unsigned char i, j, k;

	_nop_();
	i = 8;
	j = 1;
	k = 243;
	do
	{
		do
		{
			while (--k);
		} while (--j);
	} while (--i);
}

void main()
{
	char data_msg = 'a';
	
	//配置C51串口的通信方式
	UartInit();
	
	while(1){
		Delay1000ms();
		//往发送缓冲区写入数据,就完成数据的发送
		SBUF = data_msg;
	}
}

2.发送字符串给PC

#include "reg52.h"
#include "intrins.h"

sfr AUXR = 0x8E;

void UartInit(void)		//9600bps@11.0592MHz
{
	AUXR = 0x01;
	SCON = 0x40; //配置串口工作方式1,REN不使能接收
	TMOD &= 0x0F;
	TMOD |= 0x20;//定时器1工作方式位8位自动重装
	
	TH1 = 0xFD;
	TL1 = 0xFD;//9600波特率的初值
	TR1 = 1;//启动定时器
}

void Delay1000ms()		//@11.0592MHz
{
	unsigned char i, j, k;

	_nop_();
	i = 8;
	j = 1;
	k = 243;
	do
	{
		do
		{
			while (--k);
		} while (--j);
	} while (--i);
}

void sendByte(char data_msg)
{
	SBUF = data_msg;
	while(!TI);
	TI = 0;
}

void sendString(char* str)
{
	while( *str != '\0'){
		sendByte(*str);
		str++;
	}
}

void main()
{

	//配置C51串口的通信方式
	UartInit();
	
	while(1){
		Delay1000ms();
		//往发送缓冲区写入数据,就完成数据的发送
		sendString("wo zhen shuai a !\r\n");
	}
}

3.PC通过串口点亮LED

#include "reg52.h"
#include "intrins.h"

sfr AUXR = 0x8E;
sbit LED1 = P3^7;

void UartInit(void)		//9600bps@11.0592MHz
{
	AUXR = 0x01;
	SCON = 0x50; //配置串口工作方式1,REN使能接收
	TMOD &= 0x0F;
	TMOD |= 0x20;//定时器1工作方式位8位自动重装
	
	TH1 = 0xFD;
	TL1 = 0xFD;//9600波特率的初值
	TR1 = 1;//启动定时器
}

void Delay1000ms()		//@11.0592MHz
{
	unsigned char i, j, k;

	_nop_();
	i = 8;
	j = 1;
	k = 243;
	do
	{
		do
		{
			while (--k);
		} while (--j);
	} while (--i);
}

void sendByte(char data_msg)
{
	SBUF = data_msg;
	while(!TI);
	TI = 0;
}

void sendString(char* str)
{
	while( *str != '\0'){
		sendByte(*str);
		str++;
	}
}

void main()
{
	char cmd;
	LED1 = 1;
	//配置C51串口的通信方式
	UartInit();
	
	while(1){
		
		Delay1000ms();
		//往发送缓冲区写入数据,就完成数据的发送
		sendString("wo zhen shuai a !\r\n");
		//怎么知道收到数据,查询RI的值,如果RI是1(收到数据后由硬件置1)
		if(RI == 1){
			RI = 0;
			cmd = SBUF;
			if(cmd == 'o'){
				LED1 = 0;//点亮LED1
			}
			if(cmd == 'c'){
				LED1 = 1;//熄灭LED1
			}
			
		}
	}
}

4.PC串口中断控制LED

#include "reg52.h"
#include "intrins.h"

sfr AUXR = 0x8E;
sbit LED1 = P3^7;
char cmd;

void UartInit(void)		//9600bps@11.0592MHz
{
	AUXR = 0x01;
	SCON = 0x50; //配置串口工作方式1,REN使能接收
	TMOD &= 0x0F;
	TMOD |= 0x20;//定时器1工作方式位8位自动重装
	
	TH1 = 0xFD;
	TL1 = 0xFD;//9600波特率的初值
	TR1 = 1;//启动定时器
	
	EA = 1;//开启总中断
	ES = 1;//开启串口中断
}

void Delay1000ms()		//@11.0592MHz
{
	unsigned char i, j, k;

	_nop_();
	i = 8;
	j = 1;
	k = 243;
	do
	{
		do
		{
			while (--k);
		} while (--j);
	} while (--i);
}

void sendByte(char data_msg)
{
	SBUF = data_msg;
	while(!TI);
	TI = 0;
}

void sendString(char* str)
{
	while( *str != '\0'){
		sendByte(*str);
		str++;
	}
}

void main()
{

	LED1 = 1;
	//配置C51串口的通信方式
	UartInit();
	
	while(1){
		Delay1000ms();
		//往发送缓冲区写入数据,就完成数据的发送
		sendString("wo zhen shuai a !\r\n");
	}
}

void Uart_Handler() interrupt 4
{
	if(RI)//中断处理函数中,对于接收中断的响应
	{
			RI = 0;//清除接收中断标志位
			cmd = SBUF;
			if(cmd == 1){
				LED1 = 0;//点亮LED1
			}
			if(cmd == 0){
				LED1 = 1;//熄灭LED1
			}
	}
		
	if(TI);
}

5.字符串型指令如何处理

#include "reg52.h"
#include "intrins.h"
#include <string.h>


#define SIZE 12
sfr AUXR = 0x8E;
sbit LED1 = P3^7;
char cmd[SIZE];

void UartInit(void)		//9600bps@11.0592MHz
{
	AUXR = 0x01;
	SCON = 0x50; //配置串口工作方式1,REN使能接收
	TMOD &= 0x0F;
	TMOD |= 0x20;//定时器1工作方式位8位自动重装
	
	TH1 = 0xFD;
	TL1 = 0xFD;//9600波特率的初值
	TR1 = 1;//启动定时器
	
	EA = 1;//开启总中断
	ES = 1;//开启串口中断
}

void Delay1000ms()		//@11.0592MHz
{
	unsigned char i, j, k;

	_nop_();
	i = 8;
	j = 1;
	k = 243;
	do
	{
		do
		{
			while (--k);
		} while (--j);
	} while (--i);
}

void sendByte(char data_msg)
{
	SBUF = data_msg;
	while(!TI);
	TI = 0;
}

void sendString(char* str)
{
	while( *str != '\0'){
		sendByte(*str);
		str++;
	}
}

void main()
{

	LED1 = 1;
	//配置C51串口的通信方式
	UartInit();
	
	while(1){
		Delay1000ms();
		//往发送缓冲区写入数据,就完成数据的发送
		sendString("wo zhen shuai a !\r\n");
	}
}

void Uart_Handler() interrupt 4
{
	static int i = 0;//静态变量,被初始化一次
	if(RI)//中断处理函数中,对于接收中断的响应
	{
			RI = 0;//清除接收中断标志位
			cmd[i] = SBUF;
			i++;
			if(i == SIZE){
				i = 0;
			}
			if(strstr(cmd,"en")){
				LED1 = 0;//点亮LED1
				i = 0;
				memset(cmd,'\0',SIZE);
			}
			if(strstr(cmd,"se")){
				LED1 = 1;//熄灭LED1
				i = 0;
				memset(cmd,'\0',SIZE);
			}
	}
		
	if(TI);
}
posted @   Master-No1  阅读(85)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示