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)		//[email protected]
{
	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)		//[email protected]
//{
//	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)		//[email protected]
{
  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)		//[email protected]
//{
//	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)		//[email protected]
{
  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);
}
相关推荐
#金毛3 小时前
四、STM32 HAL库API完全指南:从功能分类到实战示例
stm32·单片机·嵌入式硬件
百里东风4 小时前
STM32外设AD-定时器触发 + DMA读取模板
stm32·单片机·嵌入式硬件
Deacde_ZY5 小时前
【控制波形如何COPY并无痛使用】
单片机·嵌入式硬件
仰泳之鹅7 小时前
【51单片机中断】
单片机·嵌入式硬件·51单片机
happygrilclh7 小时前
STM32 定时器主从模式配置解析
stm32·单片机·嵌入式硬件
王光环9 小时前
STM32H743IIT6_ADC采集误差分析与ADC_DMA
stm32·单片机
芯眼9 小时前
STM32启动文件详解(重点)
java·开发语言·c++·stm32·单片机·mybatis
长流小哥10 小时前
STM32 ADC+DMA+TIM触发采样实战:避坑指南与源码解析
stm32·单片机·嵌入式硬件·keil5
道亦无名10 小时前
STM32控制电机
stm32·单片机·嵌入式硬件
一支闲人10 小时前
LED点阵屏模块
51单片机·入门教程·适用于新手小白