「已注销」 2020-05-29 08:54 采纳率: 0%
浏览 630
已结题

51单片机,求大神帮帮忙

了解定时器/计数器的工作原理。
掌握定时器/计数器的寄存器配置方法。
掌握定时器的使用方法。
结合按键检测和动态扫描显示实验,设计一个时钟程序。
要求:
使用8位数码管显示时、分、秒,之间用减号间隔

  • 写回答

1条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2022-09-19 16:55
    关注
    不知道你这个问题是否已经解决, 如果还没有解决的话:
    • 这篇博客: 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来说,那就是能执行几万条指令的时间


    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 9月23日

悬赏问题

  • ¥35 平滑拟合曲线该如何生成
  • ¥100 c语言,请帮蒟蒻写一个题的范例作参考
  • ¥15 名为“Product”的列已属于此 DataTable
  • ¥15 安卓adb backup备份应用数据失败
  • ¥15 eclipse运行项目时遇到的问题
  • ¥15 关于#c##的问题:最近需要用CAT工具Trados进行一些开发
  • ¥15 南大pa1 小游戏没有界面,并且报了如下错误,尝试过换显卡驱动,但是好像不行
  • ¥15 自己瞎改改,结果现在又运行不了了
  • ¥15 链式存储应该如何解决
  • ¥15 没有证书,nginx怎么反向代理到只能接受https的公网网站