找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

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

請(qǐng)師傅們看看郭天祥的這個(gè)串口程序有沒(méi)有問(wèn)題?

[復(fù)制鏈接]
ID:204280 發(fā)表于 2017-6-2 22:21 來(lái)自觸屏版 | 顯示全部樓層 |閱讀模式
發(fā)什么數(shù)字蜂鳴器都是以同樣的頻率響,問(wèn)題出在哪里?請(qǐng)高手指點(diǎn)
#include<reg52.h>
unsigned char flag,a,num,benum;
sbit beep=P2^3;
void main()
{

        TMOD=0x21;//設(shè)置定時(shí)器1為工作方式2
        TH1=0xfd;
        TL1=0xfd;
        TH0=(65536-50000)/255;
        TL0=(65536-50000)%255;
        TR1=1;
        ET0=1;
        SM0=0;
        SM1=1;
        REN=1;
        EA=1;
        ES=1;
        while(1)
        {
                if(flag==1)
                {
                        EA=0;
                        flag=0;
                        TR0=1;
                        if(a==1)
                                benum=4;
                        if(a==2)
                                benum=2;
                        if(a==3)
                                benum=1;
                        if(a==4)
                        {
                                TR0=0;
                                beep=1;       
                        }
                        EA=1;
                }
        }
}

void ser() interrupt 4
{
        RI=0;
        a=SBUF;
        flag=1;
}

void time0() interrupt 1
{
        TH0=(65536-50000)/255;
        TL0=(65536-50000)%255;
        num++;
        if(num>=benum)
        {
                num=0;
                beep=~beep;
        }       
}
回復(fù)

使用道具 舉報(bào)

ID:204280 發(fā)表于 2017-6-3 08:28 來(lái)自觸屏版 | 顯示全部樓層
高手幫忙啊
回復(fù)

使用道具 舉報(bào)

ID:164602 發(fā)表于 2017-6-3 10:28 | 顯示全部樓層

經(jīng)過(guò)仔細(xì)研究,程序是沒(méi)有問(wèn)題的。
但為什么不對(duì)?主要在串口出了問(wèn)題。
第一:我的板子晶振12M,串口通訊必須,就是必須,波特率小于等于4800,必須,就是必須加倍。這樣串口通訊誤差才小,不然,根本認(rèn)不到你輸入的數(shù)據(jù)。
第二:你的程序定時(shí)器值的計(jì)算,也有一點(diǎn)點(diǎn)問(wèn)題,我已經(jīng)改過(guò)來(lái)了,雖然在這個(gè)程序中不影響效果,換個(gè)地方就不行了。
第三:你的定時(shí)器定時(shí)太長(zhǎng)了,蜂鳴器根本就不是響,而是在“敲”
我修改的程序如下:
#include<reg52.h>
unsigned char flag,a,num,benum;
sbit beep=P1^5;//這是我的蜂鳴器口,你改回你的口
void main()
{

        TMOD=0x21;//設(shè)置定時(shí)器1為工作方式2
        PCON=0x80;//波特率加倍
                TH1=0xf3;//波特率4800
        TL1=0xf3;
        TH0=(65536-1000)/256;
        TL0=(65536-1000)%256;//紅色是我做的修改
        TR1=1;
        ET0=1;
        SM0=0;
        SM1=1;
        REN=1;
        EA=1;
        ES=1;
        while(1)
        {
                if(flag==1)
                {
                        EA=0;
                        flag=0;
                        TR0=1;
                        if(a==1)
                                benum=4;
                        if(a==2)
                                benum=2;
                        if(a==3)
                                benum=1;
                        if(a==4)
                        {
                                TR0=0;
                                beep=1;        
                        }
                        EA=1;
                }
        }
}

void ser() interrupt 4
{
        RI=0;
        a=SBUF;
        flag=1;
}

void time0() interrupt 1
{
        TH0=(65536-1000)/256;
        TL0=(65536-1000)%256;
        num++;
        if(num>=benum)
        {
                num=0;
                beep=~beep;
        }        
}


特別注意:你在試驗(yàn)時(shí),串口通訊的軟件要選擇好,我用的STC下載軟件的串口通訊功能頁(yè),發(fā)送HEX數(shù)據(jù)模式,4800波特率。就可以成功了
你說(shuō)的只有一種聲音,關(guān)鍵是串口根本沒(méi)有認(rèn)到你輸出的數(shù)據(jù),所以沒(méi)有反應(yīng)。
回復(fù)

使用道具 舉報(bào)

