-
UID:795040
-
- 注册时间2010-04-04
- 最后登录2023-11-12
- 在线时间1310小时
-
-
访问TA的空间加好友用道具
|
前些天看到有坛友 火包 做了一个红外反射式开关,觉得挻好玩的,于是盘算我也做一个出来玩玩。但这几天都在搞其他玩意,没太多时间,只好用拖字决了,一拖就拖到昨天… 但是做也得有个方案..去看看人家是怎么做的吧.. http://bbs.mydigit.cn/read.php?tid=194872&keyword=%BA%EC%CD%E2 原来他用的是杜洋的电路和程序,我再跑到杜洋那里瞧瞧,挖到了一张电路图.. 图片一 原图片地址:http://www.doyoung.net/works/FR_TOUCH/index.html 可是问题来了,手上只有一块STC89C52能用了,STC19C52好像不带AD的,而且就算带AD,编写这样一个抗干扰的程序对我这只大菜鸟来说是一个很大的挑战,额~~望面却步… 可是就这样放弃吗?我才不会呢,但要怎么做才行?? 不用AD只好走另一条路了,想起我以前做的红外遥控风扇,对哦!!如果加上载波的话就没那么容易干扰了,轻松地去掉了强光和其他红外线的干扰,只要在程序中去除红外遥控的干扰就OK了,有想法就好了,立刻动手!!! 我直接就选用了电视(是电视用的吗?)红外接收头PC838(我只买了这种接收头=_=!)… 图片二 网上的资料说需要38khz的载波它才能接收到,哦~反正要用单片机了,就用单片机的定时器做一个38khz频率发生器,很好,再在有了载波了。单片机的输出电流太小,加了一个S8050放大电流再接个红外LED,红外LED要串上一个电阻(200R左右)才行,不然很可能会烧了红外LED的。但现在问题来了,红外接收头非常灵敏,遥控器即使不正面对着接收头也能达到遥控的效果,怎么办??我们先来写好程序做个试验再来讨论~~~ 先做两个简单的小模块,方便接线和试验.. 图片三 下图是成功驱动红外LED成功了,顺便晒晒我做的最小系统(算最小系统吗?)… 程序 #include <REG52.H> sbit LED = P1^7; #define uchar unsigned char //定义unsigned char用uchar表示 #define uint unsigned int //定义unsigned int用uint表示 void Timer0_Init(void); //定时器初始化 void delay_ms (uint iii) //延时子程序,每加1增加0.5ms { for(;iii>0;iii--) { uchar jjj=244; while(--jjj); } }
//主函数 void main(void) { Timer0_Init(); //定时器初始化 while(1); } //定时器的初始化 void Timer0_Init(void) { TH0 = 0xFF; TL0 = 0xFA; //7us TMOD = 0x01; //工作方式 ET0 = 1; //开中断 TR0 =1; //开计数器 EA = 1; } ///定时器中断 void Timer0(void) interrupt 1 { TH0 = 0xFF; TL0 = 0xFA; LED2=~LED2; } 图片四 程序的实测效果非常不理想,并不是我的红外接收头坏了,而是红外LED的频率与38khz相差太远了。我没有示波器,无法测得LED的频率,程序经过多次修改,情况还是不理想~~虽是如些,但是我也得出了丝启发,红外接收管的灵敏度与红外LED的频率有关,越是接近38khz,接收头越是灵敏。(高手不要笑,编程 是自学的,这实在找不出问题出在哪) 话说运气还是与我挻有缘嘀,用单片机发生频率效果不理想,那么我就用NE555来做一个频率发生器来代替。竟然不多不少,接收头的灵敏度居然还不错~~刚好能做红外反射… 下面是电路图++实物图~~ 图片五 图片六 19k和8k 的电阻我没有,用了两个电阻串联代替,这东西一共做了两个,第二个效果不好,回收再利用了… 现在载波问题OK了,那么现在有必要做一个红外反射头的模块了,再顺便晒晒我的继电器模块,各位大虾请过目…. 图片七 图片八 好,现在万理具备,组装各模块!!!GO~~~ 图片九 仔细检查线路,看有没有接错,嗯~~很乱对吧?? =_= 即然是电视用的红外接收头,肯定会受电视遥控的干扰,这个只能在程序中消除干扰了,程序原理也很简单的… 这要先来研究一下电视遥控发送的红外信号….原来电视遥控发射的红外信号时会有在开始时会有9ms的同步信号(有的是4.5ms..还有的就不知道了),后面的信号时间都比9ms小,那么我们只要检测一下红外信号的如果超过15ms就不是干扰了…嗯~~很好,有思路就动手写程序吧….哈哈~程序还满简单的…. #include <REG52.H> sbit open1 = P1^1; sbit open2 = P1^2; sbit open3 = P1^3; sbit key= P1^0; sbit LED2 = P1^7; #define uchar unsigned char //定义unsigned char用uchar表示 #define uint unsigned int //定义unsigned int用uint表示 uchar a,k=0; void key_(void) ; void Timer0_Init(void); //定时器初始化 void delay_ms (uint iii) //延时子程序,每加1增加0.5ms { //iii65535 for(;iii>0;iii--) { uchar jjj=244; while(--jjj); } } //主函数 void main(void) { Timer0_Init(); //定时器初始化 open1=0; open2=0; open3=0; while(1) { if (key==0) while(!key) { a++; delay_ms (10); } if (a>2) k++; a=0; key_(); } } void key_(void) { switch(k) { case 1: open1=1; open2=0; open3=0; //delay_ms(100); break; case 2: open1=0; open2=1; open3=0; //delay_ms(100); break; case 3: open1=0; open2=0; open3=1; //delay_ms(100); break; default: open3=0; k=0; //delay_ms(100); break; } } //定时器的初始化 void Timer0_Init(void) { TH0 = 0xFF; TL0 = 0xFA; //7us TMOD = 0x01; //工作方式 ET0 = 1; //开中断 TR0 =1; //开计数器 EA = 1; } ///定时器中断 void Timer0(void) interrupt 1 { TH0 = 0xFF; TL0 = 0xFA; LED2=~LED2; }
最后:编译程序-->成功编译-->下载-->下载成功,兴奋的时刻到了,加电试验,心跳加速啊,手一滑过红外LED上面,第一个继电器吸合成功,再滑过,转到第二个继电器,再滑过就到第三个,再滑一下,全部关掉,哈哈~~成功了..就一个字..爽~~ 演示视频: flash: http://player.youku.com/player.php/sid/XMjA0MDA5MTQ0/v.swf
好多费话哦..呵呵.. 顺便问个问题.....到底如何用STC89C52精确输出38K的方波??
|