电子产品世界 » 论坛首页 » 综合技术 » 电源模拟 » switch语句中为什么执行不了中断?请大神求救


共3条 1/1 1 跳转至

switch语句中为什么执行不了中断?请大神求救

工程师
2016-10-14 08:17:04    评分

求助!下面switch语句中,能执行ConfigPWM()语句,点亮了LED0和LED1,但不能进入中断点亮LED2。为什么?

#include <reg52.h>
#include <intrins.h>
unsigned char tmp;
sbit led0=P0^0;                           //指示灯0	 
sbit led1=P0^1;	                          //指示灯1	 
sbit led2=P0^2;                           //指示灯2	 
unsigned long PeriodCnt = 0; //PWM 周期计数值  
unsigned char HighRH = 0; //高电平重载值的高字节  
unsigned char HighRL = 0; //高电平重载值的低字节  
unsigned char LowRH = 0; //低电平重载值的高字节  
unsigned char LowRL = 0; //低电平重载值的低字节  
unsigned char T1RH = 0; //T1 重载值的高字节  
unsigned char T1RL = 0; //T1 重载值的低字节   

void ConfigPWM(unsigned int fr, unsigned char dc);  
void init();   //串口初始化
void main()
{	 	                 

           init();
          while(1)
          {         
                  if(RI==1)                     //是否有数据到来
                  {
                   RI = 0;
                  tmp = SBUF;                   //暂存接收到的数据
                switch(tmp){
case'1':	//前进
 EA=1;                                          
ConfigPWM(100, 10); 
while(1);
break;
default:	 //停止
   led0=1; 
                led1=1;                               
                led2=1;
             break;
                                       }      
          }
}
void init()        //串口初始化
{
                   ES=0;                                                                       //关中断
                     SCON = 0x50;                       位,1位停止位,无奇偶校验),波特率可变
                     TMOD = 0x20;                        
          TH1=TL1=0xFD;                              
          PCON &= 0x7f;                    
          TR1 = 1;                                                                
                     TI=0;                                                                      
                     RI=0;                    
                
               ES=1;
}

 /* 配置并启动 PWM,fr-频率,dc-占空比 */  
void ConfigPWM(unsigned int fr, unsigned char dc){  
    unsigned int high, low;  
    unsigned long tmp;      
    tmp = (11059200/12) / fr; //计算一个周期所需的计数值  
    high = (tmp*dc) / 100; //计算高电平所需的计数值  
    low = tmp - high; //计算低电平所需的计数值  
    high = 65536 - high + 12; //计算高电平的重载值并补偿中断延时  
    low = 65536 - low + 12;//计算低电平的重载值并补偿中断延时  
     
    HighRH = (unsigned char)(high>>8); //高电平重载值拆分为高低字节  
    HighRL = (unsigned char)high;  
    LowRH = (unsigned char)(low>>8); //低电平重载值拆分为高低字节  
    LowRL = (unsigned char)low;  
     
    TMOD &= 0xF0; //清零 T0 的控制位  
    TMOD |= 0x01; //配置 T0 为模式 1  
    TH0 = HighRH; //加载 T0 重载值  
    TL0 = HighRL;  
    ET0 = 1; //使能 T0 中断  
    TR0 = 1; //启动 T0  
    led0 = 0; 
led1=0; 
}  

/* T0 中断服务函数,产生 PWM 输出 */
void InterruptTimer0() interrupt 1{  

led2=0; 
    }  


 






关键词: switch     中断     大神     求救     LED    

助工
2016-10-14 08:37:18    评分
2楼
switch (表达式){
case 值1 : 语句1
break;

case 值2 : 语句2
break;

...
default : 语句n
break;
}

从表达式值等于某个case语句后的值开始,它下方的所有语句都会一直运行,直到遇到一个break为止。随后,switch语句将结束,程序从switch结束大括号之后的第一个语句继续执行,并忽略其他case。
假如任何一个case语句的值都不等于表达式的值,就运行可选标签default之下的语句。
假如表达式的值和任何一个case标签都不匹配,同时没有发现一个default标签,程序会跳过整个switch语句,从它的结束大括号之后的第一个语句继续执行。

专家
2016-10-14 14:15:43    评分
3楼
  switch(tmp){   
  • case'1':    //前进   
  •  EA=1;                                             
  • ConfigPWM(100, 10);    
  • while(1);   /////////////////////////////////////////////////////不出意外程序卡在这里出不去了
  • break;   
  • default:     //停止   
  •    led0=1;    
  •                 led1=1;                                  
  •                 led2=1;   
  •              break;   
  •                                        }         
  •           }   

  • 共3条 1/1 1 跳转至

    回复

    匿名不能发帖!请先 [ 登陆 注册 ]