51单片机学习笔记———12.1UART串口通信
UART
一般用于板间通讯,即单片机和外围设备之间的通讯。
当单片机的电压与外设之间的电压不同时,需要一个中介芯片来转换:
常用的是CH340T
,原理图如下:
先发一位 0 表示起始位,然后发送 8 位数据位,数据位是先低后高的顺序,数据位发完后再发一位 1 表示停止位。这样本来要发送一个字节的 8 位数据,而实际上我们一共发送了 10 位,多出来的两其中一位起始位,一位停止位。
有关寄存器:
-
SCON
:串行口控制寄存器`SM0`,`SM1`:工作方式选择位(方式)`TI`:发送中断标志,发送一帧结束,`TI = 1`,必须软件清0`RI`:接受中断标志,接受一帧结束,`RI = 1`,必须软件清0
-
PCON
:波特率加倍寄存器`SMOD`:串行口波特率倍增位1:串行口波特率加倍0:不变,默认为0
-
IE
:中断允许寄存器 -
SBUF
:串行发送/接受数据缓冲器两个独立的物理单元,但有着相同的地址,可同时发送,接收数据
补充:
TMOD
—不可位寻址
方式2—八位自动重装模式
- 代码:非中断法串口通讯:(电脑发送数据给单片机)
-
.初始化串口:
-
1.
IE
:中断允许寄存器- `EA`总中断 - `ES`串口中断- `ET1`定时器1中断中断(可选择)
-
2.
SCON
:串行口控制寄存器`SCON` = 0x50(记住)
-
3.
TMOD-
–不可位寻址
-
-
#include<reg52.h>
void main()
{UART_init();//串口初始化while(1){while(!RI);//接收完成后自动变成1RI = 0;SBUF = SBUF;while(!TI);TI = 0; }
}
void UART_init()
{EA = 1;SCON = 0x05;//串行口控制寄存器TMOD &=0x0F;TMOD |=0x20;//配置TMOD,八位自动重载模式TH1 = 256-(11059200/12/32)/9600;TL1 = TH1;ET1 = 0;ES = 1;//串行口中断
}
但是main()
函数里面也不能一直处理通信,所以要用到串口中断.
串口中断有中断源,对应的中断号是4。
void interrupt1() interrupt 4
{if(RI){RI = 0;//接收完清0;SUBF = SUBF;//接收缓存区的内容发送到发送缓存区}if(TI){TI = 0;//接收完清0;}
}
于是main()
函数就能处理其它任务。
void main()
{UART_init();while(1){;//其它程序 }
}
具体操作:
发布评论