9.串口通信

串口基本认识

串行接口简称串口,也称串行通信接口或串行通讯接口(通常指COM接口),是采用串行通信方
式的扩展接口。串行接口(Serial Interface)是指数据一位一位地顺序传送。其特点是通信线路简
单,只要一对传输线就可以实现双向通信(可以直接利用电话线作为传输线),从而大大降低了成
本,特别适用于远距离通信,但传送速度较慢

串口接线方式

  1. RXD:数据输入引脚,数据接受;STC89系列对应P3.0口。
    TXD:数据发送引脚,数据发送;STC89系列对应P3.1口。

接线方式

在这里插入图片描述

串口编程要素

输入/输出数据缓冲器都叫做SBUF, 都用99H地址码,但是是两个独立的8位寄存器
代码体现为: 想要接收数据 char data = SBUF 想要发送数据 SBUF = data

在这里插入图片描述

回忆UART是异步串行接口,通信双方使用时钟不同,因为双方硬件配置不同,但是需要约定通信
速度,叫做波特率
对于电脑来说,别人做好了软件,鼠标点点点就能配置好,而苦逼单片机的波特率配置需要我们写
代码
点点点配置什么,我们代码也要配置对应参数。

51发送字符到PC

SCON

在这里插入图片描述

在这里插入图片描述

选择SM0和SM1为01,工作模式为方式一,

REN = 0,禁止接收
REN = 1,允许接收

SCON = 0100 0000; //禁止接收
SCON = 0101 0000; //允许接收

PCON

PCON &= 0x7F;//0111 1111 按位与将SMOD设置为0。

AUXR

在这里插入图片描述

TMOD

目标:0010 xxxx

TMOD &= 0x0F; //先将高位清零,低位不变
TMOD |= 0x20; //0010 xxxx

TH1

在这里插入图片描述

TH1 = 0xFD; //smod = 0 9600 = (2^smod) / 32 x 11059200 / 12/(256 - THL)
TL1 = 0xFD; // THL = 253 = FD(HEX)

代码实现

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

sfr AUXR = 0x8E;

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

	_nop_();
	i = 2;
	j = 193;
	k = 57;
	do
	{
		do
		{
			while (--k);
		} while (--j);
	} while (--i);
}

void UartInit(void)		//9600bps@11.0592MHz
{
	PCON &= 0x7F;		
	SCON  = 0x50;		
	AUXR &= 0xBF;		
	AUXR &= 0xFE;		
	TMOD &= 0x0F;		
	TMOD |= 0x20;		
	TL1 = 0xFD;		
	TH1 = 0xFD;		
	ET1 = 0;		
	TR1 = 1;		
}

void my_UartInit()
{
	SCON = 0x40;//选择SM0和SM1为01,工作模式为方式一,SCON = 0100 0000;
	PCON &= 0x7F;//0111 1111  按位与将SMOD设置为0
 	AUXR |= 0x01;//0000 0001
	TMOD &= 0x0F;//目标:0010 xxxx   //先将高位清零,低位不变
	TMOD |= 0x20;//0010 xxxx
	TH1 = 0xFD;	//smod = 0	9600 = (2^smod) / 32 x 11059200 / 12 /(256 - THL)
	TL1 = 0xFD;	//THL = 253 = FD(HEX)
	ET1 = 0;//禁止定时器1中断
	TR1 = 1;//启动定时器1
}

void main()
{
	char msg_data = 's';
	
	my_UartInit();	
	
	while(1)
	{
		Delay250ms();
		
		SBUF = msg_data;
	}
}

51发字符串给PC

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

sfr AUXR = 0x8E;

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

	_nop_();
	i = 2;
	j = 193;
	k = 57;
	do
	{
		do
		{
			while (--k);
		} while (--j);
	} while (--i);
}

void UartInit(void)		//9600bps@11.0592MHz
{
	PCON &= 0x7F;		
	SCON  = 0x50;		
	AUXR &= 0xBF;		
	AUXR &= 0xFE;		
	TMOD &= 0x0F;		
	TMOD |= 0x20;		
	TL1 = 0xFD;		
	TH1 = 0xFD;		
	ET1 = 0;		
	TR1 = 1;		
}

void my_UartInit()
{
	SCON = 0x40;//选择SM0和SM1为01,工作模式为方式一,SCON = 0100 0000;
	PCON &= 0x7F;//0111 1111  按位与将SMOD设置为0
 	AUXR |= 0x01;//0000 0001
	TMOD &= 0x0F;//目标:0010 xxxx   //先将高位清零,低位不变
	TMOD |= 0x20;//0010 xxxx
	TH1 = 0xFD;	//smod = 0	9600 = (2^smod) / 32 x 11059200 / 12 /(256 - THL)
	TL1 = 0xFD;	//THL = 253 = FD(HEX)
	ET1 = 0;//禁止定时器1中断
	TR1 = 1;//启动定时器1
}

void sendByte(char msg_data)
{
	SBUF = msg_data;
	
	while(TI == 0);//结束TI=1,TI==0为假
	TI = 0;
}

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

void main()
{
	my_UartInit();
	
	while(1)
	{
		Delay250ms();
		sendString("hello world!\r\n");
	}
}

51接收PC发送的字符,达到点灯关灯的目的

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

sbit led1 = P3^7;

sfr AUXR = 0x8E;

char cmd; 

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

	_nop_();
	i = 2;
	j = 193;
	k = 57;
	do
	{
		do
		{
			while (--k);
		} while (--j);
	} while (--i);
}

