产生个随机数数组然后装到定时器,循环使用随机数数组装到定时器使用。 |
机器做的肯定是规则的,只是规则复杂些可以让人有不规则的错觉而已。 |
反正用延时和0,1组合做过爆闪灯玩,没用定时器,可以多种组合。 |
迷鹿的夏夜 发表于 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; } 至于你想用哪个,这纯属个人爱好,条条大路通罗马嘛。 |
其实的话我感觉不用定时器也是可以的,就是用PWM波进行时间点的控制,要是想0.4秒亮,1.6秒灭。可以设置一个周期为两秒的方波,其中高电平(低电平)为0.4秒,低电平(高电平)为1.6秒,这种方法和用PWM波控制步进电机转速很像,楼主可以参考一下。如果想用定时器,也可以用这种类似的方法,用到两个定时器,但是他们时间重合的点,需要删除。 |
chaoge131 发表于 2021-1-7 16:16 谢谢提供的修改意见 |
munuc_w 发表于 2021-1-7 15:38 已经解决了,感觉提出的意见参考 |
ggyu7 发表于 2021-1-7 16:27 嗯,会借鉴参考了,已经解决了,但仍感谢提出的参考意见。 |
wulin 发表于 2021-1-7 16:16 非常感谢,大概明白是具体什么工作原理,并且也算是记住了~波浪号是用来取反的,非常感谢 |
要是满足04秒亮1.6灭,我这边建议的话用PWM波进行控制,一个周期为2秒,高电平(低电平)为0.4秒,低电平(高电平)1.6秒,这种方法和用PWM控制步进电机转速的方法有点像 |
迷鹿的夏夜 发表于 2021-1-7 16:00 one++; if(one<=4) { led=1; //led灯亮 } else if(one<=16) { led=0; } else { one=0;//把number置0,重新计数 } |
用定时器作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 } |
C:\Users\Mr.Z\Pictures\Screenshots这是protest的仿真图 |
能否问下后续应该怎么修改,因为这一段一直没搞懂,只知道个大概,找了几个示例程序修改也一直没搞出想要的效果,编译也能过,但编译出来的HEX文件没有那种效果 |
munuc_w 发表于 2021-1-7 15:38 我也是这么想的,但我没搞懂后面应该是怎么些,倒是能看的懂一些常见亮1秒灭一秒的案例代码,但自己搞不懂怎么修改成我想要的那种计时效果 |
杨雪飞 发表于 2021-1-7 15:32 这样是不是就不去利用中断计时器去计时吗? |
用一个定时器即可,设定时时间10ms。计时开始LED亮,计到40关灯,计到160,计数清零,重新计数,LED亮,。。。如此。 |
WHILE(1) { LED = 1; DELAY 0.4S; LED = 0; DELAY 1.6S; } 不行? |