搜索
bottom↓
回复: 1

[急救]mega64遥控器接受问题,我写了一段代码大家看看,如何改一下实现红外遥控接受功

[复制链接]

出0入0汤圆

发表于 2006-12-17 15:19:04 | 显示全部楼层 |阅读模式
#include <avr/io.h>

#include <avr/delay.h>

#include <avr/signal.h>

#include <avr/interrupt.h>

//#include "mega64.h"

#include "ina90.h"

//#define  EXT_INT6  6



volatile int i=0;//测试变量i

/*------------------------------------------------------------------*

*                      红外接受程序                                 *

*------------------------------------------------------------------*/



/*---------------------*/

/*  红外接收全局变量   */

/*---------------------*/

char ray_singal_num = 0;                                             //接受信号               

char  ray_data_in = 0;                                                //ray_data_in为接收的数据

char ray_symbol = 0;

char ray_count_array[20] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};//Bit位数组               

char ray_ordar = 0;                                                  //最终得到的命令(鸡肋)  



/*---------------------*/

/*      函数声明区     */

/*---------------------*/

void ray_judger(void);

void int0_init(void);

void Timer1_init(void);



/*******红外线接收**********/

void ray_receive_init(void)  

{                           

  int0_init();               

  Timer1_init();            

}   

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

*  函数说明:定时器1初始化程序                                      *

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

void Timer1_init(void)                                                

{                                                                     

    TCNT1 =0;                                                         

    TCCR1B =0x03;                                                   

}                                                                     

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

*  函数说明:外中断0初始化程序                                      *

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

void int0_init(void)                                                  

{                                                                     

   //MCUCR=0x02;//开中断0、下降沿触发脉冲                              

   //GIFR=0xff;                                                        

}   

/*unsigned char uc_Led;

//16位定时器普通模式使用,1s改变一次灯亮的状态



void timer1_init(void)

{

   TCCR1B=0x00;      //先停止定时器1

   TCNT1H=0xF0;

   TCNT1L=0xBE;

   TCCR1A=0x00;

   TCCR1B=0x05;     //启动定时器1,使用1024分频

}



unsigned char sreg;

void T1()

{

  unsigned int i1;

  TCNT1=0x1FF;

  i1=TCNT1;

}

unsigned int TIM16_ReadTCNTn(void)

{

  unsigned int i1;

  unsigned char sreg;

  sreg=SREG;//保存中断标志

  _CLI();//禁止中断

  i=TCNT1;

  SREG=sreg;

  return i1;

}*/

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

*   函数说明:红外信号处理程序                                      *

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

void ray_judger(void)

{     

     char i=0;

     ray_data_in=0;      

     

     for(i=0;i<8;i++)                                               //加入适当的冗错处理

    {

      if(ray_count_array < 0x38)                                //0.5ms为低电平

      {

         ray_data_in &= ~(1<<i);

      }

      if(ray_count_array >=0x38)                                //1ms为高电平

      {

         ray_data_in |= (1<<i);

      }

    }      

    ray_ordar = ray_data_in;   

}

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

*  函数说明:外中断6中断处理程序                                    *

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

SIGNAL(SIG_INTERRUPT6) //INT6中断服务程序

{

      i++;

        char temp =0;                                                   

    temp = TIMSK;                                                   

    TIMSK = 0;                                                      

    if(ray_symbol == 0)                                             

    {                                                               

      if(TCNT1 >= 0x00ff)        //大于4MS则重置指针               

      {                                                            

          ray_singal_num = 0;                                       

      }                                                            

      TCNT1 = 0X00;              //0.5ms记数值为31                  

      MCUCR = 0X03;              //INT0上升沿触发                  

      ray_symbol = 1;                                               

    }                                                               

     else                                                            

     {                                                               

      if((TCNT1H == 0)&&(TCNT1 <= 0x00ff))                          

      {                                                            

         ray_count_array[ray_singal_num] = TCNT1L;                 

          ray_singal_num ++;                                       

         if (ray_singal_num == 8)                                 

          {                                                         

             ray_singal_num = 0;                                    

             ray_judger();                                          

          }                                                         

          ray_symbol = 0;                                          

      }                                                            

      else                                                         

      {                                                            

                                                                     

          ray_singal_num = 0;                                       

      }                                                            

                                                                    

      MCUCR = 0X02;              //INT0下降沿触发                  

      TCNT1 = 0;                                                   

    }                                                               

    TIMSK = temp;  

   

}

