<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > 單片機編程技巧-時(shí)鐘中斷

單片機編程技巧-時(shí)鐘中斷

作者: 時(shí)間:2011-05-18 來(lái)源:網(wǎng)絡(luò ) 收藏

功能強大的
  在程序設計中,設置一個(gè)好的,將能使一個(gè)CPU發(fā)揮兩個(gè)CPU的功效,大大方便和簡(jiǎn)化程序的編制,提高系統的效率與可操作性。我們可以把一些例行的及需要定時(shí)執行的程序放在中,還可以利用時(shí)鐘中斷協(xié)助主程序完成定時(shí)、延時(shí)等操作。
  下面以6MHz時(shí)鐘的AT89C51系統為例,說(shuō)明時(shí)鐘中斷的應用。
  定時(shí)器初值與中斷周期 時(shí)鐘中斷無(wú)需過(guò)于頻繁,一般取20mS(50Hz)即可。如需要百分之一秒的時(shí)基信號,可取10mS(100Hz)。這里取20mS,用定時(shí)器T0工作于16位定時(shí)器方式(方式1)。T0的工作方式為:每過(guò)一個(gè)機器周期自動(dòng)加1,當計滿(mǎn)0FFFFh,要溢出時(shí),便會(huì )產(chǎn)生中斷,并由硬件設置相應的標志位供軟件查詢(xún)。即中斷時(shí)比啟動(dòng)時(shí)經(jīng)過(guò)了N+1個(gè)機器周期。所以,我們只要在T0中預先存入一個(gè)比滿(mǎn)值0FFFFh小N的數,然后啟動(dòng)定時(shí)器,便會(huì )在N個(gè)機器周期后產(chǎn)生中斷。這個(gè)值便是所謂的“初值”。下面計算我們需要的初值:時(shí)鐘為6MHz,12個(gè)時(shí)鐘周期為一個(gè)機器周期,20mS中有10000個(gè)機器周期。(10000)10=(2710)16,則0FFFFh-2710h+1=0D8F0h。由于響應中斷、保護現場(chǎng)及重裝初值還需要7~8個(gè)機器周期,把這個(gè)值再加上7,即T0應裝入的初值是0D8F7h。每次中斷進(jìn)入后,先把A及PSW的值壓入堆棧,然后即把0D8F7h裝入T0。
  設置一個(gè)單元,每次中斷加1 我們可以取內部RAM中一個(gè)單元,取名為INCPI(Increase Per Interrupt),在中斷中,裝完T0初值后,用INC INCPI指令將其加一。從這個(gè)單元中,無(wú)論中斷程序還是主程序,都可以從中獲得20mS的1~256之間任意整數倍的信號。例如:有一段向數碼管送顯的程序,需要每0.5秒執行一次以便刷新顯示器,便可以設一單元(稱(chēng)為等待單元)W_DISP,用/MOV A,INCPI/ADD A,#25/MOV W_DISP,A/語(yǔ)句讓其比當前的INCPI值大25,然后在每次中斷中檢查是否于INCPI值相等。若相等,說(shuō)明已過(guò)了25個(gè)中斷周期,便執行送顯程序,并且讓W(xué)_DISP再加上25,等待下個(gè)0.5秒。我們可以設置多個(gè)等待單元,以便取出多個(gè)不同的時(shí)基信號。讓中斷程序在每次中斷時(shí)依次查詢(xún)各個(gè)等待單元是否與INCPI相等,若相等,則執行相應的處理,并重新設置該等待單元的值,否則跳過(guò)。例如:用0.5秒信號刷新或閃爍顯示器,用1秒信號產(chǎn)生實(shí)時(shí)時(shí)鐘,或輸出一定頻率的方波,以一定間隔查詢(xún)輸入設備等。
  在中斷中讀鍵 通常,我們在主程序中讀鍵盤(pán),步驟為:掃描鍵盤(pán),若有鍵按下,則延時(shí)幾十毫秒去抖動(dòng),再次確認此鍵確實(shí)按下,然后處理該鍵對應的工作,完成后再次重上述步驟。但這有兩點(diǎn)不足:1.處理相應工作時(shí)無(wú)法鎖存按鍵的輸入,即可能漏鍵。2.延時(shí)去抖時(shí)CPU無(wú)法做其它事情,效率不高。如果把讀鍵放入時(shí)鐘中斷中,則可避免上述不足。方法為:如果兩次相鄰的中斷中都讀到同一個(gè)鍵按下,則這個(gè)鍵是有效的(達到了去抖目的),并將其鎖存到先入先出(隊列)的鍵盤(pán)緩沖區,等主程序來(lái)處理。這樣,主程序處理按鍵的同時(shí),仍可響應鍵盤(pán)的輸入。緩沖區深度通??稍O為8級,若鎖存的鍵數多于8個(gè),則忽略新的按鍵,并報警提示用戶(hù)新的按鍵將無(wú)效。若鍵盤(pán)緩沖隊列停滯的時(shí)間大大長(cháng)于主程序處理按鍵所需要的最大時(shí)間,說(shuō)明主程序已出錯或跑飛,可以在中斷用指令將系統復位,起到了看門(mén)狗的目的。
  主程序中的延時(shí) 由于有常開(kāi)的時(shí)鐘中斷,所以當主程序中有需要時(shí)間較短、精度較高的延時(shí)時(shí),應暫時(shí)把時(shí)鐘中斷關(guān)閉。而程序中需要時(shí)間較長(cháng)、精度不高的延時(shí)時(shí),便可仿照下需的寫(xiě)法,避免多層嵌套的循環(huán)延時(shí)。
  例:在P1.1輸出1秒的高電平脈沖
MOV A,INCPI
INC A
CJNE A,INCPI$ ;等待一次中斷處理完成
SETB P1.1 ;設P1.1為H,脈沖開(kāi)始
ADD A,#50 ;50個(gè)20mS為1秒
CJNE A,INCPI,$ ;等中斷將INCPI加一50次
CLR P1.1 ;設P1.1為L(cháng),脈沖結束
  結束語(yǔ):從上看出,要靈活地應用時(shí)鐘中斷,將任務(wù)合理分配給中斷和主程序,并且二者要分工明確,接口簡(jiǎn)單。這其中的技巧還需要大家在實(shí)踐中多多摸索與體會(huì )。另外要注意:應盡量縮短中斷處理程序的執行時(shí)間,更不要長(cháng)于20mS。

本文引用地址:http://dyxdggzs.com/article/172757.htm


評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>