本帖最后由 yihui184 于 2012-10-12 09:35 编辑
做遥控器做了三个月来了,
还没有做到让自己满意的地步!特地来这里请教高人,
帮助帮助我,鳖的急了,真是有点恨自己了,
怎么就做不出来,在网上找资料感觉没有什么收获,这么久了,
现在我就想快点把这个学习型遥控器做出来,
尽快,我再也等不了,再拖,我自己都原谅不了我自己,
很郁闷,真的.现在确实是碰到了瓶颈了!
我做的第一个遥控器程序是专门解NEC的,参考了本论坛楼主BXAK的程序.
第二个做的是看到51hei论坛上的一个学习型遥控器,我把它该造成了存入eeprom中去,但是感觉这个路波型的学习型遥控器,感觉时间不是很准确,不是用定时器录波的,感觉不可靠,但是试了试所有的身边的电视都可以实现
接收码,再发射码都能控制电视。代码如下:有遇到点问题,里面都有注释:
学习型遥控器.rar
(40.29 KB, 下载次数: 88)
2012-10-11 23:10 上传
点击文件名下载附件
第三个是我现在做的,根据百度文库上面的一个文章写的,文章如下:
学习型遥控器设计.pdf
(121.82 KB, 下载次数: 125)
2012-10-11 23:12 上传
点击文件名下载附件
我写的程序如下:
- /*
- 时间:2012.10.10
- 功能:学习型遥控器
- */
- #include <reg52.h>
- #define uchar unsigned char
- #define uint unsigned int
- #define ulong unsigned long
- sbit study_key=P1^0; //学习按键
- sbit studylamp=P2^1; //学习状态指示灯
- sbit send_key=P1^1; //发射键
- sbit remotein=P2^0; //遥控信号输入口
- sbit remoteout= P3^4; // 遥控信号输出口
- sbit txkey=P1^1; //待定
- bit flag=0;
- uchar dat[80]; //用于记录高低电平的记时值!80个.一的电平要2个字节.
- void Delay1ms(uint t)
- {
- uint x,y;
- for(x=0;x<t;x++)
- for(y=0;y<120;y++);
- }
- void delete_dat()
- {
- uchar t;
- for(t=0;t<80;t++)
- {
- dat[t]=0;
- }
- }
- void init_io()
- {
- TMOD=0x21;
- TH1=0xF3;
- TL1=0xF3;
- remotein=1;
- remoteout=1;
- studylamp=0;
- EA=1;
- }
- void main()
- {
- uchar i=0;
- init_io();
- delete_dat();
- while(1)
- {
- if(!study_key) //学习键按下,开始接收红外码.用于记录整个码的高低电平.
- {
- Delay1ms(10);
- if(!study_key)
- {
- while(!study_key);
- while( remotein ); //当红外接收端为 1 时一直等待,为 0 跳入循环.开始接收程序.
- while(1)
- {
- TH0=0;
- TL0=0;
- TR0=1;
- while(!remotein); //当为 1 时 跳出循环.
- TR0=0;
- dat[i++]=TH0; //保存 0 的记时时间.
- dat[i++]=TL0;
- TH0=0; //重新赋初值.
- TL0=0;
- TR0=1;
- while(remotein) //当接收的时候,1 的值是否有溢出,有的话,跳出当前循环,给一个标志位,用于跳出大循环,不再接收.
- if(TF0)
- {
- TF0=0;
- TR0=0;
- flag=1;
- dat[i++]=0;
- studylamp=1;
- break;
- }
- if(flag)
- break;
- TR0=0;
- dat[i++]=TH0;
- dat[i++]=TL0;
- }
- }
- }
-
- if(!send_key) //发射键按下,用于发射接收到的码的高低电平.
- {
- Delay1ms(10);
- if(!send_key)
- {
- while(!send_key);
- if(flag)
- {
- i=0;
- ET1=1; //把发送载波的中断开启.
- while(1)
- {
- TH0=256-dat[i++]; //先发 1 ,给定时器赋初值,取反,
- TL0=256-dat[i++];
- TR0=1;
- TR1=1; //启动载波
- while(!TF0); //溢出后,发下一组.
- TF0=0;
- TR0=0;
- TR1=0;
- remoteout=0; //发送 低 电平
- TH0=256-dat[i++]; //发 0
- TL0=256-dat[i++];
- if( dat[i] == 0 ) //当发的数据中没有植,为0时,停止发送.
- {
- delete_dat();
- flag=0;
- studylamp=0;
- ET1=0;
- break;
- }
- TR0=1;
- while(!TF0);
- TF0=0;
- TR0=0;
- }
- }
- }
- }
- }
-
- }
- //40KHz发生器
- void time_intt1(void) interrupt 3
- {
- remoteout=~remoteout;
- }
复制代码请问一下:
我上面的这个程序,我根据PDF那份文档,写的程序:
看了这么多程序,我觉得要做学习型遥控器,我现在是要做记录波形的这种,我觉得只要把高低电平保存起来就可以了嘛,
我上面的这个程序,根据上面那份PDF文档写的,我感觉逻辑上没有错,可是就是控制不了,硬件上面没有问题,希望有经验的
大侠能教教我。
帮我看下我上面写的那个接收码和发射码,哪里是不是有问题呢?还是思路有问题呢?
红外的捕获时,遥控头会收外界干扰,所以当你捕获一串数据时,可能前面几个数据是错误的。后面的连续的数据才是真实的遥控码,可以从遥控首码判断。
void TIM_Config(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_ICInitTypeDef TIM_ICInitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
SET_GPIO_DIR(GPIOB,10,MODE_IN_FLOAT);
GPIO_PinRemapConfig(GPIO_PartialRemap2_TIM2, ENABLE); //端口重映射
/* 基础设置*/
TIM_TimeBaseStructure.TIM_Period = 0xf000; //计数值
TIM_TimeBaseStructure.TIM_Prescaler = 72-1; //预分频,此值+1为分频的除数,72M、72,定时1us
TIM_TimeBaseStructure.TIM_ClockDivision = 0x0; //
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上计数
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
//
/* TIM2 Input Capture Configuration */
TIM_ICInitStructure.TIM_Channel = TIM_Channel_3;
TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; //捕获上升沿
TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; //直接连接到TIM2CH3
TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;
TIM_ICInitStructure.TIM_ICFilter = 0;
TIM_ICInit(TIM2, &TIM_ICInitStructure);
TIM_ICInitStructure.TIM_Channel = TIM_Channel_4;
TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Falling; //捕获下降沿
TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_IndirectTI; //间接连接到TIM2CH3
TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;
TIM_ICInitStructure.TIM_ICFilter = 0;
TIM_ICInit(TIM2, &TIM_ICInitStructure);
/*使能预装载*/
TIM_ARRPreloadConfig(TIM2, ENABLE);
/*预先清除所有中断位*/
TIM_ClearITPendingBit(TIM2, TIM_IT_CC3 | TIM_IT_CC4);
/* 4个通道和溢出都配置中断*/
TIM_ITConfig(TIM2, TIM_IT_CC3 |TIM_IT_CC4, ENABLE);
/* Timer2中断*/
NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
/* 允许TIM2开始计数 */
TIM_Cmd(TIM2, ENABLE);
}
void TIM2_IRQHandler(void)
{
if (TIM_GetITStatus(TIM2, TIM_IT_CC3) != RESET)
{
TIM_ClearITPendingBit(TIM2, TIM_IT_CC3);
IR_TimeOut=0;//超时复位
if(IR_CaptureEnable)
{
if(0==IR_CaptureStart) //遇到第一个电平变化即开始捕获,初始化一些变量
{
IR_CaptureStart=1;
IR_CCR3=TIM2->CCR3;
IR_CCR4=TIM2->CCR4;
IR_Count=0;
}
else
{
IR_CCR3=TIM2->CCR3;
if(IR_CCR3>IR_CCR4) IR_Data[IR_Count]=IR_CCR3-IR_CCR4;
else IR_Data[IR_Count]=IR_CCR3+0xf000-IR_CCR4;
IR_Count++;
}
}
}
else if (TIM_GetITStatus(TIM2, TIM_IT_CC4) != RESET)
{
TIM_ClearITPendingBit(TIM2, TIM_IT_CC4);
IR_TimeOut=0;//超时复位
if(IR_CaptureEnable)//遇到第一个电平变化即开始捕获,初始化一些变量
{
if(0==IR_CaptureStart)
{
IR_CaptureStart=1;
IR_CCR3=TIM2->CCR3;
IR_CCR4=TIM2->CCR4;
IR_Count=0;
}
else
{
IR_CCR4=TIM2->CCR4;
if(IR_CCR4>IR_CCR3) IR_Data[IR_Count]=IR_CCR4-IR_CCR3;
else IR_Data[IR_Count]=IR_CCR4+0xf000-IR_CCR3;
IR_Count++;
}
}
}
}
mark此处,这个数据很有用
一周热门 更多>