51单片机定时工作在方式1,是16位计数方式,如果晶振频率是12M,机器周期 是1us,那么最大的定时时间也只有65.536ms,要直接定时1秒是不可能的。
但是,可以定时50ms,采用中断方式,每50ms定时到,要中断一次的,在中断程序就对中断计数,中断20次的时间就是50msX20=1000ms=1秒。有了1秒计时,那1分钟就容易了,对1秒再计数啊,60秒就是1分啦。
可能你没有写过时钟程序吧,电子钟程序就是这种方法,再计60分为1小时,24小时为一日,依此,可以计年月日呢。这有什么难的。
关键是对中断计数,就可以解决长时间定时了。
51单片机最大硬件定时时间,就是定时器能定时的 时间,最长时间=65536*Tc
Tc=fosc/12,fosc 是单片机的晶振频率。
以频率=12M为例吧,Tc=1us
最大定时时间=65536us=65.536ms。
其实,不用管最大定时时间是多少,要定时再长的时间也是可以的,采用中断的方式计数吗。
如:定时50ms,中断方式,中断一次,就是50ms,中断20次就是1秒。
有了1秒以后,什么分,小时,都可以计了。
采用定时器定时很精确的,如果定时时间为1ms,那循环1000次就是1s。定时初值要看你采用的晶振频率了,下面是12M晶振,定时器0的定时1ms程序。
timer0() interrupt 1 // 1ms延时(12.0MHz)
{
TR0=0;
ET0=0;
TH0=0xfc;
TL0=0x18;
if(delayTimes1!=0) delayTimes1--;
TR0=1;
ET0=1;
}
当要程序中把delayTimes1赋值1000后,等到delayTimes1为0的时候定时1s钟到
这是我个人学习时的一点心得,我感觉应该是一个比较清楚的版本了。虽然有快一年没有学习单片机了,但是想起这些知识还是颇感熟悉。
首先你需要明白一个等价条件和一些基本理论知识,这既是学习后面的前提,同时也是基础。(以下内容仅指单片机而言,并且晶振频率是11.0592MHz)CPU内部每经过一个机器周期(即一定的时间间隔),定时器就自动加一;反之,定时器每自动加一,就表示CPU内部经过了一个机器周期(可以类比我们使用的电子表)。二者在大多数情况下是等价的,而只有在讨论纯概念范畴时二者才是不一样的(哲学用语)。因此要想设置定时器,关键是要知道一个机器周期的大小(即时间间隔):一个机器周期=12个时钟周期=12个振荡周期=12个晶振周期=12个节拍,而一个振荡周期或者是一个晶振周期则等于晶振频率的倒数即1/fosc,由此可知一个机器周期=12/fosc。以本例来说,一个机器周期=0.000001085s,也就是1.085us。因此当我们知道了需要定时的时间之后(比如定时50ms),即知道了包含多少个机器周期之后(50ms/1.085us=46083),我们就知道了应该往定时器的计数寄存器中写多大的初值(即写入(65536-46083));同样,当我们在看到定时器的计数寄存器当中的数值后(比如(65536-46083)/256中的46083——其实是在程序中看到的),也就知道了定时一次的时间是多少(即用46083*1.085us=50ms)。
假设石英晶振频率为12mhz,单片机为51 汇编: delay: mov r4, #10 dly0: mov r5, #120 dly1: mov r6, #200 dly2: mov r7, #250 dly3: djnz r7, dly3 djnz r6, dly2 djnz r5, dly1 djnz r4, dly0 ret c51: void delay() { tmod=0x01; unsigned int i=24000; while(i--) { th0=-(50000/256); tl0=-(50000%256); while(tf0==0); tf0=0; } tr0=0; }。
声明:本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
蜀ICP备2020033479号-4 Copyright © 2016 学习鸟. 页面生成时间:2.321秒