51单片机串口

2023-11-07

51单片机串口

1.串口通信

1.1串口接线方式

  • RXD:数据输入引脚,数据接受;STC89系列对应P3.0口,上官一号有单独引出

  • TXD:数据发送引脚,数据发送;STC89系列对应P3.1口,上官一号有单独引出

  • 接线方式

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FMY5yTZI-1690308835514)(C:\Users\xie19\Pictures\Camera Roll\屏幕截图 2023-07-25 185225.png)][外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xUfBzHGK-1690308835515)(C:\Users\xie19\Pictures\Camera Roll\屏幕截图 2023-07-25 185247.png)]

2.串口编程要素

  • 输入/输出数据缓冲器都叫做SBUF, 都用99H地址码,但是是两个独立的8位寄存器

  • 代码体现为: 想要接收数据 char data = SBUF 想要发送数据 SBUF = data

  • 回忆UART是异步串行接口,通信双方使用时钟不同,因为双方硬件配置不同,但是需要约定通信速度,叫做波特率

对于电脑来说,别人做好了软件,鼠标点点点就能配置好,而苦逼单片机的波特率配置需要我们写代码点点点配置什么,我们代码也要配置对应参数

3.发送一个字符给PC

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

sfr AUXR=0x8e;	

/*
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)
{
     AUXR=0x01;
     SCON=0x40; //配置串口工作方式1,REN使能不接收
     TMOD&=0x0F; //配置定时器工作模式
     TMOD|=0x20;
     TL1=0xFD; //配置定时器初值
     TH1=0xFD;
     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 main()
{
	char data_msg='a';
    UartInit();//C51串口通信初始化	
    //每隔1s发送一次
	while(1)
    {
        Delay1000ms();
        SBUF=data_msg;
        //发送数据往寄存器SBUF写数据就ok        
    }    
}

4.发送一个字符串给PC

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

sfr AUXR=0x8e;	

/*
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)
{
     AUXR=0x01;
     SCON=0x40; //配置串口工作方式1,REN使能不接收
     TMOD&=0x0F; //配置定时器工作模式
     TMOD|=0x20;
     TL1=0xFD; //配置定时器初值
     TH1=0xFD;
     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)
   {
        sendByte(*str);
        str++;
   }       
}

void main()
{
	
    UartInit();//C51串口通信初始化	
    //每隔1s发送一次
	while(1)
    {
        Delay1000ms();
        sendString("nihao pc\r\n");       
    }    
}

5.PC通过串口点亮LED

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

sbit D5=P3^7;
sfr AUXR=0x8e;	

/*
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)
{
     AUXR =0x01;
     SCON =0x50; //配置串口工作方式1,REN使能不接收
     TMOD&=0x0F; //配置定时器工作模式
     TMOD|=0x20;
     TL1  =0xFD; //配置定时器初值
     TH1  =0xFD;
     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)
   {
        sendByte(*str);
        str++;
   }       
}

void main()
{  
    char cmd; 
    D5=1;//一上电让D5灭    
  	
    UartInit();//C51串口通信初始化	
    //每隔1s发送一次
	while(1)
    {
        Delay1000ms();
        sendString("nihao pc\r\n");  
        //怎么知道收到了数据,打开RI中断,有硬件置1(RI=1) 
        if(RI==1)
        {
           RI=0;
           cmd=SBUF;//从寄存器接收数据
           if(cmd=='o')
           {
              D5=0;
           }
           if(cmd=='c')
           {
              D5=1;
           }               
        }            
    }    
}

6.PC通过串口中断点亮LED

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

sbit D5=P3^7;
sfr AUXR=0x8e;	
char cmd;

/*
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)
{
     AUXR =0x01;
     SCON =0x50; //配置串口工作方式1,REN使能不接收
     TMOD&=0x0F; //配置定时器工作模式
     TMOD|=0x20;
     TL1  =0xFD; //配置定时器初值
     TH1  =0xFD;
     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)
   {
        sendByte(*str);
        str++;
   }       
}

void main()
{  
    D5=1;//一上电让D5灭    
  	
    UartInit();//C51串口通信初始化	
    //每隔1s发送一次
	while(1)
    {
        Delay1000ms();
        sendString("nihao pc\r\n");  //心跳包;作用:有数据,说明单片机正常
    }    
}

void uart_handler()  interrupt 4
{
   if(RI)
   {
       RI=0;
       cmd=SBUF;//从串口寄存器SBUF接收数据
       if(cmd=='o')
       {
          D5=0;
       }
       if(cmd=='c')
       {
          D5=1;
       }       
   }    
   
   if(TI);
}

7.串口发送字符串点亮LED

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

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

/*
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)
{
     AUXR =0x01;
     SCON =0x50; //配置串口工作方式1,REN使能不接收
     TMOD&=0x0F; //配置定时器工作模式
     TMOD|=0x20;
     TL1  =0xFD; //配置定时器初值
     TH1  =0xFD;
     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)
   {
        sendByte(*str);
        str++;
   }       
}

void main()
{  
    D5=1;//一上电让D5灭    
  	
    UartInit();//C51串口通信初始化	
    //每隔1s发送一次
	while(1)
    {
        Delay1000ms();
        sendString("nihao pc\r\n");  //心跳包;作用:有数据,说明单片机正常
    }    
}

void uart_handler()  interrupt 4
{
   static int i=0; 
   if(RI)
   {
       RI=0;
       cmd[i]=SBUF;//从串口寄存器SBUF接收数据
       i++;
       if(i==SIZE)
       {
          i=0;
       }           
       if(strstr(cmd,"op"))
       {
          D5=0;
          i=0;
          memset(cmd,0,SIZE);           
       }
       if(strstr(cmd,"cl"))
       {
          D5=1;
          i=0;
          memset(cmd,0,SIZE);           
       }       
   }    
   
   if(TI);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

51单片机串口 的相关文章

  • TLS/SSL协议

    1 TLS协议的工作原理 TSL设计目的 身份验证 保密性 完整性 Record记录协议 对称加密 Handshake握手协议 验证通讯双方的身份 交换加解密的安全套件 协商加密参数 2 对称加密的工作原理 1 XOR与填充 明文P和密钥K
  • 官网解读-fastcgi_param

    Syntax fastcgi param parameter value if not empty Default Context http server location Sets a parameter that should be p
  • iOS中的数据持久化方式

    iOS中的数据持久化方式 基本上有以下四种 属性列表 对象归档 SQLite3和Core Data 1 属性列表 涉及到的主要类 NSUserDefaults 一般 NSUserDefaults standardUserDefaults 就
  • 教程--从零开始使用BiSeNet(语义分割)网络训练自己的数据集

    引言 为了从图片分割出我们想要的特征 我们采用BiSeNet作为分割模型 并且在自己制作的数据集上进行训练测试 注 训练是在linux环境下的 Win下训练可能会有点问题 一 下载BiSeNet网络的安装包 1 下载地址 GitHub Co
  • matlab 非均匀体素下采样

    目录 一 非均匀下采样 二 代码实现 三 结果展示 1 原始点云 2 采样结果 四 参考链接 一 非均匀下采样 ptCloudOut pcdownsample ptCloudIn nonuniformGridSample maxNumPoi

随机推荐

  • java线程池(四):ForkJoinPool的使用及基本原理

    文章目录 1 ForkJoinPool是什么 1 1 分治法 1 2 工作窃取 work stealing 2 简单使用 2 1 不带返回值的计算 2 2 带返回值的计算 3 ForkJoin源码注释 3 1 类注释 3 2 关于原理的注释
  • 软件测试用例有五十个以上的,软件测试大牛都是这样写测试用例的,你get到了嘛?...

    1 用于语句覆盖的基路径法 基路径法保证设计出的测试用例 使程序的每一个可执行语句至少执行一次 即实现语句覆盖 基路径法是理论与应用脱节的典型 基本上没有应用价值 读者稍作了解即可 不必理解和掌握 基路径法步骤如下 1 画出程序的控制流图
  • C语言函数函数(斐波那契函数)

    作者 几冬雪来 时间 2023年2月2日 内容 C语言函数函数讲解之斐波那契函数篇 目录 前言 斐波那契函数 1 什么是斐波那契函数 2 斐波那契函数怎么实现 3 如何用C语言书写斐波那契函数 4 什么时候使用递归 什么时候使用非递归 结尾
  • uniapp开发微信小程序通过文件流下载文件

    uni downloadFile url xx 请求地址 header token token token 获取 success res gt if res statusCode 200 var filePath res tempFileP
  • 谈一下为什么程序员不要进外包吧

    从2016年毕业到现在入行也有4年多 待过几家公司 外包和非外包都待过 个人感觉 外包和非外包的区别在于后期维护和迭代升级这个阶段上 一般外包都是开发通过验收或者根本就没有通过验收当你把项目推动到某一个阶段之后你就要进入下一个项目组 这样让
  • 什么是编译?

    编译 compilation compile 1 利用编译程序从源语言编写的源程序产生目标程序的过程 2 用编译程序产生目标程序的动作 编译就是把高级语言变成计算机可以识别的2进制语言 计算机只认识1和0 编译程序把人们熟悉的语言换成2进制
  • lambda表达式java项目常用_LAMBDA表达式常用 (全)

    1 select语句 books Select p gt new p Title p UnitPrice p Author 需用匿名方式 2 where语句 books Where p gt p UnitPrice 100 p Title
  • 从七个方面,面试BAT大厂高级工程师,纯干货!

    转载注明 https blog csdn net WantFlyDaCheng article details 100078782 一 框架是重点 但别让人感觉你只会山寨别人的代码 二 别单纯看单机版的框架 适当了解些分布式 三 数据库方面
  • 安装 WebStorm 后的一些基本配置

    前言 在安装完 WebStorm 后我们需要配置一些东西来加快我们的开发效率 下面给大家列出一些基本的配置 1 设置 WebStorm 标签下的默认缩进 问题 在 WebStorm 的 html 文件中 默认在标签下的子标签是没有进行缩进处
  • 深入理解JVM(四)-执行引擎

    本文章是根据 深入理解Java虚拟机 一书 并参考网上其他文档进行的系统性的和简单容易理解的方式进行的整理 一 执行引擎 执行引擎是Java最核心的组成部分之一 具有执行代码的能力 如下图所示 1 运行时栈帧结构 栈帧是用于支持虚拟机进行方
  • mysql版本号怎么看_查看Mysql版本号的五种不同方法介绍

    查看mysql数据库版本 可以使用命令行模式进入mysql会看到最开始的提示符 也可以在命令行中使用status查看 又可以使用系统函数等 以下是查看mysql版本信息的详细介绍 1 使用命令行模式进入mysql会看到最开始的提示符 You
  • 巧妙利用kickstart实现自动化安装全get

    本文转载链接 https blog csdn net Nanjing bokebi article details 103035331 运用kickstart服务创建应答文件 实现自动化运维 运维自动化发展历程及技术应用 理解kicksta
  • 用Qt写一个简单的音乐播放器(二):增加界面(开始和暂停音乐)

    一 前言 在用Qt写一个简单的音乐播放器 一 使用QMediaPlayer播放音乐中 我们已经知道如何去使用QMediaPlayer播放音乐 但是一个对于一个音乐播放器来说 这是远远不够的 至少我们需要有一个简单的用户操作界面吧 让用户开业
  • 华为2019数字芯片岗笔试解析二(多选部分)

    首发来自微信公众号 数字芯片设计 1 异步设计的特点是 A 没有时钟skew问题 B 可移植性高 C 低电源消耗 D 设计可靠性高 解析 同步电路设计利用时钟脉冲使其子系统同步运作 而异步电路设计不使用时钟脉冲做同步 其子系统是使用特殊的
  • ucos2-cpu_c.c-位带操作

    在uC CPU ARM Cortex M3 cpu c c中有两个位带访问的函数 使用位带访问技术来对内存或外设地址addr中的第bit nbr位进行清零操作 void CPU BitBandClr CPU ADDR addr CPU IN
  • 【java】java ArrayList的深拷贝与浅拷贝

    一 前言 ArrayList是我们经常会用到的集合类 有时候我们为了要不改变原来的数据需要重新拷贝一个新的ArrayList 今天在使用ArrayList拷贝时遇到了一些问题 这里整理并记录一下 二 准备 首先 ArrayList的常见的拷
  • fflush(stdin)与fflush(stdout)

    参见原文 fflush stdin 与fflush stdout 码到城攻fflush stdin 与fflush stdout https www codecomeon com posts 92 1 fflush stdin 作用 清理标
  • 能挣钱的,开源 SpringBoot 商城系统,功能超全,超漂亮,真TMD香!

    往期热门文章 1 放弃 Notepad 事实证明 还有 5 款更牛逼 2 公司这套架构统一处理 try catch 这么香 求求你不要再满屏写了 再发现扣绩效 3 Spring 中经典的 9 种设计模式 收藏了4 高仿小米商城项目 爱了 5
  • 如何从shutterstock下载无水印图片

    shutterstock是一个高质量的创意图片素材库 但是下载的话需要付费 而且价格不菲 预览的话带水印 基本不能用 那还有没有办法优雅地薅帝国主义羊毛 答案肯定是有 而且很容易 首先找到你想要的图片链接 以 https www shutt
  • 51单片机串口

    51单片机串口 1 串口通信 1 1串口接线方式 RXD 数据输入引脚 数据接受 STC89系列对应P3 0口 上官一号有单独引出 TXD 数据发送引脚 数据发送 STC89系列对应P3 1口 上官一号有单独引出 接线方式 外链图片转存失败