51单片机 串口

一、串口基本认知概念

串口是一种用于在计算机或其他设备之间进行数据传输的通信接口。串口传输是通过发送和接收数据位来进行的,通常是一个字节一个字节地传输。串口通常有多种参数设置,比如波特率、数据位、校验位和停止位等,这些参数需要在通信的双方设备之间进行匹配才能确保正常的数据传输。串口常用于连接计算机与外围设备(比如打印机、调制解调器、传感器等),或者在嵌入式系统中进行设备之间的通信。串口通常分为RS-232、RS-485、RS-422等不同的标准,每种标准有不同的应用场景和特点。

RS-232

也称标准串口,最常用的一种[串行通讯接口,比如我们的电脑主机的9针串口 ,最高速率为20kb/s

RS-232是为点对点(即只用一对收、发设备)通讯而设计的,其传送距离最大为约15米。所以RS-232适合本地设备之间的通信RS-422

由于接收器采用高输入阻抗和发送驱动器比RS232更强的驱动能力,故允许在相同传输线上连接多个接收节点,最多可接10个节点。即一个主设备(Master),其余为从设备(Slave),从设备之间不能通信,所以RS-422支持点对多的双向通信。

RS-422的最大传输距离为1219米,最大传输速率为10Mb/s。平衡双绞线的长度与传输速率成反比

RS-485

是从RS-422基础上发展而来的,无论四线还是二线连接方式总线上可多接到32个设备

二、

三、程序

3.1 发送数据

cpp 复制代码
#include "reg52.h"
#include "intrins.h"

sbit ledOne = P3^7;
sfr AUXR =0X8E;

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

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

void UartInit(void)		//9600bps@11.0592MHz
{
	PCON &= 0x7F;		//波特率不倍速
	SCON = 0x50;		//8位数据,可变波特率
	AUXR &= 0xBF;		//定时器1时钟为Fosc/12,即12T
	AUXR &= 0xFE;		//串口1选择定时器1为波特率发生器
	TMOD &= 0x0F;		//清除定时器1模式位
	TMOD |= 0x20;		//设定定时器1为8位自动重装方式
	TL1 = 0xFD;		//设定定时初值
	TH1 = 0xFD;		//设定定时器重装值
	ET1 = 0;		//禁止定时器1中断
	TR1 = 1;		//启动定时器1
}


void main()
{
  char buf_msg = 'U';
	ledOne = 0;
  UartInit();
  
  while(1) {
    Delay1000ms();
    SBUF = buf_msg;
  
  }
}

3.2 发送字符串

cpp 复制代码
#include "reg52.h"
#include "intrins.h"

sbit ledOne = P3^7;
sfr AUXR =0X8E;

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

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

//void UartInit(void)		//9600bps@11.0592MHz
//{
//	PCON &= 0x7F;		//波特率不倍速
//	SCON = 0x50;		//8位数据,可变波特率
//	AUXR &= 0xBF;		//定时器1时钟为Fosc/12,即12T
//	AUXR &= 0xFE;		//串口1选择定时器1为波特率发生器
//	TMOD &= 0x0F;		//清除定时器1模式位
//	TMOD |= 0x20;		//设定定时器1为8位自动重装方式
//	TL1 = 0xFD;		//设定定时初值
//	TH1 = 0xFD;		//设定定时器重装值
//	ET1 = 0;		//禁止定时器1中断
//	TR1 = 1;		//启动定时器1
//}

void UartInit(void)		//9600bps@11.0592MHz
{
  SCON =  0x40;
  TMOD &= 0XF0;
  TMOD |=0X20;
  TH1 = 0XFD;
  TL1 = 0XFD;
  TR1 = 1;
}

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

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


void main()
{
  char buf_msg = '8';
	ledOne = 0;
  UartInit();
  
  while(1) {
    Delay1000ms();
//    sendbuf(buf_msg);
    sendstr("shua\r\n");
  }
}

3.3 发送指令控制LED

cpp 复制代码
#include "reg52.h"
#include "intrins.h"

sbit ledOne = P3^7;
sfr AUXR =0X8E;
char cmd;

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

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

//void UartInit(void)		//9600bps@11.0592MHz
//{
//	PCON &= 0x7F;		//波特率不倍速
//	SCON = 0x50;		//8位数据,可变波特率
//	AUXR &= 0xBF;		//定时器1时钟为Fosc/12,即12T
//	AUXR &= 0xFE;		//串口1选择定时器1为波特率发生器
//	TMOD &= 0x0F;		//清除定时器1模式位
//	TMOD |= 0x20;		//设定定时器1为8位自动重装方式
//	TL1 = 0xFD;		//设定定时初值
//	TH1 = 0xFD;		//设定定时器重装值
//	ET1 = 0;		//禁止定时器1中断
//	TR1 = 1;		//启动定时器1
//}

void UartInit(void)		//9600bps@11.0592MHz
{
  AUXR = 0x01;
  SCON =  0x50;
  TMOD &= 0XF0;
  TMOD |=0X20;
  TH1 = 0XFD;
  TL1 = 0XFD;
  TR1 = 1;
  EA =1;
  ES =1;
}

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

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


void main()
{
  char buf_msg = '8';
	ledOne = 1;
  UartInit();
  
  while(1) {
    Delay1000ms();
//    sendbuf(buf_msg);
    sendstr("shua\r\n");
    

  }
}

void Uart_Handler()  interrupt 4
{
  if(RI)
  {
    RI = 0;
    cmd = SBUF;
    if(cmd == 'o') {
      ledOne= 0;
    }
   
     if(cmd == 'c') {
      ledOne= 1;
    }
  }
  
  if(TI);
}
相关推荐
Jumbuck_1026 分钟前
从零实现《三角洲行动》手游自动跑刀脚本:ADB 直控 + OpenCV 视觉识别 + 固定点位搜刮)三角洲自动跑刀教程
嵌入式硬件·yolo·目标检测·自动化·自动驾驶·三角洲·自动跑刀
txh050738 分钟前
从零开始学习FOC
单片机·嵌入式硬件·学习
2601_9611940242 分钟前
考研政治历年真题及解析pdf
stm32·单片机·嵌入式硬件·物联网·考研·pdf
今日待办1 小时前
STM32H747I-DISCO 开发指南【数字麦克风使用】
stm32·单片机·嵌入式硬件
世微 如初1 小时前
【方案】AP5127摩托车灯驱动设计:12-100V输入,2.5A恒流
单片机·嵌入式硬件
嵌入式ZYXC1 小时前
第7章:原理图设计与阅读——从“能看懂”到“会画”的关键一跃
stm32·单片机·嵌入式硬件·物联网
Topplyz1 小时前
保险丝选型
单片机·嵌入式硬件·pcb·电源·layout
破晓单片机1 小时前
007、STM32单片机分享:宠物喂食器系统
stm32·单片机·嵌入式硬件
JNX_SEMI1 小时前
OC5800N降压DC-DC转换器:宽压输入、内置100V MOS、输出可达2A以上
单片机·嵌入式硬件
嵌入式小站1 小时前
STM32 零基础可移植教程 16:ADC + DMA 连续采样,为什么不用 CPU 一直搬数据
stm32·单片机·嵌入式硬件