说明
平台: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; ////软件清零,为下一次中断做准备
}
来源:CSDN
作者:沉默的前行者
链接:https://blog.csdn.net/weixin_44715117/article/details/104309513