51单片机串口

这篇具有很好参考价值的文章主要介绍了51单片机串口。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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是异步串行接口,通信双方使用时钟不同,因为双方硬件配置不同,但是需要约定通信速度,叫做波特率

对于电脑来说,别人做好了软件,鼠标点点点就能配置好,而苦逼单片机的波特率配置需要我们写代码点点点配置什么,我们代码也要配置对应参数文章来源地址https://www.toymoban.com/news/detail-608664.html

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);
}

到了这里,关于51单片机串口的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • STM32单片机(九)USART串口----第一节:USART串口协议

    STM32单片机(九)USART串口----第一节:USART串口协议

    ❤️ 专栏简介:本专栏记录了从零学习单片机的过程,其中包括51单片机和STM32单片机两部分;建议先学习51单片机,其是STM32等高级单片机的基础;这样再学习STM32时才能融会贯通。 ☀️ 专栏适用人群 :适用于想要从零基础开始学习入门单片机,且有一定C语言基础的的童鞋

    2024年02月16日
    浏览(67)
  • STM32毕设分享 - 基于单片机的智能鱼缸系统设计与实现 - 嵌入式 物联网 stm32 51单片机 智能鱼缸

    STM32毕设分享 - 基于单片机的智能鱼缸系统设计与实现 - 嵌入式 物联网 stm32 51单片机 智能鱼缸

    Hi,大家好,今天向大家介绍一个 单片机项目, 大家可用于 课程设计 或 毕业设计 基于单片机的智能鱼缸系统设计与实现 🔥 项目分享与指导: https://gitee.com/sinonfin/sharing 近年以来,随着我国综合实力飞速飙升,人们对物质和精神生活质量的要求也不断提升,各式各样的智能

    2024年04月11日
    浏览(11)
  • STM32单片机(九)USART串口----第三节:USART串口实战练习(串口发送)

    STM32单片机(九)USART串口----第三节:USART串口实战练习(串口发送)

    ❤️ 专栏简介:本专栏记录了从零学习单片机的过程,其中包括51单片机和STM32单片机两部分;建议先学习51单片机,其是STM32等高级单片机的基础;这样再学习STM32时才能融会贯通。 ☀️ 专栏适用人群 :适用于想要从零基础开始学习入门单片机,且有一定C语言基础的的童鞋

    2024年02月10日
    浏览(44)
  • STM32单片机(九)USART串口----第四节:USART串口实战练习(串口发送+接收)

    STM32单片机(九)USART串口----第四节:USART串口实战练习(串口发送+接收)

    ❤️ 专栏简介:本专栏记录了从零学习单片机的过程,其中包括51单片机和STM32单片机两部分;建议先学习51单片机,其是STM32等高级单片机的基础;这样再学习STM32时才能融会贯通。 ☀️ 专栏适用人群 :适用于想要从零基础开始学习入门单片机,且有一定C语言基础的的童鞋

    2024年02月10日
    浏览(37)
  • 【STM32】单片机模式配置&FlyMcu串口下载固件&STLINK Utility

    【STM32】单片机模式配置&FlyMcu串口下载固件&STLINK Utility

    目录 1 单片机模式配置 1.1 存储器映像 1.2 启动配置 1.3 启动模式选择 1.4 硬件展示 1.4.1 BOOT引脚配置: 1.4.2 USB转TTL 2 FlyMcu串口下载固件         2.1软件配置方式         2.2 选项字节 3 STLINK Utility 3.1 简介 3.2 下载程序流程 通过 设置选择管脚 ,对应到各种启动模式的不

    2024年01月20日
    浏览(43)
  • 基于51/STM32单片机的智能药盒 物联网定时吃药 药品分类

    基于51/STM32单片机的智能药盒 物联网定时吃药 药品分类

     功能介绍  以51/STM32单片机作为主控系统;   LCD1602液晶显示当前时间、温湿度、药品重量   3次吃药时间、药品类目和药品数量  HX711压力采集当前药品重量  红外感应当前药盒是否打开  DS1302时钟芯片显示当前年月日、时分秒、星期  DHT11采集当前环境温度和湿度       

    2024年02月19日
    浏览(8)
  • 【毕业设计】基于单片机的智能鱼缸系统设计与实现 - 嵌入式 物联网 stm32 51单片机 智能鱼缸

    【毕业设计】基于单片机的智能鱼缸系统设计与实现 - 嵌入式 物联网 stm32 51单片机 智能鱼缸

    Hi,大家好,今天向大家介绍一个 单片机项目, 大家可用于 课程设计 或 毕业设计 基于单片机的智能鱼缸系统设计与实现 🔥 项目分享与指导: https://gitee.com/sinonfin/sharing 近年以来,随着我国综合实力飞速飙升,人们对物质和精神生活质量的要求也不断提升,各式各样的智能

    2024年02月04日
    浏览(40)
  • 基于STM32单片机BOOTLOADER通过串口升级程序IAP——APP方案

    基于STM32单片机BOOTLOADER通过串口升级程序IAP——APP方案

                            此方法前提是你得有一个EEPROM         我用的单片机是STM32F103ZET6 , 此单片机FLASH容量为512KB; 在此单片机里面FLASH的起始地址是0X8000000,BOOT作为引导加载程序一般都是从这个地址开始,单片机一上点默认会从这个地址开始运行,所以将自己

    2024年02月04日
    浏览(37)
  • 使用DMA传输实现单片机高效串口转发——以STM32系列为例

    使用DMA传输实现单片机高效串口转发——以STM32系列为例

    Date Author Version Note 2023.08.06 Dog Tao V1.0 1. 完成了文档的撰写。 2023.08.23 Dog Tao V1.1 1. 增加了STM32F103-USART2的DMA传输配置示例。 2. 增加了STM32F103与F407单片机的DMA控制器介绍并更改了第一章节的结构。 应用场景 在许多现实应用场景中,例如工业自动化控制、嵌入式通信设备等领域,

    2024年02月14日
    浏览(41)
  • 【单片机】51单片机串口的收发实验,串口程序

    【单片机】51单片机串口的收发实验,串口程序

    这段代码是使用C语言编写的用于8051单片机的串口通信程序。它实现了以下功能: 引入必要的头文件,包括reg52.h、intrins.h、string.h、stdio.h和stdlib.h。 定义了常量FSOC和BAUD,分别表示系统时钟频率和波特率。 定义了一个发送数据的函数send,该函数将数据发送到串口,等待数据

    2024年02月14日
    浏览(11)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包