大家好,相信大家已经学会了一些蓝桥杯常考的通讯协议,例如:IIC,SPI。今天我们就来看另外一个通信协议:单片机的串行通信。
虽然历年来蓝桥杯省赛没有考串行口通信,但是串行口作为单片机的一个基本外设是必须熟练掌握的,而且掌握了单片机的串行口的使用之后,尤其在输出外设不足的时候使用起来也是一个非常好的利器!因此串行口的使用必须掌握。
一般来对51单片机所说串行通信其实是UART,当然还有UASRT;它们之间的区别就是前者是异步通信,后者是同步的,所以后者会比前者的IO口多(同步时钟信号)。51单片机UART的IO口是TXD(P31)、RXD(P30),简单的来说连接方式是两个设备RXD连接TXD。关于51单片机的UART时序暂且不多讲,我们只谈使用,51单片机UART的使用还是比较简单的。在此之前我们先一起来看一看它的内部结构。
由图可以看出:虽然在编程的时候,SBUF只有一个,它既表示发送寄存器,又表示接收寄存器,具有同一个单元地址99H,但是在物理结构上,其实SBUF有两个;也就是说当CPU对SBUF读的时候(a=SBUF)数据来自接收缓冲器,而写的时候(SBUF=a)数据发送到发送缓冲器了。
一般使用的过程中通过对SCON和PCON的配置来使用串行口。而对中断运行寄存器IE的配置可以开启或者关闭串行中断。
波特率的计算:
在串行通信中,收发双方对发送或接收数据的速率要有约定。通过软件可对单片机串行口编程为四种工作方式,其中方式0和方式2的波特率是固定的,而方式1和方式3的波特率是可变的,由定时器T1的溢出率来决定。
方式0的波特率 = fosc/12
方式2的波特率 =(2SMOD/64)· fosc
方式1的波特率 =(2SMOD/32)·(T1溢出率)
方式3的波特率 =(2SMOD/32)·(T1溢出率)
串行口工作之前需对相关寄存器进行配置,设定其工作模式。具体配置步骤如下:
(1)设置T1的工作方式(TMOD寄存器);
(2)计算T1的初值,装载TH1、TL1;
(3)启动T1(TCON中的TR1位);
(4)确定串行口控制(编程SCON寄存器);
(5)如果要开启串口中断,则要对IE寄存器进行操作。
由于串行通信在平时使用的时候比较灵活,所以本次仅提供部分代码,具体程序如下。
一般初始化函数:
void uartInit() { TMOD = 0x20; //T1工作模式2 8位自动重装 TH1 = 0xfd; TL1 = 0xfd; //比特率9600 TR1 = 1; //启动T1定时器 SM0 = 0; SM1 = 1; //串口工作方式1 10位异步 REN = 1; //串口允许接收 EA = 1; //开总中断 ES = 1; //串口中断打开 } void UART() interrupt 4 { if(RI) //检测是否接收完成 { dat = SBUF; //num 取出接收缓存器的值 P1 = SBUF; //P1口读取串行口的数据 dat++; RI = 0; //接收中断标志位 必须用软件清0 SBUF = dat; //送出数据 while(!TI); //等待数据送完 TI = 0; } }
当然在实际使用过程中如果不接受数据,仅仅是单纯的发送数据的话,也可以不使用串口中断:
void uartInit() { TH1 = 0xFD; //波特率设为9600 TL1 = TH1; TMOD |= 0x20; //定时器1方式2 SCON = 0x50; //串口接收使能 相当于SM0 = 0;SM1 = 1; REN = 1 TR1 = 1; //定时器1使能 TI = 1; }
当然也可以#include <stdio.h>之后使用printf通过串口输出数据。
总之,串口在我们学习单片机的过程中,是个必不可少的工具,也能够辅助我们对代码进行跟踪和调试。而蓝桥杯历年省赛虽然没有考过,但是并不能代表它就不重要,希望大家能够会使用单片机的串行口。不仅仅是为了考试哦~!