搜索
bottom↓
回复: 11

请教:C语言中,中断执行后返回到什么地方?

[复制链接]

出0入0汤圆

发表于 2012-8-16 10:57:54 | 显示全部楼层 |阅读模式
void main(void)
{
   IO_init();
   int_init();   
   led=1;      
   delay(50);
   led=0;
   delay(50);
   led=1;
    EX1=1;   //外部中断1允许

   while(1){
   _nop_();      
     }
}
请教:用c语言写外部中断的程序,按上面的写法,应该是返回在while循环中吧?但是实际中间发现中断后都是又从main函数开始(为了观察用了发光管闪烁显示,看门狗没有用),又执行了一次初始化的工作,(而初始化的工作对一些口的操作和运行时是不同的),即我并不想再去操作发光管亮,只是希望在while循环中运行,应该怎么办呢?以前用汇编,没有这个问题,现在刚学c,概念还不清晰,恳请知道的朋友给予指教,谢谢先。(用的Keil3).

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

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

出0入0汤圆

发表于 2012-8-16 11:01:51 | 显示全部楼层
不可能吧,优化掉了?
while里加点延时语句试试,推荐lz用keil4,提升很大!
头像被屏蔽

出0入0汤圆

发表于 2012-8-16 11:06:10 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
头像被屏蔽

出0入0汤圆

发表于 2012-8-16 11:11:51 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽

出0入0汤圆

发表于 2012-8-16 13:00:52 | 显示全部楼层
楼主没写中断处理函数吧,没写的话,发生中断后,程序跳到向量处,却找不到跳转语句,不就相当于从开头执行了

出0入0汤圆

 楼主| 发表于 2012-8-16 17:59:45 | 显示全部楼层
本帖最后由 fxhfxh 于 2012-8-16 18:01 编辑

void ex1(void) interrupt 2         using 0        //外部中断1,
{
  uchar i,tl;//,th;
  uint l,m;     
   EX1=0;         //外部中断1禁止
  TR1=1;
  i=0;
//==========================================================================  
  while(i<24)
   {
    while(shou==0);    //
        //tl=TL1;
    //th=TH1;             
        l=TH1;
        tl=TL1;                  
        TH1=TL1=0;         //记录低电平长度并初始化高电平头     
        //l=th;
    l=((l<<8)+tl);                                                                            
        if(i==0){          //处理低电平              
            if(l>3000)     //if(l>2360)                           
                  {            //确认是引导头                   
               m=l/31;                                 
          }
          else         //不符合规则(出错)
          {           i=0;
          TR1=0;
  TH1=TL1=0;
                  break;
          }
         }
    else
          {
         if(((l>(m-(m/3)))&&(l<(m+(m/3))))||((l>((m*2)-(m/2)))&&(l<((m*3)+(m/3)))));
        else
                {
         i=0;
         TR1=0;
                 TH1=TL1=0;      
            break;
        }        
      }
/*=====================================================================*/
        while(shou==1);      //等待低电平到来     
        //th=TH1;                                                           
        //tl=TL1;        
    l=TH1;
        tl=TL1;
        TH1=TL1=0;         
    //l=th;           
    l=((l<<8)+tl);   
        //  if((l>460)&&(l<760))    //短为0  短610              
    if(((l>(m-(m/4)))&&(l<(m+(m/4)))))           

    {
           i++;
      ma1<<=1; //高低位相反问题
     }              
        //else if(((l>((m*3)-(m/2)))&&(l<((m*3)+(m/2)))))
   else if(((l>((m*2)-(m/2)))&&(l<((m*4)+(m/2)))))         //zy!!!
   //else if((l<((m*3)+(m/2))))         //zy!!!                                       
     {
       i++;
      ma1<<=1; //高低位相反问题
      ma1+=1;  //高低位相反问题
     }
    else        //不符合规则出错
     {
      i=0;
      TR1=0;
          TH1=TL1=0;         
          break;      
         }
/*====================================================*/   
    if(i==8)  jmz3=ma1;   //地址
    if(i==16) jmz2=ma1;   //地址
    if(i==24)             //
     {
          jmz1=ma1;       
        // zx_ykxh();                   //执行遥控信号         
          }
   }
      TR1=0;TH1=0;TL1=0; EX1=1;//
          
}
//=====================================================================================


这是中断程序。

出0入0汤圆

发表于 2012-8-16 19:00:43 | 显示全部楼层
中断这么复杂 没心情看,中断空下,看是否有问题

出0入0汤圆

发表于 2012-8-16 19:03:59 | 显示全部楼层
  1. oid ex1(void) interrupt 2         using 0        //外部中断1,
  2. ...
  3.    EX1=0;         //外部中断1禁止
  4. ...
  5.   while(i<24)
  6. ...
  7.     while(shou==0);    //
  8. ...
  9.         while(shou==1);      //等待低电平到来     
  10. ...
复制代码
with that kind of code, maybe you want to try a new career in janitorial services.

出0入0汤圆

发表于 2012-8-16 20:31:30 | 显示全部楼层
这么诡异?

出0入0汤圆

发表于 2012-8-16 20:35:59 | 显示全部楼层
中断做一大堆事, MAIN()确闲闲没事干 , 不诡异才奇怪!

出0入0汤圆

发表于 2012-8-16 20:49:18 | 显示全部楼层
同楼上,而且还有
                          while(shou==1);      //等待低电平到来     
这样的语句,最容易死循环了

出0入0汤圆

 楼主| 发表于 2012-8-18 14:33:27 | 显示全部楼层
感谢所有朋友的回复。问题已经解决。就像楼上几个朋友所说的开了中断,但没有相应的中断函数与之配套,程序将会复位从来。因为在初始化中还打开了定时器1中断,但在调试时将中断函数屏蔽了,导致程序出错。在此也提醒初学C语言编程的朋友,开了中断,一要要有相应的中断函数与之配套,否则将会出现不可预计的错误。在此,再一次感谢楼上所有朋友的回复。谢谢。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-7-23 22:10

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

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