void UartInit(void)		//9600bps@11.0592MHz
{
	PCON &= 0x7F;
	SCON  = 0x50;
	AUXR &= 0xBF;
	AUXR &= 0xFE;
	TMOD &= 0x0F;
	TMOD |= 0x20;
	TL1 = 0xFD;
	TH1 = 0xFD;
	ET1 = 0;
	TR1 = 1;
}

void my_UartInit()
{
	SCON = 0x50;//选择SM0和SM1为01,工作模式为方式一,SCON = 0101 0000; 允许接收
	PCON &= 0x7F;//0111 1111  按位与将SMOD设置为0
 	AUXR |= 0x01;//0000 0001
	TMOD &= 0x0F;//目标:0010 xxxx   //先将高位清零,低位不变
	TMOD |= 0x20;//0010 xxxx
	TH1 = 0xFD;	//smod = 0	9600 = (2^smod) / 32 x 11059200 / 12 /(256 - THL)
	TL1 = 0xFD;	//THL = 253 = FD(HEX)
	ET1 = 0;//禁止定时器1中断
	TR1 = 1;//启动定时器1
}

void sendByte(char msg_data)
{
	SBUF = msg_data;
	
	while(TI == 0);//结束时TI=1,TI == 0 为假
	TI = 0;
}

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

void main()
{
	my_UartInit();
	led1 = 1;
	
	while(1)
	{
		Delay250ms();
		sendString("hello world!\r\n");
	}
}

void UartHandler() interrupt 4
{
	if(RI)
	{
		RI = 0;
		cmd = SBUF;
		
		if(cmd == 'o')
		{
			led1 = 0;
		}
		if(cmd == 'c')
		{
			led1 = 1;
		}
		
	}
	if(TI)
	{
		
	}
}

51接收PC发送的字符串,达到点灯关灯的目的

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

sbit led1 = P3^7;

sfr AUXR = 0x8E;

char cmd[12] = {'\0'};

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

	_nop_();
	i = 2;
	j = 193;
	k = 57;
	do
	{
		do
		{
			while (--k);
		} while (--j);
	} while (--i);
}

void UartInit(void)		//9600bps@11.0592MHz
{
	PCON &= 0x7F;
	SCON  = 0x50;
	AUXR &= 0xBF;
	AUXR &= 0xFE;
	TMOD &= 0x0F;
	TMOD |= 0x20;
	TL1 = 0xFD;
	TH1 = 0xFD;
	ET1 = 0;
	TR1 = 1;
}

void my_UartInit()
{
	SCON = 0x50;//选择SM0和SM1为01,工作模式为方式一,SCON = 0101 0000; 允许接收
	PCON &= 0x7F;//0111 1111  按位与将SMOD设置为0
 	AUXR |= 0x01;//0000 0001
	TMOD &= 0x0F;//目标:0010 xxxx   //先将高位清零,低位不变
	TMOD |= 0x20;//0010 xxxx
	TH1 = 0xFD;	//smod = 0	9600 = (2^smod) / 32 x 11059200 / 12 /(256 - THL)
	TL1 = 0xFD;	//THL = 253 = FD(HEX)
	ET1 = 0;//禁止定时器1中断
	TR1 = 1;//启动定时器1
}

void sendByte(char msg_data)
{
	SBUF = msg_data;
	
	while(TI == 0);//结束TI=1,TI==0为假
	TI = 0;
}

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

void main()
{
	my_UartInit();
	led1 = 1;
	
	while(1)
	{
		Delay250ms();
		sendString("hello world!\r\n");
	}
}

void UartHandler() interrupt 4
{
	static int i = 0;//静态变量 只被初始化一次
	
	if(RI)//中断处理函数中,对于接收中断的响应
	{	
		RI = 0;//清除接收中断标志位
		cmd[i] = SBUF;
		i++;
		
		if(strstr(cmd,"open"))
		{
			led1 = 0;
			i = 0;
			memset(cmd,'\0',12);
		}
		if(strstr(cmd,"close"))
		{
			led1 = 1;
			i = 0;
			memset(cmd,'\0',12);
		}
		
	}
	if(TI)
	{
		
	}
}

相关推荐

  1. 串口通讯串行接口通讯

    2024-03-23 09:32:02       51 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-03-23 09:32:02       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-03-23 09:32:02       100 阅读
  3. 在Django里面运行非项目文件

    2024-03-23 09:32:02       82 阅读
  4. Python语言-面向对象

    2024-03-23 09:32:02       91 阅读

热门阅读

  1. 鸿蒙:PrefereneceUtil

    2024-03-23 09:32:02       47 阅读
  2. 数值代数中的灵敏度分析【条件数】

    2024-03-23 09:32:02       38 阅读
  3. 暴力快速入门强化学习

    2024-03-23 09:32:02       33 阅读
  4. Python Using cached demjson-2.2.4.tar.gz (131 kB)...报错

    2024-03-23 09:32:02       36 阅读
  5. Flask python 开发篇:蓝图的使用

    2024-03-23 09:32:02       44 阅读
  6. postgresql 备份还原多张表

    2024-03-23 09:32:02       42 阅读
  7. Redis连接:加速数据访问与保障安全传输的关键

    2024-03-23 09:32:02       40 阅读
  8. C#如何从上次窗体关闭的位置打开窗体

    2024-03-23 09:32:02       40 阅读