51单片机 串口通信

ε祈祈猫儿з 提交于 2020-02-15 11:13:54

说明

平台:windows 10教育版64位
开发工具:普中科技 HC6800-ES V2.0 、keil uVision2

原理

哔哩哔哩视频教程:串口通信原理
文档:普中科技51单片机教程

步骤

1、确定定时器T1的工作方式(TMOD)

这里我们用的是T1定时器的工作方式2,自动重装初值

2、计算T1的初值(TH1,TH2)

计算公式:
在这里插入图片描述
SMOD = 0波特率正常。SMOD = 1波特率增倍。T1溢出率就是T1定时器溢出一次的时间T的倒数,T1溢出率 = 1/T;
设X为初值,因为8位数据,所以,一次溢出时间 = 【256-X】*12/晶振频率,得出T1的溢出率再运用之前的公式,就可以算出定时器 初值。

这里给出一个常用的表格:
在这里插入图片描述
需要注意的是,普中这块开发板用的晶振是12Mhz的,所以选择值的时候要注意,另外因为用的是12Mhz的晶振,不是11.0592Mhz,计算出来的T1定时的初值将不是一个整数,这样进行通信时会产生累计误差。在实践过程中,笔者发现,在4800及以下波特率通信时,因为误差较小,所以产生的影响很小,在通信时没有发生过异常现象,但是高于4800时,则会产生明显误差,通信时传输的数据会严重失真,建议采用4800以下的波特率。

3、启动定时器T1

4、确定串行口工作方式(SCON)

之类可以有两种代码:
一是按位设置,而是整块设置,但其实本质都是按位设置。
第一种:
按位设置

	SM0 = 0;
	SM1 = 1;

第二种

	SCON = 0X50;

5、中断设置

这里我们用到的串口通信的中断,虽然我们用到了T1定时器,但其中断我们并不进行操作,所以我们不写T1定时器的中断服务程序,串口通信的中断号为4;

详细代码

#include<reg52.h>
#define uchar unsigned char

void init();

void main()
{
	init();
	while(1);
}

void init()
{
	TMOD = 0x20;	//定时器T1,工作方式2
//	SCON = 0X50;	//第二种设置方式
//	PCON = 0X80;	//波特率倍增
	TH1 = 0Xe6;		//初值,设置波特率为1200
	TL1 = 0Xe6;
	REN = 1;	//允许串口接收数据
	SM0 = 0;	//设置串口方式1
	SM1 = 1;
	TR1 = 1;
	EA = 1;	//打开总中断
	ES = 1;	//打开串口中断
}

void ser()interrupt 4
{	
	uchar mes;
	mes = SBUF;	//读取数据
	RI = 0;	//软件清零,为下一次中断做准备
	SBUF = mes;
	while(!TI);	//等待发送数据完毕
	TI = 0;	////软件清零,为下一次中断做准备
}
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!