51单片机串口通信
一、串口通信介绍
随着单片机系统的广泛应用和计算机网络技术的普及,单片机与单片机或其他网络主机的通信愈来愈重要。在WIFI、蓝牙、GPS、GSM/GPRS等应用的控制都体现了串口通信的重要性。
通信的方式可以分为多种,按照数据传送方式可分为串行通信和并行通信。按照数据同步方式可分为同步通信和异步通信。按照数据的传输方向可分为单工、半双工、全双工通信。
串口通信(Serial Communication)是指外设和计算机间通过数据信号线、地线等按位进行传输数据的一种通信方式。串口是一种接口标准,规定了电气标准,例如:RS-232(RS-232的延伸)、RS-485等。
RS-232C是用正负电压来表示逻辑状态,与晶体管-晶体管逻辑集成电路(TTL)以高低电平表示逻辑状态的规定相反。而51单片机使用的就是TTL电平,所以要实现51单片机与计算机的串口通信,就需要进行TTL与RS-232C电平转换,通常使用MAX232芯片实现。
通信协议:通常遵循96-N-8-1
“96”表示通信波特率为9600;串口通信通常使用异步串口通信,所以必须保持两个设备的波特率一致。波特率常用值还有4800、115200
“N”表示无检验位,由于串口通信行相对更容易收到外部干扰导致传输数据出现偏差,在传输过程中使用校验位可以解决这个问题。
“8”表示数据位是8位。
“1”表示1位停止位。
二、串口相关的中断寄存器
2-1 串口控制寄存器SCON(可位寻址)
❤ SM0和SM1为工作方式选择位
❤ SM2:多机通信控制位,主要用于方式2和方式3.
❤ REN:允许串行接收位。有软件置REN=1,则启动串行口接收数据;REN=0,则禁止接收数据
❤ TB8:在方式2或方式3中,作为发送数据的第9位,也可以用软件规定其他作用
❤ RB8:在方式2或方式3中,作为接收数据的第9位
❤ TI:发送中断标志位。在方式0 时,当串行发送第8 位数据结束时,或在其它方式,串行发送开始时,由内部硬件使TI 置1,向CPU 发中断申请。在中断服务程序中,必须用软件将其清0,取消此中断申请。
❤ RI:接收中断标志位。在方式0 时,当串行接收第8 位数据结束时,或在其它方式,串行接收停止位的中间时,由内部硬件使RI 置1,向CPU 发中断申请。也必须在中断服务程序中,用软件将其清0,取消此中断申请。
2-2 电源控制寄存器PCON
SMOD:波特率倍增位。在串口方式1、方式2、方式3 时,波特率与SMOD 有关,当SMOD=1 时,波特率提高一倍。复位时,SMOD=0
三、串口使用方法
❤ 波特率的计算
方式0的波特率=fosc/12
方式2的波特率=[(2^SMOD)/32]*fosc
方式1的波特率=[(2^SMOD)/32]*(T1溢出率)
方式3的波特率=[(2^SMOD)/32]*(T1溢出率)
其中T1溢出率=fosc/{12*[256-(TH1)]},一般使用波特率工具计算波特率
❤ 串口初始化流程
1.确定T1的工作方式(TMOD寄存器)
2.确定串口的工作方式(SCON寄存器)
3.计算T1的初值(设定波特率),装在TH1、TL1
4.启动T1(TCON中的TR1)
5.如果使用中断,需要开启串口中断控制位(IE寄存器)
四、串口通信实验
4-1 通过单片机每隔一定的时间发送数据给电脑串口工具
❤ 实验目的:单片机每隔1s向电脑串口工具发送数据1,2,3,4...
代码部分:
#include <REG52.H>
unsigned char number;
//串口初始化函数
void uart_init(void)
{
PCON |= 0x80; //1000 0000 ,使能波特率倍速位:SMOD=1
SCON = 0x50; //0101 0000 ,10位异步收发器(8位数据),可变波特率
TMOD &= 0x0F; //清除定时器1模式位
TMOD |= 0x20; //0010 0000,方式2,设定定时器1为8位自动重装方式
TL1 = 0xFA; //设定定时初值
TH1 = 0xFA; //设定定时器重装值
ET1 = 0; //禁止定时器1中断
TR1 = 1; //启动定时器1
EA = 1; //开启中断总允许
ES = 1; //开启串口中断允许
}
//串口发送函数
void uart_send_byte(unsigned char byte)
{
SBUF = byte;
while (!TI); //等待TI标志位为0
TI = 0; //TI必须使用软件清零
}
// 延时单位:100ms
void Delay(unsigned char n) //@11.0592MHz
{
while (n--)
{
unsigned char i, j;
i = 180;
j = 73;
do
{
while (--j);
} while (--i);
}
}
void main()
{
uart_init ();
while (1)
{
uart_send_byte (number++);
Delay(10); //延时1s
}
}
keil 4编译后,将生成的.hex烧录到51单片机
❤ 实验结果
在电脑上打开串口工具软件(即上位机)