小弟这几天一直在研究STM8S003F单片机接受DMX512信号串口中断程序,自己写了段调试下发现一直进不去,麻烦有明白的帮忙指点下,小弟不胜感激,谢谢!本人邮箱 770510477@qq.com,是一个单片机爱好者,但是自身基础太差,往见效,谢谢!
以下为我的部分代码:
(主函数)
#include "clk_conf.h" #include "Tim1.h" #include "GPIO.h" #include "Delay.h" //static unsigned char break1=0; //unsigned char RxData[512]; //接收数据缓存区 extern FlagStatus DMX_display; extern unsigned char pwm[3]; //pwm接收数据缓存区 int main( void ) { //u8 i; Clk_conf(); Init_UART1(); Tim1_PWM_conf(255,TIM1_DIV1); //16M f=16/256 //DMX_display=0; Delay_MS(); EnableInterrupt; while(1) { if(DMX_display) { To_PWM_output(pwm[0],pwm[1],pwm[2]); DMX_display=0 ; } else {To_PWM_output(0,0,255);}//无信号 } } (uart函数) #include "iostm8s003f3.h" #include "Tim1.h" unsigned char pwm[3];//接收数据缓存区 FlagStatus DMX_display; /************************************* * 函数名称:Init_UART1 * 函数功能:UART1 初始化 * 入口参数:无 * 出口参数:无 ****************************************/ void Init_UART1(void) { // CLK_PCKENR1 |= 0X04; //使能USART1时钟 UART1_CR1=0x10; //9位数据+1stop UART1_CR2=0x00; UART1_CR3=0x00;//1 stop // 必须先写BRR2 // 例如对于波特率位250000时,分频系数=16000000/250000=64 // 对应的十六进制数为0040,BBR1=04,BBR2=00 UART1_BRR2=0x00; UART1_BRR1=0x04; UART1_CR2=0x2c;//允许接收,发送,开接收中断 } /************************************* * 函数名称:UART1_RX_RXNE * 函数功能:UART1 接收中断函数 * 入口参数:无 * 出口参数:无 ****************************************/ #pragma vector=UART1_R_RXNE_vector __interrupt void UART1_RX_RXNE(void) { unsigned char RxBuf; //临时接收 unsigned char RxData[4]; //临时接收数据缓存区 unsigned int address_counter=0; //串口接收数据长度 FlagStatus start_code=0; //判断start_code FlagStatus break1=0; //判断break if(UART1_SR_RXNE) { UART1_SR_RXNE=0; //清RXNE if(UART1_CR1_R8==0) //判断第九位 { break1=1; start_code=0; address_counter=0; DMX_display=0; } if(break1) { RxBuf=UART1_DR; if((address_counter==0)&&(RxBuf==0)) { start_code=1;address_counter=0; if(start_code) { RxData[address_counter++] = RxBuf; address_counter++; if(address_counter>3) { DMX_display=1; pwm[0]= RxData[1]; pwm[1]= RxData[2]; pwm[2]= RxData[3]; break1=0; start_code=0; address_counter=0; } } } } } }