找回密码
 立即注册

QQ登录

只需一步,快速开始

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

关于单片机定时器定时问题

[复制链接]
跳转到指定楼层
楼主
ID:1002906 发表于 2022-2-19 00:07 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
刚学定时器,需要写一个程序,就是按下S2(代码里面的key1)之后让led灯全亮,定时器定时5s之后让led灯全部熄灭。我这样子写发现并不能熄灭,有没有人给说一下问题并且给个思路?
  1. #include <reg52.h>
  2. #include <intrins.h>

  3. sbit key1=P3^0;

  4. void delay(unsigned char z)//zms延时
  5. {
  6.         unsigned char i, j;
  7.         while(z>0)
  8.         {
  9.                 _nop_();
  10.                 i = 2;
  11.                 j = 199;
  12.                 do
  13.                 {
  14.                         while (--j);
  15.                 } while (--i);
  16.                 z--;
  17.         }
  18. }

  19. void timer0Init()  //50ms
  20. {
  21.         TR0=1;
  22.         TMOD=0X01;
  23.         TH0=(65535-46082)/256;
  24.         TL0=(65535-46082)%256;
  25. }
  26. void main()
  27. {
  28.         unsigned char msec;
  29.         timer0Init();
  30.         while(1)
  31.         {
  32.                 if(key1==0)
  33.                 {       
  34.                         delay(20); //消抖
  35.                         if(key1==0)
  36.                                 P1=0x00;       
  37.                         if(TF0==1)
  38.                         {
  39.                                 TF0=0;
  40.                                 msec++;
  41.                                 TH0=(65535-46082)/256;
  42.                                 TL0=(65535-46082)%256;
  43.                                 if(msec==100)
  44.                                         P1=0XFF;                       
  45.                         }       
  46.                         while(!key1) ;//松手检测               
  47.                 }
  48.         }
  49. }

复制代码


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

使用道具 举报

沙发
ID:161164 发表于 2022-2-19 09:20 | 只看该作者

  1. void main()
  2. {
  3.         unsigned char msec;
  4.         while(1)
  5.         {
  6.                 if(key1==0)
  7.                 {      
  8.                         delay(20); //消抖
  9.                         if(key1==0)        
  10.                                 while(!key1) ;//松手检测
  11.                                 P1=0x00;
  12.                                 timer0Init();               
  13.                 }      
  14.                         if(TF0==1)
  15.                         {
  16.                                 TF0=0;
  17.                                 msec++;
  18.                                 TH0=(65535-46082)/256;
  19.                                 TL0=(65535-46082)%256;
  20.                                 if(msec==100)
  21.                                 {
  22.                                         P1=0XFF;                       
  23.                                         TR0 = 0;                        
  24.                                         msec=0;                     
  25.                                  }
  26.                         }
  27.         }
  28. }
复制代码
回复

使用道具 举报

板凳
ID:1002906 发表于 2022-2-19 09:40 | 只看该作者

这样子是解决了,不过这个 timer0Init() 写在unsigned char msec前面和卸载您的这个位置有什么区别?
回复

使用道具 举报

地板
ID:625730 发表于 2022-2-19 10:05 | 只看该作者
因为你的if(TF==1)语句嵌套在if(key1==0)里面了,松开按键后,灯亮了,如果不再按键就不会再进入if(TF==1)条件语句里。下面的程序把两个if语句并列了,都会被执行到。
回复

使用道具 举报

5#
ID:1002906 发表于 2022-2-19 10:52 | 只看该作者
TEC 发表于 2022-2-19 10:05
因为你的if(TF==1)语句嵌套在if(key1==0)里面了,松开按键后,灯亮了,如果不再按键就不会再进入if(TF==1) ...

谢谢,我明白了,不过那个 timer0Init() 我写在unsigned char msec 前面和楼上写的位置有什么区别?另外,如果我把timer0Init 写在两个if中间为什么也不对?
回复

使用道具 举报

6#
ID:161164 发表于 2022-2-19 12:50 | 只看该作者
AnRan_ 发表于 2022-2-19 10:52
谢谢,我明白了,不过那个 timer0Init() 我写在unsigned char msec 前面和楼上写的位置有什么区别?另外 ...

你弄明timer0Init ()里那几句代码的意思就知到为什么了
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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