4. 串口通信

[[Pasted image 20250120124904.png]]
也就是通过USB等接口对单片机实现通信
简单双向串口通信有两根通信线(发送端TXD和接收端RXD)
电平标准不一致时,需要电平转换芯片
且TXD与RXD要交叉连接
![[Pasted image 20250120125636.png]]

电平标准

其实就是用不同的电压表示1与0
![[Pasted image 20250120125907.png]]

串口定义

![[Pasted image 20250120130510.png]]

  • DSR:用于数据流控制
    ![[Pasted image 20250120131309.png]]
    ![[Pasted image 20250120131705.png]]

波特率计算

1/计数器溢出值 / 16 = 波特率(MHz)
![[Pasted image 20250120150138.png]]

STC89C52RC串口通信

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

unsigned char byte;

/**
	发送数据
*/
void UartRoutine(void) interrupt 4
{
	P2 = ~SBUF;
	if(RI == 1)
	{
		UartSendByte(SBUF);
		RI = 0;
	}
}

void main()
{
	UartInit();
	byte = 0x51;
	while(1)
	{
		UartSendByte(byte);
		Delay(500);
	}
}
#include <REGX52.H>

void UartInit(void)		//4800bps@11.0592MHz
{
	PCON &= 0x7F;		//波特率不倍速
	SCON = 0x50;		//8位数据,可变波特率
	TMOD &= 0x0F;		//清除定时器1模式位
	TMOD |= 0x20;		//设定定时器1为8位自动重装方式
	TL1 = 0xFA;		//设定定时初值
	TH1 = 0xFA;		//设定定时器重装值
	ET1 = 0;		//禁止定时器1中断
	TR1 = 1;		//启动定时器1
	EA = 1;
	ES = 1;
}

void UartSendByte(unsigned char byte)
{
	SBUF = byte;
	while(TI == 0);		// 检测是否发送完成
	TI = 0;
}


在发送数据时调用中断,是为了防止发送的同时接收造成混乱

posted @ 2025-01-20 15:41  Lain_surime  阅读(50)  评论(0)    收藏  举报