《微機(jī)原理與接口技術(shù)》課程設(shè)計(jì)實(shí)驗(yàn)報(bào)告交通燈控制功能設(shè)計(jì)_第1頁
《微機(jī)原理與接口技術(shù)》課程設(shè)計(jì)實(shí)驗(yàn)報(bào)告交通燈控制功能設(shè)計(jì)_第2頁
《微機(jī)原理與接口技術(shù)》課程設(shè)計(jì)實(shí)驗(yàn)報(bào)告交通燈控制功能設(shè)計(jì)_第3頁
《微機(jī)原理與接口技術(shù)》課程設(shè)計(jì)實(shí)驗(yàn)報(bào)告交通燈控制功能設(shè)計(jì)_第4頁
《微機(jī)原理與接口技術(shù)》課程設(shè)計(jì)實(shí)驗(yàn)報(bào)告交通燈控制功能設(shè)計(jì)_第5頁
已閱讀5頁,還剩30頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、微機(jī)原理與接口技術(shù)課程設(shè)計(jì)實(shí)驗(yàn)報(bào)告題目:交通燈控制功能設(shè)計(jì)指導(dǎo)老師: 專業(yè):信息科學(xué)與工程學(xué)院班級:自動(dòng)化0807班 日期:2011-1-5目錄一、設(shè)計(jì)思想和實(shí)施方案論述,硬件原理圖及分析 1.1、課程設(shè)計(jì)名稱 1.2、課程設(shè)計(jì)要求1.3、課程設(shè)計(jì)目的二、設(shè)計(jì)思想和實(shí)施方案論述,硬件原理圖及分析 2.1、設(shè)計(jì)思想和實(shí)施方案2.2、硬件原理圖三、典型模塊以及典型編程技巧分析 3.1、8086典型模塊分析3.2、編程技巧分析四、設(shè)計(jì)中遇到的問題及解決方法五、程序清單和程序注釋,相關(guān)流程圖 5.1程序清單和注釋5.2、實(shí)驗(yàn)室及流程圖六、收獲與體會七、參考文獻(xiàn)一、 設(shè)計(jì)課程名稱及要求1.1、課程設(shè)計(jì)名

2、稱:交通燈控制功能設(shè)計(jì)。1.2、課程設(shè)計(jì)要求:(1)、分別用c語言和匯編語言編程完成硬件接口功能設(shè)計(jì);(2)、硬件電路基于80x86微機(jī)接口;(3)、程序功能要求:小鍵盤給定、數(shù)碼管(屏幕)顯示;(4)、同時(shí)具備急救車應(yīng)急響應(yīng)功能和時(shí)間倒計(jì)時(shí)顯示功能。 1.3、課程設(shè)計(jì)目的:微機(jī)應(yīng)用系統(tǒng)設(shè)計(jì)與綜合實(shí)驗(yàn)(實(shí)踐)課程設(shè)計(jì)是自動(dòng)化專業(yè)本科生必修的一門技術(shù)基礎(chǔ)課。通過本課程設(shè)計(jì),讓學(xué)生對微機(jī)系統(tǒng)有一個(gè)較全面的理解,對典型數(shù)字接口電路的應(yīng)用技術(shù)有一個(gè)較深入的掌握,并對應(yīng)用系統(tǒng)進(jìn)行硬件原理和軟件編程進(jìn)行分析、設(shè)計(jì)和調(diào)試,達(dá)到基本掌握簡單微型計(jì)算機(jī)應(yīng)用系統(tǒng)軟硬件的設(shè)計(jì)方法,提高項(xiàng)目開發(fā)能力的目的。要求同學(xué)獨(dú)

3、立完成課題,寫出課程設(shè)計(jì)說明書,畫出電路原理圖,說明工作原理,畫出電路印制板圖, 編寫設(shè)計(jì)程序及程序流程圖。二、設(shè)計(jì)思想和實(shí)施方案論述,硬件原理圖及分析2.1、設(shè)計(jì)思想和實(shí)施方案: 本設(shè)計(jì)使用了兩種方案,一種是采用8086和8255a可編程并行接口實(shí)現(xiàn)了交通燈的設(shè)計(jì),分別對主干道和支干道顯示紅燈和綠燈并且計(jì)時(shí),采用8254定時(shí)器/計(jì)數(shù)器產(chǎn)生1hz的脈沖,來控制8259產(chǎn)生中斷,從而實(shí)現(xiàn)整個(gè)電路的設(shè)計(jì)。交通燈采用紅綠兩種發(fā)光二極管,主干道亮45s,支干道亮30s,計(jì)數(shù)的最后5s中綠燈閃爍,用數(shù)碼管倒計(jì)時(shí)顯示時(shí)間,在發(fā)生緊急情況時(shí),可以認(rèn)為用開關(guān)控制主干道和支干道紅燈均亮,禁止任何車通行。另一種方

