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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2890|回復: 6
打印 上一主題 下一主題
收起左側

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

[復制鏈接]
跳轉到指定樓層
樓主
ID:347721 發表于 2018-8-14 15:59 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
上位機發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;
                }
        }
}

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

地板
ID:123289 發表于 2018-8-14 23:36 | 只看該作者
例:當前I=3,你收到了一個2,會如何呢?
回復

使用道具 舉報

5#
ID:347721 發表于 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后再測試就沒有問題了
回復

使用道具 舉報

6#
ID:213173 發表于 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);
}
回復

使用道具 舉報

7#
ID:295874 發表于 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的要求。
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表