欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

標題: 51單片機串口的接收,每次都可以接收到,但反應時間很長,有時要等10秒鐘,不知道原因 [打印本頁]

作者: 喬陸騰    時間: 2018-8-14 15:59
標題: 51單片機串口的接收,每次都可以接收到,但反應時間很長,有時要等10秒鐘,不知道原因
上位機發1給單片機時,蜂鳴器以400ms頻率發聲,發2時以200ms頻率,發3時以100ms頻率,發4時關閉蜂鳴器#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;
                }
        }
}


作者: 多德    時間: 2018-8-14 19:57
會不會是在switch里跑飛了,加個default看看。建議一些變量定義后初始化。
作者: yzwzfyz    時間: 2018-8-14 23:32
你思路不清,建議你畫個框圖看看。
作者: yzwzfyz    時間: 2018-8-14 23:36
例:當前I=3,你收到了一個2,會如何呢?
作者: 喬陸騰    時間: 2018-8-15 06:45
yzwzfyz 發表于 2018-8-14 23:36
例:當前I=3,你收到了一個2,會如何呢?

謝謝,你這樣一說我突然就明白了,就像你說的如果現在i=3,但收到信息后把j改成了2,那i 就肯定已經大于j了,i=j的條件就不會滿足,我把i=j改為i>=j后再測試就沒有問題了
作者: wulin    時間: 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);
}
作者: liyongan_1985    時間: 2018-8-15 09:15
喬陸騰 發表于 2018-8-15 06:45
謝謝,你這樣一說我突然就明白了,就像你說的如果現在i=3,但收到信息后把j改成了2,那i 就肯定已經大于j ...

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




歡迎光臨 (http://www.raoushi.com/bbs/) Powered by Discuz! X3.1