目录
1.串口介绍
2。STC-ISP串口功能介绍
3.接口及引脚定义
4.串口知识点
4.1 硬件电路
4.2 电平标准
4.3 相关术语
4.4 常见通信接口比较
4.5 51单片机的UART
4.6 串口参数及时序图
4.7 串口模式图
4.8 串口和中断系统
4.9 串口相关寄存器
5.串口向电脑发送信息代码
第一步:
第二步:
第三步:
第四步:
第五步:
第六步:
第七步:
最终代码:
代码模块:
UART.c
UART.h
main.c
6.电脑通过串口控制LED代码
第一步:
第二步:
第三步:
第四步:
第五步:
第六步:
最终代码:
代码模块:
UART.c
UART.h
main.c
补充:波特率计算
1.串口介绍
串口是一种应用十分广泛的通讯接口,串口成本低、容易使用、通信线路简单,可实现两个设备的互相通信。
单片机的串口可以使单片机与单片机、单片机与电脑、单片机与各式各样的模块互相通信,极大的扩展了单片机的应用范围,增强了单片机系统的硬件实力。
51单片机内部自带UART(Universal Asynchronous Receiver Transmitter,通用异步收发器),可实现单片机的串口通信。
2。STC-ISP串口功能介绍
向单片机发送数据(下面框),返回(上框)
3.接口及引脚定义
DB9串口传输数据(注意使用的电压是否一致)使用RS232或RS485电平
4.串口知识点
4.1 硬件电路
简单双向串口通信有两根通信线(发送端TXD和接收端RXD) TXD与RXD要交叉连接
当只需单向的数据传输时,可以直接一根通信线
当电平标准不一致时,需要加电平转换芯片
4.2 电平标准
电平标准是数据1和数据0的表达方式,是传输线缆中人为规定的电压与数据的对应关系,串口常用的电平标准有如下三种:
TTL电平:+5V表示1,0V表示0
RS232电平:-3~-15V表示1,+3~+15V表示0
RS485电平:两线压差+2~+6V表示1,-2~-6V表示0(差分信号)
4.3 相关术语
全双工:通信双方可以在同一时刻互相传输数据
半双工:通信双方可以互相传输数据,但必须分时复用一根数据线
单工:通信只能有一方发送到另一方,不能反向传输
异步:通信双方各自约定通信速率
同步:通信双方靠一根时钟线来约定通信速率
总线:连接各个设备的数据传输线路(类似于一条马路,把路边各住户连接起来,使住户可以相互交流)
4.4 常见通信接口比较
4.5 51单片机的UART
STC89C52有1个UART STC89C52的UART有四种工作模式:
模式0:同步移位寄存器
模式1:8位UART,波特率可变(常用)
模式2:9位UART,波特率固定
模式3:9位UART,波特率可变
4.6 串口参数及时序图
波特率:串口通信的速率(发送和接收各数据位的间隔时间)
检验位:用于数据验证
停止位:用于数据帧间隔
4.7 串口模式图
SBUF:串口数据缓存寄存器,物理上是两个独立的寄存器,但占用相同的地址。写操作时,写入的是发送寄存器,读操作时,读出的是接收寄存器
4.8 串口和中断系统
4.9 串口相关寄存器
5.串口向电脑发送信息代码
第一步:
将延迟函数复制过来并导入工程里面
第二步:
配置串口控制寄存器,配置模式1最常用,REN允许接收给1,不允许接收给0(也可以给1外面不给发就行)
第三步:
发送完置1(硬件只负责),但必须软件复位置0
第四步:
将寄存器配置:
SCON=0x40(串行寄存器配置上面图红色字体部分);PCON=0(波特率)
下图为定时器配置:
这里定时器1,没有定时器0,所有要把高位修改(不影响高低位配置用“”& |“”这两个方式)
第五步:
自动重装:
第六步:
STC-ISP的串口功能,数据调节到我们这款单片机的适应的数据
第七步:
生成代码复制过来修改一下配置
发送数据端
调用单项发送完成
模块化串口设置(完整代码)
串口初始化和单片机向电脑发送一个字节递增数据数据
调用
最终代码:
代码模块:
Delay.c和Delay.h可以在小编往期的博客里面找到
UART.c
#include <REGX52.H>/***@brief 串口初识化,4800bps@12.000MHz*@param 无*@retval 无*/
void UART_Init()
{SCON = 0x40;PCON |= 0x80; TMOD &= 0x0F; //设置定时器模式TMOD |= 0x20; //设置定时器模式TL1 = 0xF3; //设置定时初始值TH1 = 0xF3; //设置定时重载值ET1 = 0; //禁止定时器中断TR1 = 1; //定时器1开始计时
}/***@brief 串口发送一个字节数据*@param Byte 要发送的一个字节数据*@retval 无*/
void UART_SendByte(unsigned char Byte)
{SBUF = Byte;while(TI == 0);TI = 0;
}
UART.h
#ifndef __UART_H__
#define __UART_H__void UART_Init();
void UART_SendByte(unsigned char Byte);#endif
main.c
#include <REGX52.H>
#include "Delay.h"
#include "UART.h"unsigned char Sec;void main()
{UART_Init();while(1){UART_SendByte(Sec);Sec++;Delay(1000);}
}
6.电脑通过串口控制LED代码
第一步:
复制一份一修改(收:要中断系统,配置寄存器REN置1接收使能)
所有寄存器设置如下配置:
第二步:
配置中断
中断配置代码如下:
第三步:
中断寄存器修改后总如下,其他不用修改
第四步:
中断号4:
第五步:
中断验证:
接收中断标志RI
第六步:
函数不能在主函数又在中断函数里面,调用,向单片机发送数据代码:第二功能实现:
最终代码:
代码模块:
UART.c
#include <REGX52.H>/***@brief 串口初识化,4800bps@12.000MHz*@param 无*@retval 无*/
void UART_Init()
{SCON = 0x50;PCON |= 0x80; TMOD &= 0x0F; //设置定时器模式TMOD |= 0x20; //设置定时器模式TL1 = 0xF3; //设置定时初始值TH1 = 0xF3; //设置定时重载值ET1 = 0; //禁止定时器中断TR1 = 1; //定时器1开始计时EA = 1;ES = 1;
}/***@brief 串口发送一个字节数据*@param Byte 要发送的一个字节数据*@retval 无*/
void UART_SendByte(unsigned char Byte)
{SBUF = Byte;while(TI == 0);TI = 0;
}/*串口中断函数模板,要用的时候移到主函数里面
void UART_Routine() interrupt 4
{if(RI == 1){RI = 0;}
}
*/
UART.h
#ifndef __UART_H__
#define __UART_H__void UART_Init();
void UART_SendByte(unsigned char Byte);#endif
main.c
#include <REGX52.H>
#include "Delay.h"
#include "UART.h"void main()
{UART_Init();while(1){}
}void UART_Routine() interrupt 4 //中断子函数
{if(RI == 1){P2 = ~SBUF;UART_SendByte(SBUF);RI = 0;}
}
补充:波特率计算
我们串口初识化位0xF3(十六进制数字)=243(十进制数字),寄存器每个256会溢出一次,也就是每隔13us会溢出一次,寄存器的溢出率位1/13约等于0.07692MHZ。根据串口模式图计算 波特率:0.07692/16约等于0.00480769MHZ=4807.69HZ