找回密码
 立即注册

QQ登录

只需一步,快速开始

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

51单片机能不能利用定时器做一个不规则的LED闪烁?

[复制链接]
跳转到指定楼层
楼主
比如不是要那种1秒闪一秒灭那种,而是那种0.4秒亮。1.6秒灭那种.自己找了些程序想做参考,但基本都是那种比较固定的亮灭正好相反的那种。并且在Protest动态帧运的时间计时是不是刚开始有个延迟?我现在在想的时两个计时一个负责灭一个负责亮

单片机源程序如下:
#include<reg52.h>
sbit led=P1^0; //声明一个用于测试的led灯
unsigned char one;
unsigned char two;
void main()
{
TMOD=0x01; //声明定时器的工作方式M1=0,M0=1
                                         //装入初始值,即计满所装的数时,就会溢出
TH0=(65536-45872)/256;
TL0=(65536-45872)/256;
EA=1;  //开启全局中断允许
ET0=1; //开启定时器0中断允许
TR0=1; //开启定时器0
while(1); //让程序一直循环下去,中断也不断产生

}
                        //中断函数
  void  T_Time() interrupt 2
  {
        TH0=(65536-45872)/256;                                //重装初值
        TL0=(65536-45872)/256;
        one++;
                                two++;               
        if(one==4)                 //当number=20时,即为1s
         {
          one=0;                                          //把number置0,重新计数
          led=1;                         //使led灯每隔1s亮一次
         }
                                else(two==16);
                                 {
                                        two=0;
                                        led=0;
                                 }
  }
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:97554 发表于 2021-1-7 15:32 | 只看该作者
WHILE(1)
{
LED = 1;
DELAY 0.4S;
LED = 0;
DELAY 1.6S;
}

不行?
回复

使用道具 举报

板凳
ID:752974 发表于 2021-1-7 15:38 | 只看该作者
用一个定时器即可,设定时时间10ms。计时开始LED亮,计到40关灯,计到160,计数清零,重新计数,LED亮,。。。如此。
回复

使用道具 举报

地板
ID:874595 发表于 2021-1-7 15:49 | 只看该作者

这样是不是就不去利用中断计时器去计时吗?
回复

使用道具 举报

5#
ID:874595 发表于 2021-1-7 15:50 | 只看该作者
munuc_w 发表于 2021-1-7 15:38
用一个定时器即可,设定时时间10ms。计时开始LED亮,计到40关灯,计到160,计数清零,重新计数,LED亮,。 ...

我也是这么想的,但我没搞懂后面应该是怎么些,倒是能看的懂一些常见亮1秒灭一秒的案例代码,但自己搞不懂怎么修改成我想要的那种计时效果
回复

使用道具 举报

6#
ID:874595 发表于 2021-1-7 16:00 | 只看该作者
能否问下后续应该怎么修改,因为这一段一直没搞懂,只知道个大概,找了几个示例程序修改也一直没搞出想要的效果,编译也能过,但编译出来的HEX文件没有那种效果
回复

使用道具 举报

7#
ID:874595 发表于 2021-1-7 16:01 | 只看该作者
C:\Users\Mr.Z\Pictures\Screenshots这是protest的仿真图
回复

使用道具 举报

8#
ID:874595 发表于 2021-1-7 16:05 | 只看该作者
这是Proteus的仿真设计图,用的AT89C51,想修改成利用中断计时器去进行LED灯亮2灭1那种的自由设定的参数,求解后续该怎么修改。

屏幕截图(6).png (172.61 KB, 下载次数: 91)

屏幕截图(6).png
回复

使用道具 举报

9#
ID:874595 发表于 2021-1-7 16:10 | 只看该作者
仿真电路图

屏幕截图(6).png (172.61 KB, 下载次数: 103)

屏幕截图(6).png
回复

使用道具 举报

10#
ID:213173 发表于 2021-1-7 16:16 | 只看该作者
用定时器作LED不对称闪烁当然没有问题,楼主T0中断号错了!改这样就能实现楼主目的。

void  T_Time() interrupt 1
{
        TH0=(65536-45872)/256;//重装初值
        TL0=(65536-45872)/256;
        one++;            
        if(one>=40)//2s周期
                one=0;

        if(one<=8)
                led=0;//亮0.4s
        else led=1;//熄1.6s
}
回复

使用道具 举报

11#
ID:831068 发表于 2021-1-7 16:16 | 只看该作者
迷鹿的夏夜 发表于 2021-1-7 16:00
能否问下后续应该怎么修改,因为这一段一直没搞懂,只知道个大概,找了几个示例程序修改也一直没搞出想要的 ...

        one++;                           
        if(one<=4)            
         {        
          led=1;                         //led灯亮
         }
         else if(one<=16)
       {
        led=0;  
      }
      else
     {
       one=0;//把number置0,重新计数
     }
                  
