串口,作为单片机程序开发中最常用、最方便,也是应用最广泛的程序调试方法;无论是作为调试工具,打印出调试信息,还是对功能模块进行通信,串口是每个单片机开发人员最常用的单片机外设。
由于大部分51单片机不支持在线调试功能,所以串口作为一种有效的调试功能,所以在51单片机程序开发时,无法进行在线调试,不妨可以多采用串口来进行调试。
1.串口配置
51单片机配置除了需要配置2个8位寄存器SCON、PCON外,还要配置定时器1的控制寄存器TMOD,因为串口在进行收发需要使用定时器来采样。
(1)状态控制寄存器 SCON
SCON 是一个逐位定义的 8 位寄存器,用于控制串行通信的方式选择、接收和发送,指 示串口的状态,SCON 即可以字节寻址也可以位寻址,字节地址 98H,地址位为 98H~9FH。 它的各个位定义如下:
SM0 和 SM1 是串口的工作方式选择位,2 个选择位对应 4 种工作方式,如下表,其中 Fosc 是振荡器的频率。
(2)电源与波特率控制寄存器
控制寄存器 PCON 也是一个逐位定义的 8 位寄存器,目前仅仅有几位有定义,如下所示:
仅最高位 SMOD 与串口的控制有关,其他位与掉电方式有关。PCON 的地址为 87H 只能按 字节寻址,SMOD 是串行通信波特率系数控制位,当串口工作在工作方式 1、2 时,若使用 T1 作为波特率发生器其 SMOD=1 则波特率加倍。
(3)定时器控制模式寄存器
TMOD是定时器、计数器模式控制寄存器,它是一个逐位定义的8为寄存器,但只能使用字节寻址
当串口工作在工作方式0和2是,波特率固定,方式0时fosc/12;方式2时fosc/32或fosc/64(根据SMOD判断)。当串口工作在方式1时,波特率=(2^SMOD/32)*(单片机时钟频率/(256-X)),X是初值;C/T#为定时器和计数器选择位,0为定时器,1为计数器 2.串口通用程序
为了有较好的通用性,将串口程序配置为一个H文件和C文件,往后只要开发51单片机程序,都可以将该两个文件复制在工程中直接使用,无须修改。
(1)uart.H
#ifndef _UART_H_ #define _UART_H_ #include "reg52.h" void UartInit(void); void Send_string(unsigned char *c); void Send_Data(unsigned char DAT); #endif
(2)uart.c
#include "uart.h" //串口初始化 void UartInit(void) { /*串口初始化 */ TMOD = 0x20; //定时器T1使用工作方式2 SCON = 0x50; //工作方式1,,允许接收 PCON = 0x10; TH1 = 253; // 设置初值,波特率9600bps TL1 = 253; TR1 = 1; // 开始计时 ES = 1; //打开接收中断 EA = 1; // 打开所以中断 TI = 0; RI = 0; } void Send_Data(unsigned char DAT) { ES = 0; TI=0; SBUF = DAT ; while(TI==0); TI=0; ES = 1; } void Send_string(unsigned char *c) { while(*c != '') { Send_Data(*c++); } } void RSINTR() interrupt 4 using 2 { EA=0; if(TI==1) //发送中断 { TI=0; } if(RI==1) //接收中断 { RI=0; } EA=1; }
如需串口参考例程, 请关注公众号,首页回复“
串口
”获取资料