STC51 配置串口1实现数据发送和接收

举报
DS小龙哥 发表于 2024/07/22 11:08:43 2024/07/22
【摘要】 随着物联网、智能家居、工业自动化等领域的快速发展,对单片机与外部设备之间的通信需求日益增加。STC90C51作为一种性能稳定、功能丰富的单片机,通过配置其串口1实现数据的发送和接收功能,可以满足这种需求。通过串口通信,STC90C51可以与上位机、其他单片机或外部设备建立稳定可靠的通信连接,实现数据的交换和共享。

一、前言

1.1 项目介绍

STC90C51是一款常用的8位单片机,以其强大的功能、易用的编程和稳定的性能在嵌入式系统设计中广泛应用。在许多应用中,单片机与外部设备或系统之间的通信是必不可少的,而串口通信作为一种常见的通信方式,具有传输距离远、抗干扰能力强、成本低廉等优点,因此被广泛应用于各种领域。

随着物联网、智能家居、工业自动化等领域的快速发展,对单片机与外部设备之间的通信需求日益增加。STC90C51作为一种性能稳定、功能丰富的单片机,通过配置其串口1实现数据的发送和接收功能,可以满足这种需求。通过串口通信,STC90C51可以与上位机、其他单片机或外部设备建立稳定可靠的通信连接,实现数据的交换和共享。

在实际应用中,串口通信具有广泛的应用场景。例如,在智能家居系统中,STC90C51可以通过串口接收来自传感器的数据,如温度、湿度、光照强度等,然后将这些数据发送给上位机进行处理和显示;同时,STC90C51也可以通过串口接收上位机发送的控制指令,实现对家居设备的远程控制。在工业自动化领域,STC90C51可以通过串口与其他单片机或PLC进行通信,实现数据的采集、传输和处理,从而实现对生产过程的监控和控制。

因此,本项目的开发通过配置STC90C51的串口1实现数据的发送和接收功能,为各种应用提供稳定可靠的通信解决方案。通过本项目的实施,可以进一步提高系统的通信效率和稳定性,推动相关领域的技术进步和应用发展。

image-20240612115412493

image-20240612115425251

1.2 串口协议介绍

串口协议是一种在计算机和其他数字设备之间传输数据的标准接口协议。其核心功能是作为显控设备与信号处理板之间、显控设备与其他设备、设备与设备之间的通信接口,实现了协议数据帧的通信传输。串口通信的特点在于其按位(bit)发送和接收字节的方式,尽管这种串行通信方式相较于并行通信可能显得较慢,但串口能够在同一时间使用一根线发送数据的同时用另一根线接收数据,从而实现了全双工的通信模式。

串口通信协议具体规定了数据包的内容,通常包含起始位、主体数据、校验位及停止位。起始位标记数据包的开始,通常为逻辑0的数据位;主体数据是传输的核心内容,长度可以根据需要设定为5、6、7或8位;校验位用于确保数据的完整性,常用的校验方法有奇校验(odd)、偶校验(even)、0校验(space)、1校验(mark)及无校验(noparity);停止位则用于表示单个包的结束,并给计算机提供校正时钟同步的机会,常见的停止位值为1、1.5和2位。

串口通信协议还包括了一系列重要的参数,如波特率、数据位、停止位和奇偶校验位。波特率决定了通信的速度,即每秒钟传送的bit的个数,常见的波特率有4800、9600、115200等。数据位则定义了通信中实际数据位的数量,通常为5、7或8位。

在串口通信中,常用的协议包括RS-232、RS-422和RS-485。这些协议在工业自动化、通信、电力、医疗等多个领域中发挥着重要的作用,例如在工业自动化领域中,PLC控制器、工业机器人、传感器等设备都可以通过串口通信实现数据的传输和控制。

串口协议是一种基于串行通信的数据传输规范,它通过规定数据包的内容和传输参数,实现了计算机与其他设备之间的稳定、可靠的数据通信。

二、代码实现

2.1 uart.c

#include "uart.h"
/*
串口初始化函数
单片机采用了12M的晶振
波特率配置为4800
*/
void UART_Init(void)
{
    PCON=0x80;    //波特率加倍
    SCON=0x50;    //配置串口工作在模式1(8位数据模式)
    EA=1;		  //打开总中断
    ES=1;	      //打开接收中断
    TMOD&=0x0F;   //清零T1的控制位
    TMOD|=0x20;   //配置T1为模式2 (8位自动重装载)
    //TL1=TH1=256-(12000000/12/32/4800); //计算 T1 重载值
    //TL1=TH1=256-(31250/4800);       31250/4800=6.510416666666667 约等于6.5 
    // 256-6.5=249.5
    // 0xF3=243
    //  
    TL1=TH1=0xF3;
    //TH1= TL1=256-(FOSC/12/32/BAUD);  //计算公式  FOSC表示晶振频率  BAUD表示波特率
    
    TR1=1;        //启动 T1
}

/*
串口接收中断
*/
void UART_IRQHandler(void) interrupt 4
{
	u8 Rx_Byte;
	if(RI)  //接收到字节
	{
        RI=0;//手动清零接收中断标志位
        Rx_Byte=SBUF;  //接收到的数据保存到变量中
        UART_SendOneByte(Rx_Byte); //再发回给电脑端
	}
}

/*
发送一个字符
*/
void UART_SendOneByte(u8 c)
{
    SBUF = c;
    while(TI==0){}
    TI = 0;
}
/*
发送字符串
*/
void UART_SendString(u8 *p)
{
    while(*p++!='\0')
    {
        UART_SendOneByte(*p);
    }
}

/*
重写putchar函数为了支持printf函数
*/
char putchar(char c)
{
	UART_SendOneByte(c);
	return c;
}



2.2 uart.h

#ifndef UART_H
#define UART_H
#include "type.h"
#include <stdio.h>
#include <reg51.h>
void UART_Init(void);
void UART_SendString(u8 *p);
void UART_SendOneByte(u8 c);
#endif

2.3 main.c

#include <reg51.h>
#include "delay.h"
#include "key.h"
#include "type.h"
#include "led.h"
#include "uart.h"
#include "timer.h"
#include "exti.h"
int main()
{
    u8 key;
    UART_Init();
    while(1)
    {
        key=Array_Scan();
        if(key)
        {
            UART_SendString("12345欢迎学习51单片机开发.\r\n");
        }
    }
}
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。