第一篇:單片機總結系列-1
單片機,通過片內總線連接而成:中央處理器(CPU由運算器、控制器和若干特殊功能寄存器組成)、數據存儲器(RAM)、程序存儲器(ROM/EPROM)、并行輸入/輸出口(P0口-P3口)、串行口、定時/計數器、中斷系統及特殊功能寄存器。主要部件集成在一塊集成電路芯片上的微型計算機稱為單片機。三總線結構:⑴ 地址總線AB,16位,P2口提供高8位地址,P0口經地址鎖存器提供低8位。片外存儲器可尋址范圍達64KB(即=65536個字節)。⑵ 數據總線DB,D0-D7共8位,由P0口提供,分時輸送低8位地址(通過地址鎖存器鎖存)和8位數據信息。⑶ 控制總線CB。時鐘電路與時序:單片機芯片內部有一個高增益反向放大器,其輸入引腳為XTAL1,輸出引腳為XTAL2,芯片外部通過這兩個引腳接晶體振蕩器CYS和微調電容器C1、C2形成反饋電路(通常取值在20~30pF),構成穩定的自激振蕩器,振蕩頻率范圍通常是1.2MHz~12MHz。振蕩脈沖經分頻后再為系統所用。時序單位共4個:節拍、狀態、機器周期和指令周期。CPU執行一條指令的時間稱為指令周期。一般由若干個機器周期組成。機器周期=6狀態=12晶振周期(拍節)。單片機的存儲器單片機分為程序存儲器(用于存放編好的程序、表格和常數。內部有4K ROM,片外最多可擴展64K ROM,兩者統一編址。)和數據存儲器(內部有128B RAM;片外最多可擴展64 K RAM。內、外RAM地址有重疊,可通過不同的指令來區分:“MOV”是對內部RAM進行讀寫的操作指令;“MOVX”是對外部RAM進行讀寫的操作指令),在物理空間上是相互獨立哈佛結構。物理結構上可以分為片內程序存儲器、片外程序存儲器、片內數據存儲器、片外數據存儲器。片內數據存儲器工作寄存器區、可位尋址區、通用RAM區、特殊功能寄存器區。工作方式程序執行方式、掉電保護方式、低功耗方式(空閑方式、掉電方式)最小系統對于內部帶有程序存儲器的51單片機,若上電工作時所需要的電源、復位電路和晶體振蕩電路齊全,即可構成完整的單片機最小系統。致單片機不工作的原因EA沒有接高電平、晶振電容使用不當、晶振不起振ALE控制信號端無信、復位電路設計不當?!静⑿休斎?輸出口有4個8位的雙向并行輸入/輸出(I/O)端口,P0口、P1口、P2口和P3口。P0口是一個雙功能的8位并行I/O口(地址/數據分時復用口和通用I/O口),字節地址為80H,位地址為80H~87H??勺鬏斎?輸出端口使用,又可作地址/數據總線分時傳輸低8位地址和8位數據。P1口是單一功能的并行I/O口,字節地址為90H,位地址為90H~97H。它只用作通用的數據輸入/輸出口。P2口是一個雙功能的8位并行I/O口,字節地址為80H,位地址為A0H~A7H??勺魍ㄓ玫妮斎?輸出口用,又可用作高8位地址總線。P3口是一個雙功能的8位并行I/O口,字節地址為B0H,位地址為B0H~B7H,它的第一功能是通用輸入/輸出口,作第二功能用時,各引腳定義如下:讀引腳和讀鎖存器的區別讀引腳:由傳送指令(MOV)實現;讀鎖存器:讀鎖存器是先從鎖存器中讀取數據,進行處理后,將處理后的數據重新寫入鎖存器中,這類指令成為“讀-修改-寫”指令。“讀鎖存器”可以避免因引腳外部電路的原因而使引腳的狀態發生改變造成誤讀?!俊局袛嘞到y功能實現中斷與返回、能實現優先權排隊、高級中斷能中斷低級中斷。優點分時操作、實時處理、故障處理。5個中斷源(優先級高→低)外部中斷0(IE0,0003H)、定時/計數器中斷0(TF0,000BH)、外部中斷1(IE1,0013H)、定時/計數器中斷1(TF1,001BH)、串行口發送/接收中斷(TI/RI,002BH)CPU中斷響應的條件中斷源有中斷請求,此中斷的中斷允許位為1,CPU開總中斷。中斷響應過程將相應的優先級狀態觸發器臵1(以阻斷后來的同級或低級的中斷請求);執行一條硬件LCALL指令,即把程序計數器PC的內容壓入堆棧保存,再將相應的中斷服務程序的入口地址送入PC;執行中斷服務程序。外部中斷請求有2種觸發方式:電平觸發和邊沿脈沖觸發?!俊径〞r/計數器的工作原理T0和T1的實質是加1計數器,即每輸入一個脈沖,計數器加1,當加到計數器全為1時,再輸入一個脈沖,就使計數器歸零,且計數器的溢出使TCON中的標志位TF0或TF1臵1,向CPU發出中斷請求。只是輸入的計數脈沖來源不同,把它們分成定時與計數兩種功能。當為定時工作方式時,計數器對內部機器周期計數,每過一個機器周期,計數器增1,直至計滿溢出。定時器的定時時間與系統的振蕩頻率緊密相關,因MCS-51單片機的一個機器周期由12個振蕩脈沖組成,如果單片機系統采用12 MHz晶振,則計數周期為1us,這是最短的定時周期。當為計數工作方式時,計數器對來自輸入引腳T0(P3.4)和T1(P3.5)的外部信號計數,若前一個機器周期采樣值為1,下一個機器周期采樣值為0,則計數器加1。所以檢測一個從1到0的跳變需要兩個機器周期,即外部輸入信號的周期應大于或等于兩個機器周期,也就是說外部輸入信號的頻率必須小于晶振頻率的1/24,若頻率超過晶振頻率的1/24,則無法準確計數脈沖個數。雖然對外部輸入信號的占空比無特殊要求,但是為了確保輸入信號電平在變化之前至少被采樣一次,要求電平保持時間至少是一個完整的機器周期。由定時器0、定時器
1、定時器方式寄存器TMOD(只能進行字節操作,不能位尋址)和定時器控制寄存器TCON組成(既能進行字節操作,又能位尋址)。定時器0,定時器1是16位加法計數器,分別由兩個8位專用寄存器組成;定時器0由TH0和TL0組成,定時器1由TH1和TL1組成。(一般當T1作為串行通信接口的波特率發生器時T0才工作在方式3,此時TL0可作為8位的定時/計數器;而TH0只能作為8位定時器。)GATE—門控位。GATE=0,只要用軟件使TR0(或TR1)臵1就可以啟動定時器,而不管INT0(或INT1)的電平是高還是低。GATE=1,只有INT0(或INT1)引腳為高電平且由軟件使TR0(或TR1)臵1時,才能啟動定時器工作。定時/計數器的初始化1確定工作方式——對TMOD賦值。2預臵定時或計數的初值——直接將初值寫入TH0、TL0或TH1、TL1。3根據需要開啟定時/計數器中斷——直接對IE寄存器賦值。4啟動定時/計數器工作——將TR0或TR1臵“1”初值X = M-計數值,計數值與定時器的工作方式有關。若是定時工作模式,計數脈沖由內部供給,對機器周期進行計數,因此計數脈沖頻率為f=fosc/12,計數周期T=1/f=12/fosc,若定時時間為t,則定時工作方式的計數初值:X= M-計數值=2n-t/T=2n-t ? fosc/12(例如主頻為6MHZ,要求產生1ms的定時,試計算計數初值X。若設臵定時器工作于工作方式1,定時1ms,則計數初值X=216-(6MHZ×1ms)/12=65536-500=65036=FE0CH為定時方式1,在臵TR0=1以后,定時立即開始,但在定時時間到后,還必須用軟件再次裝入初值、重新啟動才能開始新的定時。T1為計數方式2,在臵TR1=1以后,以計數開始,在計數次數到以后,自動裝入初值并重新計數,因此軟件設計不必再考慮裝入初值。)】【通信方式 并行(多個數據各位同時傳送,速度快效率高,但占用的數據線較多,成本高,僅適用于短距離)和串行(每個數據是一位一位按順序傳送,數據傳送的速度有限制,但成本低,一根數據線就可以傳送)。串行通訊分類 異步通信方式是按字符傳送的,字符的前面有一個起始位(0),后面有一個停止位(1),這是一種起止式的通訊方式,字符之間沒有固定的間隔長度,有點事數據傳送的可靠性較高、能及時發現錯誤,缺點是通信效率較低。同步通信方式按數據塊傳送的,把傳送的字符按順序連接起來,組成數據塊,在數據塊前面加上特殊的同步字符,作為數據塊的起止符號,在數據塊后面加上校驗字符,用于校驗通信中的錯誤。同步通信中字符之間是沒有間隔的,通訊效率比較高。串行通訊傳輸方式單工,半雙工,全雙工。串行口的結構 串行接口控制電路、發送電路(發送緩沖器SBUF,發送控制電路)、接收電路(接受緩沖器SBUF,接收控制電路)。特殊功能寄存器SCON存放串行口的控制和狀態信息,串行口用定時器T1作為波特率發生器(發送接受時鐘),電源控制寄存器PCON的最高位SMOD為串行口波特率的倍率控制位,中斷允許控制寄存器IE控制串行通信中斷是否允許。數據緩沖器SBUF 兩個數據緩沖器在物理上是相互獨立的,邏輯上卻占用一個字節地址(99H)。發送時,就是CPU寫入SBUF;接受時,就是CPU讀取SBUF的過程??梢酝瑫r發送和接收數據,對于發送緩沖器,由于發送時CPU是主動的,不會產生重疊錯誤。波特率的計算方式0、方式2是固定的。方式1,方式3可變。波特率 = 2SMOD / 32 ×(T1的溢出率);T1溢出率 = 單位時間內溢出次數 = 1 /(T1的定時時間);而T1的定時時間t就是T1溢出一次所用的時間。此情況下,一般設T1工作在模式2(8位自動重裝初值)。N = 256- t / T,t =(256-N)T =(256-N)×12 / fosc,所以,T1溢出率 = 1/t = fosc / 12(256-N),故,波特率 = 2SMOD / 32 × fosc / 12(256-N)。
若已知波特率,則可求出T1的計數初值: y = 256-2SMOD×fosc /(波特率×32×12)串行口初始化確定T1的工作方式(編程TMOD寄存器);計算T1的初值,裝載TH1、TL1;啟動T1(編程TCON中的TR1位);確定串行口控制(編程SCON寄存器)。串行口在中斷方式工作時,還要進行中斷設臵(編程IE、IP寄存器)。方式01、同步8位數據,波特率為F0SC/12;
2、低位在前,高位在后;
3、TI,再發送數據,軟件清0,CLRTI;
4、RI,再接收數據,軟件清0,CLRRI;
5、同步通信,無起始位和停止位。方式1
1、一幀為10位信息,1位起始(0),8位數據,1位停止(1);
2、波特率可變;
3、異步通信;
4、接收時,RB8里是停止位,數據位在SBUF(SM2=0)方式2,3是異步11位(以方式2接收數據時,REN必須臵1)RS-232C采用負邏輯電平,規定DC(-3~-5)為邏輯1,規定DC(+3~+5)為邏輯0,通常RS-232C的信號傳輸最大距離為30m,最高傳輸速率為20kbit/s
如果按鍵較多,則常用軟件方法去抖動。為了保證CPU對鍵的一次閉合僅作一次鍵輸入處理,必須去除抖動影響。即檢測出鍵閉合后執行一個延時程序產生5ms~10ms的延時,等前沿抖動消失后再一次檢測鍵的狀態,如果仍保持閉合狀態電平則確認為真正有鍵按下。當檢測到按鍵釋放后,也要給5ms~10ms的延時,待后沿抖動消失后才能轉入該鍵的處理程序,從而去除了抖動影響。
第二篇:單片機總結
單片機總結
——20120921030黃國林 我所在的專業生物醫學工程專業,是一個理工醫相結合的專業,但是側重的方向還是工程學,對于計算機,單片機的要求比較高,雖然我們在大三的時候會有單片機的專業課,但是我們院也成立的相關的創新實驗室,進行單片機的學習,組建自己的相關團隊,做創新研發。但自己的只是還是有限,因此但是選修了這門課來擴寬自己的視野,對以后的單片機的學習打一定得基礎。
51單片機的運用涉及到我們生活中的方方面面,為我們的生活提供了諸多便利,小到我們平時調動車流的交通信號燈,再到我們平時使用的形形色色的數碼管,液晶顯示屏等等,下面介紹一個我學習過的單片機的報警裝置與旋轉燈的應用./* 名稱:報警與旋轉燈
*/
#include
#include
#define uchar unsigned char
#define uint unsigned int
sbit SPK=P3^7;
uchar FRQ=0x00;
//延時
void DelayMS(uint ms)
{
}
//INT0中斷函數 uchar i;while(ms--)for(i=0;i<120;i++);說明:定時器控制報警燈旋轉顯示,并發出仿真警報聲。
void EX0_INT()interrupt 0
{
}
//定時器0中斷
void T0_INT()interrupt
1{
}
//定時器1中斷
void T1_INT()interrupt
3{
}
//主程序
void main()
{
P2=0x00;SPK=0x00;TMOD=0x11;TH0=0x00;//T0、T1方式1 TH1=-45000/256;TL1=-45000%256;P2=_crol_(P2,1);TH0=0xfe;TL0=FRQ;SPK=~SPK;TR0=~TR0;//開啟或停止兩定時器,分別控制報警器的聲音和LED旋轉 TR1=~TR1;if(P2==0x00)P2=0xe0;//開3個旋轉燈 elseP2=0x00;//關閉所有LED
}
TL0=0xff;IT0=1;IE=0x8b;IP=0x01;TR0=0;TR1=0;while(1){} FRQ++;DelayMS(1);//定時器啟停由INT0控制,初始關閉//開啟0,1,3號中斷 //INT0設為最高優先
同時,51單片機只是單片機的一類,單片機的應用十份廣泛,以后我會更加努力的學習相關的內容。
20120921030黃國林
第三篇:NXP LPC900系列單片機ISP編程技術總結
NXP LPC900系列單片機ISP編程技術總結
1、將編譯好的用戶應用程序下載(編程)到LPC900系列單片機(MCU)內部Flash的方法有三種:
(1)在系統編程ISP(In-System Programming)。
(2)在電路編程ICP(In-Circuit Programming)。(3)通用或專用編程器編程。
編程器編程是一種傳統的并行編程方法,特別適合于DIP封裝(如果是表貼的需專用適配器)或量產階段(批量)的MCU編程,其特點是速度快、可靠性高。其缺點是無法對已焊接的表貼MCU編程,而且成本較高,一臺稍好一點的通用編程器至少在千元以上。目前大部分品牌通用編程器(如Xeltek 3000U等)和周立功LPC PRO專用編程器均支持LPC900編程,而且有些編程器借助專用下載線(如Xeltek ISP-Header01、周立功ICP900-ADP)還可完成ICP編程。
ICP和ISP均采用串行編程方法。其中ICP是一種通用標準(規范)編程,硬件連接采用PCL(P0.5)、PDA(P0.4)、RST、VDD和GND 五線制,但要求編程時PCL、PDA、RST和VDD與系統其它電路斷開。ICP的加載(啟動)是由MCU內部硬件電路完成的,并調用MCU內部IAP(在應用編程,In-Application Programming)實現Flash編程。上位機(PC機)通過專用ICP下載器(如周立功MiniPRO和濤行TX-MiniICP)與目標系統相連,編程軟件使用FlashMagic或SmartPRO。
注意:僅老款的LPC932不支持ICP編程,其它LPC900系列的均支持。
關于ICP編程更多的內容可參閱周立功公司的“LPC900系列單片機ICP解決方案”和“LPC900 在電路編程(ICP)規范”。
2、與ICP不同,ISP是一種通用非標準串行在線編程,盡管不同IC廠家內部實現ISP編程技術(算法)不同,但外部硬件連接均采用串口(或USB轉串口)的RXD、TXD。根據ISP的加載啟動(Bootloader)方式不同(LPC900的ISP加載機制可參閱NXP的AN10221-“In-System Programming with the P89LPC932”圖2),LPC900的ISP編程方法又可分為三種:(1)RST 3脈沖法。(2)幀間隔法。(3)直接跳入法。
“3脈沖法”有點類似ICP,硬件連接也是采用5線制:RXD、TXD、DTR、RTS和GND,其中DTR控制MCU的VDD,RTS控制RST,且要求ISP編程時MCU的VDD和RST應與系統其它I電路斷開,具體電路可參閱周立功的“LPC900系列單片機ICP及ISP使用指南”圖1.16。該方法的ISP加載是在MCU加電復位后有內部硬件完成的,因此適用于剛出廠的全新空片編程和已下載運行應用程序的升級編程。就是因編程時要斷開VDD和RST板上連接比較麻煩。
“幀間隔法”硬件連接只需RXD、TXD和GND,簡稱“3線制”,“3線制”是目前大多數IC廠家ISP編程采用的連接方式,如STC51單片機等。簡單方便,成本低(僅需20元左右的RS232轉TTL電路或用戶自己用1片MAX232即可)。其原理是MCU檢測到RXD上幀間隔碼(連續的低電平,即串口“Break”脈沖)就進入ISP模式。雖然這種檢測是由MCU硬件完成的,但應用程序一開始必須對串口進行初始化,其C代碼參見上述“使用指南”程序清單1.2。由此可見,原則上“幀間隔法”只適合于應用程序的升級編程。不過,對于剛出廠的全新空片,由于其“引導狀態位”=1,加電復位后就自動進入ISP模式,因此上述三種方法都適用的。“直接跳入法”就是應用程序判斷某個開關,如接通(為0),則進入ISP模式,否則狀態不變運行用戶程序。顯然該方法也必須在應用程序中嵌入“開關判斷”代碼(參見上述“使用指南”程序清單1.4)。一般都用于應用程序的升級編程。ISP編程的上位機程序可使用FlashMagic或ZlgISP900,其中ZlgISP900上述三種方法都可以,但不支持ICP編程。而FlashMagic支持方法(1)和(2)以及ICP編程,對于“3脈沖法”,編程前必須將其“Advanced Option”中“Hardware Config”的“Use DTR and RTS to enter ISP”勾選上,而“幀間隔法”則不能勾選,此外,除非MCU是全新空片或者確定其引導狀態位(Status Bit)為1,否則進行ISP編程之前必須通過ISP菜單中“Start Bootloader”的“Send Break Condition”發送“3脈沖”或“幀間隔”才能使MCU進入ISP模式,而且要求:“Interface”選“None(ISP)”;“Baud Rate”選“7200”(內部RC振晶)。
注意:由于FlashMagic每次發ISP命令前要發2個同步碼(大寫字符U,原理后面闡述),因此其成功率比ZlgISP900。
3、LPC900出廠全新原裝空片,其引導狀態位(Boot Status Bit)=1,加電復位后MCU自動進入ISP模式,不必再通過“3脈沖法”和“幀間隔法”進入ISP,在MCU接收上位機ISP命令前,上位機必須通過發同步字符“U”讓MCU自動跟蹤串口通信波特率,上位機收到MCU回送的“U”表示跟蹤成功,然后就可進行各種ISP操作了,如讀ID,讀配置信息,擦除、編程、加密Flash等。
(1)由于全新空片MCU加電復位后已自動進入ISP模式,因此ZlgISP900上述三種方法均可進行ISP編程。FlashMagic也不需“Send Break Condition”。(2)FlashMagic每次發ISP命令前要發2個同步字符“U”,而ZlgISP900只在執行“進入ISP模式”命令時發同步字符“U”。
(3)同步字符“U”的十六進制代碼是0x55,在MCU的RXD上(加上“起始位”)實際上就是一串方波,便于MCU自動跟蹤測算波特率。由于MCU是自動跟蹤上位機串口通信波特率的,因此FlashMagic 或 ZlgISP900的波特率選擇不是很重要的,不過一般建議選擇7200或9600。
4、下載用戶應用程序到MCU時要注意,必須先將配置參數中引導狀態位設置為0,否則即使成功下載應用程序,復位后也無法正常運行,因狀態位=1,加電復位后MCU會自動進入ISP模式的。
ZlgISP900開始運行后或在讀入加載文件(*.hex)后總是自動將引導狀態位置為1(也許是個小Bug?),因此必須在讀入文件后,先將“安全級別”改為“弱級”,再進入“查看配置信息”,去掉“引導向量=0x1”前的“√”去掉,并點擊“設置配置信息至緩沖區”,然后才能將應用程序和配置信息下載到MCU。FlashMagic在下載應用程序時會自動將引導狀態位置為0的。
如果使用ZlgISP900在下載應用程序時將狀態位置為1了,唯一的辦法就是將狀態位設置為0后重新下載一次配置信息。
5、雖然ISP編程方法(“3脈沖法”除外)簡單方便,而且成本很低,但許多LP900的用戶發現其成功率很低,特別是對剛買來焊上的新片,成功率更低。歸納起來有如下三大類故障:
(1)第一次編程成功了,但用戶程序沒有正常運行。
(2)已下載用戶程序并正常運行,但無法再進行ISP編程。
(3)使用ZlgISP900時,點擊“進入ISP”后顯示“成功進入ISP狀態”,但無法進行ISP操作,如讀ID顯示出錯;使用FlashMagic進行ISP操作時顯示通信失敗,并顯示“Failed Autobaud”。這種情況對于剛焊上的空片出現最多。對于這三種情況,首先要解決的是所使用的MCU是不是買的全新原裝產品,現在市面上有很多“翻新片”,性能很差,工作不穩定。其次是盡量使用物理串口,因為USB轉串口工作不穩定,其驅動程序也容易出問題。
第一類故障一般都是下載應用程序時沒有將狀態位置為0。解決辦法很簡單,只要重新將狀態位置為0寫入MCU即可。
第二類故障稍復雜些,如果是使用“幀間隔法”,最有可能的原因是沒有將“幀間隔法”初始化代碼嵌入到應用程序中,另一種可能性是編程時不小心把MCU的ISP程序所占扇區(LPC933是扇區3,其它是扇區7)給擦除掉了,如果出現這種情況,唯一的辦法就是將ISP程序源碼(可從網上下載到)嵌入到用戶程序工程中重新編譯,并使用ICP或編程器下載到MCU中。
第三類故障出現最多,情況也最復雜,這也是國內很多用戶不愿意使用LPC900的原因之一,特別是以前使用過其它MCU的(如STC的51系列單片機),ISP下載很方便,很可靠。盡管NXP和FlashMagic官方網站或論壇上指出出現這種故障的原因大部分是用戶使用不當引起的(參見“http://forum.flashmagictool.com/index.php?topic=3628.0”),但據筆者多年開發經驗來看,還是NXP LPC900的ISP程序(或者是FlashMagic、ZlgISP900?)在設計上不夠完善引起的,特別是ISP程序中的“自動跟蹤波特率”(Autobaud)在設計上可能有點小Bug,經常失敗!(Failed Autobaud),導致串口無法正常通信。
對于這種故障,筆者有點小經驗:就是先運行FlashMagic或ZlgISP900使MCU進入ISP模式(如果是全新空片已進入ISP模式就不必運行了!),退出程序后再運行“串口調試助手”,自動重復發送同步字符“U”(0x55),當正確接收到字符“U”時表示MCU波特率跟蹤成功,然后再運行FlashMagic或ZlgISP900便可進行ISP操作了,注意波特率要選擇與“串口調試助手”一致(一般是9600)。
第四篇:關于51系列單片機中斷嵌套
說最基本的,老的51單片機(80C51系列)有5個中斷源,2個優先級,可以實現二級中斷服務嵌套?,F在很多擴展的51單片機已經有4個優先級(或更多)和更多的中斷源了。
在說到中斷之前,我先來定義一下優先級,明白了什么是優先級,后面的闡述就容易明白了。實際上很多人都是混淆了優先級的含義,所以才覺得糊里糊涂。
中斷的優先級有兩個:查詢優先級和執行優先級。
什么是查詢優級呢?我們從datasheet或書上看到的默認(IP寄存器不做設置,上電復位后為00H)的優先級:
外部中斷0 > 定時/計數器0 > 外部中斷1 > 定時/計數器1 > 串行中斷 或 int0,timer0,int1,timer1,serial port 或 INT0、T0、INT1、T1、UART 或 PX0>PT0>PX1>PT1>PS>......其實都是查詢優級。首先查詢優先級是不可以更改和設置的。這是一個中斷優先權排隊的問題。是指多個中斷源同時產生中斷信號時,中斷仲裁器選擇對哪個中斷源優先處理的順序。而這與是否發生中斷服務程序的嵌套毫不相干。當CPU查詢各個中斷標志位的時候,會依照上述5個查詢優先級順序依次查詢,當數個中斷同時請求的時候,會優先查詢到高優查詢先級的中斷標志位,但并不代表高查詢優先級的中斷可以打斷已經并且正在執行的低查詢優先級的中斷服務。
例如:當計數器0中斷和外部中斷1(按查詢優先級,計數器0中斷>外部中斷1)同時到達時,會進入計時器0的中斷服務函數;但是在外部中斷1的中斷服務函數正在服務的情況下,這時候任何中斷都是打斷不了它的,包括邏輯優先級比它高的外部中斷0計數器0中斷。
而中斷的執行優先級就是你對IP寄存器的設置了。在2個優先級的情況下,某位為1,則相應的中斷源為高優先級;為0,則為低優先級。
關于中斷的優先級有三條原則:
1、CPU同時接收到幾個中斷時,首先響應優先級最高的中斷請求;
2、正在進行的中斷過程不能被新的同級或低行優優先級的中斷請求所中斷;
3、正在進行的低行優優先級中斷服務,能被高行優優先級中斷請求中斷;
若:同一執行優先級中的中斷申請不止一個時,則有一個中斷優先權排隊問題。同一執行優先級的中斷優先權排隊,由中斷系統硬件確定的自然優先級形成,優先權自高到低的順序即: 外部中斷0>定時/計數0>外部中斷1>定時/計數1>串行接口
例如:設置IP = 0x10,即設置串口中斷為最高優先級,則串口中斷可以打斷任何其他的中斷服務函數實現嵌套,且只有串口中斷能打斷其他中斷的服務函數。若串口中斷沒有觸發,則其他幾個中斷之間還是保持邏輯優先級,相互之間無法嵌套。
關于中斷嵌套??梢赃@樣說,當一個中斷正在執行的時候,如果事先設置了中斷優先級寄存器IP,那么當一個更高優先級的中斷到來的時候會發生中斷嵌套,如果沒有設置則不會發
生任何嵌套;如果有同一個優先級的中斷觸發,它并不是在“不斷的申請”,而是將它相應的中斷標志位置即IE寄存器的某位置位,當CPU執行完當前中斷之后,按照查詢優先級重新去查詢各個中斷標志位,進入相應中斷。
要記住,沒有設置IP時,單片機會按照查詢優先級(或都說邏輯優先級)來排隊進入服務。如果要想讓某個中斷優先響應,則要設置IP,更改執行優先級(或者說物理優先級)。要注意的是,當設置了IP后,當低執行優先級中斷在運行時,如果有高執行優先級的中斷產生,則會嵌套調用進入高執行優先級的中斷。如果你是用C語言寫的程序,并在中斷服務時 using 了寄存組,要注意,兩個不同執行優先級的中斷服務程序不要 using 同一組寄存器。
看兩個問題,如下: 在各個中斷都是低優先級的時候,如果定時器0的溢出進入中斷。在這個中斷處理的過程中,外部中斷0也被觸發了,那么是不是要發生中斷嵌套? 如果定時器0發生中斷的時候,進入中斷處理程序,這個時候外部中斷1條件觸發條件滿足了。因為定時器0自然優先級比外部中斷1高,那么定時器0的中斷處理程序繼續執行。假設定時器中斷處理程序執行的過程中,外部中斷1的觸發。條件消失了,那么等定時器0的中斷處理完后,程序還是會進入外部中斷1處理程序嗎?
答案1:在IP事先設置了外部中斷0的優先級的情況下,CUP會中止定時器0的中斷服務,進入外部中斷0服務程序,執行完以后再回到定時器0中斷服務程序。否則不會。
答案2:肯定會進入中斷的;外部中斷1的觸發條件滿足后會置位外部1的中斷標志,即使后來外部中斷1的觸發條件消失了,也不會清除已置位的中斷標志,所以等定時器0的中斷處理完后,程序判斷外部中斷的中斷標志為1后依然會進入外部中斷1處理程序的,只有在外部中斷1處理程序中執行reti指令才會硬件清除外部中斷1的中斷標志(這也正是為什么中斷返回使用reti指令而不可以用ret替換的原因)...
第五篇:單片機項目總結
單片機項目總結
段紹峰、王春光、于和善
一、團隊遇到的難題及解決方案
1、我們再買器件時,由于不知道型號以及性能指標,所以買了很多并不需要的器件,并且有時買不到需要的器件,所以被迫更改電路設計。
2、在設計的過程中,編輯的程序不能應用到我們的硬件中,比如時鐘的程序不能使始終運行,以及溫濕度顯示不夠準確。在這種情況下,我們不斷更改程序,比如調整LCD的偏置電壓,有時還更改連接的端口,最后解決了兩個顯示問題。
3、起始時,我們并沒有弄懂數碼管的共陰以及共陽接法,導致電路連接錯誤,最后檢查后改正了電路焊接。并且初始時并沒有搞懂窗簾控制芯片的輸入電壓的定義,所以導致輸入電壓過高,燒壞了芯片,解決方法就是換了一個芯片重新進行了連接。
4、在編寫時鐘的程序時,開始不會編寫音樂的程序,經過Google后,明白音樂的編寫時通過改變輸出信號的頻率以及長短來改變聲音,最后實現了音樂的編寫。而且開始時并不知道DHT11芯片的信號的讀取,所以便在網上搜索數據手冊,弄懂其信號的輸出時輸出二進制數,并且通過時間長短代表0和1,于是懂得了其程序的編寫。
5、由于我們的智能家居是由三部分實現,所以需要的端口很多,一個單片機不夠,最后在我們減少端口使用未果后,便采取了使用三
個單片機的策略,實現了我們的項目。
二、團隊管理
通過單片機課上的系統設計項目,作為一個三人組成的團隊,我們在團隊管理方面都深有體會。
團隊成員都要有責任感,每個人都要積極做項目,對單片機有很高的興趣,遇到困難決不退縮。并且對項目的總體要有一定的把握與了解,能夠做到相互監督,相互督促。在遇到問題是相互幫助,齊心協力解決。但是團隊也是需要責任分配的,每個人都要負責好自己的職責,最后能夠保證完成自己的任務,最后能夠經過大家的共同努力完成單片機項目。
三、課程設計體會
1、在項目的制作中,能夠充分利用我們學過的知識,并且能增強我們對知識的利用能力,電路的設計與焊接,以及程序的編輯都得到了充分的鍛煉。并且在項目的制作過程中,我們根據自己的需要學習知識,并且把知識應用到制作中,這是先明確問題所在,通過一切渠道尋找知識來源,學習,再應用。這是我們在高中沒有接觸過的全新的學習方法,讓我們受益匪淺。
2、在設計的過程中,我們先是設計溫室控制,以及窗簾的定時的半自動升降,但是在制作過程發現這些并不是很好做,而且我們還把繼電氣控制電路和窗簾控制芯片燒掉,這些都是我們未曾想到的問題,但是我們及時改正思路,最后完成了我們的項目。這是我們明白
不要盲目自信,有時要量力而行。
3、我們在做單片機時,花費了很多的時間,而且更改了好幾次電路,浪費了不少的東西,成本控制的有點高,超出了我們的預期。所以我們以后再做項目需要更加詳細的計劃,爭取能夠以最小的成本收獲最好的結果。
四、項目成員貢獻排序
段紹峰完成了窗簾控制電路,并且制作了小房子,完成網站設計;王春光完成了音樂始終的設計與制作,并且完成了我們的結題論文。于和善完成了溫濕顯示電路的設計與制作,并且制作了PPT以及單片機項目總結。三人共同完成了我們的實驗進程與感想。
所以三人的貢獻為:段紹峰33%,王春光 33%,于和善33%。
五、課程改革建議
1、希望能夠更新我們的實驗裝備,讓我們使用更加方便。
2、望能夠每星期都有實驗,并且每天都能開放實驗室。并且希望老師以及學長能夠給我們更多的幫助。
3、能夠推薦更加適應我們的輔助叢書,幫助我們學習。