我用STC89C52单片机连接了一个加速度模块,根据角度信息控制IO口的电平,设置了串口中断,加速度模块每帧数据25个字节,串口RX读取数据后用来控制其他IO口的电平,连接了几个二极管控制亮灭来观察现象,然后发现IO电平会不断地快速波动,被困住了好几天,想求助大家这个问题是怎么回事。把中断代码和读取代码贴上来请大家指导,谢谢大家。
中断
- #include "stc_it.h"
- #include "usart.h"
- #include "string.h"
- //串口中断
- void USART_IRQHandler(void)interrupt 4
- {
- static uint8_t i=0;//
-
- if(RI)//接收完成标志
- {
- RI=0;//清中断接收标志
- RX_BUF[i]=SBUF;
- if (i==0&&RX_BUF[0]!=0x5a) return;//检查帧头
- i++;
- if(i==25) //
- {
- i=0; //
- Receive_ok=1;
- }
-
- }[/i][/font][i]
- [font=Tahoma] }[/font][font=Tahoma][size=5]
- 读取
- [/size][/font][font=Tahoma]while(1)
- {
- if(Receive_ok)//串口接收完毕
- { Receive_ok=0;
- for(sum=0,i=0;i<(RX_BUF[3]+4);i++)
- sum+=RX_BUF[i];
- count=0;
- if(sum==RX_BUF[i])//校验和判断
- {
- if(RX_BUF[2]&0x01) //加速度数据
- count=6;
- if(RX_BUF[2]&0x02) //陀螺数据
- count+=6;
- if(RX_BUF[2]&0x04) //磁场数据
- count+=6;
- if(RX_BUF[2]&0x08) //四元数数据
- count+=8;
- if(RX_BUF[2]&0x10) //欧拉角数据
- {
- // LED_0=0;
- rpy[0]=(RX_BUF[4+count]<<8)|RX_BUF[5+count];
- rpy[1]=(RX_BUF[6+count]<<8)|RX_BUF[7+count];
- rpy[2]=(RX_BUF[8+count]<<8)|RX_BUF[9+count];
-
- Y=rpy[0]; //获取角度
- X=rpy[1];
-
- TI=1;
-
- LED(Y,X);
- count+=6;
- }
- }
复制代码
|