了解定时器/计数器的工作原理。
掌握定时器/计数器的寄存器配置方法。
掌握定时器的使用方法。
结合按键检测和动态扫描显示实验,设计一个时钟程序。
要求:
使用8位数码管显示时、分、秒,之间用减号间隔
51单片机,求大神帮帮忙
- 写回答
- 好问题 0 提建议
- 追加酬金
- 关注问题
- 邀请回答
-
1条回答 默认 最新
关注 不知道你这个问题是否已经解决, 如果还没有解决的话:- 这篇博客: 51单片机教程:按键的定时器消抖(有延时的程序不是好程序)中的 按键消抖原理 部分也许能够解决你的问题, 相关内容:
一、首先来回顾一下按键延时消抖
按键由于是机械结构,按下的时候难免产生抖动,一般抖动会在按下的时候与松开的时候产生,抖动时间大概是10ms
于是针对按键抖动就有了延时消抖的一种简单的解决方法:二、按键消抖代码
方法一: 按下按键损耗的时间取决于按下按键到松开的时间,至少10ms,按下按键后CPU不再执行其他指令,直到按键松开,应用能力弱
代码作用:按下按键led状态取反,按下按键需要等待松开#include <reg51.h> sbit key=P1^0; //定义key为P1.0 sbit led=P2^0; //定义LED为P2.0 void delay_ms(unsigned int t) //ms延时 { unsigned int i,j; for(i=0; i<t; i++) for(j=0; j<120; j++); } void main(void) { while(1) { if(key==0) //读P1.0引脚,如果引脚为低电平,则进入if { delay_ms(10); //延时10ms消抖 if(key==0) //再次判断按键是否按下,防止干扰,增强稳定 { led = !led;//led状态改变 while(key==0);//等待按键松开,防止往下执行 } } } }
方法二: (无while)按下按键损耗的时间大约10ms,无需等待,按下按键期间可以进行其他操作,应用能力较强
代码作用:按下按键led状态取反,按下按键不需要等待松开
#include <reg51.h> sbit key=P1^0; //定义key为P1.0 sbit led=P2^0; //定义LED为P2.0 void delay_ms(unsigned int t) //ms延时 { unsigned int i,j; for(i=0; i<t; i++) for(j=0; j<120; j++); } void main(void) { int key_up=1; //按键松开标志位 while(1) { if(key==0 && key_up==1)//判断按键是否按下 { delay_ms(10);//延时消抖 key_up=0;//防止循环执行按键控制程序 if(key==0) //再次判断,排除是松开状态或外界杂波干扰 { led1=!led1; } } else if(key==1) key_up=1;//无按键按下改为松开状态 } }
可以看到,延时消抖最大的弊端就是有延时,至少要消耗10ms~20ms的时间,对于我们来说10ms或许很短,但对于一些高性能的MCU来说,那就是能执行几万条指令的时间
如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^解决 无用评论 打赏 举报- 这篇博客: 51单片机教程:按键的定时器消抖(有延时的程序不是好程序)中的 按键消抖原理 部分也许能够解决你的问题, 相关内容:
悬赏问题
- ¥15 哪位能做百度地图导航触点播报?
- ¥15 请问GPT语言模型怎么训练?
- ¥15 已知平面坐标系(非直角坐标系)内三个点的坐标,反求两坐标轴的夹角
- ¥15 webots有问题,无响应
- ¥15 使用VH6501干扰RTR位,CANoe上显示的错误帧不足32个就进入bus off快慢恢复,为什么?
- ¥15 大智慧怎么编写一个选股程序
- ¥100 python 调用 cgps 命令获取 实时位置信息
- ¥15 两台交换机分别是trunk接口和access接口为何无法通信,通信过程是如何?
- ¥15 C语言使用vscode编码错误
- ¥15 用KSV5转成本时,如何不生成那笔中间凭证