51单片机串口通讯详解

串口,作为单片机程序开发中最常用、最方便,也是应用最广泛的程序调试方法;无论是作为调试工具,打印出调试信息,还是对功能模块进行通信,串口是每个单片机开发人员最常用的单片机外设。
由于大部分51单片机不支持在线调试功能,所以串口作为一种有效的调试功能,所以在51单片机程序开发时,无法进行在线调试,不妨可以多采用串口来进行调试。
1.串口配置

51单片机配置除了需要配置2个8位寄存器SCON、PCON外,还要配置定时器1的控制寄存器TMOD,因为串口在进行收发需要使用定时器来采样。
(1)状态控制寄存器 SCON
SCON 是一个逐位定义的 8 位寄存器,用于控制串行通信的方式选择、接收和发送,指 示串口的状态,SCON 即可以字节寻址也可以位寻址,字节地址 98H,地址位为 98H~9FH。 它的各个位定义如下:
在这里插入图片描述
SM0 和 SM1 是串口的工作方式选择位,2 个选择位对应 4 种工作方式,如下表,其中 Fosc 是振荡器的频率。
51单片机串口通讯详解_第1张图片
(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 != '\0')
	{
		Send_Data(*c++);
	}	
}

void RSINTR() interrupt 4 using 2
{
	EA=0;
	if(TI==1) //发送中断	  
	{
		TI=0;
	}

	if(RI==1)	 //接收中断		  
	{	

		RI=0;								 

	}
	EA=1;
}

如需串口参考例程, 请关注公众号,首页回复“串口”获取资料
在这里插入图片描述

你可能感兴趣的:(单片机应用)