4603|3

5

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

红外遥控器控制舵机 [复制链接]

我是用mega128芯片的,想用红外遥控器控制两个舵机,分别按四个按键,分别对应舵机的正转180和反转180,遥控器是用标准的38K调制频率,求一例程进行学习……
小弟感激各位大神,小弟是初学者,绝不是那种不劳而获的人,只是真的没办法了,看了两个星期的资料还是什么都不懂,所以来论坛请教各位高手!!

最新回复

你直接烧写运行一下吧。  详情 回复 发表于 2012-12-24 20:25
点赞 关注
 

回复
举报

1461

帖子

1

TA的资源

纯净的硅(中级)

沙发
 
找一红外接收的例程修改就行。
用中断接收键值,然后判断键值,接着改变PWM波就行

点评

嗯嗯,非常感谢您的回答,我去找了个例程,我想用外部中断进行红外数据提取:#include #include #definde uchar unsigned char #definde uint unsigned int uchar irtime=TCNT0; //红外时间 ucha  详情 回复 发表于 2012-12-24 15:57
 
 
 

回复

5

帖子

0

TA的资源

一粒金砂(中级)

板凳
 

回复 沙发 shihuntaotie 的帖子

嗯嗯,非常感谢您的回答,我去找了个例程,我想用外部中断进行红外数据提取:#include
#include
#definde uchar unsigned char
#definde uint  unsigned int

uchar irtime=TCNT0;           //红外时间
uchar startflag;                      //是否启动接收
uchar irdata[33];                   //1个引导码、8用户码、8用户码、8数据码、8数据码
uchar bitnum;                       //第几位
uchar irreceok;                     //代表红外接收完毕
uchar ircode[4];                   //用于解码
uchar irprosok;                   //代表红外数据处理完毕
uchar disp[8];   
uint  PWMOfDJ;                  
/************************延时函数******************/
void delay_50us(uint t)
{
uchar j;
for(;t>0;t--)
  for(j=19;j>0;j--);

}

void delay_50ms(uint t)
{
uchar j;
for(;t>0;t--)
  for(j=6245;j>0;j--);
}
/***********************中断初始化***********************/
void timer0init(void)
{
TCCR0=0x00;          //timer0 普通工作模式,无预分频
TCNT0=0x00;
}

void int0init(void) //外部中断
{
EICRA|=(1< EIMSK|=(1< SREG|=0x80;                               //开外部中断
}

/*********************舵机控制初始化********************/
void duojiinit(void)
{
  MCUCSR|=(1<<7);
  MCUCSR|=(1<<7);
          
  DDRD = 0xFF;
  DDRB = 0xFF;
  DDRC = 0x00;
  
  TCCR1A = 0b10100010;   //快速PWM
  TCCR1B = 0b00011001;   //时钟1分频
  ICR1H  = 0xFF;         //TCNT计数上限(最高16位)  
    ICR1L  = 0xFF;
}


/********************舵机工作**************************/
void duojiwork(void)
{
   if ((PINC & (1<    {
    PWMOfDJ = 22;
        OCR1AH=PWMOfDJ;         
          OCR1AL=256-PWMOfDJ;
    delay_ms(1000);
       
        PWMOfDJ = 30;
        OCR1AH=PWMOfDJ;         
          OCR1AL=256-PWMOfDJ;
    delay_ms(1000);
  }
}
void display(void)
{
   uchar i;
   for(i=0;i<8;i++)
   {
    P1=smg_du[disp];
    P2=smg_we;
    delay_50us(20);
   }

}

void irpros(void)           //红外处理,提取数据
{
    uchar k,i,j;
    uchar value;
    k=1;
    for(j=0;j<4;j++)
    {
      for(i=0;i<8;i++)
      {
       value=value>>1;            //右移7次
       if(irdata[k]>6)            //判断8次
       {
       value=value|0x80;         //最高位置1
       }
      }
       ircode[j]=value;
     }
     irprosok=1;
}

void main(void)
{
  //timer0init();     //初始化
  int0init();        //初始化
  duojiint();
  while(1)
  {
    if(irreceok)
    {
       irpros();
       irreceok=0;  
    }
    if(irprosok)
    {
       duojiwork();
       irprosok=0;
    }
  }
}

/****************************中断服务函数*****************************/
/*
#pragma interrupt_handler timer0_ovf:3
void timer0_ovf(void)
{
  if(startflag)
    {
       if(irtime>32)           //检测引导码
       {
        bitnum=0;               //bitnum清0
       }
       irdata[bitnum]=irtime;   //装数据
       irtime=0;                //irtime清0
       bitnum++;               
       if(bitnum==33)
       {
        bitnum=0;
        irreceok=1;            //用于主函数判断,当irreceok=1,要怎样
       }      
    }
  else
    {
        startflag=1;
        irtime=0;                 //清0
    }
}
上面的是我改的程序,我不知道程序会不会在接收到红外时进入外部中断。

点评

你直接烧写运行一下吧。  详情 回复 发表于 2012-12-24 20:25
 
 
 

回复

1461

帖子

1

TA的资源

纯净的硅(中级)

4
 

回复 板凳 零解 的帖子

你直接烧写运行一下吧。
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表