基于51單片機秒表的程序設計_第1頁
基于51單片機秒表的程序設計_第2頁
基于51單片機秒表的程序設計_第3頁
基于51單片機秒表的程序設計_第4頁
基于51單片機秒表的程序設計_第5頁
已閱讀5頁,還剩6頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、基于51單片機秒表的程序設計 1設計目的:(1)利用單片機定時器中斷和定時器計數方式實現秒、分定時。(2)通過led顯示程序的調整,熟悉8155與8051,8155與led的接口技術,熟悉led動態(tài)顯示的控制過程。(3)通過鍵盤程序的調整,熟悉8155與矩陣式鍵盤的接口技術,熟悉鍵盤掃描原理。(4)通過閱讀和調試簡易秒表整體程序,學會如何編制含led動態(tài)顯示、鍵盤掃描和定時器中斷等多種功能的綜合程序,初步體會大型程序的編制和調試技巧。2  設計步驟與要求 (1)要求:以8位led右邊2位顯示秒,左邊6位顯示0,實現秒表計時顯示。以4×4矩陣鍵盤的ke0、ke1、k

2、e2等3鍵分別實現啟動、停止、清零等功能。(2)方法:用單片機定時器t0中斷方式,實現1秒定時;利用單片機定時器1方式3計數,實現60秒計數。用動態(tài)顯示方式實現秒表計時顯示,用鍵盤掃描方式取得ke0、ke1、ke2的鍵值,用鍵盤處理程序實現秒表的啟動、停止、清零等功能。(3)軟件設計:軟件整體設計思路是以鍵盤掃描和鍵盤處理作為主程序,led動態(tài)顯示作為子程序。二者間的聯系是:主程序查詢有無按鍵,無按鍵時,調用二次led動態(tài)顯示子程序(約延時8ms)后再回到按鍵查詢狀態(tài),不斷循環(huán);有按鍵時,led動態(tài)顯示子程序作為按鍵防抖延時被連續(xù)調用二次(約延時16ms),待按鍵處理程序執(zhí)行完后,再回到按鍵查

3、詢狀態(tài),同時兼顧了按鍵掃描取值的準確性和led動態(tài)顯示的穩(wěn)定性。秒定時采用定時器t0中斷方式進行,60秒計數由定時器1采用方式3完成,中斷及計數的開啟與關閉受控于按鍵處理程序。由上述設計思路可設計出軟件流程圖如圖1.1所示。(5)程序編制:編程時置ke0鍵為“啟動”,置ke1鍵為“停止”,置ke2鍵為“清零”,因按鍵較少,在處理按鍵值時未采用散轉指令“jmp”,而是采用條件轉移指令“cjne”,每條指令后緊跟著一條無條件跳轉指令“ajmp”,轉至相應的按鍵處理程序,如不是上述3個按鍵值則跳回按鍵查詢狀態(tài)。8位led顯示的數據由顯示緩沖區(qū)30h37h單元中的數據決定,順序是從左至右,動態(tài)顯示時,

4、每位顯示持續(xù)時間為1ms,1ms延時由軟件實現,8位顯示約耗時8ms。主程序、按鍵查詢子程序采用第0組工作寄存器,顯示子程序采用第1組工作寄存器。1秒定時采用定時器t0方式1中斷,每50ms中斷一次,用21h做50 ms計數單元,每20次為一個循環(huán),計滿20次,60秒計數單元(20h)計數1次。60秒計數采用定時器t1方式2計數,計數脈沖采用軟件置位、復位p3.5口的方法實現,用20h單元做60秒計數單元,如定時器t1溢出,則20h單元被清零,20h單元的數據采用十進制計數,該數據被拆成個位和十位兩個數據后分別送至顯示緩沖區(qū)的30h、31h單元。    

5、           按照上述思路可編制源程序如下:                   org                 0000h ajmpmain org000bh a

