标题: 单片机设置定时/计数器对串口通信有什么帮助吗 [打印本页]

作者: kirei0715    时间: 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;     //清除发送完成标志位
}                                            

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

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



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

但是这个定时器的中断号是2,也没有用到中断2呀。这个定时器就感觉和串口通信没什么联系
作者: lkc8210    时间: 2022-7-6 13:30
同意沙发
补充一下自己的理解
波特率的详细原理可以去百度
以9600为例,单位是bps(Bit per Second)
就是一秒传输9600位元
1200字元
即每字元耗时0.833毫秒
发个"Hello World!"就耗时10毫秒了
以例程的阻塞式等待方式发送
这10毫秒什么都不能干!

从而得知波特率加倍就是加快传输速度
减短发送耗时
作者: kirei0715    时间: 2022-7-6 13:49
Materialism 发表于 2022-7-6 12:00
51单片机没有独立的波特率发生器,它需要借助定时器当作波特率发生器。如果你不设置定时器的话,串口这种异 ...

就是说,为什么这个定时器的TL和TH都要设为0xfa(250)呢,别的值不行吗
作者: wulin    时间: 2022-7-6 14:51
此程序只是演示最基本的串口通讯的配置和使用,实际使用中往往传输的是按照通讯协议编制的数据串,可能是只发不收,也可能是只收不发,更可能是收/发不同内容的数据。至于为什么要设置定时器作波特率发生器楼上已经解释。对于晶振频率5.5296、11.0592、22.1184......MHz,波特率加倍与否无所谓,但对于使用6.0、12.0、24.0.....MHz晶振的单片机会因波特率误差较大而错码,选择波特率加倍设置可以降低波特率误差。
作者: lijianwdb    时间: 2022-7-6 16:40
串口要运行波特率是至关重要的,波特率规定了数据传输的速率,那么单片机靠什么产生标准的波特率呢,那么就需要单片机的定时器产生,所以串口离不开波特率,产生波特率的是定时器。
作者: kirei0715    时间: 2022-7-7 14:00
谢谢各位回复。还有个问题就是,我查阅了那些文档,看了视频,我都没有找到51单片机的stc89c52这个型号的串口是和定时器1相关的。我看电路图也没看到他们有什么关系。你们都是怎么知道串口和哪个定时器相关的呢?
而且定时器的初值,高8位和低8位为什么都直接设置为0xfa呢。
作者: Hephaestus    时间: 2022-7-7 15:31
wulin 发表于 2022-7-6 14:51
此程序只是演示最基本的串口通讯的配置和使用,实际使用中往往传输的是按照通讯协议编制的数据串,可能是只 ...

波特率加倍只能恶化误差,减半才是减少误差的方法。
作者: wulin    时间: 2022-7-7 16:32
Hephaestus 发表于 2022-7-7 15:31
波特率加倍只能恶化误差,减半才是减少误差的方法。

难道STC-ISP算错了???





作者: Materialism    时间: 2022-8-19 18:20
kirei0715 发表于 2022-7-6 13:22
但是这个定时器的中断号是2,也没有用到中断2呀。这个定时器就感觉和串口通信没什么联系

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




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1