51单片机触摸灯
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
单片机触摸灯
在朋友那看到有一个触摸的台灯,感觉挺好玩的,突发奇想,想趁今天没事做一个玩玩,正好手边有几个STC的8脚单片机,足够做这个了,说做就做,顺便把过程发上来和网友们分享下,电路焊接、程序编写测试,中间经历了一波三折,终究还是在一天完成了,好了,话就不多说了。
————刘辉实现功能:单个触摸按键实现3W LED灯的开启、关闭、PWM无极调光、闪亮
LED不亮时短按触摸键点亮LE D,长按闪亮,闪亮时长按调闪亮的亮度;LED亮的时候短按关闭,长按调节亮度。本来还想加上连按进入呼吸灯的,结果可能程序有些问题,很容易引起误操作,又删掉了
硬件电路设计:
单片机选用STC的STC15f104W单片机,该单片机有为51内核1T指令5V单片机,8脚封装,128B RAM 4KFlash,1K E2PROM,含两个可自动重装初值的16位定时器(PS:是定时器0和定时器2,别弄错了。想不明白姚永平到底怎么想的,留了T2却把T1删了)有掉电和空闲模式,不含ADC、PWM还有串口。
LED灯功率为3W电压3V,试过加到3.3V只要散热跟得上没什么问题,最亮时电流1A左右,本来想的用一节手机锂电池供电做来着,但是单片机3.3V供电无法正常工作o(>_<)o ~~只好改用5V加个3.3V稳压了。LED亮度采用PWM调节,单片机产生PWM波驱动三极管控制LED灯的亮灭时间,达到调节亮度的目的,由于单片机本身无PWM模块,只能用软件模拟了,频率选择100Hz左右,8位。
然后是触摸按键,这是触摸按键的仿真,方波V1的频率本来不想选的很大,频率10K,电阻兆欧级的然后用AD检测电压就行了,但是这个单片机没有ADC,又不想加电压比较器让电路变复杂,只能提高频率,100K比较合适,不按时输出电压4V,触摸时输出0.4V,单片机很容易检测到。但是单片机在2M主频下(为了节省功耗,下边会细说)用定时器产生100K的方波,再加上定时器模拟PWM输出,主程序基本上做不了什么了,还好stc15F104W可以输出内部RC时钟,只是最小只能RC时钟4分频,
也就是1.3MHz(单片机为内部RC时钟,最低可选5.5MHz),只能硬着头皮选这个频率了,经过仿真和实际测试,方波1.3MHz下R1、R3选择51k和510k输出还算不错,从仿真上看,不按时电压将近4V,触摸时电压0.7V,在单片机上刚好是高电平和低电平响应时间1.9ms,这样单片机不会误判,OK就这个了。
再然后就是怎么焊接了,在洞洞板上要焊的尽量小,不跳线,就用AD画了个嘿嘿,栅格用的100mil 刚好洞洞板的间距,额。。。(ーー;)好像大材小用了点。三极管8550发射极撇长点,中间走一根线没什么问题,呵呵。。。
再然后就是焊接了,洞洞板放的太时间长了,焊的不好勿怪哈,啦啦啦。。。。。。。。。。。。。。
电路焊接好后测试没什么问题,接下来就是程序咯,因为我想尽量降低触摸灯的功耗,也就是灯不亮的时候消耗的电流更小,所以单片机的RC时钟选择了5.5296MHz(最小的了),stc15f104W加上触摸按键在5.5296M主频下消耗电流大概8mA,而在2.7648M主频下电流小了0.5mA,所以系统时钟频率选择了RC 时钟2分频也就是2.7648MHz。
为了达到更低的功耗,使用了stc15f104w的空闲模式。空闲模式下除不给CPU提供系统时钟,CPU
不执行指令外,其余部件功能全部。也就是内部RC时钟还会向外提供频率输出,这样不会影响触摸按键的正常使用,而退出空闲模式也很简单,任意一个外部中断都可以唤醒单片机,所以把触摸按键接到了单片机的INT0也就是P3.3引脚。经测试电流降到了4.2mA左右,和一个普通LED的耗电量差不多了`(*∩_∩*)′,和典型功耗1.9mA还有一定差距,估计就是电容按键的消耗了。
感觉这个耗电还是稍微有点大了,于是想到了单片机还有一个功耗更低的掉电模式,但是进入掉电模式后内部RC时钟停振,触摸按键也就不能用了。这个还是能解决的,让单片机间歇的工作不就行了吗,继续改,选择每500ms唤醒单片机工作100ms用来检测按键,理论上讲应该是正常工作耗电量的1/4了吧,但是不知道什么原因,经过测试耗电量依然高达4.5mA。唉,,,头疼,继续加大,选择1秒唤醒单片机工作100ms,测试工作电流降到了3.3mA,但这又引来了一个问题,由于每秒钟单片机只工作了100ms,所以短按有的时候会检测不到,必须按1秒准确响应,唉,算了,为了可靠响应还是选择空闲模式吧,等以后有时间在慢慢改吧。回头买些3.3V的stc15L104w,再把稳压去掉试试。。
程序流程图:
程序:
程序也放上来吧,程序也就几十行,根据流程图写也挺简单的,单片机的资源占用也不大,RAM占用12.3字节,FLASH占用也就320字节,用stc15f101W也完全可以,甚至0.5k FLASH的stc15f100也够用了。
#include
#include "intrins.h"
typedef unsigned char uchar;
typedef unsigned int uint;
//#define P3Set_IO(x) P3M1&=~(1< //#define P3Set_PP(x) P3M1&=~(1< //#define P3Set_IN(x) P3M1|=1< //#define P3Set_OD(x) P3M1|=1< sbit KEY = P3^2; sbit PWM_Out = P3^5; //#define TRUN_1T //#define SYSTEM_CLOCK 5.5296f #define Up 1 #define Down 0 bit bKEY_Flag = Up; #define ON 1 #define OFF 0 #define bLightSwitch TR0 uchar ucHighDuty = 150; #define Sycle 200 void Delay(uchar xms) { unsigned char i; do{ while(i--); }while(xms--); } void T0_ISR() interrupt 1 { static uchar Count; Count++; if(Count>ucHighDuty&&PWM_Out==1) PWM_Out = ~PWM_Out;