找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2305|回復(fù): 10
收起左側(cè)

單片機設(shè)置定時/計數(shù)器對串口通信有什么幫助嗎

[復(fù)制鏈接]
ID:1028115 發(fā)表于 2022-7-6 10:06 | 顯示全部樓層 |閱讀模式
這是89c52的51單片機教程中演示串口的一個示例程序:
#include "reg52.h"
typedef unsigned int u16;//對系統(tǒng)默認(rèn)數(shù)據(jù)類型進行重定義
typedef unsigned char u8;
void uart_init(u8 baud)
{
    TMOD|=0X20;     //設(shè)置計數(shù)器工作方式 2
    SCON=0X50;     //設(shè)置為工作方式 1
    PCON=0X80;     //波特率加倍
    TH1=baud;     //計數(shù)器初始值設(shè)置
    TL1=baud;
    ES=1; //打開接收中斷     
    EA=1;     //打開總中斷
    TR1=1;     //打開計數(shù)器
}


void main()
{
    uart_init(0XFA);//波特率為 9600
    while(1)
    {
    }
}
void uart() interrupt 4 //串口通信中斷函數(shù)
{
    u8 rec_data;
    RI = 0;     //清除接收中斷標(biāo)志位
    rec_data=SBUF;     //存儲接收到的數(shù)據(jù)
    SBUF=rec_data;     //將接收到的數(shù)據(jù)放入到發(fā)送寄存器
    while(!TI);     //等待發(fā)送數(shù)據(jù)完成
        TI=0;     //清除發(fā)送完成標(biāo)志位
}                                            

這個程序可以實現(xiàn)將串口接收到的數(shù)據(jù)再發(fā)送回相連的電腦。
設(shè)置定時器對這樣的串口通信有什么用嗎,我感覺沒有用啊。

還有為什么要波特率加倍,波特率一開始又是什么。。暈
真的很迷惑


回復(fù)

使用道具 舉報

ID:1027834 發(fā)表于 2022-7-6 12:00 | 顯示全部樓層
51單片機沒有獨立的波特率發(fā)生器,它需要借助定時器當(dāng)作波特率發(fā)生器。如果你不設(shè)置定時器的話,串口這種異步通訊,沒有波特率當(dāng)作時鐘,它怎么發(fā)送數(shù)據(jù)呢?又怎么接收到正確的數(shù)據(jù)呢?
至于波特率加倍……我一般不加倍……不加倍會好理解一些,就是你算出來的波特率。

評分

參與人數(shù) 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎勵!

查看全部評分

回復(fù)

使用道具 舉報

ID:1028115 發(fā)表于 2022-7-6 13:22 | 顯示全部樓層
Materialism 發(fā)表于 2022-7-6 12:00
51單片機沒有獨立的波特率發(fā)生器,它需要借助定時器當(dāng)作波特率發(fā)生器。如果你不設(shè)置定時器的話,串口這種異 ...

但是這個定時器的中斷號是2,也沒有用到中斷2呀。這個定時器就感覺和串口通信沒什么聯(lián)系
回復(fù)

使用道具 舉報

ID:161164 發(fā)表于 2022-7-6 13:30 | 顯示全部樓層
同意沙發(fā)
補充一下自己的理解
波特率的詳細(xì)原理可以去百度
以9600為例,單位是bps(Bit per Second)
就是一秒傳輸9600位元
1200字元
即每字元耗時0.833毫秒
發(fā)個"Hello World!"就耗時10毫秒了
以例程的阻塞式等待方式發(fā)送
這10毫秒什么都不能干!

從而得知波特率加倍就是加快傳輸速度
減短發(fā)送耗時
回復(fù)

使用道具 舉報

ID:1028115 發(fā)表于 2022-7-6 13:49 | 顯示全部樓層
Materialism 發(fā)表于 2022-7-6 12:00
51單片機沒有獨立的波特率發(fā)生器,它需要借助定時器當(dāng)作波特率發(fā)生器。如果你不設(shè)置定時器的話,串口這種異 ...

就是說,為什么這個定時器的TL和TH都要設(shè)為0xfa(250)呢,別的值不行嗎
回復(fù)

使用道具 舉報

ID:213173 發(fā)表于 2022-7-6 14:51 | 顯示全部樓層
此程序只是演示最基本的串口通訊的配置和使用,實際使用中往往傳輸?shù)氖前凑胀ㄓ崊f(xié)議編制的數(shù)據(jù)串,可能是只發(fā)不收,也可能是只收不發(fā),更可能是收/發(fā)不同內(nèi)容的數(shù)據(jù)。至于為什么要設(shè)置定時器作波特率發(fā)生器樓上已經(jīng)解釋。對于晶振頻率5.5296、11.0592、22.1184......MHz,波特率加倍與否無所謂,但對于使用6.0、12.0、24.0.....MHz晶振的單片機會因波特率誤差較大而錯碼,選擇波特率加倍設(shè)置可以降低波特率誤差。
回復(fù)

使用道具 舉報

ID:1038594 發(fā)表于 2022-7-6 16:40 | 顯示全部樓層
串口要運行波特率是至關(guān)重要的,波特率規(guī)定了數(shù)據(jù)傳輸?shù)乃俾,那么單片機靠什么產(chǎn)生標(biāo)準(zhǔn)的波特率呢,那么就需要單片機的定時器產(chǎn)生,所以串口離不開波特率,產(chǎn)生波特率的是定時器。
回復(fù)

使用道具 舉報

ID:1028115 發(fā)表于 2022-7-7 14:00 | 顯示全部樓層
謝謝各位回復(fù)。還有個問題就是,我查閱了那些文檔,看了視頻,我都沒有找到51單片機的stc89c52這個型號的串口是和定時器1相關(guān)的。我看電路圖也沒看到他們有什么關(guān)系。你們都是怎么知道串口和哪個定時器相關(guān)的呢?
而且定時器的初值,高8位和低8位為什么都直接設(shè)置為0xfa呢。
回復(fù)

使用道具 舉報

ID:883242 發(fā)表于 2022-7-7 15:31 | 顯示全部樓層
wulin 發(fā)表于 2022-7-6 14:51
此程序只是演示最基本的串口通訊的配置和使用,實際使用中往往傳輸?shù)氖前凑胀ㄓ崊f(xié)議編制的數(shù)據(jù)串,可能是只 ...

波特率加倍只能惡化誤差,減半才是減少誤差的方法。
回復(fù)

使用道具 舉報

ID:213173 發(fā)表于 2022-7-7 16:32 | 顯示全部樓層
Hephaestus 發(fā)表于 2022-7-7 15:31
波特率加倍只能惡化誤差,減半才是減少誤差的方法。

難道STC-ISP算錯了???
無標(biāo)題.jpg

無標(biāo)題1.jpg

回復(fù)

使用道具 舉報

ID:1027834 發(fā)表于 2022-8-19 18:20 | 顯示全部樓層
kirei0715 發(fā)表于 2022-7-6 13:22
但是這個定時器的中斷號是2,也沒有用到中斷2呀。這個定時器就感覺和串口通信沒什么聯(lián)系

在你貼出來的程序中,沒有發(fā)現(xiàn)定時器中斷號2,只有一個定時器工作模式2,模式2是8位自動重裝模式。我查看89C52的DATASHEET,發(fā)現(xiàn)他只能用定時器1做波特率發(fā)生器,而且 TR1=1; 也確實是定時器1的開啟語句。
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表