1.串口基本认知
串行接口简称串口,也称串行通信接口或串行通讯接口(通常指COM接口),是采用串行通信方式的扩展接口。串行接口(Serial Interface)是指数据一位一位地顺序传送。其特点是通信线路简单,只要一对传输线就可以实现双向通信(全双工),可以直接利用电话线作为传输线,从而大大降低了成本,特别适用于远距离通信,但传送速度较慢.
2.异步串行是什么
异步串行是指UART(Universal Asynchronous Receiver/Transmitter),通用异步接收/发送,
UART包含TTL电平的串口和RS232电平的串口.
TTL
TTL是Transistor-Transistor Logic,即晶体管-晶体管逻辑的简称,它是计算机处理器控制的设备
内部各部分之间通信的标准技术。TTL电平信号应用广泛,是因为其数据表示采用二进制规定,
+5V等价于逻辑“1”,0V等价于逻辑“0”.
数字电路中,由TTL电子元器件组成电路的电平是个电压范围,规定:
输出高电平>=2.4V,输出低电平<=0.4V;
输入高电平>=2.0V,输入低电平<=0.8V;
RS232
RS232也称标准串口,最常用的一种[串行通讯接口,比如我们的电脑主机的9针串口 ,最高速率20kb/s
,RS-232是为点对点(即只用一对收、发设备)通讯而设计的,其传送距离最大为约15米。所以RS-232适合本地设备之间的通信.
3.串口通信
USB转TTL模块
该模块使用ch340通信
串口通信接线方式
串口通信中数据接收与发送过程
输入/输出数据缓冲器都叫做SBUF, 地址为99H,实际是两个独立的8位寄存器(缓冲器)
数据传输代码体现为:
想要接收数据: char data = SBUF
想要发送数据: SBUF = data
注意
UART是异步串行接口,通信双方使用的时钟不同,因为双方硬件配置不同,但是需要约定通信
速度,即使用配置统一波特率.
4.串口通信的简单应用
实现单片机向PC端发送一个字符串
当单片机发送字母l,点亮LED1,发送字母m关闭LED1.
示例代码如下
#include "reg52.h"
#include "intrins.h"
sfr AUXR = 0x8E; //定义SBUF缓存器地址
sbit LED1 = P3^7;
char cmd;
void UartInit(void) //9600bps@11.0592MHz
{
AUXR = 0x01;
SCON = 0x50; //配置串口工作方式1,REN使能接收
TMOD &= 0x0F;
TMOD |= 0x20;//定时器1工作方式位8位自动重装
TH1 = 0xFD;
TL1 = 0xFD;//9600波特率的初值
TR1 = 1;//启动定时器1
EA = 1;//开启总中断
ES = 1;//开启串口中断
}
void Delay1000ms() //@11.0592MHz
{
unsigned char i, j, k;
_nop_();
i = 8;
j = 1;
k = 243;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void sendByte(char data_msg)
{
SBUF = data_msg;
while(!TI);
TI = 0;
}
void sendString(char* str)
{
while( *str != '\0'){ //\0字符串结束标志
sendByte(*str);
str++; //指针
}
}
void main()
{
LED1 = 1;
//配置C51串口的通信方式
UartInit();
while(1){
Delay1000ms();
//往发送缓冲区写入数据,就完成数据的发送
sendString("hello world\r\n"); // \r\n换新行
}
}
void Uart_Handler() interrupt 4 //串口中断
{
if(RI)//中断处理函数中,对于接收中断的响应
{
RI = 0;//清除接收中断标志位
cmd = SBUF;
if(cmd == 'l'){
LED1 = 0;//点亮LED1
}
if(cmd == 'm'){
LED1 = 1;//熄灭LED1
}
}
if(TI);//中断处理函数中,对于发送中断的响应
}