89C52RC串口向电脑发数据(复习自用)

一、串口寄存器的配置

1.1现在先讲自己配置的方法,之后讲一下简便方法。

从数据手册中看相关的寄存器,然后根据数据手册配置。

1.2串行控制寄存器SCON和PCON

STC89C52系列单片机的串口设有两个控制寄存器:串行控制寄存器SCON和波特率选择特殊功能寄存器PCON。因为此时我们需要用到的工作方式是方式1也就是8位UART,波特率可变,所以把SM0和SM1配成01,SM2是多机通信控制位,在此时我们可以不用,REN是允许/禁止串行接受控制位,为1允许接收,为0禁止接收。在这里我们只用来发数据可以配0或者1都不影响。在这里不用停止位只有8位数据,所以TB8和RB8都不用,这里先不使用中断,只是单纯的传输数据所以中断位都不配置。

所以SCON是0101 0000,SCON=0x50.

接下来根据PCON电源控制寄存器配置,(这里对于波特率的计算比较麻烦,可以用软件配)

接下来几个寄存器都是中断的这里暂时不配置,因为这里只是简单的数据发送。

其实这时候串口的寄存器配置好了,但是用到串口时因为波特率的关系所以还需要配置下Timer1定时器,之前对于定时器的配置已经说明了,不同的是这里对于串口的波特率传输比较快,所以用双8位自动重装的模式,这样初始值就不用手动赋值。所以TMOD &=0x0F;TMOD |=0x20;然后设置初值,因为初值涉及到波特率的计算,所以之后讲,先讲软件配置的方法。

二、波特率软件生成

之前说此单片机的晶振是12Mhz,但是这次使用串口的时候发现,12Mhz在发送数据的时候会有误差,所以改成11.0592MHZ发现没问题,下面是用软件生成串口配置的格式。若是12MHZ的单片机需要勾上波特率倍数,这样可以减少误差。

虽然平时用软件比较方便,但是有时候还是得学会自己配置,可以帮助对电路原理图的理解。

三、发送数据

发送数据的话只需在SBUF寄存器中发出想给的数据就行了。例如:SBUF=0xFF;我这里是定义每一秒发送一个数据从0一直加加。

但是需要最好判断一下标志位TI这是发送中断标志位,当TI等于1时发送,但是得自己手动清0;

最后下载,打开串口助手。

void UART_SendByte(unsigned char Byte)
{
	SBUF=Byte;
	while(TI==0);
	TI=0;
}

 四、完整代码

头文件大家自己声明下,模块化编程之后方便使用。

4.1main.c

#include <REGX52.H>
#include "Delay.h"
#include "UART.h"
unsigned char Number;

void main()
{
	UART_Init();
	
	while(1)
	{
		UART_SendByte(Number);
		Number++;
		Delay1ms(1000);
	}
}

4.2UART.c

#include "UART.h"
#include <REGX52.H>
/**
  * @brief  串口初始化
  * @parm   
  * @retval  

  */
void UART_Init()//4800bps@12.000MHz
{
		//启动定时器1

	PCON &= 0x7F;		//波特率不倍速
	SCON = 0x50;		//8位数据,可变波特率
	TMOD &= 0x0F;		//清除定时器1模式位
	TMOD |= 0x20;		//设定定时器1为8位自动重装方式
	TL1 = 0xFA;		//设定定时初值
	TH1 = 0xFA;		//设定定时器重装值
	ET1 = 0;		//禁止定时器1中断
	TR1 = 1;		//启动定时器1
	
}
/**
  * @brief  串口发送一个字节数据
  * @parm   无
  * @retval  无

  */
void UART_SendByte(unsigned char Byte)
{
	SBUF=Byte;
	while(TI==0);
	TI=0;
}

 4.3Delay.c

void Delay1ms(int xms)		//@12.000MHz
{
	unsigned char i, j;

	while(xms--!=0)
	{
		i = 2;
		j = 199;
		do
		{
			while (--j);
		} while (--i);
	}
}

  • 16
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
如果您想在STC89C52RC单片机上使用串口接收数据,可以按照以下步骤进行操作: 1. 配置串口参数:波特率、数据位、停止位、校验位等。 2. 初始化串口模块,使其准备好接收数据。 3. 在主循环中,不断地检查串口是否接收到了数据。 4. 如果接收到数据,可以通过读取串口数据寄存器来获取数据。 5. 对接收到的数据进行处理,比如进行数据解析、存储等操作。 以下是一个简单的串口接收示例代码: ```c #include <reg52.h> #define FOSC 11059200L #define BAUD 9600 #define TIMER_1MS FOSC / 12 / 1000 typedef unsigned char u8; typedef unsigned int u16; u8 flag; void init_uart() { SCON = 0x50; // 设置串口工作方式 TMOD &= 0x0F; // 设置定时器1为模式0,16位计数器 TMOD |= 0x20; TH1 = TL1 = -(FOSC / 12 / 32 / BAUD); // 设置波特率 TR1 = 1; // 启动定时器1 ES = 1; // 开启串口中断 EA = 1; // 开启总中断 } void uart_isr() interrupt 4 { u8 receive_data; if (RI) { // 接收到数据 RI = 0; receive_data = SBUF; // 读取串口数据寄存器 // 对接收到的数据进行处理 flag = 1; // 标志位置1,表示接收到了数据 } } void main() { u8 data; init_uart(); while (1) { if (flag) { // 判断是否接收到了数据 flag = 0; // 对接收到的数据进行处理 } } } ``` 在这个示例代码中,我们通过串口中断来实现串口接收功能,并且使用一个标志位来标记是否接收到了数据。当接收到数据后,我们可以在主循环中对数据进行处理。当然,实际应用中需要根据具体的需求进行修改和完善。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值