本帖最后由 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文档写的,我感觉逻辑上没有错,可是就是控制不了,硬件上面没有问题,希望有经验的
大侠能教教我。
帮我看下我上面写的那个接收码和发射码,哪里是不是有问题呢?还是思路有问题呢?
3.2.2 数据的逻辑定义
(1)RC6逻辑电平的定义(对于接受波形)。见图RC6-3。
逻辑‘ 0’ :先高后低,下降沿。
逻辑‘ 1’ :先低后高,上升沿。
(2)RC6每一位的时间
RC6用36K 载波, 半位时间(1T)占用16个载波周期。
半位时间(HALF BIT TIME‡1T):16*27778=444.444µs(1T)
一位时间(FULL BIT TIME‡2T):2*444.444=888.889µs(2T)
(3)RC6消息时间(MESSAGE TIME)和帧(FRAME TIME)
一个消息经历的消息时间为:52*0.444444=23.111MS(52T)。
一个帧经历的帧时间为:58*0.444444=25.778MS(58T)。
(4)RC6重复时间(REPEATING TIMING)
240*0.444444=106.667ms。
还有一点需要特别注意,遥控接收头的问题,并不是所有的接收头都可以接收所有的遥控信号。有些接收出来的时序和实际差别很大,导致无法正常解码。
又一个错误的地方,16位定时器赋值错误
TH0=256-dat[i++]; //先发 1 ,给定时器赋初值,取反,
TL0=256-dat[i++];
程序已传到新帖,链接:基于STC89C52的简易学习型红外遥控器
BXAK,你就弄出来啦,就验证啦,真厉害!
还好,主要模块都是以前模块化编程留下来的,现在只需组合小改就行
一周热门 更多>