51单片机串口通信--收发字符串

目录

前言:

1.硬件连接

2.代码编写

3.实验现象

4.代码测试

总结


前言:

单片机串口通信是单片机和计算机之间进行数据传输的一种常见方式。在实际应用中,我们通常会使用串口通信来完成一些实时数据采集、控制等功能。在串口通信中,收发字符串是一种常见的操作,本文将介绍如何用51单片机进行串口通信收发字符串。


1.硬件连接

串口数据收发线要交叉连接,计算机的 TXD 要对应单片机的 RXD,计算机的 RXD 要对应单片机的 TXD,并且共 GND,以确保信号传输的稳定性。

2.代码编写

接下来,需要编写代码来实现串口通信收发字符串的功能。代码的核心部分是通过串口发送和接收数据来实现的。具体实现步骤如下:

1.设置串口参数

在进行串口通信之前,需要设置串口的波特率、数据位、停止位等参数,以保证数据传输的正确性。

2.发送字符串

使用串口发送字符串的方式可以调用UART_SendString函数,该函数使用循环调用UART_SendByte函数来实现字符串发送。在调用该函数前,需要将要发送的字符串存储在一个字符数组中。

3.接收字符串

(1).使用串口接收字符串的方式可以编写串口接收中断函数,通过反复的触发中断条件,反复调用中断函数,实现单片机接收字符串。

(2).使用串口接收字符串的方式可以调用UART_ReceiveString函数,该函数使用循环调用UART_ReceiveByte函数来实现字符串接收。在调用该函数前,需要定义一个用于存储接收数据的字符数组。

UART_SendString函数

void UART_SendByte(unsigned char byte)   //串口发送单个字节函数
{
    SBUF = byte;
    while(!TI);     //等待发送完成
    TI = 0;         //清除发送完成标志位
}

void UART_SendString(unsigned char *str)  //串口发送字符串函数
{
    while(*str!='\0')     //判断字符串截止位则退出
	{
		UART_SendByte(*str);  
		str++;
	}
}

UART_ReceiveString函数

第一种:
void UART_Routine(void) interrupt 4   //串口接收中断函数
{
	if(RI==1)
	{
		RI=0;
        P2=SBUF;     //判断串口是否接收成功
		UART_SendByte(SBUF);
	}
}
第二种:
unsigned char UART_ReceiveByte()    //串口接收单个字节函数
{
    while(!RI);     //等待接收完成
    RI = 0;         //清除接收完成标志位
    return SBUF;    //返回单个字节
}

unsigned char UART_ReceiveString()    //串口接收字符串函数
{   unsigned char value[50]; 
    unsigned char i = 0;
    while((value[i]=UART_ReceiveByte;)!='\r') //接收到回车符则退出
    {  
        i++;
    }
    return value[50];  //返回字符串
}

下面是基于AT89C52的串口收发字符串示例代码:

#include <REGX52.H>
#include <intrins.H>

