用户登录
用户注册

分享至

51软件定时程序 51单片机软件延时和定时器的区别

  • 作者: 萝莉也狠美
  • 来源: 51数据库
  • 2020-04-21

单片机进中断后执行中断里的程序,比如你进定时中断,执行完后退出中断后做其他事,但定时还在计数,这样计数和做其他事情两不误。

你的程序中本来就没做其他事情,你的LED移动就是等待中断计数到10才操作的,LED动作的先决条件就是中断计数结束更多

亲,首先谢谢您无私的奉献,小弟还有一点不理解,就上面的这个程序,在第一次进入中断定时器数数的时候,主程序在干什么? 好像什么也没有做,在等呢?是不是这样?

下面的程序就不一样了,没进中断时执行主循环,有中断就进中断,中断执行完再回到中断前主程序执行的位置

进中断后,主程序就等啊,等中断退出才回到主程序

谢谢您 ,如果是进中断后,主程序在等,那和软件延时,感觉差不多啊!!软件延时好比是在等的时间内在数数 是这样吗? 小弟刚开始学单片机,所以脑袋有些不开翘,嘿嘿

在你这个程序是差不多的,但是软件延时,就一直在那计数,要不然中断计数,中断计数器满了才进中断累加的,比如说,要定时1分钟,用延时的话,这一分钟都在delay,不能做其他事情,中断的话中断累加10次到达1分中的话,不到0.1分钟内的时间不进中断,那这0.1分钟可以做其他事情,等到0.1后进中断,累加一次,就退出中断,再过0.1才进中断,这之间大部分时间可以做其他了

真的谢谢您无私的奉献,感谢

51单片机两个定时器同时使用程序,望大神解答一二!拜谢~~!!

定时时间是一样的,但是由于先启动的是T1定时器(TR1=1),所以T1先溢出,首先相应的是T1定时器中断。

怎么用51单片机定时1个小时 好像是循环,具体汇编程序是怎样的??

简单啊。

大致说来就是

你先开启个定时器,根据你选用的晶振,计算出你要用定时器定时的基准时间,

就假设是10毫秒吧。

然后给定时器的THx,TLx写入初值,开启中断,进行定时。

然后就等待中断。

在你响应中断的程序中,再次给单片机送入初值,

由于是10毫秒中断一次,因此我们设置几个“软件计数器”

比如每此中断,软甲计数器+1,

例如“软件计数器1”在中断程序中计数100次,则是10ms*100=1s

而“软件计数器2”在1的基础上继续计数100次,则是1S*100=100S

而“软件计数器3”在2的基础上继续计数36次,则是100S*36=3600S=1小时。

关于51单片机用定时器1秒延时,这有个程序不知对了?求解。

你这个程序肯定不行,别说1秒,0.1秒都达不到,我帮你改一下:

void delay1()

{

uchar t = 19;

TMOD=0x10;

for(t=19;t>0;t--)

{

TH1=(65536-50000)/256;

TL1=(65536-50000)%256;

TR1=1;

while(!TF1);//等待定时器1溢出标志置位

TF1 = 0;//清0标志位

}

}

你没有说明晶体振荡器频率,所以定时器初值和循环次数t按原程序

谢谢你,大侠,我写的错在哪了啊?晶体是12MHz的。

你没有等待定时器溢出,怎能达到延时效果。

51单片机定时程序 定时六个小时

采用软计时器,即用寄存器的值乘以定时器溢出时间,以加长定时时间

51单片机定时器精确定时方法

他可以通过定时器T0 T1啊,这两个就是精确定时的,误差在零点几微秒,

一般51单片机的 1个机器周期=12个振荡周期,即记术频率为晶振频率的1/12.

定时时间=(2的X次方-初值)*机器周期。x又定时器工作方式决定。分别为13. 16 。 8.

机器周期=12/系统的晶振。

比如 系统晶振频率为12MHZ,则机器周期为1微妙秒。

51单片机程序定时器怎么这么不准确啊,求高手指点!

这是编译器造成的,你最好用Debug模式看看生成的汇编代码是什么摸样,比较一下你那三种方 式给TH0和TL0赋的是什么样的值。

这是我试验的结果:

4: TH0=-780/256;

C:0x0003 758CFD MOV TH0(0x8C),#0xFD

5: TL0=-780%256;

C:0x0006 758AF4 MOV TL0(0x8A),#0xF4

6: TH0=-516/256;

C:0x0009 758CFE MOV TH0(0x8C),#0xFE

7: TL0=-516%256;

C:0x000C 758AFC MOV TL0(0x8A),#0xFC

8: TH0=(65536-516)/256;

C:0x000F 758CFD MOV TH0(0x8C),#0xFD

9: TL0=(65536-516)%256;

C:0x0012 758AFC MOV TL0(0x8A),#0xFC

看出差别了吧?使用-780时给T0赋值0xFDF4,使用第三种方式赋值为0xFDFC,这两个数字相近,所以结果基本正确。但是使用-516时赋值的0xFEFC,这差别就大了,结果就是不正确。

一般建议用TH0=(65536-516)/256 ;TL0=(65536-516)%256;这种方式,保证不出问题。

51单片机定时器精确定时方法

精确定时一般用汇编来写,如果你选用晶体 F=12MHZ,则定时器每加一就是 1uS,这样就可以设定定时器的初始值了,

如果你需要50mS的定时,定时器初始值为:65536-50000=15536 即 3CH,B0H TH0=3CH TL0=B0H (设定时器0用来定时,工作在16位 MOV TMOD,#11H)如果你需要更长时间定时则需要软件计时了,比如一秒,需要 (50ms *20=1000ms) 20次了,这需要在定时器0的中断程序中计算了!

转载请注明出处51数据库 » 51软件定时程序 51单片机软件延时和定时器的区别

软件
前端设计
程序设计
Java相关