STC15F104E做的LED小台灯(USB供电+3级触摸调光+掉电记忆)

16 篇文章 1 订阅

STC15F104E做的LED小台灯(USB供电+3级触摸调光+掉电记忆)

主要特点:
3级亮度(就是亮1、2、3个LED,非PWM无闪烁)
触摸控制(本来是做电容式的,实际上需要触碰到电极)
掉电状态记忆(比如亮2个LED,拔掉电再插上还是亮2个)
低功耗(手上只有104E用的空闲模式,如果用104W可以在掉电模式定时唤醒)

操作方法:
每次触摸切换灯状态(关 - 1个亮 - 2个亮 - 3个亮 - 关),长触摸直接关。

电路很简单,上图:
 
LED功率不大直接用IO驱动的,如果是大功率LED可以加MOS管驱动,这里简单起见没加。
触摸按键是经典的RC充放电(姑且认为是吧),R5起到一定保护作用。

触摸按键代码参考了论坛一个帖子,当时没记链接,抱歉:

  1. // 测量引脚电平上升时间
  2. static uint8_t Touch_Mes(void)
  3. {
  4.     uint8_t i;

  5.     KEY_TOUCH = 0;  // 拉低TOUCH口

  6.     // 确保TOUCH口已经拉低,i控制溢出
  7.     for (i = 255; i != 0; i--);
  8.     for (i = 1; KEY_TOUCH && i; i++);

  9.     TH0 = 0;        // 初始化TH0为0
  10.     TL0 = 0;        // 初始化TL0为0
  11.     TR0 = 1;        // 启动定时器
  12.     KEY_TOUCH = 1;  // 释放TOUCH口,此时TOUCH会慢慢升高电平
  13.     // 等待电平升高到单片机所认为的高电平,i控制溢出
  14.     for (i = 1; !KEY_TOUCH && i; i++);
  15.     TR0 = 0;        // 停止计数器

  16.     return TL0;
  17. }
复制代码


掉电记忆使用Flash一个扇区模拟EEPROM,有简易的磨损均衡算法:
  1. // 保存配置
  2. static void SaveCfg(void)
  3. {
  4.     uint16_t i;
  5.     uint8_t dat;

  6.     // 每次从扇区前面往后存,直到扇区全满时擦除重来
  7.     for (i = 0; i < IAP_SEC_SIZE; i++) {
  8.         dat = IAP_ReadByte(IAP_ADDR_BASE + i);
  9.         if (dat == 0xff) {
  10.             IAP_ProgramByte(IAP_ADDR_BASE + i, gLightStatus);
  11.             return;
  12.         }
  13.     }

  14.     // 扇区全满
  15.     IAP_EraseSector(IAP_ADDR_BASE);
  16.     IAP_ProgramByte(IAP_ADDR_BASE, gLightStatus);
  17. }

  18. // 读取配置
  19. static void LoadCfg(void)
  20. {
  21.     uint16_t i;
  22.     uint8_t dat;

  23.     // 从扇区后面往前查找最近的配置
  24.     for (i = IAP_SEC_SIZE; i > 0; i--) {
  25.         dat = IAP_ReadByte(IAP_ADDR_BASE + i - 1);
  26.         if (dat < LED_STATUS_MAX) {
  27.             gLightStatus = dat;
  28.             return;
  29.         }
  30.     }

  31.     gLightStatus = LED_STATUS_1;
  32. }
复制代码


再贴几张实物照片:
 
 
 
直接飞线的看起来有点乱,触摸位置就是尾部粘的那块铝箔。

  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值