51单片机用定时器中断让LED流转间隔为400ms,500ms,600ms,一直到1200ms?

各位大佬,51单片机用定时器中断让LED流转间隔为400ms,500ms,600ms,一直到1200ms,LED初始速度为400ms,按键按下加100ms,一直加到1200ms,数码管显示速度的值。按键控制数码管显示已经弄出来了,就LED流转速度不会弄,大佬们怎么弄呢?谢谢大家了

关于led转速的问题,我给个思路:

按键按下后,关闭定时器,重新设定定时器初值,再开启定时器。

至于定时器处置如何实现按一下按键增加100ms,以下思路给你参考,

1、计算法:用公式去实现,每按一下按键程序中计算一下初值。

2、查表法:将初值先计算好,放到只读数组中,按一次按键根据索引查一次表。


定时器的初值的计算:

     在定时器模式下,计数器的计数脉冲来自于晶振脉冲的12分频信号,即对机器周期进行计数。

     若选择12M晶振,则定时器的计数频率为1MHZ。假设定时时间为T,机器周期为T1,即12/晶振频率。X为定时器初值。则 X=2^n-T/T1。方式0,n=13,方式1时,n=16,方式2和方式3,n=8

计数初值(假设计数初值为X,要定时的时间为Y 毫秒)计算公式如下:

X=2^n-Y*10^(-3)/(12/6*10^6)


由于定时器有最大定时时间,因此你还需要考虑定时次数累加,才能达到你要的时间。

温馨提示:内容为网友见解,仅供参考
无其他回答

51单片机用定时器中断让LED流转间隔为400ms,500ms,600ms,一直到1200m...
1、计算法:用公式去实现,每按一下按键程序中计算一下初值。2、查表法:将初值先计算好,放到只读数组中,按一次按键根据索引查一次表。定时器的初值的计算: 在定时器模式下,计数器的计数脉冲来自于晶振脉冲的12分频信号,即对机器周期进行计数。若选择12M晶振,则定时器的计数频率为1MHZ。假设...

51单片机如何计时500ms
12MHZ的51单片机,定时器最大只能定时65.535ms,所以要定时500ms的时间,需要产生10次50ms的定时。步骤如下:1、每隔50ms定时器中断溢出,计数+1。2、当计数达到10次时,便产生了500ms的定时啦,然后,你自己根据你的设计,需要让单片机做什么就自己写些什么(比如让某个io口取反)3、计数达到10次...

单片机汇编语言流水灯,定时器中断控制,(500ms)延时
单片机汇编语言流水灯,用定时器中断控制,可以初始化设置定时器时间(如50mS注定时器最大定时时间到不了500mS,需要加计数存储,中断10就是500mS),有多种方式实现如作一个流水状态表,定时读取写入IO端口 表加一,,或者用左移太移等方式都可以实现在,网上有很多这种实例。

高分:51单片机汇编程序,数码管跳动问题
应该是串口收发导致单片机忙不过来,显示就会闪烁,因为你的延时程序是空操作,也占用CPU,建议你用定时中断做显示程序,中断时间定在5ms就可以了,这个定时器可以通过计数干很多其他事,比如500ms干一次。这样就不用CPU做空操作干等了。给你贴一个我写的显示程序(在定时中断中调用,这个程序显示两组数据...

51单片机怎么延时程序
最容易让人忽略的是计算循环外的那部分延时,在对时间要求不高的场合,这部分对程序不会造成影响。500ms延时子程序程序:(晶振12MHz,一个机器周期1us。)void delay500ms(void){ unsigned char i,j,k;for(i=15;i>0;i--)for(j=202;j>0;j--)for(k=81;k>0;k--);} ...

单片机500ms延时器程序(中断方式)
ET0=1;\/\/开定时器中断 TR0=1;\/\/开启定时器0 } void main(){ init();\/\/调用初始化子程序 } void timer0() interrupt 2 \/\/定时程序 { TH0=(65536-50000)\/256;TL0=(65536-50000)%256;cont++;if(cont==10){ cont=0;此处是你需要操作的数据,比如你要发光二级管亮灭, 或者数加减...

51单片机延时500ms程序
void DelayM(unsigned int a){ unsigned char i;while( --a != 0){ for(i = 0; i < 125; i++); \/\/一个 ; 表示空语句,CPU空转。} \/\/i 从0加到125,CPU大概就耗时1毫秒 } 定时M毫秒的程序,晶振为12MHz。a取500就为500ms ...

我的要求在51单片机板上实现500ms一亮,500ms一灭。并且蜂鸣器跟随灯500...
不知道蜂鸣器的选通信号是不是高电平,如果是的话,请看第40行的while(1);可见此处是死循环,程序不能继续往下运行了。建议你删去试试。另外,你可以试试单步运行,定位问题出在哪一步。祝你成功!!

单片机间隔点亮一led灯的C语言程序
以下是一个单片机间隔点亮一LED灯的C语言程序,以8051单片机为例:c Copy code include \/\/包含了AT89C51的寄存器定义 void delay(unsigned int xms) \/\/延时函数,xms为要延时的毫秒数 { unsigned int i,j;for(i=xms;i>0;i--)for(j=112;j>0;j--);} void main(){ P1=0x00; \/\/将P1口...

51单片机,求编译一条延时500ms的程序
DELAY: MOV R5,#10 D1: MOV R6,#20 D2: MOV R7,#123 NOP DJNZ R7,DJNZ R6,D2 DJNZ R5,D1 RET END 这个是延时500MS的,将10改成20就是延时1S的。

相似回答
大家正在搜