寫在前面:
前天晚上斷網之后閑來無事忽然心血來潮想起和誰說過以我現在的水平做個時鐘沒有什么問題,就準備將它實現了。借用老師的學習板子,一直搞到凌晨2點做出了一個24小時的計數器顯示,因為沒有學過按鍵的使用方法,昨天實驗課下課后問了老師,她給出了查詢方式。昨晚搞了下,可以置數,但是不能實現0~60范圍加,只能0~99加。今天上午在老師的指導下,終于可以了,總算沒有食言啊。呵呵,下面貼出程序了。
mini_second equ 30h ;設置0.05秒、秒、分、時的地址 second equ 31h minute equ 32h clock equ 33h k1 equ p3.2 ;設置按鍵地址,為外部中斷口int0和int1 k2 equ p3.3 org 0000h ljmp start org 000bh ljmp t0_x ;使用中斷計時 org 0050h start: mov mini_second,#00h ;清零 mov second,#00h mov minute,#00h mov clock,#00h mov tmod,#01h ;置工作方式1,開定時器 mov th0,#3ch mov tl0,#0b0h setb ea setb et0 setb tr0 start1: lcall show_led ;主程序跳轉程序顯示 lcall key_d ;置數程序 ljmp start1 ;一直循環顯示 t0_x: push acc ;保護現場 push psw mov th0,#3ch ;置初值,這個不是很準確, mov tl0,#0b4h ;估計一分鐘慢個2~3秒 inc mini_second mov a,mini_second cjne a,#20,ret0 ;20次為1秒,沒有20次均跳出中斷重新跳 mov mini_second, #00h mov a,second add a,#01h da a mov second,a cjne a,#60h,ret0 ;1秒后出循環,每秒后秒清零,跳到分計時加1 mov second,#00h mov a,minute add a,#01h ;分同秒 da a mov minute,a cjne a,#60h,ret0 mov minute,#00h mov a,clock add a,#01h da a mov clock,a cjne a,#24h,ret0 mov clock,#00h ret0: pop psw ;結束保護,跳出 pop acc reti nop nop nop ;======================================顯示子程序 show_led: mov a,second ;個位秒顯示 anl a,#0fh mov 40h,a clr p1.5 ;片選數碼管 clr p1.6 setb p1.7 mov a,40h lcall led_x lcall delay mov a,second ;十位秒顯示 anl a,#0f0h swap a mov 41h,a setb p1.5 clr p1.6 setb p1.7 mov a,41h lcall led_x lcall delay mov a,minute ;個位分顯示 anl a,#0fh mov 42h,a setb p1.5 setb p1.6 setb p1.7 mov a,42h lcall led_x lcall delay mov a,minute ;十位分顯示 anl a,#0f0h swap a mov 43h,a clr p1.5 clr p1.6 clr p1.7 mov a,43h lcall led_x lcall delay mov a,clock ;個位時顯示 anl a,#0fh mov 44h,a clr p1.5 setb p1.6 clr p1.7 mov a,44h lcall led_x lcall delay mov a,clock ;十位時顯示 anl a,#0f0h swap a mov 45h,a setb p1.5 setb p1.6 clr p1.7 mov a,45h lcall led_x lcall delay ret led_x: mov dptr,#led_data movc a,@a+dptr mov p0,a ret ;====================================延遲子程序 delay: mov r7,#10 de1: mov r6,#100 ;延時1ms多一點,因為晶振為11.0592MHZ djnz r6,$ djnz r7,de1 ret ;===================================數碼管的段選碼 led_data: db 0c0h,0f9h,0a4h,0b0h,099h,92h,82h,0f8h,80h,90h ;=====================================置數子程序 key_d: jnb k1,key1 jnb k2,key2 ret key1: mov a,minute ;查詢方式 ————> 分位置數 clr c ;清零進位,防止干擾da和cjne指令的操作 inc a ;累加器自加一 ,此為加法置數 da a ;十進制處理 cjne a, #60h, k_01 ;判斷是否為60,為60清零,跳出 mov a,#00h k_01: mov minute,a jnb k1,$ ret key2: mov a,clock ;時位 置數同上 clr c inc a da a cjne a, #24h,k_11 mov a,#00h k_11: mov clock,a jnb k2,$ ret
本程序如有雷同,純屬不可能
完整版的程序請從這里下載:http://www.zg4o1577.cn/ziliao/file/dzzd.rar
我的不夠成熟或稱之為幼稚的匯編編程,鄭文老師的獨特學習板子(顯示數碼管是p0口,片選竟然是用p1口3個I/O口接138,——!這個獨特焊接方式讓我程序寫得這么長),鄭子含老師對我置數程序的修改,才出來的程序,雖然不是什么成功,至少是一個開始,我會繼續瘋下去的。這個時鐘的弊端挺多的,比如置數的時候,會有閃屏現象,程序我會再改進的。
后記:對于院系電子設計競賽我的失敗我得向我的組員道歉,雖然我知道那些所謂成功的幾組也比我們好不到哪里去(看過答辯了),但是我會繼續我們的課題,加油吧
編譯工具:wave6000
燒制工具:stc-isp(話說國產的stc公司要統一全球51市場,呵呵) 、RS232串口
請大家多多指教,謝謝^ ^