1.串行口介绍
硬件电路
TXD:发送端 RXD:接收端
电平标准
常见通信接口
通信的基本概念
1)串行通信和并行通信
串行通信
并行通信
2)单工、半双工、全双工
3)异步和同步
总线
串口参数
串口内部结构
串口和中断
图中涉及的RI和TI,以及定时器的初值TH1和TL1会在接下里讲解
串行口相关寄存器(重要!!!)
(1)SCON
1)SM0/FE
2)SM1
3)SM2
暂时不用管,会在汇编语言中运用
4) REN
5)TB8
6)RB8
7)TI
8)RI
(2) PCON
1)SMOD
注意的是SMOD=0时,波特率不加倍 !!!
2) SMOD0
(3)SBUF
无需配置
(4)其他相关寄存器
波特率计算 (重要!特别是在MCS51单片机汇编语言的学习中)
STC89C52和MCS51单片机都使用相同的8051核心,都是基于8051架构的单片机
1)方式0
波特率固定,为fosc/12
2)方式2
SMOD=0,波特率=fosc/64
SMOD=1,波特率=fosc/32
3)方式1和方式3
TH1=256-((2^SMOD)/32)*(fosc/12)* (1/波特率)
SMOD=0/1
例如串口向电脑发送数据时,设置初值为FC,即244
244=256-2/32*11059200/12*(1/波特率)
解得波特率为4800b/s
2.串口向电脑发送数据
步骤
不使用串口中断时,定时器1的设置初值是用来实现定时发送数据的。通过定时器1的计数和溢出,可以控制每隔一定时间发送数据到串口,实现定时发送的功能。
(1)配置串口函数
运用STC进行波特率的计算
(2)发送子函数
(3)主函数
#include <REGX52.H>
#include "Delay.h"
unsigned char Sec;
void UartInit(void) //串口配置函数
{
PCON |= 0x80; //使能波特率倍速位SMOD
SCON = 0x50; //8位数据,可变波特率,0x50把REN置位,允许接收
//我们要配置定时器1,使其找工作在模式2,
//因为模式2是八位重装载,不需要再进行第二次赋初值,精度更高
TMOD &= 0x0F; //高位清零,低位不变
TMOD |= 0x20; //定时器1为8位自动重装方式,高位配置为0010,GATE C/T M1 M0
TL1 = 0xF4; //设定定时初值
TH1 = 0xF4; //设定定时器重装值
ET1 = 0; //禁止定时器1中断
TR1 = 1; //启动定时器1
}
void UART_SendByte(unsigned char Byte)//发送子函数
{
SBUF=Byte;
while(TI==0);//TI=0,表示没有发送完毕,等待发送完毕,即TI=1
TI=0;//发送结束,软件清零
}
void main()
{
UartInit();
while(1)
{
UART_SendByte(Sec);//全局变量,默认为0
Sec++;
Delay(1000);//延时,达到更好的显示
}
}
(4)STC配置
不用时,要先点击关闭串口,在断电
效果如下:
普中51单片机串口向电脑发送数据
3.模块化
(1)UART.c
(2)UART.h
4.电脑通过串口控制LED
步骤:
(1) UART.c
此时需要用到串口中断,即ES
(2)主函数
配置中断函数
#include <REGX52.H>
#include "Delay.h"
#include "UART.h"
void main()
{
UartInit();
while(1)
{
}
}
void UART_Routine() interrupt 4//串行口中断函数
{
if(RI==1)//判断是否接受完数据
{
P2=~SBUF;//读数据
UART_SendByte(SBUF);//接收我发送的数据
RI=0;//软件清零
}
}
效果如下:
电脑通过串口控制LED
5.HEX模式和文本模式的区别
在HEX模式下,发送的是0x30
在文本模式下,发送的是0
例如我想要个字母A