4、案是采用單片機(jī)來實(shí)現(xiàn)的,達(dá)到的效果和上述方案相同。單片機(jī)采用定時(shí)器t0和t1來觸發(fā)中斷,根據(jù)中斷優(yōu)先級的不同,從而可以處理不同的情況,交通燈也是采用紅綠兩種發(fā)光二極管,主干道亮45s,支干道亮30s,計(jì)數(shù)的最后5s中綠燈閃爍,用數(shù)碼管倒計(jì)時(shí)顯示時(shí)間,在發(fā)生緊急情況時(shí),可以認(rèn)為用開關(guān)控制主干道和支干道紅燈均亮,禁止任何車通行,在故障清除后,斷開開關(guān)可以使紅綠燈和數(shù)碼管回到原來的狀態(tài)繼續(xù)正常工作。2.2、硬件原理圖:(a)圖是基于8086的設(shè)計(jì),(b)圖是基于單片機(jī)的設(shè)計(jì)。在(a)圖中,可編程并行接口芯片8255a用作輸出口,控制紅綠燈的亮暗和數(shù)碼管的計(jì)時(shí),定時(shí)器/計(jì)數(shù)器8254采用級聯(lián)的方式產(chǎn)生

5、1hz的脈沖,并將此方波接到中斷器8259的ir1上,即每秒鐘讓中斷控制器產(chǎn)生依次中斷,從而可以執(zhí)行中斷子程序。在(b)圖中,p0口用于接數(shù)碼管,p1口用于控制紅綠燈的亮暗,p2口用于選通數(shù)碼管,p32為定時(shí)器t0的控制端,當(dāng)p32口為高電平時(shí),定時(shí)器t0才會工作,并且t0的中斷優(yōu)先級高于t1,所以可以用于控制緊急情況。p37口接揚(yáng)聲器,在計(jì)數(shù)器t0工作時(shí)揚(yáng)聲器就會響。三、典型模塊以及典型編程技巧分析3.1、8086典型模塊分析:基于8086的設(shè)計(jì)主要由3個(gè)模塊構(gòu)成,其中8255是作為與外部顯示電路的接口單元,8254和8259協(xié)同工作產(chǎn)生中斷作為控制電路。可編程并行接口芯片8255a通過方式

6、控制字設(shè)置成方式0工作模式,a、b、c口均為輸出,可編程計(jì)數(shù)器/定時(shí)器8254通過控制字寄存器設(shè)置ou0和ou1均為方式3工作模式,通過級聯(lián)產(chǎn)生1hz的方波,中斷控制器通過初始化命令字設(shè)置成邊緣觸發(fā),8254的ou1口接到8259的ir1端,每秒鐘就可以產(chǎn)生一次中斷,每次執(zhí)行中斷子程序時(shí)使計(jì)數(shù)減1,從而可以實(shí)現(xiàn)倒計(jì)時(shí)功能,當(dāng)計(jì)數(shù)到0時(shí),重新給計(jì)數(shù)初值賦給,改變燈的狀態(tài)。外部開關(guān)接8259的ir0端,它的中斷優(yōu)先級別高,設(shè)置成邊緣觸發(fā),當(dāng)按下開關(guān),產(chǎn)生一個(gè)高電平的脈沖,就可以停止原來的狀態(tài)來執(zhí)行更高級別的中斷子程序,這就可以處理緊急情況,讓主干道和支干道都變成紅燈。單片機(jī)典型模塊分析:基于單片機(jī)

