下图是遥控器,以前买学习板送的,一块多一只
左边是红外接收管,之前改装机顶盒买的,大概4毛一只
这个单片机坏了一半,P1口坏了,其它口还正常,放着一直不知道做什么,正好,拆掉多余的东西,把这个拿过来
没用的都拆掉,留个晶振
还有几个继电器,是之前拆老式的稳压电源里拆出来的,很旧,质量也不好,想扔又可惜,正好也给他用这里了,电风扇用的次数不多的,一年继电器估计也跳不到100次,所以质量差的没有关系,本来用双向可控硅最方便,但是手头没有这个东西,本着废物利用的原则,先用垃圾继电器
开拆风扇,这个没什么好看的,大家都知道里面长啥样
很简单的,三档加摇头
下面开始组装
把复位电路和5V稳压电路,贴到背面
贴片体积小,稳定可靠
正面4个三极管,用来驱动继电器
把空的地方弄掉不要
反面
这样就差不多了,找位置安装
还好风扇里面还是比较空的
位置这样摆,最右边那点小小的线路板是阻容降压,忘了拍正面照了
接线
相当乱,哈哈,扎下吧
后面空间很大,就这样吧,不影响
红外头贴在正面
试机一次成功,这下方便多了,遥控按按就可以控制了,包括风速调节,摇头,有时间还可以从程序上增加定时功能,先弄到这里
补充一下,4个继电器,最多同时工作是二个,单个电流是24ma,单片机整块是13ma,所以最多是61ma,我阻容降压的电容是1uf,万用表测量值是1.045uf
理论电流是1.04/14.5=72ma,所以够用,就没有使用变压器
谢谢大家耐心看完!
程序代码:
#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
sbit IR=P3^2; //红外接口标志
sbit J0=P3^4; //摇头继电器
sbit J1=P3^5; //一档
sbit J2=P3^6; //二档
sbit J3=P3^7; //三档
/*------------------------------------------------
全局变量声明
------------------------------------------------*/
unsigned char irtime; //红外用全局变量
bit irpro_ok,irok;
unsigned char IRcord[4];
unsigned char irdata[33];
/*------------------------------------------------
函数声明
------------------------------------------------*/
void Ir_work(void);
void Ircordpro(void);
/*------------------------------------------------
定时器0初始化
------------------------------------------------*/
void TIM0init(void)//定时器0初始化
{
TMOD=0x02;//定时器0工作方式2,TH0是重装值,TL0是初值
TH0=0x00; //重载值
TL0=0x00; //初始化值
ET0=1; //开中断
TR0=1;
}
/*------------------------------------------------
外部中断0初始化
------------------------------------------------*/
void EX0init(void)
{
IT0 = 1; //指定外部中断0下降沿触发,INT0 (P3.2)
EX0 = 1; //使能外部中断
EA = 1; //开总中断
}
/*------------------------------------------------
定时器0中断处理
------------------------------------------------*/
void tim0_isr (void) interrupt 1 using 1
{
irtime++; //用于计数2个下降沿之间的时间
}
/*------------------------------------------------
外部中断0中断处理
------------------------------------------------*/
void EX0_ISR (void) interrupt 0 //外部中断0服务函数
{
static unsigned char i; //接收红外信号处理
static bit startflag; //是否开始处理标志位
if(startflag)
{
if(irtime<63&&irtime>=33) //引导码 TC9012的头码,9ms+4.5ms
i=0;
irdata=irtime; //存储每个电平的持续时间,用于以后判断是0还是1
irtime=0;
i++;
if(i==33)
{
irok=1;
i=0;
}
}
else
{
irtime=0;
startflag=1;
}
}
/*------------------------------------------------
红外码值处理
------------------------------------------------*/
void Ircordpro(void)//红外码值处理函数
{
unsigned char i, j, k;
unsigned char cord,value;
k=1;
for(i=0;i<4;i++) //处理4个字节
{
for(j=1;j<=8;j++) //处理1个字节8位
{
cord=irdata[k];
if(cord>7) //大于某值为1,这个和晶振有绝对关系,这里使用12M计算,此值可以有一定误差
value|=0x80;
if(j<8)
{
value>>=1;
}
k++;
}
IRcord=value;
value=0;
}
irpro_ok=1; //处理完毕标志位置1
}
/*------------------------------------------------
主函数
------------------------------------------------*/
void main(void)
{
EX0init(); //初始化外部中断
TIM0init();//初始化定时器
while(1)//主循环
{
if(irok) //如果接收好了进行红外处理
{
Ircordpro();
irok=0;
}
if((IRcord[2])==0x0c) //1档开
{
J1=0;
J2=1;
J3=1;
}
if((IRcord[2])==0x18) //2档开
{
J1=1;
J2=0;
J3=1;
}
if((IRcord[2])==0x5e) //3档开
{
J1=1;
J2=1;
J3=0;
}
if((IRcord[2])==0x5a) //停止
{
J1=1;
J2=1;
J3=1;
J0=1;
}
if((IRcord[2])==0x52) //摇头(8号)
{
if(J1==0||J2==0||J3==0) //风扇不转的时候不摇头
J0=0;
}
if((IRcord[2])==0x4a) //停止摇头(9号)
{
J0=1;
}
}
}