⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 yaokong.c

📁 基于凌阳的数字电子钟基于凌阳的数字电子钟基于凌阳的数字电子钟
💻 C
字号:
#include "spce061a.h"

volatile unsigned int  count_0_5ms=0;
volatile unsigned char  IR_state=0;
volatile unsigned char  IR_data=0;

void timer_b_init(void)
{
	
   *P_TimeBase_Clear=0x0001;
   *P_INT_Ctrl = *P_INT_Ctrl_New |C_IRQ4_2KHz; //Setup interrupt
   __asm("INT IRQ"); 
}

void IRQ4(void) __attribute__ ((ISR));
void IRQ4(void)
{ 
    unsigned int portb;	
   if(*P_INT_Ctrl&C_IRQ4_2KHz)
   {
     *P_TimerB_Data=0xfff3;
     portb=*P_IOB_Data&0x0004; //外部中断一
     ++count_0_5ms;
    switch(IR_state)
    {
   	case 0:
   	      break;
   	case 1:  //同步头检测状态
   	      if(count_0_5ms>29)//如果是重发位的处理
   	     {
   	      IR_state=0;
   	      //*P_TimerB_Ctrl=0x06;
   	      *P_INT_Ctrl = *P_INT_Ctrl_New&(~0x0020);//关掉2KHz的中断
   	      count_0_5ms=0;
   	     }
   	     break;
   	case 2:  //数据位接收状态
   	     if(count_0_5ms>7)//如果是42位数据后的空闲位的处理
   	     {
   	     	IR_state=0;
   	     //	*P_TimerB_Ctrl=0x06;
   	       *P_INT_Ctrl = *P_INT_Ctrl_New&(~0x0020);//关掉2KHz的中断
   	     	count_0_5ms=0;
   	     }
   	     break;
    }                      
        *P_INT_Clear|=C_IRQ4_2KHz;
  }

}

void IRQ3(void) __attribute__ ((ISR));
void IRQ3(void)
{
  unsigned char pre_5ms_count=0;
  static unsigned char bit_count=0;
  static unsigned int get_IR_code;
  if((0x0200 & *P_INT_Ctrl))
  {
   switch(IR_state)
   {
   	case 0:
   	      *P_INT_Ctrl = *P_INT_Ctrl_New&(~0x0020);//关掉2KHz的中断
   	      //*P_TimerB_Ctrl=0x06;//空闲状态下
   	      count_0_5ms=0;
   	      timer_b_init();
   	      IR_state=1;
   	      break;
   	case 1://测试起始码状态
   	      *P_INT_Ctrl = *P_INT_Ctrl_New&(~0x0020);//关掉2KHz的中断
   	    // *P_TimerB_Ctrl=0x06;//stop
   	     if((count_0_5ms>30)||(count_0_5ms<=24))//>14,<12.5不是起始码
   	     {    
   	      count_0_5ms=0;
   	      timer_b_init();//没有收到同步
   	      break;
   	     }
   	     count_0_5ms=0;//找到引导符
   	     bit_count=0;
   	     get_IR_code=0;
   	     IR_state=2;
   	     timer_b_init();//收到同步头
   	     break;
  //起始码后就跟着控制数据, 共有42位数据, 其中前面
  //26位数据为用户码的原码和反码, 后16位数据为遥控按键的原码和反码 	     
   case 2://接收数据状态
        *P_INT_Ctrl = *P_INT_Ctrl_New&(~0x0020);//关掉2KHz的中断
       // *P_TimerB_Ctrl=0x06;//stop;
        pre_5ms_count=count_0_5ms;//读出上一个数据位的脉冲宽度
        timer_b_init();
        count_0_5ms=0;
        bit_count++;
        if((pre_5ms_count>=2)&&(pre_5ms_count<=3))
        	//收到0  脉冲周期是1.12毫秒的为0
        	{
        		if(bit_count>16)
        		get_IR_code=get_IR_code>>1;
        	}
   	     else 
   	      if((pre_5ms_count>=4)&&(pre_5ms_count<=5))
   	      	//收到1  脉冲周期是2.25毫秒的为1
   	      	{
   	      	 if(bit_count>16)
   	      	   get_IR_code=(get_IR_code>>1)|0x8000;
   	      	}
   	      	if(bit_count ==32)
   	      	{
   	      		 *P_INT_Ctrl = *P_INT_Ctrl_New&(~0x0020);//关掉2KHz的中断
   	      		//*P_TimerB_Ctrl=0x06;//stop 没有必要测试空闲位
   	      		IR_state=0;//原来为 1
   	      		if(((get_IR_code>>8)&0x00ff)==((~get_IR_code)&0x00ff))
   	      			//是否合法的遥控码
   	      			{
   	      				IR_data=get_IR_code & 0x00ff;
   	      			}
   	      	}break;
   }
   *P_INT_Clear=0x0200;
  }
 
}


void adjust_time(void)
{
   *P_INT_Ctrl = *P_INT_Ctrl_New|C_IRQ3_EXT2; //Open IRQ3_EXT2 interrupt
   __asm("INT IRQ");
   
	 switch(IR_data)
	 {
	 	case 0x0001: ;
	 	            break;
	 	case 0x0002:;
	 	            break;
	    case 0x0003:;
	 	            break;	
	 	case 0x0004:;
	 	            break;
	 	case 0x0005:;
	 	            break;   
	 	case 0x0006:;
	 	            break;  
	 	case 0x0007:;
	 	            break;  
	 	case 0x0008:;
	 	            break;  
	 	case 0x0009:;
	 	            break;                                                        
	 }	
	*P_Watchdog_Clear = 0x0001;	
	
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -