❶ 哪位大神能幫我寫一個基於單片機C51的電子時鍾設計報告
老師給我的
電子鍾設計
1、 電路圖:
2功能實現:
(1. 把「單片機系統」區域中的P1.0-P1.7埠用8芯排線連接到「動態數碼顯示」區域中的A-H埠上;
(2. 把「單片機系統:區域中的P3.0-P3.7埠用8芯排線連接到「動態數碼顯示」區域中的S1-S8埠上;
(3. 把「單片機系統」區域中的P0.0/AD0、P0.1/AD1、P0.2/AD2埠分別用導線連接到「獨立式鍵盤」區域中的SP3、SP2、SP1埠上;
3、程序框圖:
6. 匯編源程序
HOURK BIT P1.2
MINITEK BIT P1.1
SECONDK BIT P1.0
SECOND EQU 30H
MINITE EQU 31H
HOUR EQU 32H
ORG 00H
LJMP START
ORG 0BH
LJMP INT_T0
ORG 0030H
START:
MOV SECOND,#00H
MOV MINITE,#00H
MOV HOUR,#12
MOV R0,#00H
MOV TMOD,#01H
MOV TH0,#3CH
MOV TL0,#0B0H
SETB EA
SETB ET0
SETB TR0
NEXT: MOV A,#7FH
MOV P3,A
MOV A,HOUR
MOV B,#10
DIV AB
MOV DPTR,#TABLE
MOVC A,@A+DPTR
MOV P2,A
CALL DELAY
MOV A,#0BFH
MOV P3,A
MOV A,B
MOV DPTR,#TABLE
MOVC A,@A+DPTR
MOV P2,A
CALL DELAY
MOV A,#0DFH
MOV P3,A
mov p2,#40h
call delay
mov a,#0efh
mov p3,a
MOV A,MINITE
MOV B,#10
DIV AB
MOV DPTR,#TABLE
MOVC A,@A+DPTR
MOV P2,A
CALL DELAY
MOV A,#0F7H
MOV P3,A
MOV A,B
MOV DPTR,#TABLE
MOVC A,@A+DPTR
MOV P2,A
CALL DELAY
MOV A,#0FBH
MOV P3,A
mov p2,#40h
call delay
MOV A,#0FDH
MOV P3,A
MOV A,SECOND
MOV B,#10
DIV AB
MOV DPTR,#TABLE
MOVC A,@A+DPTR
MOV P2,A
CALL DELAY
MOV A,#0FEH
MOV P3,A
MOV A,B
MOV DPTR,#TABLE
MOVC A,@A+DPTR
MOV P2,A
CALL DELAY
WT: JB SECONDK,NK1
LCALL DELY10MS
JB SECONDK,NK1
JNB SECONDK,$
INC SECOND
MOV A,SECOND
CJNE A,#60,NK1
MOV SECOND,#00H
NK1: JB MINITEK,NK2
LCALL DELY10MS
JB MINITEK,NK2
JNB MINITEK,$
INC MINITE
MOV A,MINITE
CJNE A,#60,NK2
MOV MINITE,#00H
NK2: JB HOURK,NK3
LCALL DELY10MS
JB HOURK,NK3
JNB HOURK,$
INC HOUR
MOV A,HOUR
CJNE A,#24,NK3
MOV HOUR,#00
NK3:
MOV A,R0
CJNE A,#20,NEXT1
MOV R0,#0
INC SECOND
MOV A,SECOND
CJNE A,#60,NEXT1
MOV SECOND,#0
INC MINITE
MOV A,MINITE
CJNE A,#60,NEXT1
MOV MINITE,#0
INC HOUR
MOV A,HOUR
CJNE A,#24,NEXT1
MOV HOUR,#0
next1:JMP NEXT
TABLE:DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,40H
INT_T0: CLR TR0
INC R0
MOV TH0,#3CH
MOV TL0,#0B0H
SETB TR0
RETI
DELAY:
MOV R6,#2
D1: MOV R7,#248
DJNZ R7,$
DJNZ R6,D1
RET
DELY10MS:
MOV R6,#10
DD1: MOV R7,#248
DJNZ R7,$
DJNZ R6,DD1
RET
END
❷ 用匯編語言編寫一個數字電子鍾程序代碼
data segment
;*****定義please等提示信息*****
str db 20
db 50h,7,0,0
db 6ch,7,0,1
db 65h,7,0,1
db 61h,7,0,1
db 73h,7,0,1
db 65h, 7,0,1
db 70h,7,1,-10
db 72h,7,0,1
db 65h,7,0,1
db 73h,7,0,1
db 73h,7,0,1
db 53h,7,0,2
db 6bh,7,0,2
db 65h,7,0,1
db 79h,7,0,1
db 65h,7,0,2
db 78h,7,0,1
db 69h,7,0,1
db 74h,7,0,1
db 21h,7,0,1
;*****定義0-9十個圖形數字*****
s0 db 6
db 5fh,7,0,0
db 7ch,7,1,-1
db 7ch,7,1,0
db 5fh,7,0,1
db 7ch,7,0,1
db 7ch,7,-1,0
sy db 2
db 7ch,7,1,0
db 7ch,7,1,0
s2 db 5
db 5fh,7,0,0
db 7ch,7,1,1
db 5fh,7,0,-1
db 7ch,7,1,-1
db 5fh,7,0,1
s3 db 5
db 5fh,7,0,0
db 7ch,7,1,1
db 5fh,7,0,-1
db 7ch,7,1,1
db 5fh,7,0,-1
s4 db 4
db 7ch,7,1,0
db 5fh,7,0,1
db 7ch,7,1,1
db 7ch,7,-1,0
s5 db 5
db 5fh,7,0,0
db 7ch,7,1,-1
db 5fh,7,0,1
db 7ch,7,1,1
db 5fh,7,0,-1
s6 db 6
db 5fh,7,0,0
db 7ch,7,1,-1
db 5fh,7,0,1
db 7ch,7,1,1
db 5fh,7,0,-1
db 7ch,7,0,-1
s7 db 3
db 5fh,7,0,0
db 7ch,7,1,1
db 7ch,7,1,0
s8 db 7
db 7ch,7,1,0
db 5fh,7,-1,1
db 7ch,7,1,1
db 5fh,7,0,-1
db 7ch,7,1,1
db 5fh,7,0,-1
db 7ch,7,0,-1
s9 db 6
db 7ch,7,1,0
db 5fh,7,-1,1
db 7ch,7,1,1
db 5fh,7,0,-1
db 7ch,7,1,1
db 5fh,7,0,-1
s11 db 2
db 03h,7,1,0
db 03h,7,1,0
data ends
stack segment
db 200 p (0)
stack ends
code segment
assume cs:code,ss:stack,ds:data
start:
mov ax,data
mov ds,ax
mov ah,0 ;設置顯示方式
mov al,4
int 10h
mov ah,0bh ;置彩色調板
mov bh,0
mov bl,1
int 10h
mov ah,0bh ;置彩色調板
mov bh,1
mov bl,4
int 10h
mov ah,2 ;取系統時間
int 1ah
mov ax,0
mov bx,0
mov ah,ch ;取系統時間
mov al,cl ;保存分鍾
mov bh,dh ;保存秒
mov bl,dl ;保存百分之一秒
tt:
push ax
push bx
mov ah,0
mov al,4
int 10h
mov ah,0bh
mov bh,0
mov bl,1
int 10h
mov ah,0bh
mov bh,1
mov bl,4
int 10h
MOV AH,1 ;讀鍵盤緩沖區字元
INT 16h
JZ ww
MOV AH,8 ;從鍵盤輸入字元
INT 21h
CMP AL,'s' ;輸入s,結束程序
JE tu
ww: pop bx
pop ax
call xian ;調用顯示子程序
push ax
qu: mov ah,2 ;取系統時間
int 1ah
cmp bh,dh
je qu
pop ax
inc bh ;對時間進行加1
cmp bh,100
jl tt
mov bh,0
inc al
call beep
cmp al,100
jl tt
mov al,0
inc ah
cmp ah,24
jl tt
mov ah,0
jmp tt
tu: mov ah,4ch
int 21h
ret
xian proc ;對時間值進行處理並顯示的子程序
push si
push di
push dx
push cx
push bx
push ax
pop ax
push ax
mov bx,ax
mov ax,0
mov al,bh
mov cl,4
shr al,cl
mov bl,al
mov dh,10
mov dl,2
call ff
pop ax
push ax
mov bx,ax
mov ax,0
mov al, bh
and al,0fh
mov bl,al
mov dh,10
mov dl,6
call ff
mov dh,10
mov dl,10
mov bl,10
call ff
pop ax
push ax
mov cl,4
shr al,cl
mov bl,al
mov dh,10
mov dl,14
call ff
pop ax
push ax
and al ,0fh
mov bl,al
mov dh,10
mov dl,18
call ff
mov dh,10
mov dl,22
mov bl,10
call ff
pop ax
pop bx
push bx
push ax
mov ax,0
mov al,bh
mov cl,4
shr al,cl
mov bl,al
mov dh,10
mov dl,26
call ff
pop ax
pop bx
push bx
push ax
mov al,bh
and al,0fh
mov bl,al
mov dh,10
mov dl,30
call ff
mov dh,0
mov dl,15
mov bl,22
call ff
pop ax
pop bx
pop cx
pop dx
pop di
pop si
ret
xian endp
ff proc ;顯示具體數值
push ax
push bx
push cx
push dx
cmp bl,0
je l0
cmp bl,1
je l1
cmp bl,2
je l2
cmp bl,3
je l3
cmp bl,4
je l4
cmp bl,5
je l5
cmp bl,6
je l6
cmp bl,7
je l7
cmp bl,8
je l8
cmp bl,9
je l9
cmp bl,10
je l10
cmp bl,22
je ld
l0: lea di,s0
jmp ty
l1 : lea di,sy
jmp ty
l2: lea di,s2
jmp ty
l3: lea di,s3
jmp ty
l4: lea di,s4
jmp ty
l5: lea di,s5
jmp ty
l6: lea di,s6
jmp ty
l7: lea di,s7
jmp ty
l8: lea di,s8
jmp ty
l9: lea di,s9
jmp ty
l10: lea di,s11
jmp ty
ld : lea di,str
ty: mov ah,0fh ;示方式
int 10h
sub cx,cx
mov cl,[di]
inc di
plot_next: add dh,[di+2]
add dl,[di+3]
mov ah,2
int 10h
mov al,[di]
mov bl,[di+1]
push cx
mov cx,1
mov ah,09
int 10h
pop cx
add di,4
loop plot_next
pop dx
pop cx
pop bx
pop ax
mov cx,100
gg: dec cx
loop gg
ret
ff endp
clear proc
push ax
push bx
push cx
push dx
mov ah,6
mov al,0
mov bh,1
int 10h
pop dx
pop cx
pop bx
pop ax
ret
clear endp
beep proc
push ax
push bx
push cx
push dx
mov al ,10110110b
out 43h,al
mov ax,533h
out 42h,al
mov al,ah
out 42h,al
in al,61h
mov ah,al
or al,03
out 61h,al
sub cx,cx
mov bl,28h
g7: loop g7
dec bl
jnz g7
mov al,ah
out 61h,al
pop dx
pop cx
pop bx
pop ax
ret
beep endp
code ends
end start
❸ 求一個用匯編語言編寫一個8051單片機的時鍾程序(急急急啊)
給你當參缺春祥考...不足功能自己改...有問題再發問..
;P1.4小時調整伏搏 P1.5分種調整
CODE_SEG SEGMENT CODE
DATA_SEG SEGMENT DATA
STACK_SEG SEGMENT IDATA
K1 BIT P1.4
K2 BIT P1.5
RSEG DATA_SEG
KEY_S: DS 1
KEY_V: DS 1
DIS_DIGIT: DS 1
SEC: DS 1
DIS_INDEX: DS 1
HOUR: DS 1
MIN: DS 1
SEC100: DS 1
DIS_BUF: DS 8
BUF_HOUR_H EQU DIS_BUF ; 小時十位
BUF_HOUR_L EQU DIS_BUF+1 ; 小時個森氏位
BUF_MIN_H EQU DIS_BUF+3 ; 分十位
BUF_MIN_L EQU DIS_BUF+4 ; 分個位
BUF_SEC_H EQU DIS_BUF+6 ; 秒十位
BUF_SEC_L EQU DIS_BUF+7 ; 秒個位
RSEG STACK_SEG
STACK: DS 20
;===============================================================================
CSEG AT 0000H
JMP MAIN
CSEG AT 0000BH
LJMP TIMER0
CSEG AT 0001BH
LJMP TIMER1
;===============================================================================
RSEG CODE_SEG
MAIN:
USING 0
MOV SP, #(STACK-1) ;
MOV P0,#0FFH
MOV P2,#0FFH
MOV TMOD,#011H ; 定時器0, 1工作模式1, 16位定時方式
MOV TH0,#0FCH
MOV TL0,#017H
MOV TH1,#0DCH
CLR A
MOV TL1,A
MOV HOUR,#12 ;
CLR A ;
MOV MIN,A
MOV SEC,A
MOV SEC100,A
MOV A,HOUR
MOV B,#10
DIV AB
MOV DPTR,#DIS_CODE
MOVC A,@A+DPTR
MOV BUF_HOUR_H,A ; 時十位
MOV A,HOUR
MOV B,#10
DIV AB
MOV A,B
MOVC A,@A+DPTR
MOV BUF_HOUR_L,A ; 時個位
MOV A,MIN
MOV B,#10
DIV AB
MOVC A,@A+DPTR
MOV BUF_MIN_H,A ; 分十位
MOV A,MIN
MOV B,#10
DIV AB
MOV A,B
MOVC A,@A+DPTR
MOV BUF_MIN_L,A ; 分個位
MOV A,SEC
MOV B,#10
DIV AB
MOVC A,@A+DPTR
MOV BUF_SEC_H,A ; 秒十位
MOV A,SEC
MOV B,#10
DIV AB
MOV A,B
MOVC A,@A+DPTR
MOV BUF_SEC_L,A ; 秒個位
MOV BUF_HOUR_H+02H,#0BFH
MOV BUF_HOUR_H+05H,#0BFH
MOV DIS_DIGIT,#0FEH
CLR A
MOV DIS_INDEX,A
MOV IE,#08AH ; 使能timer0,1 中斷
SETB TR0
SETB TR1
MOV KEY_V,#03H
MAIN_LP:
LCALL SCAN_KEY ; 鍵掃描
JZ MAIN_LP ; 無鍵返回
MOV R7,#10 ; 延時10ms
LCALL DELAYMS ; 延時去抖動
LCALL SCAN_KEY ; 再次掃描
JZ MAIN_LP ; 無鍵返回
MOV KEY_V,KEY_S ; 保存鍵值
LCALL PROC_KEY ; 鍵處理
SJMP MAIN_LP ; 調回主循環
;===============================================================================
SCAN_KEY:
; 掃鍵掃描子程序
; 保存按鍵狀態到key_s
; 返回: A --- 按鍵是否按下(BOOL)
CLR A
MOV C,K1 ; 讀按鍵K1
MOV ACC.0,C
MOV C,K2 ; 讀按鍵K2
MOV ACC.1,C
MOV KEY_S,A ; 保存按鍵狀態到key_s
XRL A,KEY_V
RET
;===============================================================================
PROC_KEY:
; 鍵處理子程序
; 傳入參數: KEY_V --- 按鍵值
; 返回值: 無
CLR EA
MOV A,KEY_V
JNB ACC.0,PROC_K1
JNB ACC.1,PROC_K2
SJMP END_PROC_KEY
PROC_K1: ; 按鍵k1處理
LCALL INC_HOUR ; 小時加1
SJMP END_PROC_KEY
PROC_K2: ; 按鍵K2處理
INC MIN ; 分鍾加1
MOV A,MIN ;
SETB C
SUBB A,#59
JC K2_UPDATE_MIN ; 如果分鍾等於60,則分清0,小時加1
CLR A ;
MOV MIN,A
K2_UPDATE_MIN: ; 更新分顯示緩沖區
MOV A,MIN
MOV B,#10
DIV AB ; A = MIN / 10
MOV DPTR,#DIS_CODE
MOVC A,@A+DPTR
MOV BUF_MIN_H,A ; 更新分十位
MOV A,MIN
MOV B,#10
DIV AB
MOV A,B ; A = MIN % 10
MOVC A,@A+DPTR
MOV BUF_MIN_L,A ; 更新分個位
END_PROC_KEY:
SETB EA
RET
;===============================================================================
USING 0
TIMER0:
; 定時器0中斷服程序, 用於數碼管的動態掃描
; DIS_INDEX --- 顯示索引, 用於標識當前顯示的數碼管和緩沖區的偏移量
; DIS_DIGIT --- 位選通值, 傳送到P2口用於選通當前數碼管的數值, 如等於0xfe時,
; 選通P2.0口數碼管
; DIS_BUF --- 顯於緩沖區基地址
PUSH ACC
PUSH PSW
PUSH AR0
MOV TH0,#0FCH
MOV TL0,#017H
MOV P2,#0FFH ; 先關閉所有數碼管
MOV A,#DIS_BUF ; 獲得顯示緩沖區基地址
ADD A,DIS_INDEX ; 獲得偏移量
MOV R0,A ; R0 = 基地址 + 偏移量
MOV A,@R0 ; 獲得顯示代碼
MOV P0,A ; 顯示代碼傳送到P0口
MOV P2,DIS_DIGIT
MOV A,DIS_DIGIT ; 位選通值左移, 下次中斷時選通下一位數碼管
RL A
MOV DIS_DIGIT,A
INC DIS_INDEX ; DIS_INDEX加1, 下次中斷時顯示下一位
ANL DIS_INDEX,#0x07 ; 當DIS_INDEX等於8(0000 1000)時, 清0
POP AR0
POP PSW
POP ACC
RETI
;===============================================================================
USING 0
TIMER1:
; 定時器1中斷服務程序, 產生時基信號10ms
;
;
PUSH PSW
PUSH ACC
PUSH B
PUSH DPH
PUSH DPL
MOV TH1,#0DCH
INC SEC100
MOV A,SEC100
CLR C
SUBB A,#100 ; 是否中斷100次(達到1s)
JC END_TIMER1 ; < 1S
MOV SEC100,#00H ; 達到1s
LCALL INC_SEC ; 秒加1
END_TIMER1:
POP DPL
POP DPH
POP B
POP ACC
POP PSW
RETI ;
;===============================================================================
INC_SEC:
INC SEC
MOV A,SEC
SETB C
SUBB A,#59 ;
JC UPDATE_SEC
CLR A
MOV SEC,A
LCALL INC_MIN
UPDATE_SEC:
MOV A,SEC
MOV B,#10
DIV AB ; A = SEC / 10
MOV DPTR,#DIS_CODE
MOVC A,@A+DPTR ;
MOV BUF_SEC_H,A ;
MOV A,SEC
MOV B,#10
DIV AB
MOV A,B ; A = SEC % 10
MOVC A,@A+DPTR
MOV BUF_SEC_L,A
RET
;===============================================================================
INC_MIN:
INC MIN ; 分鍾加1
MOV A,MIN ;
SETB C
SUBB A,#59
JC UPDATE_MIN ; 如果分鍾等於60,則分清0,小時加1
CLR A ;
MOV MIN,A
LCALL INC_HOUR ; 小時加1
UPDATE_MIN: ; 更新分顯示緩沖區
MOV A,MIN
MOV B,#10
DIV AB ; A = MIN / 10
MOV DPTR,#DIS_CODE
MOVC A,@A+DPTR
MOV BUF_MIN_H,A ; 更新分十位
MOV A,MIN
MOV B,#10
DIV AB
MOV A,B ; A = MIN % 10
MOVC A,@A+DPTR
MOV BUF_MIN_L,A ; 更新分個位
RET
;===============================================================================
INC_HOUR:
INC HOUR ; 小時加1
MOV A,HOUR
SETB C
SUBB A,#24
JC UPDATE_HOUR ; 如果小時等於24,則小時清0
CLR A
MOV HOUR,A ; 小時清0
UPDATE_HOUR:
MOV A,HOUR
SETB C
SUBB A,#10
JC UPDATE_HOUR1 ; 如果小時小於10,則十位0不顯示
MOV A,HOUR
MOV B,#10
DIV AB
MOV DPTR,#DIS_CODE
MOVC A,@A+DPTR ;
MOV BUF_HOUR_H,A
SJMP UPDATE_HOUR2
UPDATE_HOUR1:
MOV BUF_HOUR_H,#0FFH
UPDATE_HOUR2:
MOV A,HOUR
MOV B,#10
DIV AB
MOV A,B
MOV DPTR,#DIS_CODE
MOVC A,@A+DPTR
MOV BUF_HOUR_L,A
RET
;===============================================================================
DELAYMS:
; 延時子程序
; 傳入參數:R7 --- 延時值(MS)
; 返回值:無
MOV A,R7
JZ END_DLYMS
DLY_LP1:
MOV R6,#185
DLY_LP2:
NOP
NOP
NOP
DJNZ R6,DLY_LP2
DJNZ R7,DLY_LP1
END_DLYMS:
RET
; END OF DELAYMS
;===============================================================================
DIS_CODE:
DB 0C0H
DB 0F9H
DB 0A4H
DB 0B0H
DB 099H
DB 092H
DB 082H
DB 0F8H
DB 080H
DB 090H
DB 0FFH
END