找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2648|回復(fù): 6
打印 上一主題 下一主題
收起左側(cè)

51單片機(jī)串口的接收,每次都可以接收到,但反應(yīng)時(shí)間很長,有時(shí)要等10秒鐘,不知道原因

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:347721 發(fā)表于 2018-8-14 15:59 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
上位機(jī)發(fā)1給單片機(jī)時(shí),蜂鳴器以400ms頻率發(fā)聲,發(fā)2時(shí)以200ms頻率,發(fā)3時(shí)以100ms頻率,發(fā)4時(shí)關(guān)閉蜂鳴器#include<reg52.h>
#define uchar unsigned char
sbit beep=P1^5;
sbit led=P2^0;
uchar a;
uchar t;
uchar i,j;

void init()//初始化
{
        TMOD=0x21;
        SCON=0x50;
        TH1=0xf3;
        TL1=TH1;
        TH0=(65536-50000)/256;
        TL0=(65536-50000)%256;
        PCON=0x00;
        
        EA=1;
        ES=1;
        ET0=1;
        
        TR0=1;
        TR1=1;
        t=0;
}
void timer0() interrupt 1
{
        TH0=(65536-50000)/256;
        TL0=(65536-50000)%256;
        t++;
        if(t==2)
        {
                t=0;
                i++;//每100ms,i加1
                if(i==j)
                {
                        i=0;
                        beep=~beep;
                        led=~led;
                        
                }
        }
        
}
void uart() interrupt 4
{
        
        if(RI)
        {
                RI=0;
                a=SBUF;
        }
        else
                TI=0;
}

void main()
{
        init();
        while(1)
        {
                switch(a)
                {
                        case 0x01:j=4;break;
                        case 0x02:j=2;break;
                        case 0x03:j=1;break;
                        case 0x04:TR0=0;led=1;break;
                }
        }
}

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:221865 發(fā)表于 2018-8-14 19:57 | 只看該作者
會(huì)不會(huì)是在switch里跑飛了,加個(gè)default看看。建議一些變量定義后初始化。
回復(fù)

使用道具 舉報(bào)

板凳
ID:123289 發(fā)表于 2018-8-14 23:32 | 只看該作者
你思路不清,建議你畫個(gè)框圖看看。
回復(fù)

使用道具 舉報(bào)

地板
ID:123289 發(fā)表于 2018-8-14 23:36 | 只看該作者
例:當(dāng)前I=3,你收到了一個(gè)2,會(huì)如何呢?
回復(fù)

使用道具 舉報(bào)

5#
ID:347721 發(fā)表于 2018-8-15 06:45 | 只看該作者
yzwzfyz 發(fā)表于 2018-8-14 23:36
例:當(dāng)前I=3,你收到了一個(gè)2,會(huì)如何呢?

謝謝,你這樣一說我突然就明白了,就像你說的如果現(xiàn)在i=3,但收到信息后把j改成了2,那i 就肯定已經(jīng)大于j了,i=j的條件就不會(huì)滿足,我把i=j改為i>=j后再測試就沒有問題了
回復(fù)

使用道具 舉報(bào)

6#
ID:213173 發(fā)表于 2018-8-15 07:41 | 只看該作者
你試試
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit beep=P1^5;
sbit led=P2^0;
uchar i,a=0;
uint j;
void init()//初始化
{
        PCON=0x00;
        SCON=0x50;
        TMOD=0x21;
        TH1=0xf3;
        TL1=0xf3;
        TH0=0xff;
        TL0=0xff;
        EA=1;
        ES=1;
        ET0=1;       
        TR0=0;
        TR1=1;
}
void timer0() interrupt 1
{
        TH0=(65536-j)/256;
        TL0=(65536-j)%256;
        beep=~beep;
        i++;
        if(i>=250)
        {
                i=0;
                led=~led;
        }
}
void uart() interrupt 4
{        
        RI=0;
        a=SBUF;
        switch(a)
        {
                case 0x01: j=65036;TR0=1;break;
                case 0x02: j=64536;TR0=1;break;
                case 0x03: j=63536;TR0=1;break;
                case 0x04: j=0;TR0=0;led=1;beep=1;break;
                default: break;
        }
}

void main()
{
        init();
        while(1);
}
回復(fù)

使用道具 舉報(bào)

7#
ID:295874 發(fā)表于 2018-8-15 09:15 | 只看該作者
喬陸騰 發(fā)表于 2018-8-15 06:45
謝謝,你這樣一說我突然就明白了,就像你說的如果現(xiàn)在i=3,但收到信息后把j改成了2,那i 就肯定已經(jīng)大于j ...

改為i>=j雖然可以測試通過,但是不一定與你事先約定的時(shí)間對(duì)的上,建議還是使用i==j來進(jìn)行判定,只不過每次串口中斷收到一次控制數(shù)據(jù)j,均將時(shí)間計(jì)數(shù)器i與t執(zhí)行一次清零操作,使其時(shí)間基準(zhǔn)歸零一次,可以準(zhǔn)確做到你要求的400、200、100ms的要求。
回復(fù)

使用道具 舉報(bào)

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

本版積分規(guī)則

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

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

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