搜索
bottom↓
回复: 7

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

[复制链接]

出0入0汤圆

发表于 2012-5-16 21:40:40 | 显示全部楼层 |阅读模式
#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;       
                                }
                        }
                       
        }

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

 楼主| 发表于 2012-5-16 21:52:38 | 显示全部楼层
t是ds18b20采集的一个温度值,单片机与上位机的通信;当发0x01时单片机发送温度值给上位机;另外一种情况则发过来的是单片机的警戒温度,单片机显示在数码管上,定时器0的作用是扫温度是否超过描警戒温度,问题出现在;当上位机把警戒温度发过来以后,用手握住ds18b20当温度超过时,蜂鸣器报警,可松手后,它一直再叫个不停,应该温度降低了就不会有声音了啦

出0入0汤圆

 楼主| 发表于 2012-5-16 21:53:08 | 显示全部楼层
大虾帮忙呀

出0入0汤圆

发表于 2012-5-17 00:28:20 | 显示全部楼层
  1. void zhongduan() interrupt 1
  2. {               
  3.      UINT16 a ;
  4.           TH0=65535-50000/256;
  5.         TL0=65535-50000%256;
复制代码
wow!
  1.           for(a=0;a<1000;a++)
复制代码
wow!!

出0入0汤圆

发表于 2012-5-17 00:38:10 | 显示全部楼层
1. 楼主代码中的定时器0初始化,如代码中的操作是没有问题的。
2. 同意4楼的第二个观点,楼主的中断服务程序里面处理时间,远远大于你的定时器了。导致又一次陷入你的蜂鸣器警示后,无法再次初始化定时器的计数。

出0入0汤圆

 楼主| 发表于 2012-5-17 18:49:17 | 显示全部楼层
对,我也发现了是这个问题...非常感谢

出0入0汤圆

 楼主| 发表于 2012-5-17 19:01:36 | 显示全部楼层
無智 发表于 2012-5-17 00:38
1. 楼主代码中的定时器0初始化,如代码中的操作是没有问题的。
2. 同意4楼的第二个观点,楼主的中断服务程 ...

确实是中断服务程序里面处理时间大于定时器了这个问题引起的,追问一句当它的中断函数执行时间是不是意味着他的初始化时间将失去意义,进入中断函数死循环,可是我在他后面加了一个return后它应该会跳出这个函数回到主函数中呀。从而蜂鸣器也因该停止鸣叫

出0入0汤圆

发表于 2012-5-17 21:27:30 | 显示全部楼层
309946641 发表于 2012-5-17 19:01
确实是中断服务程序里面处理时间大于定时器了这个问题引起的,追问一句当它的中断函数执行时间是不是意味 ...

你的硬件应该除了蜂鸣器在动作,其它的都不响应了吧?
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-24 02:24

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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