7、的設(shè)計(jì)主要是以51單片機(jī)為核心,通過變成開放t0和t1的中斷,但t0要在int0為高電平時(shí)計(jì)數(shù)器t0才會工作。計(jì)數(shù)器t1每50ms產(chǎn)生一次中斷,每產(chǎn)生20次中斷就令數(shù)碼管的計(jì)數(shù)減1,當(dāng)計(jì)數(shù)減到0時(shí),重新設(shè)置數(shù)碼管的計(jì)數(shù)初值,這樣就可以依次循環(huán)工作了。當(dāng)p32接高電平時(shí),計(jì)數(shù)器t0開始工作,此時(shí)紅燈都亮,揚(yáng)聲器發(fā)音,中斷結(jié)束后還原原來的狀態(tài)。3.2、編程技巧分析:基于8086的設(shè)計(jì)編程語言是匯編語言,這里的幾個(gè)編程模塊就是方波產(chǎn)生模塊,數(shù)碼管顯示模塊和中斷子程序模塊。方波是通過8254級聯(lián)產(chǎn)生的,設(shè)置8254的計(jì)時(shí)器0和計(jì)數(shù)器1工作在方式3,設(shè)置適當(dāng)計(jì)數(shù)初值n即可,這個(gè)模塊的程序如下所示:loo

8、p2: mov dx,my8254_mode mov al,0 out dx,al ;計(jì)數(shù)器0,讀寫16位低高字節(jié),工作方式3,bcd計(jì)數(shù) mov al,00h mov dx,my8254_0 out dx,al mov al,50 out dx,al mov dx,my8254_mode mov al,77h out dx,al ;計(jì)數(shù)器1,讀寫16位低高字節(jié),工作方式3,bcd計(jì)數(shù) mov al,8 mov dx,my8254_1 out dx,al mov al,2 out dx,al ;1.041667mhz/2000/1000=1hz,即計(jì)數(shù)器輸出1hz的方波數(shù)碼管的顯示是通過調(diào)用顯

9、示函數(shù)實(shí)現(xiàn)的,通過設(shè)置8255的工作模式,選擇數(shù)碼管的高位工作,然后將計(jì)數(shù)的高位送到數(shù)碼管,再選擇數(shù)碼管的低位工作,然后將計(jì)數(shù)的低位送到數(shù)碼管,在1s鐘內(nèi)多次掃描就可以消除閃爍,從而達(dá)到理想的計(jì)數(shù)效果,它的程序如下所示:disp proc nearc1:mov dx,my8255_cmov al,0feh;選通高位數(shù)碼管out dx,alsub ah,ahmov al,countmov bl,0ahdiv bl;商寄存在al中,余數(shù)在ah中mov bx,offset tabxlat;通過查表找到對應(yīng)的7段顯示字符mov dx,my8255_bout dx,alcall delay1msmov

10、al,0out dx,almov al,0fdh;選通低位數(shù)碼管mov dx,my8255_cout dx,almov al,ahmov bx,offset tabxlat;通過查表找到對應(yīng)的7段顯示字符mov dx,my8255_bout dx,alcall delay1msmov al,0 out dx,almov ah,1int 16h;有鍵按下則跳出jnz quitdisp endp中斷子程序模塊是通過擴(kuò)充中斷源實(shí)現(xiàn)的,主要是通過設(shè)置8259的工作模式,開放tr1和tr0的中斷,按上開關(guān)k后,tr0就發(fā)生中斷,在tr0中斷沒有觸發(fā)的情況下,從ou1口輸出一個(gè)上升沿脈沖,tr1就中斷一次

11、,程序如下所示:query: mov dx,my8259_ocw3 ;向8259的ocw3發(fā)送查詢命令 mov al,0ch out dx,al in al,dx ;讀出查詢字 test al,80h ;判斷中斷是否已響應(yīng) jz query ;沒有響應(yīng)則繼續(xù)查詢 and al,03h cmp al,00h je ir0isr ;若為ir0請求,跳到ir0處理程序 jne ir1isr ;若為ir1請求,跳到ir1處理程序 jmp eoi基于單片機(jī)的編程語言是c語言,它主要有數(shù)碼管顯示程序和中斷服務(wù)子程序。數(shù)碼管的顯示和上面匯編語言的原理一樣,它的程序如下:void display(unsign

12、ed char t)/顯示數(shù)碼管函數(shù) p2=0xf5;選通兩個(gè)高位數(shù)碼管 p0=tabt/10;取t的十位送到p0口顯示 delay(); p2=0xf0;開通所有的數(shù)碼管,避免閃爍 p2=0xfa;選通低位兩個(gè)數(shù)碼管 p0=tabt%10;取t的個(gè)位送到p0口顯示 delay(); p2=0xf0;中斷服務(wù)子程序有計(jì)數(shù)器t0和計(jì)數(shù)器t1的子程序。t1的優(yōu)先級低,它主要用于控制正常工作狀態(tài)的紅綠燈和數(shù)碼管計(jì)數(shù),而t0的優(yōu)先級高,可以處理緊急情況,并且在處理緊急情況以后能返回原正常運(yùn)行狀態(tài),這在匯編里面用的是棧保護(hù),而在c語言中可以設(shè)置一個(gè)變量也存儲原來的數(shù)據(jù),可以達(dá)到同樣保護(hù)數(shù)據(jù)的效果,這一點(diǎn)