void UartInit(void)		//9600bps@11.0592MHz
{
	PCON &= 0x7F;		//波特率不倍速
	SCON = 0x50;		//8位数据,可变波特率
	TMOD &= 0x0F;		//设置定时器模式
	TMOD |= 0x20;		//设置定时器模式
	TL1 = 0xFD;			//设置定时初始值
	TH1 = 0xFD;			//设置定时重载值
	ET1 = 0;			//禁止定时器中断
	TR1 = 1;			//定时器1开始计时
	ES=1;
	EA=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 UART_SendByte(unsigned char byte)   //串口发送单个字节函数
{
    SBUF = byte;
    while(!TI);     //等待发送完成
    TI = 0;         //清除发送完成标志位
}

void UART_SendString(unsigned char *str)  //串口发送字符串函数
{
    while(*str!='\0')     //判断字符串截止位则退出
	{
		UART_SendByte(*str);  
		str++;
	}
}
void main()
{
    unsigned char array[20]={1,2,3,4,5,6};    //定义一个长度为20的字符数组

    UartInit();    //初始化串口

    while(1)
    {
        UART_ReceiveString(array);        //接收字符串
        Delay1000ms();     //延时1秒
    }
}
void UART_Routine(void) interrupt 4   //串口接收中断函数
{
	if(RI==1)
	{
		RI=0;
		P2=SBUF;  //判断串口是否接收成功
		UART_SendByte(SBUF);
	}
}

3.实验现象

4.代码测试

完成代码编写后,需要进行测试以确认串口通信收发字符串的正确性。

步骤如下:

1.编译下载程序。使用Keil等开发环境将代码编译生成hex文件,并将其下载到单片机中。

2.打开串口调试助手。使用串口调试助手等工具,设置好串口参数,并打开串口。

3.测试串口通信。在串口调试助手中输入要发送的字符串,并点击发送按钮。如果一切正常,则可以在接收框中看到回显的字符串。

总结

通过本文的介绍,我们了解了如何用51单片机实现串口通信收发字符串。串口通信是单片机应用中比较常见的一种通信方式,在实际应用中需要根据具体需求进行相应的设置和调试。

  • 21
    点赞
  • 100
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论
好的,下面是一个基于C51单片机串口收发数据并在数码管上显示的示例程序。假设你已经选择了一款使用串口通信的数码管模块,并将其连接到了单片机的IO口上,同时你也准备好了另一台设备作为数据的发送方。 ```c #include <REG52.H> sbit TXD = P3^1; // 串口发送引脚 sbit RXD = P3^0; // 串口接收引脚 sbit LED = P1^0; // 用于指示接收到数据的LED灯 sbit DIG1 = P2^0; // 数码管第一位 sbit DIG2 = P2^1; // 数码管第二位 sbit DIG3 = P2^2; // 数码管第三位 sbit DIG4 = P2^3; // 数码管第四位 unsigned char code SEG_TABLE[] = { // 数码管显示表 0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f }; void init_serial() { // 初始化串口 TMOD = 0x20; TH1 = 0xfd; TL1 = 0xfd; TR1 = 1; SCON = 0x50; ES = 1; EA = 1; } void send_byte(unsigned char ch) { // 发送一个字节 SBUF = ch; while (!TI); TI = 0; } void send_string(unsigned char *str) { // 发送一个字符串 while (*str) { send_byte(*str++); } } void display_number(unsigned int num) { // 在数码管上显示一个整数 unsigned char i, j, k; unsigned char buf[4]; // 数码管最多显示4位数 for (i = 0; i < 4; i++) { k = num % 10; buf[i] = k; num /= 10; } for (i = 0; i < 4; i++) { P0 = SEG_TABLE[buf[i]]; switch (i) { case 0: DIG1 = 0; break; case 1: DIG2 = 0; break; case 2: DIG3 = 0; break; case 3: DIG4 = 0; break; } for (j = 0; j < 10; j++) { // 延时一段时间,以便肉眼可见 } DIG1 = 1; DIG2 = 1; DIG3 = 1; DIG4 = 1; } } void main() { init_serial(); while (1) { // 在这里你可以编写其他的代码 } } void serial_isr() interrupt 4 { // 串口中断服务程序 unsigned char ch; if (RI) { RI = 0; ch = SBUF; LED = 1; // 接收到数据时点亮LED灯 display_number(ch); // 在数码管上显示接收到的数据 } } ``` 在代码中,我们首先定义了串口发送和接收的引脚,以及数码管显示的引脚。然后,我们定义了一个数码管显示表,用于将数字转换为数码管可以显示的格式。在主函数中,我们初始化了串口,并在一个无限循环中等待接收数据。当接收到数据时,我们点亮了一个LED灯以表示数据已经接收到,并将接收到的数据在数码管上进行显示。 当然,这只是一个简单的示例程序,你需要根据自己的具体情况进行修改和完善。例如,你可能需要增加错误处理机制、增加数据校验等等。希望这可以帮助你开始进行相关的开发工作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

回不去的bug

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值