![微機原理課程設計電子鐘的設計_第1頁](http://file2.renrendoc.com/fileroot_temp3/2021-6/22/6e77d42a-b981-459e-8f31-936935ea610d/6e77d42a-b981-459e-8f31-936935ea610d1.gif)
![微機原理課程設計電子鐘的設計_第2頁](http://file2.renrendoc.com/fileroot_temp3/2021-6/22/6e77d42a-b981-459e-8f31-936935ea610d/6e77d42a-b981-459e-8f31-936935ea610d2.gif)
![微機原理課程設計電子鐘的設計_第3頁](http://file2.renrendoc.com/fileroot_temp3/2021-6/22/6e77d42a-b981-459e-8f31-936935ea610d/6e77d42a-b981-459e-8f31-936935ea610d3.gif)
![微機原理課程設計電子鐘的設計_第4頁](http://file2.renrendoc.com/fileroot_temp3/2021-6/22/6e77d42a-b981-459e-8f31-936935ea610d/6e77d42a-b981-459e-8f31-936935ea610d4.gif)
![微機原理課程設計電子鐘的設計_第5頁](http://file2.renrendoc.com/fileroot_temp3/2021-6/22/6e77d42a-b981-459e-8f31-936935ea610d/6e77d42a-b981-459e-8f31-936935ea610d5.gif)
版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、摘要數字鬧鐘1、通過8253定時器產生秒脈沖定時中斷。在中斷服務程序中實現秒、分、小時的進位(24小時制)。2、將當前時分秒在七段led顯示器上顯示(如:091132)。3、可設置鬧鐘的時間當前值(對準時間),設置鬧鈴時間,鬧鈴功能的關閉和開放.關鍵詞:數字鬧鐘,8253定時器,led顯示器,8255a并行口目 錄1.實驗線路12.設計思想23.功能流程圖44.結果討論85.源程序以及注釋9參考文獻261.實驗線路實驗線路如圖1所示。圖1 實驗線路圖2.設計思想一、概述:程序主體設計:本程序共有分端口設置模塊,計數模塊,顯示模塊等幾個模塊。c-display 12, 45, 37 -將鬧鐘設置
2、為12:45: 37;g-go ahead-開中斷,鬧鐘恢復走時d-stop to display-關中斷,鬧鐘停止走時e-exit to dos-返回dosm-set the clock -設置鬧鈴時間f-open the clock-設置鬧鐘功能為開b-close the clock-設置鬧鐘功能為關p-position the beninning date-設置鬧鐘的時間二、計時器軟件的設計:主程序中,要對各個用到的芯片進行初始化,目的是使其每20豪秒產生一次方波。8253a的定時器輸出與8259a的ir2連接,計數器0工作在模式3(方波發(fā)生器),計數值采用二進制格式,輸出作為計數器1的
3、輸入, 計數器1工作在模式2(分頻器),計數值采用二進制格式,輸出到總線irq2,向cpu發(fā)送時鐘中斷信號,根據兩個計數器的設置,系統(tǒng)每隔20毫秒便由8253a產生一次中斷請求,即每隔20豪秒執(zhí)行一次中斷處理程序。這個方法將與時間相關的兩個模塊即顯示模塊和計時模塊放在中斷處理程序中,這樣,就保證了數字顯示的穩(wěn)定,中斷處理程序完成計時功能要依靠兩個方面,因為中斷處理程序是每20豪秒執(zhí)行一次,但計時并不是以20豪秒為單位進行的,而是以秒為單位進行的,所以,計時功能的實現一方面要利用20毫秒這個基準時間單位,另一方面借助一個計數單位。計數單位的初始值為50,每進行一次中斷,便使計數單元的內容減1。每
4、當計數單元從50減為0時,說明已經過了1秒時間。并判斷是否有進位,如有則進行修改,實現進位。并在led上顯示。顯示部分:本程序顯示部分用了6個共陰極led作為顯示管,顯示程序要做到每送一次段碼就送一次位碼,每送一次位碼后,將位碼中的0右移1位作為下次的位碼,從而可以實現從左到右使6個led依次顯示出相應的數字。雖然cpu每隔一定時間便執(zhí)行顯示程序,但只要這個時間段不太長,由于人眼的視覺作用,就可以在6個led上同時見到數字顯示。程序中,用8255a的pa口作為輸出,輸出掃描信號,pb口作為輸入,讀進列值。本程序用行掃描法來識別鍵盤的閉合鍵。先使第0行接地,其余行為高電平,然后看第0行是否有鍵閉
5、合,這是通過檢查列線電位來實現的,即在第0行接地時看是否有哪條列線變成低電平。如果有某條列線變?yōu)榈碗娖?,則表示第0行和此列線位置上的鍵被按下如果沒有,則說明第0行上沒有鍵被按下。此后,再將第1行接地,然后檢測列線中是否有變?yōu)榈碗娖降木€。如此往下逐行掃描,直到最后一行。為消除鍵的抖動,所以調用延遲程序,然后再判斷具體按下的到底是哪個鍵,如果得到的是ffh,則程序在循環(huán)中等待。計數部分:見流程圖時間設定模塊對于輸入的檢測,若超出范圍,則對其置f-,3.功能流程圖一、程序主流程控制圖(如圖2所示)d鍵?p鍵?m鍵?f鍵?b鍵?e鍵?nnnnnnyyyyyyg鍵?nyc鍵?y顯示初始化時間開始計時停止
6、計時開啟鬧鈴設置鬧鈴設置時間關閉鬧鈴退出回到dosn圖2 程序主流程控制圖二、中斷服務子程序流程圖(如圖3所示)收到50次中斷?進位處理部分(下)鬧鈴開?計數值減一(初值為50)yn鬧鈴時間到?中斷進入yyn響鈴退出中斷服務圖3 中斷服務子程序流程圖圖三、進位處理部分流程圖(如圖4所示)開始秒鐘是否到59(此部分的轉換從略)秒加1秒十位和各位賦值為0 0ny分鐘是否到59(此部分的轉換從略)分鐘加1ny分鐘十位和各位賦值為0 0分鐘是否到23(此部分的轉換從略)小時加1ny小時十位和各位賦值為0 0鬧鈴判斷響鈴部分圖4進位處理部分流程圖4.結果討論本程序共有分端口設置模塊,計數模塊,顯示模塊等
7、幾個模塊。經過調試,本程序可以實現題目的要求。時、分、秒都分兩位。個位滿十后就向前進一位。分秒的十位滿六十后也向前進一位。顯示小時兩位在滿二十四后重新計數。在置數時,使用者可置任意值,但如果有某位超過計數值,則在led顯示器上輸出出錯信息。程序中設置壓c鍵為led顯示器清0,壓e鍵為退出,壓d鍵為計數暫停,壓p鍵為設置led顯示器初始值。應該注意的是,程序中設定的鍵值為實驗臺上的小鍵盤的鍵值,并非計算機鍵盤。經測試,程序中設置的功能全都可以良好運行。本程序參照實驗室電腦中16bit文件中的kl.asm編制定時器/計數器8253計數初值的設定。下面對幾個重點部分的調試過程和遇到的問題作一定的討論
8、:修改后的中斷服務子程序(改變進位的條件)(1)其中進位的條件判斷以及后面的鬧鈴的程序段位置的設置都與程序結果有很大的關系.進位判斷特別要注意仔細,編程實現前應該畫個流程圖,直接再源文件上改不但不能節(jié)省時間,反而更加浪費時間.(2)此中斷服務子程序的類型設置為far調用,這里要特別注意.因為相對于中斷發(fā)生時的運行狀態(tài),此程序段與之不在同一代碼段,所以應該定義為far類型.這樣產生了另外一個問題,在此程序段中若想調用此code段中以他過程,則那個過程也應該被定義為far調用,當然可以簡單的通過不使用過程調用解決.以解決此中斷子程序過程和其他普通過程對對應過程的調用沖突.5.源程序以及注釋;此程序
9、實現數字鬧鐘的設定,鬧鈴時間得設定,鬧鈴功能的開關;試驗硬件平臺是tpc-1型試驗培訓系統(tǒng);386以上微機適用;純dos下才能使用;tasm4.1或以上編譯;*;* 鍵盤顯示 8255led *;*; io_plx_device_id equ 05406h;tpc卡設備id io_plx_vendor_idequ 010b5h;tpc卡廠商id io_plx_sub_id equ 0905410b5h;tpc卡子設備及廠商id pa55 equ 218h-200h;8255端口地址 pb55 equ 219h-200h p55ctl equ 21bh-200h portseg equ 211h
10、-200h;led端口地址 portbit equ 210h-200h tim_ctl equ 203h-200h;8253端口地址 timer0 equ 200h-200h timer1 equ 201h-200h mode03 equ 36h ;0011-0111 mode12 equ 74h ;0111-0101data segment csregdw? ipregdw? ;舊中斷向量保存空間 io_9054base_addressdb 4 dup(0);tpc卡pci接口芯片i/o基地址暫存空間 io_base_address db 4 dup(0);tpc卡i/o基地址暫存空間 in
11、terrupt_line db 2 dup(0);tpc卡中斷號暫存空間 pcicardnotfinddb 0dh,0ah,tpc pci card not find or address/interrupt error !,0dh,0ah,$ io9054baseaddressdb 0dh,0ah,tpc pci card 9054 chip i/o base address : ,$ iobaseaddressdb 0dh,0ah,tpc pci card i/o base address : ,$ intnumber db 0dh,0ah,tpc pci card interrupt l
12、ine : ,$ enter_return db 0dh,0ah,$ mess db 8253a timer0 in mode3! count=0200h,0ah,0dh db 8253a timer1 in mode2! count=0ah,0ah,0dh,$ mess1 db i am ringing,0ah,0dh,$ irq_vectdb 08h,09h,0ah,0bh,0ch,0dh,0eh,0fh,70h,71h,72h,73h,74h,75h,76h,77h;新的中斷向量,中斷0-7的向量為:08h-0fh,中斷8-15的向量為:70h-77h irq_mask_0_7_tabl
13、edb 011111110b,011111101b,011111011b,011110111bdb 011101111b,011011111b,010111111b,001111111bdb 011111011b,011111011b,011111011b,011111011bdb 011111011b,011111011b,011111011b,011111011b;新的中斷掩碼,中斷0-7時從低至高相應位為零,中斷8-15時第2位為零 irq_mask_8_15_tabledb 0ffh,0ffh,0ffh,0ffh,0ffh,0ffh,0ffh,0ffhdb 011111110b,011
14、111101b,011111011b,011110111bdb 011101111b,011011111b,010111111b,001111111b;新的中斷掩碼,中斷0-7時全一,中斷8-15時從低至高相應位為零count db 15ctime db 00h,00h,00h,00h,00h,00hclock db 0ah,0ah,0ah,0ah,0ah,0ahbuf db 00h,00h,00h,00h,00h,00h;*mybell db 00h;*off*initializemonth3 db 0day3 db 0char1 db ?intmask db ?const1 dw ?led
15、 db 3fh,06h,5bh,4fh,66h,6dh,7dh,07h,7fh,6fh,40h,79h,00htable1 dw 0101h,0201h,0401h,0801h,1001h,2001h,4001h,8001h dw 0102h,0202h,0402h,0802h,1002h,2002h,4002h,8002h dw 0104h,0204h,0404h,0804h,1004h,2004h,4004h,8004hchar db cdefba9845673210 rpmg;maxday db 00h,1fh,1ch,1fh,1eh,1fh,1eh,1fh,1fh,1eh,1fh,1e
16、h,1fhmes db in small keyrord,0ah,0dh db c-display 12, 45, 37 ; g-go ahead,0ah,0dh db d-stop to display ; e-exit to dos,0ah,0dh db m-set the clock ; f-open the clock,0ah,0dh db b-close the clock,0ah,0dh db p-position the beninning date,0ah,0dh,$data endsstacks segmentdb 100 dup (?)sta dw 512 dup (?)t
17、op equ length stastacks endscode segment ;assume cs:code,ds:data,ss:stacks,es:datastart:;enable local interrupt input.386 cli mov ax,data mov ds,ax mov es,ax mov ax,stacks mov ss,ax callfindtpc;查找tpc卡資源并顯示 mov ah,0 int 1ah ;時間中斷,保存到dx中 mov bx,dxt1: mov ah,0 int 1ah cmp bx,dx jz t1 mov bx,dx mov si,0
18、t2: mov ah,0 int 1ah mov ax,800ht3: dec ax ;循環(huán)800h次 jnz t3 inc si cmp bx,dx jz t2 mov ax,30h mov bx,si mul bx mov bx,56h div bx mov word ptr const1,axmov dx,word ptr io_base_address;初始化8253add dx,tim_ctl ;控制口mov al,mode03 ;36h=0011 0110 ;計數器0工作在模式3(方波發(fā)生器),計數值采用二進制格式out dx,almov dx,word ptr io_base_a
19、ddressadd dx,timer0 ;計時器0mov al,00hout dx,almov al,02hout dx,almov dx,word ptr io_base_addressadd dx,tim_ctl ;74h=0111 0100 ;設置計數器1工作在模式2(分頻器),計數值采用二進制格式mov al,mode12out dx,almov dx,word ptr io_base_addressadd dx,timer1mov al,0ahout dx,almov al,00out dx,almov dx,offset mesmov ah,09int 21hmov dx,word
20、 ptr io_9054base_addressadd dx,68h ;設置 tpc 卡中9054芯片io口,使能中斷 in ax,dx or ax,0900h out dx,ax mov bx,word ptr interrupt_line ;保存原中斷向量mov al,byte ptr irq_vect+bxmov ah,35h int 21hmov ax,esmov csreg,axmov ipreg,bx mov bx,word ptr interrupt_line ;設置新中斷向量 mov al,byte ptr irq_vect+bx mov cx,cs mov ds,cxmov
21、dx,offset int_procmov ah,25h int 21hmov ax,datamov ds,axmov es,ax in al, 21h ;設置中斷掩碼 mov bx,word ptr interrupt_linemov ah,byte ptr irq_mask_0_7_table+bxandal,ah out 21h, al in al, 0a1h mov bx,word ptr interrupt_linemov ah,byte ptr irq_mask_8_15_table+bxandal,ah out 0a1h, alsti ;開中斷;*;*小鍵盤的查詢過程*lkey:
22、 call key ;獲得tpc鍵盤輸入值 mov dl,char1 ;c-display 12, 45, 37 cmp dl,c jnz lgy call cpro jmp lkeylgy: cmp dl,g; g-go ahead jnz ldy call gpro jmp lkeyldy: cmp dl,d; d-stop to display jnz lpy call dpro jmp lkeylpy: cmp dl,p; p-position the beninning jnz lmy call ppro jmp lkeylmy: cmp dl,m ;set the clock ti
23、me jnz lfy call mpro jmp lkeylfy: cmp dl,f ;belling on/off jnz lby mov mybell,01h;on jmp lkeylby: cmp dl,b;b-close the clock jnz ley mov mybell,00h;off jmp lkeyley: cmp dl,e; exit to dos jnz lkey;*非規(guī)定的按鍵時繼續(xù)等待*;*exit: cli mov bx,word ptr interrupt_line;恢復中斷掩碼 mov ah,byte ptr irq_mask_0_7_table+bx not
24、 ah inal, 21h oral, ah out21h, al mov bx,word ptr interrupt_line mov ah,byte ptr irq_mask_8_15_table+bx not ah inal, 0a1h oral, ah out0a1h, al mov bx,word ptr interrupt_line;恢復原中斷向量 mov al,byte ptr irq_vect+bx mov dx,ipreg mov cx,csreg mov ds,cx mov ah,25h int 21h mov ax,data;設置 tpc 卡中9054芯片io口,關閉中斷
25、 mov ds,ax mov dx,word ptr io_9054base_address add dx,68h in ax,dx and ax,0f7ffh out dx,ax mov ax,4c00h int 21h;退出;-int_proc proc far ;修改后的中斷服務子程序(改變進位的條件);此中斷服務子程序的類型設置為far調用,這里要特別注意.因為相對于中斷發(fā)生時的運行;狀態(tài),此程序段與之不在同一代碼段,所以應該定義為far類型.這樣產生了另外一個問題,;在此程序段中若想調用此code段中以他過程,則那個過程也應該被定義為far調用,當然;可以簡單的通過不使用過程調用解決
26、.以解決此中斷子程序過程和其他普通過程對對應過程;的調用沖突 cli push ax push bx push cx push dx push si push di push ds mov ax,data ;interrupt to do mov ds,ax dec count jnz ddd mov count,20 mov di,offset ctime mov al,di+4 mov ah,0ah mul ah add al,di+5 cmp ax,59 ;先判斷秒鐘是否等于59秒,是則判斷分鐘,否則加1 jz fenzhong inc byte ptr di+5 cmp byte pt
27、r di+5,0ah jnz ddd mov byte ptr di+5,00h inc byte ptr di+4 jmp dddfenzhong: mov word ptr di+4,0000h ;先將秒鐘置為0,再轉換分鐘為十進制形式 mov al,di+2 mov ah,0ah mul ah add al,di+3 cmp ax,59 ;判斷是否應該向時鐘進位 jz shizhong inc byte ptr di+3 cmp byte ptr di+3,0ah jnz ddd mov byte ptr di+3,00h inc byte ptr di+2 jmpdddshizhong
28、: mov word ptr di+2,0000 mov al,di mov ah,0ah mul ah add al,di+1 cmp ah,23 ;判斷時鐘該不該循環(huán)了 jnz qqq mov word ptr di,0000h jmp dddqqq: inc byte ptr di+1 cmp byte ptr di+1,0ah jnz ddd mov byte ptr di+1,00h inc byte ptr diddd:;將鬧鈴功能鍵與鬧鈴條件的判斷放在20次中斷計數條件滿足后的執(zhí)行代碼中;有效縮短延遲時間以及誤差時間 cmp byte ptr mybell,00h ;檢測鬧鈴有沒
29、有開, jz zzz lea di,ctime lea si,clock mov cx,5check: ;檢測門鈴時間是否到了 mov al,di mov bl,si cmp al,bl jnz zzz inc di inc si loop check ;* 鬧鈴時的檢測輸出 mov dl,07h mov ah,02h int 21h lea dx,mess1 mov ah,09h int 21h mov byte ptr mybell,00h zzz: mov al,20h ;send eoi out 0a0h,al out 20h,al mov cx,0ffffhloopx: nop lo
30、op loopx ;延時 pop dspop di pop si pop dx pop cx pop bx pop ax sti iretint_proc endp;-key proc near ;ab口端口讀取的控制,是對小鍵盤的控制 push cxkst: mov al,82h mov dx,word ptr io_base_address add dx,p55ctl out dx,al mov al,00h mov dx,word ptr io_base_address add dx,pa55 out dx,al mov dx,word ptr io_base_address add d
31、x,pb55 in al,dx or al,0f8h cmp al,0ffh jz delay push ax mov cx,0a00h ;兩重循環(huán)dly: mov ax,word ptr const1dly1: dec ax jnz dly1 dec cx jnz dly pop ax mov cl,08h mov ah,0fehscan1: mov dx,word ptr io_base_address;行列掃描,得到小鍵盤輸入 add dx,pa55 mov al,ah out dx,al mov dx,word ptr io_base_address add dx,pb55 in al
32、,dx or al,0f8h cmp al,0ffh jnz keyn rol ah,1 dec cl jnz scan1 jmp kstkeyn: push ax mov dx,word ptr io_base_address add dx,pb55relea: in al,dx or al,0f8h cmp al,0ffh jnz relea pop ax not ax mov si,offset table1 mov di,offset char mov cx,24tt: cmp ax,si jz nn dec cx jz kst add si,02 inc di jmp ttnn: m
33、ov dl,di mov char1,dl mov ah,02h int 21h pop cx jmp yangdelay: call disply jmp kstyang: retkey endp;-disply proc near ;led的顯示部分 push cx mov bx,offset led mov cx,0006 mov si,offset ctime mov ah,01hdisply1: cld lodsb xlat mov dx,word ptr io_base_address add dx,portseg out dx,al mov al,ah mov dx,word p
34、tr io_base_address add dx,portbit out dx,al shl ah,1 mov al,00 out dx,al loop disply1 pop cx retdisply endp;-cpro proc near ;c鍵按下時執(zhí)行的過程,顯示預設時間 cli mov word ptr ctime,0201h mov word ptr ctime+2,0504h mov word ptr ctime+4,0703h retcpro endp;-gpro proc near ;g鍵按下時執(zhí)行的過程,開中斷,計時開始 sti retgpro endp;-dpro p
35、roc near ;d鍵按下時執(zhí)行的過程,關中斷,計時停止 cli retdpro endp;-ppro proc near ;時間設置的過程 cli push ax push bx mov word ptr ctime,0c0ch mov word ptr ctime+2,0c0ch mov word ptr ctime+4,0c0ch call disply call key mov dl,char1 cmp dl,2 ;首位判斷是否小于2 jng next1 jmp err1next1: cmp dl,2 ;第一位是否為1,是則判斷第二位是否小于3 jnz normal sub dl,3
36、0h mov ctime,dl call key mov dl,char1 cmp dl,3 jng next2 jmp err1normal: sub dl,30h mov ctime,dl call disply call key mov dl,char1 cmp dl,9 ;第三位的判斷,如此直到第六位 jng next2 jmp err1next2: sub dl,30h mov ctime+1,dl call disply call key mov dl,char1 cmp dl,5 jng next3 jmp err1next3: sub dl,30h mov ctime+2,dl
37、 call disply call key mov dl,char1 cmp dl,9 jng next4 jmp err1next4: sub dl,30h mov ctime+3,dl call disply call key mov dl,char1 cmp dl,5 jng next5 jmp err1next5: sub dl,30h mov ctime+4,dl call disply call key mov dl,char1 cmp dl,9 jng next6 jmp err1next6: sub dl,30h mov ctime+5,dl call disply jmp ww err1: mov word ptr ctime,0a0bh ;輸入不全規(guī)范時輸出,e mov word ptr ctime+2,0a0ah mov word ptr ctime+4,0a0ah call displyww: pop bx pop ax retppro endp;-
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 農機售賣租賃合同范本
- 個人領養(yǎng)寵物合同范例
- 公建房屋維修合同范本
- 寫退貨合同范本
- 2人合伙人協(xié)議合同范例
- 農村水井租賃合同范例
- 農村住宅買賣租賃合同范本
- 仿古面磚采購合同范本
- 農村水產養(yǎng)殖租賃合同范例
- 養(yǎng)殖奶牛合作合同范例
- 山東省濟寧市2025屆高三歷史一輪復習高考仿真試卷 含答案
- 五年級數學(小數乘法)計算題專項練習及答案
- 交通法規(guī)教育課件
- 產前診斷室護理工作總結
- 湖南省長郡中學2023-2024學年高二下學期寒假檢測(開學考試)物理 含解析
- 2022屆北京市東城區(qū)高三語文一模語文試卷講評課件
- 先天性腎上腺皮質增生癥(CAH)課件
- 水利工程設計變更表格
- 了不起的狐貍爸爸-全文打印
- 03fusionsphere虛擬化場景概要設計模板hld
- 火災接警處置流程圖
評論
0/150
提交評論