51单片机串口通信_电脑通过串口控制LED(附代码)

1.串口介绍

串口(是通讯接口)可以实现两个设备的互相通信,单片机与单片机,单片机与电脑,或与各式各样的模块进行通信,增强单片机系统的硬件实力。

STC89C52系列单片机的串行通信口,除用于数据通信外,还可方便地构成一个或多人并行I/O口,或作串一并转换,或用于扩展串行外设等。

STC89C52系列单片机的串行口设有两个控制寄存器: 串行控制寄存器SCON和波特率选择特殊功能寄存器PCON,单片机内部自带UART,可实现单片机的串口通信。

STC89c52设有2个互相独立的接收、发送缓冲器,可以同时发送和接收数据。两个缓冲器统称串行通信特殊功能寄存器SBUF。 

STC89C52有1个UART
STC89C52的UART有四种工作模式:
    模式0:同步移位寄存器
    模式1:8位UART,波特率可变(常用)
    模式2:9位UART,波特率固定
    模式3:9位UART,波特率可变

波特率:串口通信的速率(发送和接收各数据位的间隔时间) 


检验位:用于数据验证
停止位:用于数据帧间隔

 

2.源代码

main.c

#include <REGX52.H>
#include "Delay.h"
#include "UART.h"

unsigned char Sec;

void main()
{
	UART_Init();	//初始化调用函数
	while(1)
	{

	}
}

void UART_Routine() interrupt 4   //小尾巴interrupt跟谁后面谁就是中断函数
{
	if(RI==1)
	{
		P2=~SBUF;
		UART_SendByte(SBUF);
		RI=0;
	}
}

UART.c

#include <REGX52.H>

/**
  * @brief 串口初始化,//4800bps@11.0592MHz
  * @param 无
  * @retval 无
  */
void UART_Init()            //4800bps@11.0592MHz
{
	SCON=0x50;
	PCON |= 0x80;
	TMOD &= 0x0F;			//设置定时器模式
	TMOD |= 0x20;			//设置定时器模式
	TL1 = 0xF4;			//设置定时初始值
	TH1 = 0xF4;			//设置定时重载值
	ET1 = 0;			//禁止定时器中断
	TR1 = 1;			//定时器1开始计时
	EA=1;               //使能,中断
	ES=1;               //允许接收
}

/**
  * @brief 串口发送一个字节数据
  * @param Byte要发送的一个字节数据
  * @retval 无
  */
void UART_SendByte(unsigned char Byte)
{
	SBUF=Byte;
	while(TI==0);
	TI=0;
}

/*  串口中断函数模板  用的时候放主函数main里
void UART_Routine() interrupt 4   //小尾巴interrupt跟谁后面谁就是中断函数
{
	if(RI==1)
	{

		RI=0;
	}
}
*/

UART.h

#ifndef __UART_H__
#define __UART_H__

void UART_Init();            

void UART_SendByte(unsigned char Byte);

#endif

用上面三个模块就可以使用电脑向单片机发送指令来控制LED。

如果想让电脑以一定的频率接收到单片机发来的指令那么还需要Delay函数。

Delay.c

#include <REGX52.H>

void Delay(unsigned int xms)
{
	unsigned char i, j;
	while(xms--)
	{
		i = 2;
		j = 239;
		do
		{
			while (--j);
		} while (--i);
	}
}

Delay.h

#ifndef __DELAY_H__
#define __DELAY_H__

void Delay(unsigned int xms);

#endif

SBUF:串口数据缓存寄存器,物理上是两个独立的寄存器,但占用相同的地址。写操作时,写入的是发送寄存器,读操作时,读出的是接收寄存器  
STC89C52系列单片机的串行口缓冲寄存器(SBUF)的地址是99H,实际是2个缓冲器,写SBUF的操作完成待发送数据的加载,读SBUF的操作可获得已接收到的数据。两个操作分别对应两个不同的寄存器,1个是只写寄存器,1个是只读寄存器。 

