这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界» 论坛首页» 嵌入式开发» MCU» 天晓得?如何在switch语句中执行中断语句?

共6条 1/1 1 跳转至

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

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

  • #include  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 跳转至

回复

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