13、的實(shí)現(xiàn)代碼如下:void time0(void) interrupt 1 using 0 t=0;count1=count;/寄存中斷前count的值,以便中斷結(jié)束后恢復(fù) while(t!=125) t+; sound=sound; p10=0;/緊急情況綠燈全熄 p12=0; p11=1;/緊急情況紅燈全亮 p13=1; p2=0xf0;/點(diǎn)亮兩個(gè)數(shù)碼管 count=88; display(count); th0=(65535-921)/256; tl0=(65535-921)%256; count=count1;/恢復(fù)原來count的值 if(a%2=0) p10=1; p11=0; p1

14、2=0; p13=1;/返回主干道通行 else p10=0; p11=1; p12=1; p13=0;/返回主干道通行 四、設(shè)計(jì)中遇到的問題及解決方法 1.數(shù)碼管的計(jì)數(shù)每秒鐘減1,當(dāng)時(shí)不熟練8254的應(yīng)用,就想用軟件延時(shí)來實(shí)現(xiàn)這個(gè)功能,最后查資料的時(shí)候知道了計(jì)時(shí)器的級聯(lián)應(yīng)用,很容易的就解決了這個(gè)問題。 2.對于數(shù)碼管的顯示,最開始感覺很模糊,查閱資料的時(shí)候找到了xlat表轉(zhuǎn)換指令的應(yīng)用,首先定義十進(jìn)制的七段顯示碼,將表格首地址送入bx,數(shù)字的七段碼在表格中的偏移量送入,然后執(zhí)行xlat就可以實(shí)現(xiàn)這個(gè)功能了。 3.對于要求中的緊急響應(yīng)功能,開始時(shí)只想利用8254來實(shí)現(xiàn),結(jié)果失敗了,所以我就想到

15、了用兩級中斷,產(chǎn)生高級中斷時(shí)就開啟緊急響應(yīng)功能,觸發(fā)蜂鳴器,點(diǎn)亮紅燈。 4.在執(zhí)行中斷程序的過程中,寄存器中的變量好多都改變了,開始時(shí)束手無策,最后查資料時(shí)想到了棧的運(yùn)用,利用入棧和出棧來保護(hù)寄存器中的初值。 5.在用c語言編程時(shí),用protues軟件進(jìn)行仿真時(shí),數(shù)碼管顯示錯(cuò)誤,一會顯示一會停止,閃爍感太明顯了。想想后,我就把顯示函數(shù)從中斷子程序中改放到主函數(shù)中,放在while(1)無限循環(huán)語句中,最后很好的解決了這個(gè)問題。查閱資料后才明白,執(zhí)行中斷子程序是很快的事,執(zhí)行完了后就會返回到主函數(shù)中繼續(xù)執(zhí)行,所以顯示函數(shù)放在中斷子程序中只有在產(chǎn)生中斷的時(shí)候才會工作,所以數(shù)碼管很多時(shí)候就處于熄滅的狀

16、態(tài),而顯示函數(shù)放在主函數(shù)中就放好解決了這個(gè)問題。 6.要做到可以人為設(shè)置通行時(shí)間,在單片機(jī)中,我不熟練鍵盤掃描,所以就想到了另外一個(gè)辦法,給p1的高四位賦不同的初值,這樣可以得到16種組合,故可以設(shè)置16中初值,為了簡化程序,我只設(shè)置了4種初值,不過同樣可以達(dá)到設(shè)置初值的效果。 7.用單片機(jī)產(chǎn)生兩級中斷的時(shí)候,我不知道該選定時(shí)器中斷還是外部中斷,查資料后知道定時(shí)器0和定時(shí)器1的中斷優(yōu)先級不一樣,定時(shí)器t0的優(yōu)先級高,所以可以讓定時(shí)器t1控制正常工作狀態(tài)的燈顯示和數(shù)碼管計(jì)數(shù),而定時(shí)器t0則控制突發(fā)情況。 五、程序清單和程序注釋,相關(guān)流程圖 5.1程序清單和注釋: 基于8086匯編語言的程序清單及