6、jmpcont ;主程序 ;初始化程序main:movtmod,#61h ;置t0方式1定時,t1方式2計數 movth0,#3ch;t0置初值 movtl0,#0b0h movth1,#0c4h;t1置初值 movtl1,#0c4h movdptr,#4400h ;8155控制口地址送dptr mova,#43h ;設置8155工作方式字 movxdptr,a;設置pa、pb口輸出,pc口輸入 mov20h,#00h;60秒計數單元置初值 mov21h,#14h ;50ms計數單元置初值 movsp,#3fh;堆棧指針置初值 movr2,#08h;led待顯示位數送r2 movr0,#30h

7、 ;顯示緩沖區(qū)首址送r0 star:movr0,#00h;顯示緩沖區(qū)清零 incr0 djnzr2,star clra ;累加器清零 ;鍵盤查詢程序   key: acallks;調按鍵查詢子程序判是否有鍵按下 jnzk1 ;有鍵按下轉移 acalldisp;無鍵按下,調顯示子程序延時 ajmpkey ;繼續(xù)查詢按鍵 ;鍵盤掃描程序 k1: acalldisp;鍵盤去抖延時 acalldisp acallks ;再次判別是否有鍵按下 jnzk2 ;有鍵按下轉移 ajmpkey ;無按鍵,誤讀,繼續(xù)查詢按鍵 k2: movr3,#0feh;首列掃描字送r3 movr4,#00h;首列號

8、送r4 k3: movdptr,#4401h;pa口地址送dptr,開始列掃描 mova,r3 movxdptr,a;列掃描字送pa口 incdptr ;指向pc口 incdptr movxa,dptr;讀取行掃描值 jbacc.0,l1;第0行無鍵按下,轉查第1行 mova,#00h;第0行有鍵按下,行首鍵號送a ajmplk ;轉求鍵號 l1: jbacc.1,l2;第1行無鍵按下,轉查第2行 mova,#08h;第1行有鍵按下,行首鍵號送a ajmplk ;轉求鍵號 l2: jbacc.2,l3;第2行無鍵按下,轉查第3行 mova,#10h;第2行有鍵按下,行首鍵號送a ajmplk;

9、轉求鍵號 l3: jbacc.3,next;第3行無鍵按下,轉查下一列 mova,#18h ;第3行有鍵按下,行首鍵號送a ajmplk lk: adda,r4;形成鍵碼送a pushacc;鍵碼入棧保護 k4: acalldisp acallks;等待鍵釋放 jnzk4 ;未釋放,等待 popacc ;鍵釋放,彈棧送a ajmppr;轉鍵盤處理程序 next:incr4 ;修改列號 mova,r3 jnbacc.3,key;4列掃描完返回按鍵查詢狀態(tài) rla;未掃描完,改為下列掃描字 movr3,a;掃描字暫存r3 ajmpk3;轉列掃描程序 ;鍵盤處理程序 pr: cjnea,#00h,p

10、r01;不是ke0鍵碼,轉ke1鍵 ajmpke0;轉ke0鍵處理程序 pr01:cjnea,#01h,pr02;不是ke1鍵碼,轉ke2鍵 ajmpke1;轉ke1鍵處理程序 pr02:cjnea,#02h,pr03;不是ke2鍵碼,返回按鍵查詢 ajmpke2;轉ke2鍵處理程序 pr03:ajmpkey ke0: setbtr0;啟動定時器t0 setbtr1;啟動定時器t1 setbet0;允許定時器t0中斷 setbea;開中斷 ajmpkey ;返回鍵盤查詢狀態(tài) ke1: clrea;關中斷 clret0;禁止定時器t0中斷 clrtr1;關定時器t1 clrtr0;關定時器t0

