找回密码
 立即注册

QQ登录

只需一步,快速开始

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

51单片机定时器延迟按键的奇怪问题

[复制链接]
跳转到指定楼层
楼主
ID:718523 发表于 2024-1-19 20:33 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
下面的程序是对的没有错误,有一个疑惑: 在定时器中断子程序中我把 if(flagkey==0){ 改成 if(flagkey==1) 就不正常,这是什么原因呀,正常不是应该就等于1吗?在检定按键程序里

if(p01 == 0){
          flagkey=1;
          TR0 = 1;//这里才是要进中断的地方呀为什么就不正常呢
          }
          else{
                            flagkey=0; //为什么这个正常
                  }

单片机源程序如下:
  1. /*------------定时器----------------*/
  2. void Timer0Init(void)                //10Ms
  3. {
  4.         TMOD = 0x01;
  5.     TH0 = 0x0D8;
  6.     TL0 = 0x0F0;
  7.     EA = 1;
  8.     ET0 = 1;
  9.     //TR0 = 1;
  10. }

  11. /*------------检察按键----------------*/  
  12. void anjian(void)
  13. {
  14.           if(p01 == 0){// 检测按键是否按下
  15.           flagkey=1;
  16.           TR0 = 1;//按键按下开始计时,溢出后中断
  17.           }
  18.           else{
  19.                             flagkey=0;
  20.                   }
  21. }

  22. /*------------主程序----------------*/
  23. void main()
  24. {
  25.   Timer0Init(); //定时器初始化  
  26.         while(1)
  27.         {            
  28.                         anjian();                         //检察按键
  29.         }
  30. }




  31. /*------------定时器中断子程序----------------*/
  32. void Timer0Interrupt(void) interrupt 1{
  33. if(flagkey==0){      //改成if(flagkey==0){程序就有问题if(flagkey==0){
  34. flagkey=999;        
  35. Timer0Init_count ++;
  36. if(Timer0Init_count>5){
  37. TR0 = 0;//关定时器
  38. TH0 = 0x0D8;//赋初值
  39. TL0 = 0x0F0;

  40. P10 = ~P10;
  41. }}

  42. }
复制代码

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

使用道具 举报

沙发
ID:275826 发表于 2024-1-20 08:28 | 只看该作者
程序不完整
回复

使用道具 举报

板凳
ID:192020 发表于 2024-1-20 09:16 | 只看该作者
试下改成if(flagkey==1)时,按按键久一点什么效果
回复

使用道具 举报

地板
ID:226055 发表于 2024-1-20 10:14 | 只看该作者
    1、软件IO口判断是否为1取决于硬件电路。
    2、你需要把硬件电路按键检测部分上下图,脱离硬件的软件设计是危险的。
回复

使用道具 举报

5#
ID:1080331 发表于 2024-1-20 11:02 | 只看该作者
根据你提供的代码,在定时器中断子程序中,你将 if(flagkey==0) 改为了 if(flagkey==1)。这导致程序出现问题的原因是,flagkey 的初始值为0,当按键按下时,会将 flagkey 设置为1,然后开启定时器。而在定时器中断子程序中,你判断 flagkey 是否为0,如果不为0,则执行相应的操作。

因此,当你将 if(flagkey==0) 改为了 if(flagkey==1) 时,定时器中断子程序只有在 flagkey 的值为1时才会执行相应的操作。但是根据你提供的代码逻辑,在按键按下后,会将 flagkey 设置为1,并开启定时器,所以此时 flagkey 的值应该是1。

因此,将 if(flagkey==0) 改为 if(flagkey==1) 会导致定时器中断子程序无法执行相应的操作,从而导致程序异常。你可以将 if(flagkey==0) 改回来,以恢复正常运行的状态。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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