17、注釋如下所示: my8255_a equ ioy0+00h*4 ; 8255a口的地址 my8255_b equ ioy0+01h*4 ; 8255b口的地址 my8255_c equ ioy0+02h*4 ; 8255c口的地址 my8255_mode equ ioy0+03h*4 ; 8255控制寄存器的地址 my8254_0 equ ioy1+00h*4 ; 8254計(jì)數(shù)器0端口的地址 my8254_1 equ ioy1+01h*4 ; 8254計(jì)數(shù)器0端口的地址 my8254_mode equ ioy1+02h*4 ; 8254計(jì)數(shù)器0端口的地址;*根據(jù)check配置信息修改下列符號值

18、* intr_ivadd equ 01cch ;intr對應(yīng)的中斷矢量地址 intr_ocw1 equ 0a1h ;intr對應(yīng)pc機(jī)內(nèi)部8259的ocw1地址 intr_ocw2 equ 0a0h ;intr對應(yīng)pc機(jī)內(nèi)部8259的ocw2地址 intr_im equ 0f7h ;intr對應(yīng)的中斷屏蔽字 pci_intcsr equ 9438h ;pci卡中斷控制寄存器地址 ioy0 equ 0c400h ;片選ioy0對應(yīng)的端口始地址 ioy1 equ 0c440h ;片選ioy0對應(yīng)的端口始地址 ioy2 equ 0c480h ;片選ioy0對應(yīng)的端口始地址;* my8259_icw1

19、 equ ioy2+00h ;實(shí)驗(yàn)系統(tǒng)中8259的icw1端口地址 my8259_icw2 equ ioy2+04h ;實(shí)驗(yàn)系統(tǒng)中8259的icw2端口地址 my8259_icw3 equ ioy2+04h ;實(shí)驗(yàn)系統(tǒng)中8259的icw3端口地址 my8259_icw4 equ ioy2+04h ;實(shí)驗(yàn)系統(tǒng)中8259的icw4端口地址 my8259_ocw1 equ ioy2+04h ;實(shí)驗(yàn)系統(tǒng)中8259的ocw1端口地址 my8259_ocw2 equ ioy2+00h ;實(shí)驗(yàn)系統(tǒng)中8259的ocw2端口地址 my8259_ocw3 equ ioy2+00h ;實(shí)驗(yàn)系統(tǒng)中8259的ocw3端

20、口地址 red equ 0fah ;緊急時(shí)刻,主支干道全部亮紅燈 zhu equ 0f5h ;主干道燈的狀態(tài) zhi equ 0f9h ;支干道燈的狀態(tài) flicker equ 0f0h ;控制燈閃爍 close equ 00h ;關(guān)閉所有的燈 time1 equ 20 ;主干道通行時(shí)間 time2 equ 10 ;支干道通行時(shí)間 data segment cs_bak dw ? ip_bak dw ? im_bak dw ? tab db 40h,79h,24h,30h,19h,12h,02h,78h,00h,18h ;十進(jìn)制數(shù)的七段顯示碼 count dw ? ;存儲計(jì)數(shù)的變量 flag

21、dw ? ;flag為偶數(shù)時(shí)表明主干道通行 data ends stack1 segment stack dw 256 dup(?) stack1 ends code segment assume cs:code,ds:data,ss:stack1 start: mov ax,data mov ds,ax cli mov dx,my8255_mode mov al,80h out dx,al ;初始化8255的工作模式a、b、c工作在方式0,均為輸出 loop1: mov dx,my8255_a mov cx,3 a1: mov al,red out dx,al call delay1 ;延時(shí)

22、0.5s mov al,close out dx,al call delay1 loop a1 ;初始狀態(tài)主支干道紅燈均閃爍,3s后進(jìn)入正常工作狀態(tài) loop2: mov dx,my8254_mode mov al,0 out dx,al ;計(jì)數(shù)器0,讀寫16位低高字節(jié),工作方式3,bcd計(jì)數(shù) mov al,00h mov dx,my8254_0 out dx,al mov al,50 out dx,al mov dx,my8254_mode mov al,77h out dx,al ;計(jì)數(shù)器1,讀寫16位低高字節(jié),工作方式3,bcd計(jì)數(shù) mov al,8 mov dx,my8254_1 ou