ID:164602 發(fā)表于 2017-6-3 11:09 | 顯示全部樓層
剛才重點(diǎn)想程序去了,沒(méi)有把波特率為什么那么設(shè)置說(shuō)清楚,補(bǔ)充一下。
在本站的下載的波特率計(jì)算器,計(jì)算就可以知道:
第一:對(duì)于51單片機(jī)的晶振為11.0592MHz時(shí),任何波特率都可以,誤差都為零。高波特率時(shí),加倍反而誤差大。
第二:對(duì)于晶振為12MHz的,波特率一大,誤差就很大,即,你發(fā)送的數(shù)據(jù),當(dāng)51單片機(jī)接收到時(shí),已經(jīng)變成另一個(gè)數(shù)據(jù)了,所以就不能完成相應(yīng)的控制。你原來(lái)的程序就是這樣(我猜,你的晶振也是12M的),而原來(lái)的波特率為9600,看看我截取的圖片,就可以知道誤差多大。所以,必須小于等于4800,這是我試驗(yàn)出來(lái)的最大波特率、且誤差最小。
第三:原程序?yàn)槭裁粗挥幸粋€(gè)聲音?就是因?yàn)榇谳斔偷臄?shù)據(jù),單片機(jī)接收到的是錯(cuò)的,所以只以初始化的數(shù)據(jù)在發(fā)聲音,我試驗(yàn)過(guò),輸送任何數(shù)據(jù)都是一個(gè)聲音,關(guān)不了(原程序輸送4是關(guān)聲音)。改為4800且加倍的波特率后,就好了。
可能當(dāng)時(shí)郭天祥老師在做這個(gè)例子時(shí),是講過(guò)這個(gè)內(nèi)容的,只不過(guò)我們沒(méi)有看到罷了。
1.jpg
2.jpg
3.jpg
4.jpg
5.jpg
6.jpg
回復(fù)

使用道具 舉報(bào)

ID:47286 發(fā)表于 2017-6-3 14:02 | 顯示全部樓層
HC6800-ES-V2.0 發(fā)表于 2017-6-3 11:09
剛才重點(diǎn)想程序去了,沒(méi)有把波特率為什么那么設(shè)置說(shuō)清楚,補(bǔ)充一下。
在本站的下載的波特率計(jì)算器,計(jì)算就 ...

前輩這活干的是真仔細(xì)啊
回復(fù)

使用道具 舉報(bào)

ID:47286 發(fā)表于 2017-6-3 14:04 | 顯示全部樓層
HC6800-ES-V2.0 發(fā)表于 2017-6-3 10:28
經(jīng)過(guò)仔細(xì)研究,程序是沒(méi)有問(wèn)題的。
但為什么不對(duì)?主要在串口出了問(wèn)題。
第一:我的板子晶振12M,串口 ...

我覺(jué)得他那程序沒(méi)問(wèn)題 255也好 256也好 對(duì)于這種程序只是誤差大小 聲音長(zhǎng)短總是會(huì)變 即便不準(zhǔn)也不會(huì)一樣 他都一個(gè)聲 應(yīng)該是串口通信波特率的問(wèn)題 單片機(jī)沒(méi)收到正確指令 沒(méi)執(zhí)行對(duì)應(yīng)的動(dòng)作
回復(fù)

使用道具 舉報(bào)

ID:207378 發(fā)表于 2017-6-3 14:22 | 顯示全部樓層
應(yīng)該沒(méi)有問(wèn)題呀
回復(fù)

使用道具 舉報(bào)

ID:204280 發(fā)表于 2017-6-3 16:05 來(lái)自觸屏版 | 顯示全部樓層
HC6800-ES-V2.0 發(fā)表于 2017-6-3 11:09
剛才重點(diǎn)想程序去了,沒(méi)有把波特率為什么那么設(shè)置說(shuō)清楚,補(bǔ)充一下。
在本站的下載的波特率計(jì)算器,計(jì)算就 ...

非常感謝您的指點(diǎn)!謝謝!
回復(fù)

使用道具 舉報(bào)

ID:143694 發(fā)表于 2017-10-26 23:21 來(lái)自觸屏版 | 顯示全部樓層
這么認(rèn)真的解答,頂起�。�!
回復(fù)

使用道具 舉報(bào)

ID:213173 發(fā)表于 2017-10-27 08:59 | 顯示全部樓層
樓主和樓上的壇友都有所誤讀此程序:
1.這個(gè)程序是針對(duì)天祥實(shí)驗(yàn)板寫(xiě)的,波特率9600,板上晶振11.0592MHz。
2..這個(gè)程序除了二樓指出的瑕疵外沒(méi)有其它毛病,原作者本意寫(xiě)的是50ms定時(shí)器, TH0=(65536-50000)/256;
TL0=(65536-50000)%256; 所以二樓把50000改成1000是不對(duì)的。對(duì)二樓鉆研精神表示贊賞。
3.天祥實(shí)驗(yàn)板上使用的是有源蜂鳴器,所以鳴響頻率是固定的,此程序只是演示通過(guò)串口控制蜂鳴器按不同節(jié)拍間歇鳴響和停止,不是要改變鳴響頻率。
4.此程序經(jīng)實(shí)測(cè)滿足設(shè)計(jì)意圖。
回復(fù)

使用道具 舉報(bào)

ID:1070602 發(fā)表于 2023-5-17 22:43 來(lái)自觸屏版 | 顯示全部樓層
如果單片機(jī)通過(guò)藍(lán)牙模塊傳輸數(shù)據(jù),數(shù)據(jù)大了30左右是哪里出問(wèn)題了
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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