找回密码
 立即注册

QQ登录

只需一步,快速开始

帖子
查看: 5501|回复: 2
打印 上一主题 下一主题
收起左侧

C51单片机按键去抖外部中断开关机(低功耗模式)

[复制链接]
跳转到指定楼层
楼主
ID:416501 发表于 2018-10-27 22:50 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
单片机C语言,适合于初学者。

低功耗模式的按键去抖开关机

单片机源程序如下:


  1. #include <reg52.h>


  2. sbit KEY4 = P3^2;


  3. unsigned char code LedChar[] =
  4. {                          //定义表格一定要使用code,这样会做到程序存储区中
  5.     0x3F,                  //表格第1步数据0b00111111
  6.     0x06,                  //表格第2步数据0b00000110
  7.     0x5B,                  //表格第3步数据0b01011011
  8.     0x4F,                  //表格第4步数据0b01001111
  9.     0x66,                  //表格第5步数据0b01100110
  10.     0x6D,                  //表格第6步数据0b01101101
  11.     0x7D,                  //表格第7步数据0b01111101
  12.     0x07,                  //表格第8步数据0b00000111
  13.     0x7F,                  //表格第9步数据0b01111111
  14.     0x6F,                  //表格第10步数据0b01101111
  15. };
  16. bit KeySta = 1;  //当前按键状态
  17. unsigned char Ke;  

  18. void main()
  19. {
  20.     bit backup = 1;  //按键值备份,保存前一次的扫描值
  21.     unsigned char cnt = 0;  //按键计数,记录按键按下的次数
  22.    
  23.     EA = 1;       //使能总中断
  24.     TMOD = 0x01;  //设置T0为模式1
  25.     TH0  = 0xF8;  //为T0赋初值0xF8CD,定时2ms
  26.     TL0  = 0xCD;
  27.     ET0  = 1;     //使能T0中断
  28.     TR0  = 1;     //启动T0
  29.     P0 = LedChar[cnt];   //显示按键次数初值
  30.        
  31.     while (1)
  32.     {
  33.         if (KeySta != backup)  //当前值与前次值不相等说明此时按键有动作
  34.         {
  35.             if (backup == 0)   //如果前次值为0,则说明当前是弹起动作
  36.             {
  37.                 cnt++;
  38.                                         P0=0;
  39.                                        
  40.                                         if(Ke==0)
  41.                                         {
  42.                                         IT0 = 1;                 //外部中断0为下降沿触发
  43.                                         EX0 = 1;           //使能总中断
  44.                                         EA = 1;
  45.                                         PCON=0x02;
  46.                                         }
  47.                                         Ke++;
  48.                                         if(Ke==2) Ke=0;
  49.                                 //        else if(Ke!=1) Ke=0;
  50.                 if (cnt >= 10)
  51.                 {              //只用1个数码管显示,所以加到10就清零重新开始
  52.                     cnt = 0;
  53.                                
  54.                 }
  55.                 P0 = LedChar[cnt];  //计数值显示到数码管上
  56.             }
  57.             backup = KeySta;   //更新备份为当前值,以备进行下次比较
  58.         }
  59.     }
  60. }
  61. /* T0中断服务函数,用于按键状态的扫描并消抖 */
  62. void InterruptTimer0() interrupt 1
  63. {
  64.     static unsigned char keybuf = 0xFF;  //扫描缓冲区,保存一段时间内的扫描值
  65.    
  66.     TH0 = 0xF8;  //重新加载初值
  67.     TL0 = 0xCD;
  68.     keybuf = (keybuf<<1) | KEY4;  //缓冲区左移一位,并将当前扫描值移入最低位
  69.     if (keybuf == 0x00)
  70.     {   //连续8次扫描值都为0,即16ms内都只检测到按下状态时,可认为按键已按下
  71.         KeySta = 0;
  72.     }
  73.     else if (keybuf == 0xFF)
  74.     {   //连续8次扫描值都为1,即16ms内都只检测到弹起状态时,可认为按键已弹起
  75.         KeySta = 1;
  76.     }
  77.     else
  78.     {}  //其它情况则说明按键状态尚未稳定,则不对KeySta变量值进行更新
  79. }
  80. void int0() interrupt 0
  81. {
  82. PCON=0;//唤醒单片机

  83. }
复制代码

所有资料51hei提供下载:
按键去抖开关机.rar (27.78 KB, 下载次数: 43)


评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

举报

沙发
ID:1 发表于 2018-10-31 17:03 | 只看该作者
好资料,51黑有你更精彩!!!
回复

举报

板凳
ID:711438 发表于 2020-3-24 22:48 | 只看该作者
有电路图吗?
回复

举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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