HC6800-ESV2.0 串口通信 说明 平台: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) 之类可以有两种代码: 一是按位设置,而是整块设置,但其实本质都是按位设置。 第一种: 按位设置 1 SM0 = 0; 2 SM1 = 1; 第二种 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; //软件清零,为下一次中断做准备 } |