为什么当进入定时器中断后,不能跳出来

2020-02-05 09:21发布

#include <reg51.h>
typedef unsigned char UINT8;
typedef unsigned int UINT16;
code UINT8 SEGMENT[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
code UINT8 SELECT[8]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};
sbit abi=P1^7 ;
sbit SPK=P1^0;
UINT8 i=0;
UINT16  t,Recbuf;

extern UINT16 read_temp(void);

void Delay(UINT16 b)
{
UINT8 d;
while(b--)for(d=0;d<120;d++);
}
void Display1(UINT16 temp,UINT16 shezhi)         
{
        static UINT8 num=0;
        P2=0xff;
        switch(num)
        {
                case 0:
                        P0=SEGMENT[temp/1000];
                        break;
                case 1:
                        P0=SEGMENT[temp%1000/100];
                        break;
                case 2:
                        P0=SEGMENT[temp%100/10]&0x7f;
                        break;
                case 3:
                        P0=SEGMENT[temp%10];
                        break;
                case 4:
                        P0=0XFF;
                        break;
                case 5:
                        P0=SEGMENT[shezhi%100/10];                                       
                        break;
                case 6:
                                           P0=SEGMENT[shezhi%10];
                        break;
                                    case 7:
                        P0=0xff;
                        break;                                  
        }
        P2=SELECT[num];
        num++;
        num%=8;
}

void Sernial_Init(void)
{
        TMOD=0x21;
        TH1=0xfd;
        TL1=0xfd;
        TR1=1;
        SCON=0x50;         //SM0 SM1 SM2 REN TB8 RB8 TI RI 方式1
        IE=0x92;         //EA X X ES ET1 EX1 ET0 EX0
        TR0=1;
        TH0=65535-50000/256;
        TL0=65535-50000%256;

}
void zhongduan() interrupt 1
{                
     UINT16 a ;
          TH0=65535-50000/256;
        TL0=65535-50000%256;
        if(t>=i*10&&i>=20)
          {
          for(a=0;a<1000;a++)
            {
                SPK=!SPK;
                Delay(1);             
                     }
                        SPK=0;
                        return ;
                }
}

void Send(UINT8 c)
{
        TI=0;
        TB8=0;
        SBUF=c;
        while(TI==0);
        TI=0;
}

void Rec(void) interrupt 4
{
        if(RI==0)
                return;
           RI=0;
           Recbuf=SBUF;
        }

void main()
{       
        UINT8 m,n;
        UINT16 x;
        Sernial_Init();
                        while(1)
                        {       
                           t=read_temp();
                           for(x=0;x<2200;x++)
                                   Display1(t,i);
                                if(Recbuf==0x01)       
                                {
                                 abi=1;       
                                m=t/256;
                                n=t%256;
                                Send(m);
                                Send(n);
                                }       
                                 else
                                {
                                abi=0;
                                i=Recbuf;       
                                }
                        }
                       
        }
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
8条回答
309946641
1楼-- · 2020-02-05 11:04
t是ds18b20采集的一个温度值,单片机与上位机的通信;当发0x01时单片机发送温度值给上位机;另外一种情况则发过来的是单片机的警戒温度,单片机显示在数码管上,定时器0的作用是扫温度是否超过描警戒温度,问题出现在;当上位机把警戒温度发过来以后,用手握住ds18b20当温度超过时,蜂鸣器报警,可松手后,它一直再叫个不停,应该温度降低了就不会有声音了啦
309946641
2楼-- · 2020-02-05 11:43
大虾帮忙呀
wctmdgcd
3楼-- · 2020-02-05 13:11
第一:          TH0=65535-50000/256;
                  TL0=65535-50000%256;
                   估计你在12M晶振之下,定时器0是想50ms中断一次的吧,那你上面赋初值应该是这样的:
                 TH0=(65535-50000)/256;
                  TL0=(65535-50000)%256;
第二:定时器0的中断服务函数不应该处理太多的事情,应该在中断服务函数打上一个标志位,然后在主程序里面响这个标志位来处理就行了
millwood0
4楼-- · 2020-02-05 17:04
 精彩回答 2  元偷偷看……
無智
5楼-- · 2020-02-05 18:07
1. 楼主代码中的定时器0初始化,如代码中的操作是没有问题的。
2. 同意4楼的第二个观点,楼主的中断服务程序里面处理时间,远远大于你的定时器了。导致又一次陷入你的蜂鸣器警示后,无法再次初始化定时器的计数。
309946641
6楼-- · 2020-02-05 18:45
对,我也发现了是这个问题...非常感谢

一周热门 更多>