本文最后更新于2022年7月9日,已超过 1 年没有更新,如果文章内容失效,请 反馈 给我们,谢谢!
电瓶12V NA,太阳能板18-30V左右瓦数控制在30-100W之间都行,控制器10A即可,白天有太阳的时候给电瓶充电,到了晚上电瓶提供电力给单片机及被控电灯供电。作用:实现楼上楼下双控操作,即楼下按下开关灯亮延时后关闭3秒内重复触发无效达到消除抖动,同样楼上按下开关同楼下一样。(如果把开关换成遥控比如443 315等那就更好了岂不高大尚!)
元件:
89C52RC单片机一块;
5V继电器模块一个;
光敏电阻模块一个;
12MHZ晶震一个;
30Pf陶瓷电容二个;
10uF电解电容一个;
1uF贴片电容一个(0805);
10K、470R色环电阴各一个;
200R贴片电阻一个;
太阳能板、电瓶、12V灯泡、控制器(带USB接口的那种可以直接取5V电压)各一个。
5V继电器模块一个;
光敏电阻模块一个;
12MHZ晶震一个;
30Pf陶瓷电容二个;
10uF电解电容一个;
1uF贴片电容一个(0805);
10K、470R色环电阴各一个;
200R贴片电阻一个;
太阳能板、电瓶、12V灯泡、控制器(带USB接口的那种可以直接取5V电压)各一个。
单片机程序如下我已经调试好了烧录即可以用已备注详细不懂的看注释:
/* 画面感: If(天黑了){所有部件开始干活,检测开关是否触发,如果触发给继电器信号,继电器开灯且延时关闭,循环检测开关触发} If(天亮了){所有部件关闭省电} 就这 */ #include #include #include #define uchar unsigned char //0-255 #define uint unsigned int //0-65535 /*******************★下二行设置的地方★***********************/ unsigned int delay220=43749; //15s //设置亮灯后的延时时间/继电器控制的灯 unsigned int delayrun=29166; //10s //大于此值闪烁灯/信号灯,和上面的灯同步亮灭 /*******************★下七行接线的地方★***********************/ sbit p10=P1^0;//信号灯(灯要亮它就亮灯快灭时它快闪) sbit p11=P1^1;//控制脚(继电器模块-灯/817-继电器-灯/三级管-继电器-灯)继电器模块 sbit p37=P3^7;//光敏电阻模块DU sbit p14=P1^4;//T1定时器信号灯(在晚上会一直闪证明在干活) sbit p32=P3^2;//按键三秒内触发一次不带抖动的/按一次亮,三秒内按无效,三秒后再按一次灭 sbit p33=P3^3;//重复触发中断1红外 一直触发一直亮(省略经测试有干扰) sbit p34=P3^4;//红外模块的电源开关(白天关了省电)ss8050X2(两个三脚全接一起)+1K//为啥一个8050驱动不了呢//1开0关,P34-330R-817-按钮灯 sbit test=P0^7;//测试T2的 unsigned int sum=0; //65536 Us循环一次自增一 unsigned char flagkey =0; //3秒延时触发 012三个值 //定时器T2用来延时光敏电阻间隔及抖动(长延时) unsigned int sumt2=0; //周期自增 bit sumt2_k =0; //定时开关开 bit flagldr =0; //10秒为1 unsigned int sumt2_s=0; //秒自增 unsigned int testnum=0; //测试用的 自增 /*************************定时器T0用来做闪灯不灵不灵的*******************************/ void zd0() interrupt 1 { TH0 = 0; //重新给TH1赋初值 TL0 = 0; //重新给TL1赋初值 //注意优先级的问题,这个定时器不要了太坑爹了 } /******************定时器T1的中断****************************/ /* P14闪烁能闪就是正常的啦,延时触发开关P32,灯快灭了快速闪烁P10 */ void Timer1Interrupt(void) interrupt 3 { //43749=15s 抱着表数出来的 TH1 = 0; //重新给TH1赋初值 TL1 = 0; //重新给TL1赋初值 sum++; //周期58332 20s 1ms=3.8888 if(sum%1000==0){p14=~p14;} //直观看到计时器是在动的 //按键3秒后才能重复触发(不存在抖动) if(flagkey==1){ flagkey=2; p11=~p11; if(p11==0){p10=0;}else{p10=1;} } if(sum>8750){flagkey=0;}//3s 放在外层哟 //再不走关灯了 if(p11==0){ if(sum>delayrun){ if(sum%500==0){p10=~p10;} } } //清零,关灯,关提示led拜了个拜 if(sum>delay220){sum=0;p11=1;p10=1;} } /*****************定时器T2的中断用来延时光敏电阻检测时间听说你的优先级最差最适合了*********************/ void Timer2(void) interrupt 5 { //定时1000微秒 1ms TF2=0; //溢出标志位必须软件清除 TL2=0x18; //重新给TL2赋初值 TH2=0xFC; //重新给TH2赋初值 if(sumt2_k==1){//注意注意天要黑了小子们准备火把 sumt2++; if(sumt2>=1000){sumt2_s++;sumt2=0;}//1秒了 if(sumt2_s>=10){flagldr=1;sumt2=0;sumt2_s=0;}else{flagldr=0;}//10秒置1 } //测试用 testnum++; if(testnum%1000==0){test=~test;} } /********************开关中断0**************************/ void ISR_Key(void) interrupt 0 using 1 { //104电容加1K电阻效果不错 //TR1=0;//关T0//关不掉的别想了 if(flagkey==0) { if(p32==0) { flagkey=1;sum=0; } } } /********************重复触发中断1**************************/ void IFR_Key(void) interrupt 2 using 1 { if(p33==0) { p11=0;p10=0;sum=0; } } /************设置3个定时器和2个中断*********************/ void main(void) { TMOD=0x21; //设T0为方式1,GATE=1; SCON=0x50; //定时器T2(不能停) TH2=0xFC; TL2=0x18; TR2=1; ET2=1; //定时器T1 TH1 = 0; //篮子清空 TL1 = 0; //篮子清空 //TR1=1; //开启定时器T1 ET1=1; //允许T1中断 //定时器T0 TH0=0; //篮子清空 TL0=0; //篮子清空 //TR0=1; //开启定时器T0 ET0=1; //允许T0中断 //中断0 p32 //EX0=1; //外部中断0开 IT0=1; //边沿触发 //中断1 p33 //EX1=1; //外部中断1开 IT1=1; EA=1; //开启总中断 /**********************开始表演*************************/ while(1) { if(p37==1){sumt2_k=1;if(flagldr==1){//当光敏电阻输出1时代表天黑了 sumt2_k=0; if(p37==1){//当光敏电阻隔了这么久还是输出1时代表天真的黑了 p34=1; //红外模块的电源打开歇了一天该干活了//天亮的第一次会产生一个中断不知道怎么回事 EX0=1; //外部中断0开//按键 EX1=1; //外部中断1开//红外 TR1=1; //定时器1开 //最累的 } }} else {//天亮了 能关的都给它关了吧 不做延时 TR0=0;TR1=0;EX0=0;EX1=0;p14=0;p11=1;p10=1;p34=0;//定时器0、1,中断0、1,定时器1信号灯,灯,信号灯,红外模块电源 //这里要能对准阳光就更完美了可惜太难了 } } }
原理图如下:
PCB图如下:
打版后效果图如下:
焊接后成品图如下:
在实际电路中没有用到p34的红外功能因为在实际使用中会有干扰,比如下雨的话会误触发固不用了,这个p34接口可以用来在开关上面接一个LED灯晚上开关上会亮就很容易找到开灯。白天的时候就会自动断电。为了方便用笔画了一下如下图接线即可:
说明:板子上有个单片机电源指示灯这个LED可以不用接因为和工作灯(也就是定时器信号灯)效果一样的他们一直都在亮,工作灯常亮表示单片机没有工作证明是白天,工作灯闪烁的时候就代表单片机已经开始工作了(每闪一下大概运行了60000次),还有一个灯是做警示用的在关灯的5秒内持续快速闪烁代表灯快关闭了。
注意:外接的LED在做电路图的时候没有做限流电阻需要自己加一个一般200R-1K都行,不加也一样能用问题不大。
遥控芯片灵R1A+817+8050驱动电路
本站原创