51單片機定時工作在方式1,是16位計數(shù)方式,如果晶振頻率是12M,機器周期 是1us,那么最大的定時時間也只有65.536ms,要直接定時1秒是不可能的。
但是,可以定時50ms,采用中斷方式,每50ms定時到,要中斷一次的,在中斷程序就對中斷計數(shù),中斷20次的時間就是50msX20=1000ms=1秒。有了1秒計時,那1分鐘就容易了,對1秒再計數(shù)啊,60秒就是1分啦。
可能你沒有寫過時鐘程序吧,電子鐘程序就是這種方法,再計60分為1小時,24小時為一日,依此,可以計年月日呢。這有什么難的。
關(guān)鍵是對中斷計數(shù),就可以解決長時間定時了。
51單片機最大硬件定時時間,就是定時器能定時的 時間,最長時間=65536*Tc
Tc=fosc/12,fosc 是單片機的晶振頻率。
以頻率=12M為例吧,Tc=1us
最大定時時間=65536us=65.536ms。
其實,不用管最大定時時間是多少,要定時再長的時間也是可以的,采用中斷的方式計數(shù)嗎。
如:定時50ms,中斷方式,中斷一次,就是50ms,中斷20次就是1秒。
有了1秒以后,什么分,小時,都可以計了。
采用定時器定時很精確的,如果定時時間為1ms,那循環(huán)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鐘到
這是我個人學習時的一點心得,我感覺應該是一個比較清楚的版本了。雖然有快一年沒有學習單片機了,但是想起這些知識還是頗感熟悉。
首先你需要明白一個等價條件和一些基本理論知識,這既是學習后面的前提,同時也是基礎。(以下內(nèi)容僅指單片機而言,并且晶振頻率是11.0592MHz)CPU內(nèi)部每經(jīng)過一個機器周期(即一定的時間間隔),定時器就自動加一;反之,定時器每自動加一,就表示CPU內(nèi)部經(jīng)過了一個機器周期(可以類比我們使用的電子表)。二者在大多數(shù)情況下是等價的,而只有在討論純概念范疇時二者才是不一樣的(哲學用語)。因此要想設置定時器,關(guān)鍵是要知道一個機器周期的大小(即時間間隔):一個機器周期=12個時鐘周期=12個振蕩周期=12個晶振周期=12個節(jié)拍,而一個振蕩周期或者是一個晶振周期則等于晶振頻率的倒數(shù)即1/fosc,由此可知一個機器周期=12/fosc。以本例來說,一個機器周期=0.000001085s,也就是1.085us。因此當我們知道了需要定時的時間之后(比如定時50ms),即知道了包含多少個機器周期之后(50ms/1.085us=46083),我們就知道了應該往定時器的計數(shù)寄存器中寫多大的初值(即寫入(65536-46083));同樣,當我們在看到定時器的計數(shù)寄存器當中的數(shù)值后(比如(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; }。
聲明:本網(wǎng)站尊重并保護知識產(chǎn)權(quán),根據(jù)《信息網(wǎng)絡傳播權(quán)保護條例》,如果我們轉(zhuǎn)載的作品侵犯了您的權(quán)利,請在一個月內(nèi)通知我們,我們會及時刪除。
蜀ICP備2020033479號-4 Copyright ? 2016 學習鳥. 頁面生成時間:2.321秒