本文通過介紹只有雙時鐘的單片機系統(tǒng),在多個事件需要分別定時或延時的時候,解決一個時鐘完成多個計時延時的有效方法,通過這種方法可以達到對多個被控事件統(tǒng)一自動控制目的。 一、引言 單片機作為嵌入式系統(tǒng)的微控制器,已經(jīng)不是新鮮的事情,作為單片機的定時/計數(shù)器的使用可以說沒有什么難度,但對于需要多個獨立計時的事件,單片機的兩個時鐘顯得有點不能滿足要求,其實不然,合理的運用內存和標志位可以實現(xiàn)一個定時器充當多個計時時鐘的效果,本文以51系列單片機為例,實現(xiàn)一個時鐘控制8個獨立馬達的運行過程中,時間分別統(tǒng)計方法。 二、單片機計數(shù)/定時器的基本原理簡介 本文以51系列單片機為例介紹定時器的用法,定時/計數(shù)器的原理可以分為定時和計數(shù)兩部分,定時器的原理是通過設定8位或16位的定時器單元,通過給定定時器單元的初值,然后啟動定時器,于是定時器開始從初值開始累計,每增加一個數(shù)需要特定的時間,這個特定的時間是累加指令的機器周期,是由MCU的晶振的頻率決定。對于51系列的單片機機器周期是時鐘周期的1/12,也就是晶振頻率的12分頻。單片機的定時器原理上相當于一個16位的內存單元,通過TMOD可以設定定時/計數(shù)器的工作方式。計數(shù)值從初值計到全“1”,如果是16位方式則計數(shù)單元變成FF,此時并不產(chǎn)生中斷,當下一個計數(shù)指令加1,導致存儲單元溢出,在中斷控制寄存器允許的情況下產(chǎn)生中斷,通過中斷服務程序執(zhí)行特定的任務。計數(shù)器的原理不同之處在于,不是單純的加指令,而是對外部的脈沖計數(shù),常用來測量脈沖的寬度。 三、時鐘對多事件分別計數(shù)的具體途徑 對于實時性要求不是很高的時間可以通過如下方式實現(xiàn)。在完成基本的定時器工作方式設定以后,也就是設定定時器的計數(shù)方式,比如16位或8位,以及計數(shù)的初始值,以及啟動中斷的方式,建議使“SETB TR0”的方式。并且允許中斷。在中斷服務程序中,開辟存儲單元,以8個事件為例,每個事件不一定同時發(fā)生,每個事件發(fā)生以后以相同的時間延遲,再進行下一步的任務,為了完成定時延時,事件發(fā)生的時刻記作A1,A2,A3。。。。。。A10,中段服務程序中首先檢查有無這些既定的事件發(fā)生,沒有則不做任何處理,恢復計數(shù)初值后退出中斷,相反,假如檢測到AX(X=1、2、3。。。。。。)事件發(fā)生則給預先選定的對應的內存單元增加1,也就是執(zhí)行累加運算,比如, A1"50H;表示A1對應的存儲單元是50h A2"51H;表示A2對應的存儲單元是51h A3"52H; 。 。 。 。 。 。 A7 57H; 表示A7對應的存儲單元是57h 假如A3事件發(fā)生,則對52H內存表示的地址單元增加1,使用的指令是“INC 52H”,可以預先計算事件延時時間與計數(shù)單元數(shù)值的關系,當對應的數(shù)值到了預先設定的值時,執(zhí)行下一任務。比如開關操作等等,并且恢復初始值以便繼續(xù)循環(huán)控制。這樣可以分別對A1到A7,8個任務分別計時,時間可以相同也可以不同,具體的情況可以根據(jù)中斷程序中寄存器累計的實際值與根據(jù)需要所設定的預定值比較而實現(xiàn)。 四、典型應用 也許大家都看到過繁華街道上的拼圖式廣告牌吧,有十幾個或者幾十個三棱柱,通過旋轉,構成不同的畫面,在每幅畫面都停留一段時間,這正好是上面介紹的情況,當一個棱柱的某個畫面轉到特定的角度,比如正對馬路的方向,該畫面必須停留,等所有與此畫面相連接而能拼成完整畫面的其他柱面到來,也就是從柱面開始啟動到下一次停下來需要所有畫面經(jīng)過相同的時間,然而所有的主面不可能同時啟動,可能為了形成某種觀賞效果,有意依次啟動,或由中間開始啟動,逐漸向兩邊延伸,等等,所有這些事件的轉動控制實質就是定時控制,先啟動,先停止。最終保證所有的畫面構成一幅完整的畫面,而且必須是一個平面,我通過這種方法成功地完成了8組和15組轉動馬達的起停控制,實踐證明這種方法簡單可行。部分原程序如下所示。基本流程和部分程序代碼如下。 以下是定時中斷服務程序的全部代碼,可以完成對8個事件的時間統(tǒng)計,并在時間滿足條件時,調用子程序OUT01,是對外部開關的控制指令。通過這段程序,成功實現(xiàn)了一個定時器對多個事件的自動運行控制(以下程序僅供參考)。 TIME0: CLR TR0 PUSH PSW PUSH ACC MOV TL0,#22H;定時100ms重新啟動定時器0 MOV TH0,#1CH LINSHI: MOV A,2AH CJNE A,#0FFH,DEA SETB TR0 POPACC POPPSW RETI DEA:MOV A,2AH CJNE A,#00H,DE1 MOV A,2CH CJNE A,#00H,DE1 ;SETB TR0 POP ACC POP PSW RETI DE1:JNB 2AH.0,DEAL1 DE2:JNB 2AH.1,DEAL2 DE3:JNB 2AH.2,DEAL3 DE4:JNB 2AH.3,DEAL4I DE5:JNB 2AH.4,DEAL5I DE6:JNB 2AH.5,DEAL6I DE7:JNB 2AH.6,DEAL7I DE8:JNB 2AH.7,DEAL8I LJMP FINISH DEAL4I: LJMP DEAL4 DEAL5I: LJMP DEAL5 DEAL6I: LJMP DEAL6 DEAL7I: LJMP DEAL7 DEAL8I: LJMP DEAL8 DEAL1: JNB 2CH.0,DE2 INC 50H MOV A,50H CJNE A,#20,DE2 CLR 2CH.0 LCALL OUT01 mov 50h,#00h LJMP DE2 DEAL2: JNB 2CH.1,DE3 INC 51H MOV A,51H CJNE A,#20,DE3 CLR 2CH.1 LCALL OUT01 MOV 51H,#00H LJMP DE3 DEAL3:JNB 2CH.2,DE4 INC 52H MOV A,52H CJNE A,#20,DE4 CLR 2CH.2 LCALL OUT01 MOV 52H,#00H LJMP DE4 DEAL4:JNB 2CH.3,DE5I INC 53H MOV A,53H CJNE A,#20,DE5I CLR 2CH.3 LCALL OUT01 MOV 53H,#00H DE5I: LJMP DE5 DEAL5: JNB 2CH.4,DE6I INC 54H MOV A,54H CJNE A,#20,DE6I CLR 2CH.4 MOV 54H,#00H LCALL OUT01 DE6I: LJMP DE6 DEAL6: JNB 2CH.5,DE7I INC 55H MOV A,55H CJNE A,#20,DE7I CLR 2CH.5 LCALL OUT01 MOV 55H,#00H DE7I: LJMP DE7 DEAL7: JNB 2CH.6,DE8I INC 56H MOV A,56H CJNE A,#20,DE8I CLR 2CH.6 LCALL OUT01 MOV 56H,#00H DE8I: LJMP DE8 DEAL8: JNB 2CH.7,FINISH INC 57H MOV A,57H CJNE A,#20,FINISH CLR 2CH.7 LCALL OUT01 MOV 57H,#00H FINISH: MOV A,2CH CJNE A,#00H,TUI SETB TR0;SETB TR0 POP ACC POP PSW RETI TUI:SETB TR0;開定時器 POP ACC POP PSW RETI OUT01: MOV A,2CH MOV P2,A CLR G0 LCALLDELAY CLR CLOCK LCALLDELAY SETB CLOCK NOP CLR CLOCK SETB G0 LCALLDELAY RET |