找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 772|回复: 0
打印 上一主题 下一主题
收起左侧

HC6800-ES V2.0单片机串口通信原理与程序

[复制链接]
跳转到指定楼层
楼主
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的溢出率再运用之前的公式,就可以算出定时器 初值。

这里给出一个常用的表格:

  
波特率
  (bps)
  
晶振
  
(MHz)
初值
误差(%)
晶振
  
(MHz)
初值
误差(12MHz晶振)(%)
SMOD=0
SMOD=1
SMOD=0
SMOD=1
SMOD=0
SMOD=1
300
11.0592
0XA0
0X40
0
12
0X98
0X30
0.16
0.16
600
11.0592
0XD0
0XA0
0
12
0XCC
0X98
0.16
0.16
1200
11.0592
0XE8
0XD0
0
12
0XE6
0XCC
0.16
0.16
1800
11.0592
0XF0
0XE0
0
12
0XEF
0XDD
2.12
-0.79
2400
11.0592
0XF4
0XE8
0
12
0XF3
0XE6
0.16
0.16
3600
11.0592
0XF8,248
0XF0
0
12
0XF7
0XEF
-3.55
2.12
4800
11.0592
0XFA
0XF4
0
12
0XF9
0XF3
-6.99
0.16
7200
11.0592
0XFC
0XF8
0
12
0XFC
0XF7
8.51
-3.55
9600
11.0592
0XFD
0XFA
0
12
0XFD
0XF9
8.51
-6.99
14400
11.0592
0XFE
0XFC
0
12
0XFE
0XFC
8.51
8.51
19200
11.0592
-
0XFD
0
12


0XFD
-
8.51
28800
11.0592
0XFF
0XFE
0
12
0XFF
0XFE
8.51
8.51
需要注意的是,普中这块开发板用的晶振是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;        //软件清零,为下一次中断做准备
}
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表