打印

哪位帮我看下dmx512的解码器程序为什么不能进中断

[复制链接]
2906|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
chuchudongdong|  楼主 | 2013-9-25 17:42 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
u16 UDR[3];
u16 u16_data;
u16 DATA_R;
u16 DATA_G;
u16 DATA_B;
u8 RXB8=0;
u8 address=1;
u8 address_counter=0;
u8 counter=0;
u8 start_code=0;
u8 break1=0;


void  Uart_Init()
{
  UART1_DeInit();
  UART1_Init((u32)250000,UART1_WORDLENGTH_9D, UART1_STOPBITS_1, \
  UART1_PARITY_NO,UART1_SYNCMODE_CLOCK_DISABLE,UART1_MODE_RX_ENABLE);

  UART1_ITConfig(UART1_IT_RXNE_OR, ENABLE); //开启接收中断
  UART1_Cmd(ENABLE);
}

int main(void)
{

  /* 系统时钟初始化 */
  SystemClock_Init();
  //CLK->PCKENR1|=0X04;
  //CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1);//设置时钟为内部时钟16MHz

  GPIO_Init(GPIOA,GPIO_PIN_3, GPIO_MODE_OUT_PP_HIGH_FAST ); /*!< Output push-pull, high level, 10MHz */
  GPIO_Init(GPIOC,GPIO_PIN_3, GPIO_MODE_OUT_PP_HIGH_FAST );
  GPIO_Init(GPIOC,GPIO_PIN_4, GPIO_MODE_OUT_PP_HIGH_FAST );

  GPIO_WriteLow(GPIOA,GPIO_PIN_3);//高电平点亮
  GPIO_WriteLow(GPIOC,GPIO_PIN_4);
  GPIO_WriteLow(GPIOC,GPIO_PIN_3);


  Uart_Init();
  enableInterrupts();

while(1)//while(!(进入中断的标志=0))
{
  GPIO_WriteHigh(GPIOA,GPIO_PIN_3);

}
}

#pragma vector=20
  __interrupt void UART1_RX_IRQHandler(void)
{
  //static u8 i=0;

  GPIO_WriteLow(GPIOA,GPIO_PIN_3);
  GPIO_WriteHigh(GPIOC,GPIO_PIN_4);

   //UART1_ClearITPendingBit(UART1_IT_RXNE);
   u16_data=UART1_ReceiveData9();

  RXB8=u16_data&0X0100;
  if(UART1_GetITStatus(UART1_IT_RXNE)!=RESET)
  {
    if(!RXB8)
    {
     break1=1;
     start_code=0;
     address_counter=0;
     }
    if(break1)
   {
    u16_data=UART1_ReceiveData9();
    if((counter==0)&&(u16_data==0))
    {
     start_code=1;
    }
    else if(start_code)
    {
     address_counter++;

      if(address_counter==address)
      {
      DATA_R=UART1_ReceiveData9();
      }

      if(address_counter==address+1)
      {
      DATA_G=UART1_ReceiveData9();
      }

      if(address_counter==address+2)
      {
      DATA_B=UART1_ReceiveData9();
      }

      if(address_counter>512)
      {
       address_counter=0;
       break1=0;
       start_code=0;
      }
    }
   }
   }

/* if(UART1_GetITStatus(UART1_IT_RXNE)!=RESET)
  {
    if(UART1->CR1&=0X00){n=0;return;}//接收数据的第九位

    if((n>=address)&&(n<address+3))
    UDR[i]=UART1_ReceiveData9();
    i++;
   //RXB8=(UDR[i]&0x0008);
   UART1_ClearITPendingBit(UART1_IT_RXNE);
  }  */

GPIO_WriteHigh(GPIOC,GPIO_PIN_3);//landeng
}

相关帖子

沙发
chuchudongdong|  楼主 | 2013-9-25 17:49 | 只看该作者
中断函数用的是判断第九位数据是否为0作为判断break的标志  但是仿真时一直都没有进中断

使用特权

评论回复
板凳
chuchudongdong|  楼主 | 2013-9-25 17:49 | 只看该作者
有没有弄过dmx512的  帮帮忙啊

使用特权

评论回复
地板
chuchudongdong|  楼主 | 2013-9-26 08:40 | 只看该作者

使用特权

