关于51单片机长时间定时

来源:百度知道 编辑:UC知道 时间:2024/06/16 00:48:19
我刚学单片机,现在碰到一个问题,就是用软件定时器定时,累加器最多只能到255,否则就要溢出,所以请各位高手请教一下如何实现更长时间的定时啊,最好能给出程序,谢谢了.
我也知道用循环,可是不明白循环程序怎么写,我写了好几个都没用

使用T2定时器的16位重载方式,并且使用中断。当T2溢出时发生中断并进入中断程序。在中断程序中使用DPTR作为计数器,因此最大可以延时2的32次方个机器周期(2^32=4294967296)……够用了吧?当使用12MHz的晶振时,可以延时大约4295秒。

可以多加个累佳器,多层循环,我做过实验的,源码没了,你自己试下吧!

给你举个例子吧 80C51
已知fosc=6MHZ,下面延时子程序的延时时间大约为10ms
精确的时间为:
DELAY: MOV R6,#10 ;2us
D1: MOV R7,#250 ;20us,重复了10次,一次2us
D2: DJNZ R7,D2 ;1ms,250*2*2 us
DJNZ R6,D1 ;40us ,10*2*2us
RET ;4us
虽然一次只累计250次
但通过循环10次的250次累计,就可以达到长时间的定时
所以上面的精确时间为10ms+66us(忽略不计)
这么详细了没明白?
直说了吧
这程序段,你给R6:10,他就延时10ms
你给R6:20,他就延时20ms
你给R6:200,他就延时200ms
在R6=200的基础上,在加两句,让200ms循环5次,就可以得到1s的延时,10次就是2s
这样够不够?
那我给你解释下上面的那段延时程序吧.
DELAY: MOV R6,#10;给R6预设10,循环10次用
D1: MOV R7,#250;给R7预设250,
D2: DJNZ R7,D2;R7减1,判断R7是否为0,不为0,则跳转D2(原地踏步),R7=0的话则继续执行下一条(R7已从250减到0了)
DJNZ R6,D1;R6减1,判断R6是否为0,不为0,跳D1,而D1又是从R7重赋250,这样,不断循环,直到R6=0,才循环结束
RET

软件方式,就用多重循环吧,理论上能延时无限长