OpenVINOTM,给你看得见的未来!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » MCU » 天晓得?如何在switch语句中执行中断语句?

共6条 1/1 1 跳转至

天晓得?如何在switch语句中执行中断语句?

专家
2016-10-14 13:54:30    评分
下面switch语句中,能执行ConfigPWM()语句,点亮了LED0和LED1,但不能进入中断点亮LED2。为什么?

  • #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     中断     单片机    

专家
2016-10-14 14:05:28    评分
2楼
应该是楼主未开启中断。

这是STM32F103串口1的初始化,并且开启了中断,楼主参考一下。
void USART1_Configuration(void)
{
        GPIO_InitTypeDef GPIO_InitStructure;
        USART_InitTypeDef USART_InitStructure;

        RCC_APB1PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

       //GPIO结构的成员设置如下:
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; 
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //复用推挽输出
        GPIO_Init(GPIOA, &GPIO_InitStructure);

        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空输入
        GPIO_Init(GPIOA, &GPIO_InitStructure);

       //串口的结构成员设置如下:
        USART_InitStructure.USART_BaudRate = 9600;         
        USART_InitStructure.USART_WordLength = USART_WordLength_8b;
        USART_InitStructure.USART_StopBits = USART_StopBits_1;
        USART_InitStructure.USART_Parity = USART_Parity_No;
        USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
        USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;
        USART_Init(USART1, &USART_InitStructure);

        USART_Cmd(USART1, ENABLE);
        USART_GetITStatus(USART1, USART_FLAG_TC); //清 发送完成标志
     
}

专家
2016-10-14 14:17:37    评分
3楼

楼上的思路很正确。首先看中断开启没有。其次看中断开启条件是否满足


专家
2016-10-15 09:35:28    评分
4楼

case'1':    //前进 

 

修改为

case 1 :    //前进 

试试


专家
2016-10-16 23:39:28    评分
5楼
建议楼主在while(1)中增加20ms的延时试试。

专家
2016-10-17 10:25:03    评分
6楼
把 switch 改成 if 语句试试。

共6条 1/1 1 跳转至

回复

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