找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1355|回复: 10
收起左侧

单片机设置定时/计数器对串口通信有什么帮助吗

[复制链接]
ID:1028115 发表于 2022-7-6 10:06 | 显示全部楼层 |阅读模式
这是89c52的51单片机教程中演示串口的一个示例程序:
#include "reg52.h"
typedef unsigned int u16;//对系统默认数据类型进行重定义
typedef unsigned char u8;
void uart_init(u8 baud)
{
    TMOD|=0X20;     //设置计数器工作方式 2
    SCON=0X50;     //设置为工作方式 1
    PCON=0X80;     //波特率加倍
    TH1=baud;     //计数器初始值设置
    TL1=baud;
    ES=1; //打开接收中断     
    EA=1;     //打开总中断
    TR1=1;     //打开计数器
}


void main()
{
    uart_init(0XFA);//波特率为 9600
    while(1)
    {
    }
}
void uart() interrupt 4 //串口通信中断函数
{
    u8 rec_data;
    RI = 0;     //清除接收中断标志位
    rec_data=SBUF;     //存储接收到的数据
    SBUF=rec_data;     //将接收到的数据放入到发送寄存器
    while(!TI);     //等待发送数据完成
        TI=0;     //清除发送完成标志位
}                                            

这个程序可以实现将串口接收到的数据再发送回相连的电脑。
设置定时器对这样的串口通信有什么用吗,我感觉没有用啊。

还有为什么要波特率加倍,波特率一开始又是什么。。晕
真的很迷惑


回复

使用道具 举报

ID:1027834 发表于 2022-7-6 12:00 | 显示全部楼层
51单片机没有独立的波特率发生器,它需要借助定时器当作波特率发生器。如果你不设置定时器的话,串口这种异步通讯,没有波特率当作时钟,它怎么发送数据呢?又怎么接收到正确的数据呢?
至于波特率加倍……我一般不加倍……不加倍会好理解一些,就是你算出来的波特率。

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:1028115 发表于 2022-7-6 13:22 | 显示全部楼层
Materialism 发表于 2022-7-6 12:00
51单片机没有独立的波特率发生器,它需要借助定时器当作波特率发生器。如果你不设置定时器的话,串口这种异 ...

但是这个定时器的中断号是2,也没有用到中断2呀。这个定时器就感觉和串口通信没什么联系
回复

使用道具 举报

ID:161164 发表于 2022-7-6 13:30 | 显示全部楼层
同意沙发
补充一下自己的理解
波特率的详细原理可以去百度
以9600为例,单位是bps(Bit per Second)
就是一秒传输9600位元
1200字元
即每字元耗时0.833毫秒
发个"Hello World!"就耗时10毫秒了
以例程的阻塞式等待方式发送
这10毫秒什么都不能干!

从而得知波特率加倍就是加快传输速度
减短发送耗时
回复

使用道具 举报

ID:1028115 发表于 2022-7-6 13:49 | 显示全部楼层
Materialism 发表于 2022-7-6 12:00
51单片机没有独立的波特率发生器,它需要借助定时器当作波特率发生器。如果你不设置定时器的话,串口这种异 ...

就是说,为什么这个定时器的TL和TH都要设为0xfa(250)呢,别的值不行吗
回复

使用道具 举报

ID:213173 发表于 2022-7-6 14:51 | 显示全部楼层
此程序只是演示最基本的串口通讯的配置和使用,实际使用中往往传输的是按照通讯协议编制的数据串,可能是只发不收,也可能是只收不发,更可能是收/发不同内容的数据。至于为什么要设置定时器作波特率发生器楼上已经解释。对于晶振频率5.5296、11.0592、22.1184......MHz,波特率加倍与否无所谓,但对于使用6.0、12.0、24.0.....MHz晶振的单片机会因波特率误差较大而错码,选择波特率加倍设置可以降低波特率误差。
回复

使用道具 举报

ID:1038594 发表于 2022-7-6 16:40 | 显示全部楼层
串口要运行波特率是至关重要的,波特率规定了数据传输的速率,那么单片机靠什么产生标准的波特率呢,那么就需要单片机的定时器产生,所以串口离不开波特率,产生波特率的是定时器。
回复

使用道具 举报

ID:1028115 发表于 2022-7-7 14:00 | 显示全部楼层
谢谢各位回复。还有个问题就是,我查阅了那些文档,看了视频,我都没有找到51单片机的stc89c52这个型号的串口是和定时器1相关的。我看电路图也没看到他们有什么关系。你们都是怎么知道串口和哪个定时器相关的呢?
而且定时器的初值,高8位和低8位为什么都直接设置为0xfa呢。
回复

使用道具 举报

ID:883242 发表于 2022-7-7 15:31 | 显示全部楼层
wulin 发表于 2022-7-6 14:51
此程序只是演示最基本的串口通讯的配置和使用,实际使用中往往传输的是按照通讯协议编制的数据串,可能是只 ...

波特率加倍只能恶化误差,减半才是减少误差的方法。
回复

使用道具 举报

ID:213173 发表于 2022-7-7 16:32 | 显示全部楼层
Hephaestus 发表于 2022-7-7 15:31
波特率加倍只能恶化误差,减半才是减少误差的方法。

难道STC-ISP算错了???
无标题.jpg

无标题1.jpg

回复

使用道具 举报

ID:1027834 发表于 2022-8-19 18:20 | 显示全部楼层
kirei0715 发表于 2022-7-6 13:22
但是这个定时器的中断号是2,也没有用到中断2呀。这个定时器就感觉和串口通信没什么联系

在你贴出来的程序中,没有发现定时器中断号2,只有一个定时器工作模式2,模式2是8位自动重装模式。我查看89C52的DATASHEET,发现他只能用定时器1做波特率发生器,而且 TR1=1; 也确实是定时器1的开启语句。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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