小弟這幾天一直在研究STM8S003F單片機(jī)接受DMX512信號串口中斷程序,自己寫了段調(diào)試下發(fā)現(xiàn)一直進(jìn)不去,麻煩有明白的幫忙指點(diǎn)下,小弟不勝感激,謝謝!本人郵箱 770510477@qq.com,是一個(gè)單片機(jī)愛好者,但是自身基礎(chǔ)太差,往見效,謝謝!
以下為我的部分代碼:
(主函數(shù))
#include "clk_conf.h" #include "Tim1.h" #include "GPIO.h" #include "Delay.h" //static unsigned char break1=0; //unsigned char RxData[512]; //接收數(shù)據(jù)緩存區(qū) extern FlagStatus DMX_display; extern unsigned char pwm[3]; //pwm接收數(shù)據(jù)緩存區(qū) 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函數(shù)) #include "iostm8s003f3.h" #include "Tim1.h" unsigned char pwm[3];//接收數(shù)據(jù)緩存區(qū) FlagStatus DMX_display; /************************************* * 函數(shù)名稱:Init_UART1 * 函數(shù)功能:UART1 初始化 * 入口參數(shù):無 * 出口參數(shù):無 ****************************************/ void Init_UART1(void) { // CLK_PCKENR1 |= 0X04; //使能USART1時(shí)鐘 UART1_CR1=0x10; //9位數(shù)據(jù)+1stop UART1_CR2=0x00; UART1_CR3=0x00;//1 stop // 必須先寫B(tài)RR2 // 例如對于波特率位250000時(shí),分頻系數(shù)=16000000/250000=64 // 對應(yīng)的十六進(jìn)制數(shù)為0040,BBR1=04,BBR2=00 UART1_BRR2=0x00; UART1_BRR1=0x04; UART1_CR2=0x2c;//允許接收,發(fā)送,開接收中斷 } /************************************* * 函數(shù)名稱:UART1_RX_RXNE * 函數(shù)功能:UART1 接收中斷函數(shù) * 入口參數(shù):無 * 出口參數(shù):無 ****************************************/ #pragma vector=UART1_R_RXNE_vector __interrupt void UART1_RX_RXNE(void) { unsigned char RxBuf; //臨時(shí)接收 unsigned char RxData[4]; //臨時(shí)接收數(shù)據(jù)緩存區(qū) unsigned int address_counter=0; //串口接收數(shù)據(jù)長度 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; } } } } } }