评论回复
5
kxc2008| | 2013-9-26 14:47 | 只看该作者
/****************************/
#include <STC12C5410AD.h>
//菜单变量
/****************************/
//#include<reg52.h>
#include < intrins.h>
#define uint unsigned int
#define uchar unsigned char
sbit test=P2^0;
sbit dis1=P2^1;
sbit dis2=P2^3;
sbit dis3=P2^7;
sbit dis4=P2^6;
sbit key1=P3^3;
sbit key2=P3^4;
sbit key3=P2^5;
sbit key4=P3^2;
uchar key1PreS;
uchar key2PreS;
uchar key3PreS;
uchar key4PreS;
uint  key1Time;
uint  key2Time;
uint  key3Time;
uint  key4Time;
uchar keyMode; // 0为地址码,1为调光
void key();
void delay(uchar a);
void display(uchar disnum);
void delay5ms(uchar a);
void display_menu(uchar numdis);
uint num=1,num2=0;
uchar i,i1,i2;
uchar code number[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
/**********************************************************************/

//PWM调光变量
/**********************************************************************/
sbit PWM0 = P3^7;//R
sbit PWM1 = P3^5;//G
sbit PWM2 = P2^0;//B
sbit PWM3 = P2^4;//W
uchar off = 1;
uchar i = 255;
//void Delay1ms(unsigned int count);
void STC_PWM(void);     //PWM初始化
void pwm_add();
void pwm_subb();
uchar d1,d2,d3,d4;
/**********************************************************************/

//dmx设置变量
/****************************************/
uchar temp;
uint address=0;
uchar data m[4];//接收数据缓存
uint n;
sbit RE_RXD=P2^2;
void init();
void dmx();
bit  dmxtest;
uchar b1,b2,b3,b4,a1,a2,a3,a4;
/****************************************/

void main()
{
    dmxtest=1;   
    init();
    //Delay1ms(5000);
    STC_PWM(); //PWM波初始化设置
    dis1=1;
    dis2=1;
    dis3=1;
    dis4=1;
    key1PreS = key1;
    key2PreS = key2;
    key3PreS = key3;
    key4PreS = key4;
    key1Time = 0;
    key2Time = 0;
    key3Time = 0;
    key4Time = 0;
        keyMode = 0;
        display(num);
        while(1)
        {           
     test=dmxtest;
     b1=m[0];b2=m[1];b3=m[2];b4=m[3];
     if(b1==0)
     {
      CCAP0L=0xff;
      CCAP0H=0xff;
      CCAP1L=0xff;
      CCAP1H=0xff;
      CCAP2L=0xff;
      CCAP2H=0xff;
      CCAP3L=0xff;
      CCAP3H=0xff;
     }
     else
     {
      a1=b1;
      CCAP0L=255-a1;
      CCAP0H=255-a1;
     }
     if(b2==0)
     {
      CCAP1L=0xff;
      CCAP1H=0xff;
      CCAP2L=0xff;
      CCAP2H=0xff;
      CCAP3L=0xff;
      CCAP3H=0xff;
     }
     else
     {
      a2=b2;
      CCAP1L=255-a2;
      CCAP1H=255-a2;
     }
     if(b3==0)
     {
      CCAP2L=0xff;
      CCAP2H=0xff;
      CCAP3L=0xff;
      CCAP3H=0xff;
     }
     else
     {
      a3=b3;
      CCAP2L=255-a3;
      CCAP2H=255-a3;
     }
     if(b4==0)
     {
      CCAP3L=0xff;
      CCAP3H=0xff;
     }
     else
     {
      a4=b4;
      CCAP3L=255-a4;
      CCAP3H=255-a4;
     }
     key();               
        }
}


void display(uchar disnum)
{
uchar aa,bb,cc,dd;
aa=disnum/1000;
bb=disnum%1000/100;
cc=disnum%100/10;
dd=disnum%10;
dis1 = 0;
P1 = 0xa1;
delay5ms(20);
dis1 = 1;
dis2 = 0;
P1=number[bb];
delay5ms(20);
dis2 = 1;
dis3 = 0;
P1=number[cc];
delay5ms(20);
dis3 = 1;
dis4 = 0;
P1=number[dd];
delay5ms(20);
dis4 = 1;
delay5ms(20);   
}


void display_menu(uchar numdis)
{
uchar qin,bai,shi,ge;
qin=numdis/1000;
bai=numdis%1000/100;
shi=numdis%100/10;
ge=numdis%10;
dis1 = 0;
P1=0x83;
delay5ms(20);
dis1 = 1;
dis2 = 0;
P1=number[bai];
delay5ms(20);
dis2 = 1;
dis3 = 0;
P1=number[shi];
delay5ms(20);
dis3 = 1;
dis4 = 0;
P1=number[ge];
delay5ms(20);
dis4 = 1;
delay5ms(20);
}


void key()
{
        if(key1 == 0 && key1PreS == 1)//KEY1是否按下,按下的话就切换到调光模式菜单
        {
                keyMode = 1;//调光模式
        }
        key1PreS = key1;
        if(!key2)
        {
                if (key2PreS == 1)
                {
                        if (keyMode == 0)
                        {
                                num++;
                                if(num == 255)
                                {
                                        num = 1;
                                }
                        }
                        else
                        {   
                                num2++;
                CCAP0L=CCAP0L-1;  
                CCAP0H=CCAP0H-1;
                                if(num2==255)
                            {
                                 num2 = 0;
                 CCAP0L=0x00;
                 CCAP0H=0x00;
                 CCAP3L=0xff;
                 CCAP3H=0xff;
                            }
                        }
                }
                else
                {
                        key2Time++;
                        if (key2Time == 300)
                        {
                                key2Time = 0;
                                if (keyMode == 0)
                                {
                                        num++;
                                        if(num == 255)
                                        {
                                         num = 1;
                                        }
                                }
                                else
                                {   
                                        num2++;
                                        if(num == 255)
                                    {
                                         num2 = 0;
                     CCAP0L=0x00;
                     CCAP0H=0x00;
                     CCAP3L=0xff;
                     CCAP3H=0xff;
                                    }
                 CCAP0L=CCAP0L-1;  
                 CCAP0H=CCAP0H-1;
                                }
                        }
        
                }
                key2Time++;
          }
        else
                key2Time = 0;
            key2PreS = key2;
        if(!key3)
        {
                if (key3PreS == 1)
                {
                        if (keyMode == 0)
                        {
                                num--;
                                if(num == 1)
                                {
                                 num = 255;
                                }
                        }
                        else
                        {
                                if(num2 == 0)
                            {
                                 num2 = 255;
                 CCAP0L=0xff;
                 CCAP0H=0xff;
                 CCAP3L=0xff;
                 CCAP3H=0xff;
                            }
                                else
                {
                                 num2--;
                 CCAP0L=CCAP0L+1;   
                 CCAP0H=CCAP0H+1;   
                 CCAP3L=CCAP3L-1;   
                 CCAP3H=CCAP3H-1;  
                }
                        }
                }
                else
                {
                        key3Time++;
                        if (key3Time == 300)
                        {
                                key3Time = 0;
                                if (keyMode == 0)
                                {
                                        num--;
                                        if(num == 1)
                                        {
                                         num = 255;
                                        }
                                }
                                else
                                {
                                        if(num2 == 0)
                                    {
                                                num2 = 255;
                        CCAP0L=0xff;
                        CCAP0H=0xff;
                        CCAP3L=0xff;
                        CCAP3H=0xff;
                                    }
                                        else
                                                num2--;
                        CCAP0L=CCAP0L+1;   
                        CCAP0H=CCAP0H+1;   
                        CCAP3L=CCAP3L-1;   
                        CCAP3H=CCAP3H-1;
                                }
                        }
                }
                key3Time++;
          }
        else
                key3Time = 0;
        key3PreS = key3;
        if(key4 == 0 && key4PreS == 1)
        {
                keyMode = 0;
        }
        key4PreS = key4;
        if (keyMode == 0)
        {   
                display(num);
        }
        else
        {
                display_menu(num2);
        }
}




void delay5ms(uchar a)
{
uint b,c;
for(b=a;b>0;b--)
for(c=10;c>0;c--);
}

/***************************1秒延时子程序start***************************/
void Delay1ms(unsigned int count)
{
unsigned int a,j;
for(a=0;a<count;a++)
for(j=0;j<120;j++);
}

/***************************1秒延时子程序end****************************/


/*****************************************************/
void STC_PWM(void)
{
CCON=0;
CMOD=0x00;   //set PCA timer
CL=0x00;
CH=0x00;
CCAP0L=0xff;   //设置占空比
CCAP0H=0xff;
CCAPM0=0x42;   //设置使用PWM模式
CCAP1L=0xff;   //设置占空比
CCAP1H=0xff;
CCAPM1=0x42;   //设置使用PWM模式
CCAP2L=0xff;   //设置占空比
CCAP2H=0xff;
CCAPM2=0x42;   //设置使用PWM模式
CCAP3L=0xff;   //设置占空比
CCAP3H=0xff;
CCAPM3=0x42;   //设置使用PWM模式
CR=1; //开始PCA 定时器
}
/*****************************************************/


/****************************************************************/


/*void pwm_add()
{
CCAP0L=CCAP0L-1;  
CCAP0H=CCAP0H-1;  
}

void pwm_subb()
{
CCAP0L=CCAP0L+1;   
CCAP0H=CCAP0H+1;  
CCAP3L=CCAP3L-1;   
CCAP3H=CCAP3H-1;   
}*/



void init()
{
PCON=0x00;//工作方式2的波特率加倍
SM0=1;  //串行口工作方式2,9位 固定波特率250K ,使用16MHZ晶振
SM1=0;
SM2=0;
REN=1;//允许串行接收状态
IP=0x10; //串行口优行中断级
EA=1;//总中断允许
ES=1;//允许串行口中断
address=1;
RE_RXD=0;
temp=0;
n=0;
}   



/***DMX512接收程序***************/
void serial() interrupt 4 using 0
{
RI=0;
dmxtest=0;
if(RB8==0)
  {
   SBUF==0;
   n=0;
   return;
  }
if(n<address)
  {
  n++;
  return;
  }
else if(n>address+3)
  {
  n++;
  return;
  }
else         
  {      
  m[n-address]=SBUF;
  n++;
  if(n==512)
  dmxtest=0;   
  }
}

给个测试通过的给你参考

使用特权

评论回复
6
chuchudongdong|  楼主 | 2013-9-26 17:10 | 只看该作者
kxc2008 发表于 2013-9-26 14:47
/****************************/
#include
//菜单变量

我先是测试用串口接收
用串口助手就能进中断接收 怎么连接控制器的时候中断就进不去了呢
你是怎么测试的???

使用特权

评论回复
7
xcyycx| | 2014-2-24 11:15 | 只看该作者
顶起!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

7

主题

40

帖子

0

粉丝