23、t dx,al mov al,2 out dx,al ;1.041667mhz/2000/1000=1hz,即計(jì)數(shù)器輸出1hz的方波 mov count,time1 mov flag,0 ;初始化主干道通行 mov cl,zhu mov al,cl mov dx,my8255_a out dx,al mov dx,pci_intcsr sub dx,19h in al,dx mov dx,pci_intcsr ;初始化pci卡中斷控制寄存器 mov ax,1f00h ;向pci_intcsr中寫入003f1f00h out dx,ax add dx,2 mov ax,003fh out dx,

24、ax mov ax,0000h ;替換intr的中斷矢量 mov es,ax mov di,intr_ivadd mov ax,es:di mov ip_bak,ax ;保存intr原中斷處理程序入口偏移地址 mov ax,offset myisr mov es:di,ax ;設(shè)置當(dāng)前中斷處理程序入口偏移地址 add di,2 mov ax,es:di mov cs_bak,ax ;保存intr原中斷處理程序入口段地址 mov ax,seg myisr mov es:di,ax ;設(shè)置當(dāng)前中斷處理程序入口段地址 mov dx,intr_ocw1 ;設(shè)置中斷屏蔽寄存器,打開intr的屏蔽位 in

25、 al,dx xor ax,ax mov im_bak, ax ;保存intr原中斷屏蔽字 and al,intr_im out dx,al mov dx,my8259_icw1 ;初始化實(shí)驗(yàn)系統(tǒng)中8259的icw1 mov al,13h ;邊沿觸發(fā)、單片8259、需要icw4 out dx,al mov dx,my8259_icw2 ;初始化實(shí)驗(yàn)系統(tǒng)中8259的icw2 mov al,08h out dx,al mov dx,my8259_icw4 ;初始化實(shí)驗(yàn)系統(tǒng)中8259的icw4 mov al,01h ;非自動(dòng)結(jié)束eoi out dx,al mov dx,my8259_ocw1 ;初始

26、化實(shí)驗(yàn)系統(tǒng)中8259的ocw1 mov al,0fch ;打開ir0和ir1的屏蔽位 out dx,al sti wait1: call disp ;數(shù)碼管顯示 mov ah,1 ;判斷是否有按鍵按下 int 16h jz wait1 ;無按鍵則跳回繼續(xù)等待,有則退出 quit: cli mov dx,pci_intcsr ;恢復(fù)pci卡中斷控制寄存器 mov ax,0000h out dx,ax mov ax,0000h ;恢復(fù)intr原中斷矢量 mov es,ax mov di,intr_ivadd mov ax,ip_bak ;恢復(fù)intr原中斷處理程序入口偏移地址 mov es:di,

27、ax add di,2 mov ax,cs_bak ;恢復(fù)intr原中斷處理程序入口段地址 mov es:di,ax mov dx,intr_ocw1 xor ax,ax ;恢復(fù)intr原中斷屏蔽寄存器的屏蔽字 mov ax,im_bak out dx,al sti mov ax,4c00h ;返回到dos int 21h myisr proc near ;中斷處理程序myisr query: mov dx,my8259_ocw3 ;向8259的ocw3發(fā)送查詢命令 mov al,0ch out dx,al in al,dx ;讀出查詢字 test al,80h ;判斷中斷是否已響應(yīng) jz q

28、uery ;沒有響應(yīng)則繼續(xù)查詢 and al,03h cmp al,00h je iro0 ;若為ir0請求,跳到ir0處理程序 jne iro1 ;若為ir1請求,跳到ir1處理程序 jmp eoi iro0: mov al,flag ;iro為高級中斷,處理緊急情況 cbw mov bx,ax ;把count變成雙字節(jié)存入ax,這樣就可以存入棧中 mov al,count ;把count變成雙字節(jié)存入ax,這樣就可以存入棧中 cbw push ax push bx mov cx,0ffffh ;中斷程序執(zhí)行時(shí)間為65536*256/f=3s loop0: mov bl,0ffh loop1