回复

使用道具 举报

12#
ID:714744 发表于 2021-1-7 16:27 | 只看该作者
要是满足04秒亮1.6灭,我这边建议的话用PWM波进行控制,一个周期为2秒,高电平(低电平)为0.4秒,低电平(高电平)1.6秒,这种方法和用PWM控制步进电机转速的方法有点像
回复

使用道具 举报

13#
ID:874595 发表于 2021-1-7 16:29 | 只看该作者
wulin 发表于 2021-1-7 16:16
用定时器作LED不对称闪烁当然没有问题,楼主T0中断号错了!改这样就能实现楼主目的。

void  T_Time() in ...

非常感谢,大概明白是具体什么工作原理,并且也算是记住了~波浪号是用来取反的,非常感谢
回复

使用道具 举报

14#
ID:874595 发表于 2021-1-7 16:30 | 只看该作者
ggyu7 发表于 2021-1-7 16:27
要是满足04秒亮1.6灭,我这边建议的话用PWM波进行控制,一个周期为2秒,高电平(低电平)为0.4秒,低电平( ...

嗯,会借鉴参考了,已经解决了,但仍感谢提出的参考意见。
回复

使用道具 举报

15#
ID:874595 发表于 2021-1-7 16:30 | 只看该作者
munuc_w 发表于 2021-1-7 15:38
用一个定时器即可,设定时时间10ms。计时开始LED亮,计到40关灯,计到160,计数清零,重新计数,LED亮,。 ...

已经解决了,感觉提出的意见参考
回复

使用道具 举报

16#
ID:874595 发表于 2021-1-7 16:31 | 只看该作者
chaoge131 发表于 2021-1-7 16:16
one++;                           
        if(one

谢谢提供的修改意见
回复

使用道具 举报

17#
ID:714744 发表于 2021-1-7 16:32 | 只看该作者
其实的话我感觉不用定时器也是可以的,就是用PWM波进行时间点的控制,要是想0.4秒亮,1.6秒灭。可以设置一个周期为两秒的方波,其中高电平(低电平)为0.4秒,低电平(高电平)为1.6秒,这种方法和用PWM波控制步进电机转速很像,楼主可以参考一下。如果想用定时器,也可以用这种类似的方法,用到两个定时器,但是他们时间重合的点,需要删除。
回复

使用道具 举报

18#
ID:97554 发表于 2021-1-7 18:30 | 只看该作者
迷鹿的夏夜 发表于 2021-1-7 15:49
这样是不是就不去利用中断计时器去计时吗?

如果你只单纯控制LED按你想要的方式闪,这种延时循环似乎比计时器更管用,因为还可以在后边加很多花样。你说的等时间闪烁那只是给初学者的教程,为了举一反三而已。因为那只要一行LED = ~LED;代码就可以解决。定时器是解决更高级问题用的,比如精确的计算出延时或者使用的器件需要精确的高速的时序。对于点灯来说,无谓了。或者你是为了学习定时器,也不算冤枉。

比如流水灯,你可以写成:
while(1)
{
LED1 = 0;LED2 = 1; LED3 = 1; LED4 = 1; LED5 = 1; LED6 = 1; LED7=1;
delay;
LED1 = 1;LED2 = 0; LED3 = 1; LED4 = 1; LED5 = 1; LED6 = 1; LED7=1;
delay;
LED1 = 1;LED2 = 1; LED3 = 0; LED4 = 1; LED5 = 1; LED6 = 1; LED7=1;
delay;
LED1 = 1;LED2 = 1; LED3 = 1; LED4 = 0; LED5 = 1; LED6 = 1; LED7=1;
delay;
……

LED1 = 1;LED2 = 1; LED3 = 1; LED4 = 1; LED5 = 1; LED6 = 1; LED7=0;
delay;
}

也可以写成
while(1)
{
PX = 0XFE;
delay;
PX = 0XFC;
delay;

……

PX =0X7F;
delay;
}

还可以写成
while(1);
{
PX << =1;
delay;
}

至于你想用哪个,这纯属个人爱好,条条大路通罗马嘛。

回复

使用道具 举报

19#
ID:97554 发表于 2021-1-7 18:32 | 只看该作者
反正用延时和0,1组合做过爆闪灯玩,没用定时器,可以多种组合。
回复

使用道具 举报

20#
ID:584814 发表于 2021-1-11 11:16 | 只看该作者
机器做的肯定是规则的,只是规则复杂些可以让人有不规则的错觉而已。
回复

使用道具 举报

21#
ID:25310 发表于 2021-1-12 16:31 | 只看该作者
产生个随机数数组然后装到定时器,循环使用随机数数组装到定时器使用。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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