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串口通信

复制代码
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
#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); } }
复制代码
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
#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 @   Lain_surime  阅读(11)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
展开