當前位置:編程學習大全網 - 編程語言 - 用AT89S51(單片機)設計壹個電子鐘

用AT89S51(單片機)設計壹個電子鐘

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;20h.1半點標示位

;20H.2鬧鐘設置中........標示,為了顯示區別用

;20H.3鬧鐘設置時間CHECK到,使能標誌位

;20H.5開/關鬧鐘設置中........標示;

;20H.6鬧鐘1開關標誌位

;20H.7鬧鐘2開關標誌位

;psw.5用來做顯示開關標誌位

;21,22,23,24這裏設置第壹個鬧鐘的時間

;25,26,27,28這裏設置第二個鬧鐘的時間

;29H

;P0口輸出數碼管段碼,

;P2口 輸出位選信號

;70H存放P1.0--3按鈕值,

;71H--78H存放當前系統定時時間;

;78H 77H 76H 75H 74H 73H 72H 71H

; 星期* 小時 分鐘 秒鐘

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

ts equ 24h ;這裏設置`24小時周期制

trr equ #0bbh ;這個是溫度,晶振等的時間補償值,

org 0000h ;定時太慢此值調大,定時太快調小;

jmp main

;org 0bh ;定時器0中斷入口矢量

;jmp bz

org 1bh ;定時器1中斷入口矢量

jmp t1int

org 0100h ;主程序

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;主程序

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

main:clr p3.0; ;關繼電器

mov sp,#30h

mov r3,#20

mov tmod,#10h

;mov tl0,#06h ;定時器1,方式1,定時 50 MS;

;mov th0,#06h

mov tl1,#0b0h

mov th1,#3ch

mov ie,#88h ;開定時器1中斷

;mov 65h,#5

; mov 66h,#100

;mov 64h,#4

;clr psw.5

clr p3.0

setb pt1 ;設置T1為高優先級中斷

;setb tr1

clr tr1 ;開啟T1中斷

acall send ;71h--78h 清零;

acall send1 ;20h--29h 清零;

dd: acall daa ;進行十進制調整71H-79H

;acall compare ;第壹鬧鐘

;acall compare1 ;第二鬧鐘 設置值

;acall sound

acall disp ;數碼管顯示,78H--71H分別對應著8個數碼管顯示

acall key_scanf ;按鈕控制

acall time_adj ;時間調整

acall lasttime ;調用上壹次的設置值為當前定時值

;acall alarm1_set ;設置定時開/關鬧鐘

ajmp dd

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;調用上次值為設置時間

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

lasttime:push acc

mov a,70h

jnb acc.2,return1

clr p3.0; 緊急暫停按鈕,按下後暫停,並把上次設定值恢復.

clr tr1

mov 73h,21h

mov 74h,22h

wait7:acall disp

acall key_scanf

mov a,70h

jnb acc.0,wait7

mov 71h,#0

mov 72h,#0

mov 79h,#0

mov tl1,trr

mov th1,#3ch

mov r3,#20

setb tr1

setb p3.0

return1:pop acc

ret

daa: push acc ;對當前系統時間進行十進制調整

mov 71h,79h

mov r1,#71h

cjne @r1,#10,s2

mov 71h,#0h

mov 79h,#0

inc 72h

mov r1,#72h

cjne @r1,#6,s2

mov 72h,#0h

dec 73h

mov r1,#73h

cjne @r1,#255,s2

dec 74h

mov 73h,#9

s1: pop acc

ret

s2: mov r1,#73h

cjne @r1,#0,s1

mov r1,#74h

cjne @r1,#0,s1

clr p3.0

clr tr1

sjmp s1

h_half: ;半點CHECK

mov r1,#73h

mov a,74h

swap a

xchd a,@r1

cjne a,#29h,o25 ;CHECK 當前時間是否為29分鐘

xchd a,@r1

mov r1,#71h

mov a,72h

swap a

xchd a,@r1

cjne a,#59h,o25 ;CHECK 當前時間為59秒?

setb tr0 ;啟動T0

setb 20h.1 ;enable 半點flag bit

o25: xchd a,@r1

ret

compare: ;鬧鐘1設置時間與當前時間比較

push acc

jnb 20h.6,nequ ;鬧鐘1開/關標誌位

mov a,73h

cjne a,21h,nequ ;分低位

mov a,74h

cjne a,22h,nequ ;分高位

mov a,75h

cjne a,23h,nequ ;小時低位

mov a,76h

cjne a,24h,nequ ;小時高位

setb 20h.3 ;到鬧鐘設置時間,使能鬧鐘報警標誌位

nequ:pop acc

ret

compare1: ;鬧鐘2設置時間與當前時間比較

push acc

jnb 20h.7,nequ33 ;鬧鐘2開/關標誌位

mov a,73h

cjne a,25h,nequ33

mov a,74h

cjne a,26h,nequ33

mov a,75h

cjne a,27h,nequ33

mov a,76h

cjne a,28h,nequ33

setb 20h.3 ;到鬧鐘設置時間,使能鬧鐘報警標誌位

nequ33:

pop acc

ret

sound:

acall h_half ;check 是否半點?

jb 20h.1,s23 ;半點則返回

jb 20h.0,s23

mov r1,#73h

mov a,74h

swap a

xchd a,@r1

cjne a,#59h,s25

xchd a,@r1

mov r1,#71h

mov a,72h

swap a

xchd a,@r1

s20: cjne a,#56h,s21

ajmp s26

s21: cjne a,#58h,s22

ajmp s26

s22: cjne a,#59h,s25

setb tr0

ajmp s26

s25: xchd a,@r1

s23: ret

s26: jb 20h.0,s25

setb tr0

xchd a,@r1

ret

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;T0中斷服務程序,報時鈴音信號輸出

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

bz: djnz 64h,rrr

jb 20h.3,alarmsign;鬧鐘到點報時有效

jb 20h.1,next ;半點報時

mov 64h,#4 ;0.5KHZ

ajmp justh

alarmsign:

mov 64h,#1; 2KHZ信號

justh:

djnz 66h,ccc

mov 66h,#100

djnz 65h,ccc ;產生1000次中斷後關中斷

mov 65h,#5 ;響0.5秒

setb 20h.0

clr tr0

reti

next:mov 64h,#2 ;1KHZ信號,半點報時音

ccc: jb 20h.3,cc

cpl p1.4 ;半點報時輸出聲音信號

rrr: reti

cc: cpl p1.4 ;鬧鐘報時輸出聲音信號

reti

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;T1中斷服務程序,定時器主時鐘;

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

t1int:

clr ea

mov tl1,trr

mov th1,#3ch

djnz r3,sd ;20*50MS=1S

mov r3,#20

;cpl p1.4

inc 79h

clr 20h.0

clr 20h.1 ;半點報時標誌清零

jb 20h.3,sdd ;鬧鐘CHECK有效與否?

clr tr0 ;關T0

sd: setb ea

reti

sdd: setb tr0 ;開T0,即開鬧鈴聲音

setb ea

reti

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;顯示子函數

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

dispnum1:; 顯示

ajmp disp_num

disp:

push acc

;jb 20h.5,dispnum1;開/關鬧鐘設置中界面...........

;jb 20h.2,alarmcheck;鬧鐘設置時間中界面..........

jb psw.5,closedisp

mov r2,#01h;位選通信號輸出到P2口

mov r5,#2; 顯示的位數循環控制

mov r0,#73h;分別取出內存76H-71H

cjne r3,#10,dot1;在小時和分之間閃爍DOT point

dot1:jnc dsp1

orl 73h,#10h

;dot1:cjne r3,#11,dsp1

;anl 73h,#0efh

dsp1:mov a,r2

;cpl a

mov p2,a

mov a,@r0

dsp2:mov dptr,#bcd

movc a,@a+dptr

mov p0,a

acall delay

mov a,r2

rl a

mov r2,a

inc r0

djnz r5,dsp1

anl 73h,#0efh

pop acc

ret

closedisp:; 關顯示

acall delay

mov p0,#0ffh

mov p2,#0

pop acc

ret

;;;;;;;;;;;;;;;;;鬧鐘的定時設置顯示

alarmcheck:

mov r2,#01h

mov r5,#2 ;兩位顯示22-21H對應定時設置值

mov r0,#21h

dsp21:

mov a,r2

;cpl a

mov p2,a

mov a,@r0

mov dptr,#bcd

movc a,@a+dptr

mov p0,a

acall delay

mov a,r2

rl a

mov r2,a

inc r0

djnz r5,dsp21

pop acc

ret

bcd:; ***陽接法數碼管段碼表

db 0c0h,0f9h,0a4h,0b0h

db 99h,92h,82h,0f8h

db 80h,90h,88h,83h

db 0c6h,0a1h,86h,8eh; 不帶小數點七段

db 40h,79h,24h,30h,19h

db 12h,02h,78h,00h,10h

db 0ffh,0bfh,7fh,3fh; 帶小數點七段

delay:mov r6,#4h

tm: mov r4,#0h

ee: djnz r4,ee; 延時2048US=2MS

djnz r6,tm

ret

send:mov r7,#9; 初始化設置

mov r0,#71h

mov a,#0h

ss: mov @r0,a

inc r0

djnz r7,ss

mov 78h,#1h

mov 77h,#01ah

;mov 71h,#1

;mov 72h,#2

;mov 73h,#3

;mov 74h,#4

ret

send1:; 初始化

mov r7,#10

mov r0,#20h

mov a,#0

ss1: mov @r0,a

inc r0

djnz r7,ss1

ret

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;;;;;;;;;;;開/關鬧鐘界面顯示

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

disp_num:

mov p2,#0f7h

mov a,29h ;當前要操作的鬧鐘號碼

mov dptr,#bcd

movc a,@a+dptr

mov p0,a

acall delay

pop acc

ret

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

key_scanf:; 按鈕處理

push acc

mov 70h,#0

orl p1,#0fh

mov a,p1

cpl a

anl a,#07h

jz nokey1

acall daa

acall disp

mov a,p1

cpl a

anl a,#07h

jz nokey1

mov 70h,a

key_wait:; 等按鈕放下

acall daa

acall disp

mov a,p1

cpl a

anl a,#07h

jnz key_wait

mov a,70h

jnb acc.1,nokey1

cpl psw.5

nokey1:; 無按鈕

pop acc

ret

a_on_off:

jnb 29h.0,iii

cpl 20h.6

iii: jnb 29h.1,out_2

cpl 20h.7

out_2:

ajmp alarmnum

alarmnum:

setb 20h.5

acall daa

acall disp

acall key_scanf

clr 20h.5

mov a,70h

jb acc.0,a_on_off

jb acc.1,alar_adj_1

jb acc.2,a_num_inc

acall numb

ajmp alarmnum

alarm1_set:

push acc

mov a,70h

jb acc.1,alarmnum

alarm1_out:

clr 20h.2

pop acc

ret

a_num_inc:

inc 29h

mov a,29h

anl a,#0fh

cjne a,#3,alarmnum

anl 29h,#0

ajmp alarmnum

alar_adj_1:

setb 20h.2

acall daa

orl 21h,#10h

acall disp

anl 21h,#0fh

acall key_scanf

mov a,70h

jb acc.1,hadj_1

jb acc.2,minc_1

ajmp alar_adj_1

madj_2:

acall daa

orl 25h,#10h

acall disp

anl 25h,#0fh

acall key_scanf

mov a,70h

jb acc.1,hadj_2

jb acc.2,minc_2

ajmp madj_2

hadj_1:

acall daa

orl 23h,#10h

acall disp

anl 23h,#0fh

acall key_scanf

mov a,70h

jb acc.1,madj_2

jb acc.2,hinc_1

ajmp hadj_1

hadj_2:acall daa

orl 27h,#10h

acall disp

anl 27h,#0fh

acall key_scanf

mov a,70h

jb acc.1,alarm1_out

jb acc.2,hinc_2

ajmp hadj_2

minc_1:

inc 21h

mov r1,#21h

cjne @r1,#10,alar_adj_1

mov 21h,#0

inc 22h

mov r1,#22h

cjne @r1,#6,alar_adj_1

mov 22h,#0h

ajmp alar_adj_1

minc_2:

inc 25h

mov r1,#25h

cjne @r1,#10,madj_2

mov 25h,#0

inc 26h

mov r1,#26h

cjne @r1,#6,madj_2

mov 26h,#0

ajmp madj_2

hinc_1:

inc 23h

mov r1,#23h

cjne @r1,#10,ss14

mov 23h,#0

inc 24h

ss14:

mov a,24h

swap a

xchd a,@r1

cjne a,#ts,ss15

mov 23h,#0

mov 24h,#0

ajmp hadj_1

ss15:xchd a,@r1

ajmp hadj_1

hinc_2:

inc 27h

mov r1,#27h

cjne @r1,#10,sss14

mov 27h,#0

inc 28h

sss14:

mov a,28h

swap a

xchd a, @r1

cjne a,#ts,sss15

mov 27h,#0

mov 28h,#0

ajmp hadj_2

sss15:

xchd a,@r1

ajmp hadj_2

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;時間調整程序

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

time_adj:;

clr psw.5

push acc

mov a,70h

jb acc.0,l1;P1.0調時功能鍵,每按壹次切換壹位

ajmp nokeyout

adj_out:

mov 21h,73h

mov 22h,74h

setb p3.0 ;閉合繼電器

setb tr1

nokeyout:

pop acc

ret

QQ: anl 73h,#0fh

anl 74h,#0fh

;anl 78h,#0fh

ret

l1: clr tr1;acall dab; 分鐘調整

orl 73h,#10h;點亮分右下角的小數點,當前調整位置

acall disp

acall QQ

acall key_scanf

clr psw.5

mov a,70h

jb acc.0,h_adj;切換到小時調整

jb acc.1,m_inc;P1.2加1按鈕

ajmp l1

h_adj:; 小時調整

;acall dab

orl 74h,#10h

acall disp

acall QQ

acall key_scanf

clr psw.5

mov a,70h

jb acc.0,out_adj;切換到星期調整

jb acc.1,h_inc;小時加1

ajmp h_adj

w_adj:

acall daa

orl 78h,#10h

acall disp

acall QQ

acall key_scanf

clr psw.5

mov a,70h

jb acc.0,out_adj

jb acc.2,w_inc

ajmp w_adj

out_adj:

ajmp adj_out

m_inc:;;;;;;;;;;;;;;; 調整分時,對定時復位,初始化

clr tr1

mov 71h,#0

mov 72h,#0

mov 79h,#0

mov tl1,trr

mov th1,#3ch

mov r3,#20

inc 73h

mov r1,#73h

cjne @r1,#10,s12

mov 73h,#0

inc 74h

mov r1,#74h

cjne @r1,#10,s12

mov 74h,#0

s12: ajmp l1

;;;;;;;;;;;;;;;;;;;;;;調整小時位

h_inc:

inc 74h

mov r1,#74h

cjne @r1,#10,s14

mov 74h,#0

;inc 76h

s14: ajmp h_adj

;mov a,76h

;swap a

;xchd a,@r1

;cjne a,#ts,s15;;;12進制,24進制設置值決定

;mov 75h,#0

;mov 76h,#0

;ajmp h_adj

;s15: ;xchd a,@r1

;ajmp h_adj

;;;;;;;;;;;;;;;;;;;;;;;調整星期位

w_inc:

inc 78h

mov r1,#78h

cjne @r1,#8,s16

mov 78h,#1h

s16: ajmp w_adj

;;;;;;;;;;;;;;;;;;;;;;;當前鬧鐘開/關情況報告位

numb:clr 29h.4

jnb 29h.0,iii1

jnb 20h.6,iii1

setb 29h.4

iii1:jnb 29h.1,out_21

jnb 20h.7,out_21

setb 29h.4

out_21:

jnb 20h.6,out_12

jnb 20h.7,out_13

mov 77h,#1dh

ajmp out_22

out_12:

jnb 20h.7,out_14

mov 77h,#1bh

ajmp out_22

out_13:

mov 77h,#1ch

ajmp out_22

out_14:

mov 77h,#1ah

out_22:

ret

end

  • 上一篇:十進制轉換為八進制的方法
  • 下一篇:北郵電子信息杯時間
  • copyright 2024編程學習大全網