设为首页收藏本站淘宝杂货铺

从F到0 - From F to 0

 找回密码
 注册已关闭
搜索
查看: 1055|回复: 0
收起左侧

STC单片机 互锁开关 两个按键控制1个LED亮灭 带掉电模式+外部中断 定时器中断消抖

[复制链接]
发表于 2021-11-22 19:29:22 | 显示全部楼层 |阅读模式
原理图.png
单片机型号:STC任意 晶振频率:6Mhz
本例程使用定时器中断识别按键事件并进行消抖,带看门狗喂狗。
硬件连接:LED:P3.4与100R电阻与VCC 开按键:P3.2与GND 关按键:P3.3与GND
开按键按下后,LED点亮,关按键按下后,LED熄灭,按键松开后,进入掉电模式,任意一个按键按下后唤醒外部中断。
P3.2与P3.3如需更改为其他IO口,必须支持外部中断才可以,否则无法唤醒掉电模式。
  1. #include "STC15.h"
  2. #include "intrins.h"
  3. #define u8 unsigned char
  4. #define u16 unsigned int
  5. #define feed_dog() WDT_CONTR |= 0x10        //看门狗喂狗
  6. sbit LED = P3 ^ 4;                  //LED (低电平点亮)
  7. sbit sKEY_on = P3 ^ 2;              //按下打开
  8. sbit sKEY_off = P3 ^ 3;             //按下关闭
  9. bit KEY_on = 1;
  10. bit KEY_off = 1;
  11. void main() {
  12.     WDT_CONTR = 0x27;   //开看门狗
  13.     TMOD = 0x01;
  14.     TH0 = 0xFE;
  15.     TL0 = 0x0C;
  16.     IT0 = 1;            //INT0下降沿唤醒
  17.     IT1 = 1;            //INT1下降沿唤醒
  18.     EX0 = 1;            //开INT0中断
  19.     EX1 = 1;            //开INT1中断
  20.     EA = 1;             //开总中断
  21.     ET0 = 1;            //开定时器0中断
  22.     TR0 = 1;            //开定时器0计时
  23.     LED = 1;            //初始灭灯
  24.     while (1) {
  25.         feed_dog();
  26.         if (KEY_on == 0) {
  27.             LED = 0;
  28.             while (KEY_on == 0) {
  29.                 feed_dog();
  30.             }
  31.         }

  32.         if (KEY_off == 0) {
  33.             LED = 1;
  34.             while (KEY_off == 0) {
  35.                 feed_dog();
  36.             }
  37.         }
  38.     }
  39. }

  40. void exint0() interrupt 0 {      //INT0(P3.2)外部中断入口
  41.     _nop_(); _nop_();
  42.     _nop_(); _nop_();
  43. }

  44. void exint1() interrupt 2 {      //INT1(P3.3)外部中断入口
  45.     _nop_(); _nop_();
  46.     _nop_(); _nop_();
  47. }

  48. void Timer0Interrupt() interrupt 1 {    //6Mhz 1mS定时器中断
  49.     static u8 KEYon_ms, KEYoff_ms;
  50.     TH0 = 0xFE;
  51.     TL0 = 0x0C;
  52.     if (sKEY_on && sKEY_off) {
  53.         PCON |= 0x02;
  54.         _nop_(); _nop_();
  55.         _nop_(); _nop_();
  56.     } else {
  57.         if (sKEY_on) {
  58.             KEYon_ms = 0;
  59.         } else {
  60.             if (KEYon_ms != 0xFF) {
  61.                 KEYon_ms++;
  62.             }
  63.         }

  64.         if (sKEY_off) {
  65.             KEYoff_ms = 0;
  66.         } else {
  67.             if (KEYoff_ms != 0xFF) {
  68.                 KEYoff_ms++;
  69.             }
  70.         }
  71.     }
  72.     KEY_on = !(KEYon_ms >= 25);
  73.     KEY_off = !(KEYoff_ms >= 25);
  74. }
复制代码

相关帖子

您需要登录后才可以回帖 登录 | 注册已关闭

本版积分规则

QQ|手机版|Archiver|从F到0 ( 蒙ICP备17002595号-1 )
蒙公网安备15010402000325号

腾讯云安全认证

GMT+8, 2024-3-29 19:40 , Processed in 0.441025 second(s), 22 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表