找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1575|回复: 0
打印 上一主题 下一主题
收起左侧

单片机最小系统与按键消抖

[复制链接]
跳转到指定楼层
楼主
ID:403543 发表于 2018-10-5 20:43 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
日常连载8

单片机最小系统:
  • MCU
  • 晶振
  • 复位电路
  • 电源接口
晶振:
              

有源晶振:信号质量好精度高,价格较高,依赖特定的工作电压。
无源晶振:需要外部电路,价格低,不依赖于电压(有电压就能起振),依赖电容,又称为晶体。

复位电路:
1、上电复位分析
                            2、复位时间计算  t = 1.2RC(1.2*电阻*电容)
         3、手动复位分析
  • 1.2*4700*0.0000001=564us
图中R60是当按键按下的一瞬间,电容需要放电,如果没有这个电阻,会产生很大的电流产生电磁干扰,降低系统的稳定性,故加了这个电阻给电容放电保持系统的稳定。

按键消抖的更优方法1:
http://www.360doc.com/showweb/0/0/782209534.aspx(在此网址有详细介绍,这里只作简短介绍)


单片机源程序:

  1.     /*————备注:———————*
  2.     平台:Keil4  STC89C52RC  
  3.     功能:
  4.     作者:西片                                         
  5.     联系方式:18724145220@163.com
  6.     日期:2018/ /                     
  7.     备注: 晶振12MHz
  8.           更有效率的消抖方法                                    
  9.     *——————————————————*/  
  10.    
  11.    
  12. //====头文件定义===*  
  13. #include<reg52.h>  
  14. #include<intrins.h>   
  15. //=================*  
  16.    
  17.    
  18. //====宏定义=======*  
  19. #define uchar unsigned char  
  20. #define uint unsigned int  
  21. //=================*  
  22.    
  23.    
  24. //====引脚说明=====*  
  25. sbit LSA=P2^2;  
  26. sbit LSB=P2^3;  
  27. sbit LSC=P2^4;  
  28. sbit key1=P1^7;//将矩阵键盘变为独立按键,让第一行的按键左端均为低电平,然后通过列的一个高低电平判断按键是否按下  
  29. sbit KEY=P1^3;//第一个按键对应的列  
  30. //=================*  
  31.    
  32. bit KeySta=1;//按键状态标志位  
  33.    
  34. //====全局变量=====*  
  35. //=================*  
  36.    
  37.    
  38. //====编码数组=====*  
  39. uchar code smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,  
  40.                          0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};//0~F,加无显示码  
  41. //=================*  
  42.    
  43.    
  44. //====定时器0设定==*  
  45. void SetT0()  
  46. {  
  47.      TMOD=0x01;  
  48.      TH0=0xf8;  
  49.      TL0=0x30;  
  50.      EA=1;  
  51.      ET0=1;  
  52.      TR0=1;  
  53. }  
  54. //=================*  
  55.    
  56.    
  57. //====要添加的函数=*  
  58. //=================*  
  59.    
  60.    
  61. //====主函数=======*  
  62. void main()  
  63. {         
  64.      bit backup = 1;//备份上一次的状态,判断状态是否变化,和怎样变化。从0到1表示已经松开,从1到0表示在按下  
  65.      uchar cnt=0;  
  66.      LSA=0;  
  67.      LSB=0;  
  68.      LSC=0;//点亮第一个数码管(最右边的)  
  69.      key1=0;  
  70.      P0=smgduan[cnt];  
  71.      SetT0();  
  72.      while(1)      
  73.      {  
  74.          if(KeySta != backup)  
  75.         {  
  76.              if(backup == 0) //从0到1的变化表示按键已经松开,可以执行操作  
  77.              {  
  78.                  cnt++;  
  79.                  if(cnt >= 16)  
  80.                  {  
  81.                      cnt = 0;  
  82.                  }  
  83.                  P0 = smgduan[cnt];  
  84.              }  
  85.              backup = KeySta;//记录上一次的状态留作下一次的对比  
  86.         }      
  87.      }  
  88. }  
  89. //=================*  
  90.    
  91.    
  92. //====定时器0中断==*  
  93. void Timer0()interrupt 1  
  94. {     
  95.      static uchar keybuf = 0xFF;//定义一个静态变量以记录按键8次状态是否都相同,相同则为稳定态,认定不是抖动。按键扫描缓冲区,保存一段时间内的扫描值。  
  96.    
  97.      TH0=0xf8;//每2ms刷新一次状态记录,刷新8次即可得到一个字节(8次)的状态(由于人按下按键的最快时间一般不低于20ms,所以16ms可以满足检测)  
  98.      TL0=0x30;  
  99.    
  100.     keybuf = (keybuf <<1) |KEY;//移位加或进行状态记录      
  101.     if(keybuf == 0x00)//八位全为0为按下转态  
  102.     {  
  103.         KeySta = 0;  
  104.     }  
  105.     else if(keybuf == 0xFF)//八位全为1认为弹起状态  
  106.     {  
  107.         KeySta = 1;  
  108.     }  
  109.     else//其余情况KeySta不变,认为抖动状态  
  110.     {  
  111.     }  
  112.   
  113. }  
  114. //=================*  
复制代码

完整的Word格式文档51黑下载地址:
08-单片机最小系统和消抖.docx (222.77 KB, 下载次数: 10)


评分

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

查看全部评分

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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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