29、: mov dx,my8255_a mov ax,0fah ;主干道支干道紅燈均亮 mov dx,my8255_c mov al,80h ;pc7為高電平,接揚(yáng)聲器 out dx,al dec bl cmp bl,0 jne loop1 loop loop0 pop bx pop ax mov count,al ;還原中斷前的變量值 mov flag,bl mov ah,0 mov al,flag mov bl,2 div bl ;ah=1,flag為奇數(shù) ,支干道通行 cmp ah,1 je p3 mov dx,my8255_a mov al,zhu ;主干道通行燈的狀態(tài) out dx,al

30、 p3: mov dx,my8255_a mov al,zhi ;支干道通行燈的狀態(tài) out dx,al iret iro1: mov al,count sub al,01h das mov count,al ;計(jì)數(shù)初值自減1 cmp al,0 je l2 mov al,flag mov bl,2 div bl ;ah=1,flag為奇數(shù) ,支干道通行 cmp ah,1 je p1 mov dx,my8255_a mov al,zhu ;主干道通行燈的狀態(tài) out dx,al p1: mov dx,my8255_a mov al,zhi ;支干道通行燈的狀態(tài) out dx,al l2: mov

31、 al,flag add al,01h ;狀態(tài)顯示數(shù)加1 daa mov ah,0 mov bl,2 div bl ;ah=1,flag為奇數(shù) ,支干道通行 cmp ah,1 je p2 mov count,time1 ;支干道工作完后設(shè)置主干道的通行時(shí)間time1 p2: mov count,time2 ;主干道工作完后設(shè)置支干道的通行時(shí)間time2 iret eoi: mov dx,my8259_ocw2 ;向?qū)嶒?yàn)系統(tǒng)中8259發(fā)送中斷結(jié)束命令 mov al,20h out dx,al over: mov dx,pci_intcsr sub dx,19h in al,dx mov dx,p

32、ci_intcsr ;清pci卡中斷控制寄存器標(biāo)志位 add dx,2 mov ax,003fh out dx,ax mov dx,intr_ocw2 ;向pc機(jī)內(nèi)部8259發(fā)送中斷結(jié)束命令 mov al,20h out dx,al mov al,20h out 20h,al iret myisr endp disp proc mov dx,my8255_c mov al,0ah ;選通高位數(shù)碼管 out dx,al mov al,count mov bl,0ah div bl ;十位存在al中,個(gè)位存在ah中 mov bx,offset tab xlat ;找到十位對應(yīng)的七段顯示碼 mov

33、dx,my8255_b out dx,al call delay1ms mov dx,my8255_c mov al,05h out dx,al mov al,ah mov bx,offset tab xlat ;找到個(gè)位對應(yīng)的七段顯示碼 mov dx,my8255_b out dx,al ret ;過程返回指令 disp endp delay1 proc near ;延時(shí)0.5s push ax push cx mov ax,05fffh d1: mov cx,64ffh d2: loop d2 dec ax jnz d1 pop cx pop ax ret delay1 endp dela

34、y1ms proc near ;延時(shí)1ms push cx mov cx,50h next: nop nop loop next pop cx ret delay1ms endp code ends end start 基于單片機(jī)的c語言程序清單及注釋如下所示: #include unsigned char tab=0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90;unsigned char time;unsigned char t;unsigned char count;/儲存通行時(shí)間unsigned char main1;/主干道通行時(shí)間u

35、nsigned char cross;/支干道通行時(shí)間unsigned char count1;unsigned char a;/測試主干道工作還是支干道工作 sbit p10=p10;/控制主干道綠燈 sbit p11=p11;/主干道紅燈sbit p12=p12;/控制支干道綠燈sbit p13=p13;/支干道紅燈sbit p14=p14;/以下端口輔助撥碼開關(guān)設(shè)置時(shí)間sbit p15=p15;sbit p16=p16;sbit p17=p17;sbit sound=p37;/發(fā)聲音void delay()/延時(shí)20ms unsigned char i; for(i=0;i200;i+) ;void display(unsigned char t)/顯示數(shù)碼管函數(shù) p2=0xf5; p0=tabt/10; delay(); p2=0xf0; p2=0xfa; p0=tabt%10; delay(); p2=0xf0;void main() ea=1; /開總中斷 et0=1; /開定時(shí)器0的中斷 et1=1; /開定時(shí)器1的中斷 tmod=0x19;/計(jì)數(shù)器1工作于方式1,計(jì)數(shù)器0工作于方式1,tr0為1且int0為高電平啟動(dòng)工作 th0=(65535-921)/256; tl0=(65535-921)%256; /定

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論