51单片机触摸灯

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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;

相关文档
最新文档