找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2444|回复: 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;
                }
        }
}

回复

使用道具 举报

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,会如何呢?
回复

使用道具 举报

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后再测试就没有问题了
回复

使用道具 举报

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);
}
回复

使用道具 举报

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 单片机教程网

快速回复 返回顶部 返回列表