UART–通用异步收发器
- 是一种通常用于单片机和电脑之间或者单片机之间的通信,一次只能发送一个二进制
- 波特率baud–一秒钟能发送多少位二进制
- 一个完整的串行数据帧 有10位 起始位数据位和停止位
USB转串口通信
- 通过CH340将usb转换成串口通信以及ttl/cmos和232之间的电平转换
- 串口调试助手 十六进制显示、十六进制发送、com口保持一致 波特率校验位停止位1
IO口模拟串口通信
#include <reg52.h>
sbit PIN_RXD = P3^0;
sbit PIN_TXD = P3^1;
bit RxdOrTxd = 0;
bit RxdEnd = 0;
bit TxdEnd = 0;
unsigned char RxdBuf = 0;
unsigned char TxdBuf = 0;
void ConfigUART(unsigned int baud);
void StartTXD(unsigned char dat);
void StartRXD();
void main()
{
EA = 1;
ConfigUART(9600);
while (1)
{
while (PIN_RXD);
StartRXD();
while (!RxdEnd);
StartTXD(RxdBuf+1);
while (!TxdEnd);
} }
void ConfigUART(unsigned int baud)
{
TMOD &= 0xF0;
TMOD |= 0x02;
TH0 = 256 - (11059200/12)/baud;
}
177
void StartRXD()
{
TL0 = 256 - ((256-TH0)>>1);
ET0 = 1;
TR0 = 1;
RxdEnd = 0;
RxdOrTxd = 0;
}
void StartTXD(unsigned char dat)
{
TxdBuf = dat;
TL0 = TH0;
ET0 = 1;
TR0 = 1;
PIN_TXD = 0;
TxdEnd = 0;
RxdOrTxd = 1;
}
void InterruptTimer0() interrupt 1
{
static unsigned char cnt = 0;
if (RxdOrTxd)
{
cnt++;
if (cnt <= 8)
{
PIN_TXD = TxdBuf & 0x01;
TxdBuf >>= 1;
}
else if (cnt == 9)
{
PIN_TXD = 1;
}
else
{
cnt = 0;
TR0 = 0;
TxdEnd = 1;
}
}
else
178
{
if (cnt == 0)
{
if (!PIN_RXD)
{
RxdBuf = 0;
cnt++;
}
else
{
TR0 = 0;
}
}
else if (cnt <= 8)
{
RxdBuf >>= 1;
if (PIN_RXD)
{
RxdBuf |= 0x80;
}
cnt++;
}
else
{
cnt = 0;
TR0 = 0;
if (PIN_RXD)
{
RxdEnd = 1;
}
}
}
}
- 此程序用IO口模拟串口通信,模拟发送数据以及通过起始位和停止位去判断是否已经开始工作,通过设置定时器中断来传输数据。主程序一开始接收数据时PIN_RXD是高电平当检测到起始位电平拉低,进入StartRXD启动接收数据函数打开定时器进入定时器中断,移位接收数据后将RxdEnd = 1此时接收数据完成关闭中断完成数据+1在打开定时器 设置为发送状态进入中断开始发送数据完成整个通信过程。
- 主要是理解整个串口通信先接收电脑发送的数据处理之后在通过单片机发送给电脑,中间主要是设置定时器的模式和初始值。通过该程序了解串口通信的过程
总结
- 掌握定时器的模式的作用,以及数据是如何通过位操作来传递数据
- 了解串口通信的定义和一些注意事项
- 学习单片机如何使用中断函数