11、ajmpkey ke2: clrea ;關中斷 ajmpmain;返回主程序進行初始化 ;按鍵查詢子程序 ks: movdptr,#4401h ;置8155pa口地址 mova,#00h movxdptr,a;全掃描字#00h送pa口 incdptr ;指向pc口 incdptr movxa,dptr;讀入pc口狀態(tài) cpla ;變正邏輯,高電平表示有鍵按下 anla,#0fh ;屏蔽高4位 ret ;返回,a0表示有鍵按下 ;led動態(tài)顯示子程序 disp:pushacc;a入棧保護 setbrs0;保護第0組工作寄存器,啟用第1組工作寄存器     

12、                  movr2,#08h        ;led待顯示位數送r2 movr1,#00h;設定顯示時間 movr3,#7fh;選中最右端led movr0,#30h;顯示緩沖區(qū)首址送r0 mova,r0;秒顯示個位送a disp1:movdptr,#tab;指向字形表首址 movca,a+dptr;查表取得字形碼 movdptr,#440

13、2h;指向8155pb口(段碼口) movxdptr,a;字形碼送pb口 mova,r3 ;取位選字 movdptr,#4401h;指向8155pa口(位選口) movxdptr,a;位碼送pa口 djnzr1,$;延時0.5ms djnzr1,$;延時0.5ms rra;位選字移位 movr3,a;移位后的位選字送r3 incr0 ;指向下一位緩沖區(qū)地址 mova,r0;緩沖區(qū)數據送a djnzr2,disp1;未掃描完,繼續(xù)循環(huán) clrrs0 ;恢復第0組工作寄存器 popacc ;a彈棧,恢復現場 ret tab:db3fh,06h,5bh,4fh,66h;共陰極led字形表 db6dh

14、,7dh,07h,7fh,6fh ;定時器中斷服務程序 cont:push acc ;保護現場 mov th0,#3ch ;定時器t1重置初值 mov tl0,#0b0h mov a,20h ;秒計數器送a ajmp cont1ren:ajmp ren1 cont1:djnz21h,ren;1秒定時未到,中斷返回 mov21h,#14h;重置50ms計數初值 clrp3.5 ;軟件產生定時器t1計數脈沖 nop nop setbp3.5 inca ;1秒計數值加1 daa ;換算為10進制計數 jbctf1,cont2;60秒到,轉清零 cont3:mov20h,a;計數值送60秒計數單元20

15、h anla,#0fh ;屏蔽高4位 mov30h,a;秒表個位待顯示數據送顯示緩沖區(qū) mova,20h swapa;60秒計數單元高、低4位數據互換 anla,#0fh ;屏蔽高4位 mov31h,a;秒表十位待顯示數據送顯示緩沖區(qū) ajmpren1 cont2:mova,#00h ajmpcont3 ren1:popacc;恢復現場 ret;中斷返回 end3 總結與分析 (1)實驗采用七段碼led設計(數碼管),顯示直觀;采用定時器中斷,計時更準確;功能齊全,可隨時啟動、停止、清零,后者智能化程度更高。 (2)設計、調試大型程序時,需先根據要求劃分模塊,優(yōu)化結構;再根據各模塊特點確定何為主程序,何為子程序,何為中斷服務程序,相互間如何調用;再根據各模塊性質和功能將各模塊細化,設計出程序流程圖;最后才根據各模塊流程圖編制具體程序。調試時應先調主程序,實現最基本最主要的功能,在此基礎上再將各模塊功能往主程序上堆砌,直至各模塊聯調、統調,實現全部功能。本例子將整個程序劃分為鍵盤程序,動態(tài)顯示程序,秒計時程序三大模塊,根據各自的特點確定鍵盤程序為主程序,動態(tài)顯示程序為子程序,秒計時程序為定時器中斷服務程序。主程序又細分為初始化程序,鍵盤查詢程序,鍵盤掃描程序,鍵盤處理程序四大部分。三大模塊之間的關系是:鍵盤程序在無鍵按下時,不斷調用動態(tài)顯示子程序;在有鍵按下時,先調用動態(tài)顯示子程序

溫馨提示

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

評論

0/150

提交評論