void deal()

{

           char temp =0;                                                   

    temp = TIMSK;                                                   

    TIMSK = 0;                                                      

    if(ray_symbol == 0)                                             

    {                                                               

      if(TCNT1 >= 0x00ff)        //大于4MS则重置指针               

      {                                                            

          ray_singal_num = 0;                                       

      }                                                            

      TCNT1 = 0X00;              //0.5ms记数值为31                  

      //MCUCR = 0X03;              //INT0上升沿触发

          EICRA|=0x30;//EICRB5:4配置为1、1,上升沿都产生中断

      //EICRA&=0xEF;                  

      ray_symbol = 1;                                               

    }                                                               

     else                                                            

     {                                                               

      if((TCNT1H == 0)&&(TCNT1 <= 0x00ff))                          

      {                                                            

         ray_count_array[ray_singal_num] = TCNT1L;                 

          ray_singal_num ++;                                       

         if (ray_singal_num == 8)                                 

          {                                                         

             ray_singal_num = 0;                                    

             ray_judger();                                          

          }                                                         

          ray_symbol = 0;                                          

      }                                                            

      else                                                         

      {                                                            

                                                                     

          ray_singal_num = 0;                                       

      }                                                            

                                                                    

      //MCUCR = 0X02;              //INT0下降沿触发

          EICRA|=0x20;//EICRB5:4配置为1、0,下降沿都产生中断

      EICRA&=0xEF;                  

      TCNT1 = 0;                                                   

    }                                                               

    TIMSK = temp;

}

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

*  函数说明:外中断2中断处理程序                                    *

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

SIGNAL(SIG_INTERRUPT2) //INT2中断服务程序

{

  if(3==i)

  {

    i=2;

        deal();

  }

  i++;

  

}

void main(void)

{

  ray_receive_init();

  SREG|=0x80;//置位全局中断使能

  EIMSK|=0x04;//0000 0100b对外部中断请求2使能

  EICRA|=0x20;//EICRB5:4配置为1、0,下降沿都产生中断

  EICRA&=0xEF;

  DDRD=0xFF;//D Output

  while(1)

  {

    PORTD|=0x04;//PD2=1; 模拟产生中断

        PORTD&=0xFB;//PD2=0;

  }

  /*SREG|=0x80;//置位全局中断使能

  EIMSK|=0x40;//0100 0000b对外部中断请求6使能

  EICRB|=0x10;

  EICRB&=0xDF;//EICRB5:4配置为0、1,上升沿和下降沿都产生中断

  DDRE=0xFF;//E 设置为输出

  while(1)

  {

    PORTE|=0x40;//实现对pe6 口的改变把pe6 =1;

        PORTE&=0xBF;//pe6=0;

  };*/

   /*ray_receive_init();  

   T1();

   TIM16_ReadTCNTn();*/



  /*timer1_init();

  uc_Led=0;

  DDRB=0xff;

  while(1)

  {

      while(!(TIFR&0x04));

          PORTB=uc_Led++;

          TCNT1H=0xF0;

      TCNT1L=0xBE;

          if(uc_Led==255)

          uc_Led=0;

          TIFR |=0x04;

  }*/

  

   

}

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

发表于 2006-12-19 00:22:47 | 显示全部楼层
M64做这个 大财晓勇吧
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-13 19:08

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表