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