ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

C51 串口

2021-07-27 20:03:05  阅读:228  来源: 互联网

标签:C51 UART void 串口 电平 单片机 寄存器


目录

串口的介绍

串口是一种十分广泛的通讯接口,串口成本低,容易使用,通信线路简单,可实现两个设备的互相通信。
单片机的串口可以使单片机与单片机,单片机与电脑,单片机与各式各样的模块相互通信,极大的扩展了单片机的应用范围,增强了单片机系统的硬件实力。
51单片机内部自带UART(),可实现单片机的串口通信。
在这里插入图片描述

串口硬件电路

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

串口电平标准

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

1.TTL电平:+5V 表示1,0V表示 0
2.RS232电平:-3 ~-15V表示1,+3 ~ +15V表示0
3.RS485电平:两线压差 +2 ~ +6V 表示1, -2 ~ -6V表示0(差分信号)

常用通信接口比较

在这里插入图片描述

全双工:通信双方可以在同一时刻互相传输数据
半双工:通信双方可以互相传输数据,但某一时刻,只能一个状态
单 :通信只能有一方发送到另一方,不能反向纯属
异步 :通信双方各自约定通信速率
同步 :通信双方靠一根时钟线来约定通信速率

总线 : 连接各个设备的数据传输线
(类似于一条阿鲁,把路边各住户连接起来,使住户可以相互交流)

51单片机的UART

STC89C52有一个UART
STC89C52的UART有四种工作模式:
模式0: 同步移位寄存器
模式1: 8位UART,波特率可变(常用)
模式2:9位UART,波特率固定
模式3:9位UART,波特率可变
在这里插入图片描述

UART参数及时序图

在这里插入图片描述
波特率 : 串口通信的速率(发送和接收各数据位的间隔时间)
校验位: 用于数据验证
停止位: 用于数据帧的间隔

奇校验:让1的个数为奇数,例如:0100 1001 这时候有三个1了,校验位就为0
偶校验:让1的个数为偶数,例如:0100 1001 这时候有三个1了,校验位就为1

UART模式图

在这里插入图片描述
SUBF: 串口数据缓存寄存器,物理上是两个独立的寄存器,但占用相同的地址。
写操作时,写入的是发送寄存器,读操作时,读出的是接收寄存器。

串口和中断

在这里插入图片描述

串行口相关寄存器

在这里插入图片描述
SUBF: 串口数据缓存寄存器,物理上是两个独立的寄存器,但占用相同的地址。
写操作时,写入的是发送寄存器,读操作时,读出的是接收寄存器。

这是C52的,C51只有一个中断优先级寄存器

串口发送数据

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

代码

usart.h

#ifndef _UART_H_
#define _UART_H_

void UART_Init(void);
void UART_SendByte(unsigned char Byte);

#endif

usart.c

#include <REGX52.h>
#include "uart.h"

/**
 *¹¦ÄÜ£º´®¿Ú³õʼ»¯
 *²ÎÊý£ºvoid
 *·µ»ØÖµ£ºvoid
 *²¨ÌØÂÊ£º4800£¬Ð£Ñéλ£ºÎÞ£¬Í£Ö¹Î»£º1
 */
void UART_Init(void)
{
	SCON = 0x40;  //0100 0000  ´®¿Ú¿ØÖƼĴæÆ÷
	PCON |= 0x80; //ÅäÖò¨ÌØÂʼӱ¶

	TMOD &= 0x0F; //µÍËÄλ²»±ä£¬¸ßËÄλÇåÁã
	TMOD |= 0x20; //ÅäÖö¨Ê±Æ÷ģʽ1£¬0010 0000 ,µÍËÄλ²»±ä£¬µÚÈýλΪ1
	
	TR1 = 1;      //¿ªÆô¶¨Ê±Æ÷1
	TL1 = 0xF4;
	TH1 = 0xF4;
	ET1 = 0;
}

/**
 *¹¦ÄÜ£º´®¿Ú·¢ËÍÊý¾Ý
 *²ÎÊý£ºByte ÐèÒª·¢Ë͵ÄÊý¾Ý
 *·µ»ØÖµ£ºvoid
 */
void UART_SendByte(unsigned char Byte)
{
    SBUF = Byte;
	while(TI == 0);//ÅжÏÊÇ·ñ·¢ËÍÍê³É
	TI = 0;//¸´Î»

}

main.c

#include <REGX52.h>
#include <INTRINS.H>
#include "Timer0.h"
#include "uart.h"

/**
 *¹¦ÄÜ£ºÑÓʱ500ms
 *²ÎÊý£ºvoid
 *·µ»ØÖµ£ºvoid
 */
void Delay500ms(void)		//@11.0592MHz
{
	unsigned char i, j, k;
	
	_nop_();
	_nop_();
	i = 22;
	j = 3;
	k = 227;
	do
	{
		do
		{
			while (--k);
		} while (--j);
	} while (--i);
}

int main()
{
	UART_Init();
	while(1)
	{
		UART_SendByte(0x66);
		Delay500ms();
	}
}

在这里插入图片描述

标签:C51,UART,void,串口,电平,单片机,寄存器
来源: https://blog.csdn.net/qq_44610809/article/details/119147912

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有