TI:发送中断请求标志位。在方式0,当串行发送数据第8位结束时,由内部硬件自动置位,即TI=1,向主机请求中断,响应中断后必须用软件复位,即TI=0。在其他方式中,则在停止位开始发送时由内部硬件置位,必须用软件复位。

RI:接收中断请求标志位。在方式0,当串行接收到第8位结束时由内部硬件自动置位RI=1,向主机请求中断,响应中断后必须用软件复位,即RI=0。在其他方式中,串行接收到停止位的中间时刻由内部硬件置位,即RI=1(例情况见SM2说明),必须由软件复位,即RI=0。

【注】:串口通信初始化代码也可以从STC-ISP中获取:

 这里是基于晶振是11.0592MHz的单片机,像12MHz或其他频率的将系统频率进行更换即可。

最后在进行发送数据或接收数据时也需要注意STC-ISP是否调完好

这里的串口必须与扫描串口一致,波特率为4800。

HEX模式/十六进制模式/二进制模式:以原始数据的形式显示
文本模式/字符模式:以原始数据编码后的形式显示
使用文本模式输出的数据会发生相应变化,这里多食用HEX模式保证数据无误。

3.效果图

 此时在电脑上发送的数据是FF,对应单片机所有的LED显示亮起来

  • 9
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
很高兴为您解答关于51单片机串口通信的问题。下面是关于51单片机串口通信模板的详细介绍以及通信实例。 1. 51单片机串口通信模板 51单片机与外部设备进行串口通信,需要设置串口的一些参数,包括波特率、数据位、校验位和停止位等。以下是51单片机串口通信模板的代码: ```c #include <reg52.h> #include <stdio.h> #define FOSC 11059200L #define BAUD 9600 typedef unsigned char BYTE; typedef unsigned int WORD; sbit LED = P1^0; void UART_Init(); void SendData(BYTE dat); void SendString(char *s); void main() { UART_Init(); while(1) { LED = ~LED; SendString("Hello, world!\r\n"); delay(1000); } } void UART_Init() { TMOD &= 0x0F; TMOD |= 0x20; TH1 = TL1 = -(FOSC/12/32/BAUD); TR1 = 1; SCON = 0x50; ES = 1; EA = 1; } void SendData(BYTE dat) { SBUF = dat; while(TI == 0); TI = 0; } void SendString(char *s) { while(*s) { SendData(*s++); } } ``` 在上面的代码中,我们定义了一个LED灯,在主函数中通过串口发送“Hello, world!”字符串,并控制LED灯闪烁。在UART_Init()函数中,我们设置了串口的一些参数,包括波特率、数据位、校验位和停止位等。 2. 51单片机串口通信实例 以下是一个简单的51单片机串口通信实例,它通过串口接收PC机发送的数据,并将其原封不动地发送回去: ```c #include <reg52.h> #include <stdio.h> #define FOSC 11059200L #define BAUD 9600 typedef unsigned char BYTE; typedef unsigned int WORD; sbit LED = P1^0; void UART_Init(); void SendData(BYTE dat); void SendString(char *s); void main() { BYTE c; UART_Init(); while(1) { if(RI) { c = SBUF; RI = 0; SendData(c); LED = ~LED; } } } void UART_Init() { TMOD &= 0x0F; TMOD |= 0x20; TH1 = TL1 = -(FOSC/12/32/BAUD); TR1 = 1; SCON = 0x50; ES = 1; EA = 1; } void SendData(BYTE dat) { SBUF = dat; while(TI == 0); TI = 0; } void SendString(char *s) { while(*s) { SendData(*s++); } } ``` 在上面的代码中,我们定义了一个LED灯,在主函数中通过串口接收PC机发送的数据,并将其原封不动地发送回去。同时,每当接收到数据时,LED灯会闪烁一次。 以上就是关于51单片机串口通信模板和通信实例的介绍,希望能对您有所帮助。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值