51单片机串口向电脑发送数据

声明:本人跟随b站江科大学习,我的所有文章仅记录我的学习总结,以防我以后忘了,有地方回忆,况且江科大的资料都是开源的。我也希望大家多多去看江科大的视频,讲的是真的好,我的文章仅限看过视频学习过的,过段时间有些地方不清楚又懒得再看视频,可以快速查看知识点的。

一、串口的介绍

        串口是一种应用十分广泛的通讯接口,串口成本低、容易使用、通信线路简单,可实现两个设备的互相通信。
       单片机的串口可以使单片机与单片机、单片机与电脑、单片机与各式各样的模块互相通信,极大的扩展了单片机的应用范围,增强了单片机系统的硬件实力。
       51单片机内部自带UART (Universal Asynchronous Receiver Transmitter,通用异步收发器),可实现 单片机的串口通信。

 二、硬件电路

  • 简单双向串口通信有两根通信线(发送端TXD和接收端RXD)
  • TXD与RXD要交叉连接
  • 当只需单向的数据传输时,可以直接一根通信线
  • 当电平标准不一致时,需要加电平转换芯片

 三、电平标准

电平标准是数据1和数据0的表达方式,是传输线缆中人为规定的电压与数据的对应关系,串口常用的电平标准有如下三种:

  • TTL电平: +5V表示1,0V表示0 
  • RS232电平: -3~-15V表示1, +3~+15V表示0
  • RS485电平:两线压差+2~+6V表示1, -2~-6V表示0 (差分信号)
  • 注意:TTL电平和RS232电平最多传输10米的距离,再远就会出错,而RS485电平最多可传输一千米的距离

四、常见的通信接口比较

 此外还有:CAN总线、USB等

  • 全双工:通信双方可以在同一时刻互相传输数据
  • 半双工:通信双方可以互相传输数据,但必须分时复用一根数据线
  • 单工:通信只能有一方发送到另一方,不能反向传输
  • 异步:通信双方各自约定通信速率
  • 同步:通信双方靠一根时钟线来约定通信速率
  • 总线:连接各个设备的数据传输线路(类似于一条马路,把路边各住户连接起来,使住户可以相互交流)

        同步的一般都带有时钟线SCL/SCLK,异步的一般不带有时钟线 ;异步的一般都是双方预定好通信速率,设备发送10和1100,不同的通信速率,可能会导致接收的数据错误。比如设备A一秒发送一个数据,设备B却0.5秒进行一次采样,就会出现数据传输错误。

五、51单片机的UART

  • STC89C52有1个UART
  • STC89C52的UART有四种工作模式:

                                                                模式0:同步移位寄存器
                                                                模式1: 8位UART,波特率可变(常用)
                                                                模式2: 9位UART,波特率固定
                                                                模式3: 9位UART,波特率可变

                                                             

六、串口参数及时序图

七、串口模式图

 中间T1定时器模式为8位自动重装载(自动重装载时间更精确),靠定时器约定通信速率即波特率,设置波特率时SMOD为1是加倍。

波特率计算:

删除AUXR,波特率倍速一定要用 

这里的F3十进制是243,算的是T1的溢出率,8位的计数器到256进行一次溢出,256-243=13,即

13us进行一次溢出,1/13us=0.07692MHz,0.07692MHz/16=0.00480769MHz=4807.69Hz,即波特率

 八、串口和中断系统

 当接收、发送完成产生中断进入中断系统

九、串口相关寄存器

 十、代码

UART.c

#include <REGX52.H>

/** 
  * @brief  串口初始化
  * @param  无
  * @retval 无
  */
void UART_Init()//UART串口用的T1定时器,模式是8位自动重装载,//4800bps@12.000MHz
{
			SCON=0x40;
			PCON|= 0x80;   //使能波特率倍速位SMOD
			TMOD &= 0x0F;		//清除定时器1模式位
			TMOD |= 0x20;		//设定定时器1为8位自动重装方式,当溢出时将TH1存放的值自动重装
                                //载入TL1
			TL1 = 0xF3;		//设定定时初值
			TH1 = 0xF3;		//设定定时器重装值
			ET1 = 0;		//禁止定时器1中断
			TR1 = 1;		//启动定时器1
}

/** 
  * @brief  串口发送一个字节数据
  * @param  Byte 要发送的一个字节数据
  * @retval   无
  */
void UART_SendByte(unsigned char Byte)
{
			SBUF=Byte;
			while(TI==0);//这里是在等数据发送完,当数据发送完TI由硬件置1就会跳出循环
			TI=0;        //此时再由软件置0
}

main.c

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

unsigned char Sec;

void main()
{
	UART_Init();
	while(1)
	{
			UART_SendByte(Sec);
			Sec++;
//			Delay(1);  //由于晶振的原因,波特率产生的误差,发的太快了就会出现错误,可以延时函数延时一下
		  Delay(1000);
	}
}

  • 16
    点赞
  • 111
    收藏
    觉得还不错? 一键收藏
  • 8
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值