登录
首页 单片机论坛
回帖 发帖
正文

主题:[原创]基于AT89C51+MAX7219的频率计 PROTEUS仿真 硬件测试通过

点击:2547 回复:3

;-----------------------------
;2006年电子设计大赛选拔试题
;制作人:李明星
;完成日期:2006。08。21
;晶震:22。1148
;-----------------------------
KEY_1 BIT P1.0
KEY_2 BIT P1.1
KEY_3 BIT P1.2
KEY_4 BIT P1.3
T    EQU 40H
M    EQU 41H
ORG 0000H
AJMP MAIN
ORG 001BH
AJMP _T0_
ORG 0030H
MAIN: MOV SP,#5FH
NOP
       lcall init_main
       lcall init_max7219
LM_M: ACALL DISP
ACALL D10MS
ACALL KEY_SCAN
AJMP LM_M
KEY_SCAN:
MOV P1,#0FFH
MOV C,KEY_1
JNC D1STIME
MOV C,KEY_2
JNC D100MSTIME
MOV C,KEY_3
JNC D10MSTIME
MOV C,KEY_4
JNC D1MSTIME
RET

init_main:
       mov r1,#8
       mov r0,#30h
lp_main:mov @r0,#00h
       inc r0
       djnz r1,lp_main
       ret
D1STIME:
MOV M,#0
CLR F0
MOV T,#100
ACALL INIT_T
JNB F0,$
RET
D100MSTIME:
MOV M,#1
CLR F0
MOV T,#10
ACALL INIT_T
JNB F0,$
RET
D10MSTIME:
MOV M,#2
CLR F0
MOV T,#1
ACALL INIT_T
JNB F0,$
RET
D1MSTIME:
MOV M,#2
CLR F0
MOV T,#1
ACALL INIT_T
JNB F0,$
RET
INIT_T:
MOV TMOD,#15H
MOV TH1,#0B8H
MOV TL1,#03H
SETB ET1
CLR ET0
SETB EA
SETB TR0
SETB TR1
RET
_T0_: MOV TH1,#0B8H
MOV TL1,#03H
DJNZ T,_T0_NEXT
CLR TR0
CLR TR1
SETB F0
ACALL DAT_CONVERSION
MOV TH0,#00H
MOV TL0,#00H
ACALL MOVE_M
ACALL DISP
_T0_NEXT:RETI
MOVE_M: nop
       mov a,m
       cjne a,#00h,move_2
       ret
       mov a,m
move_2: cjne a,#01h,move_3
       mov 35h,34h
       mov 34h,#0
       mov 34h,33h
       mov 33h,#0
       mov 33h,32h
       mov 32h,#0
mov 32h,31h
mov 31h,#0
mov 31h,30h
mov 30h,0
       ret
       mov a,m
move_3: cjne a,#02h,move_ret
       mov 36h,34h
       mov 34h,#0
       mov 35h,33h
       mov 33h,#0
       mov 34h,32h
       mov 32h,#0
mov 33h,31h
mov 31h,#0
mov 32h,30h
mov 30h,#0
move_ret:    ret
dat_conversion:
       mov a,th0
       rrc a
       mov r2,a
       mov a,tl0
       rrc a
       mov r3,a
       acall ibtd2
       mov a,r6
       anl a,#0fh
       mov 30h,a
       mov a,r6
       anl a,#0f0h
       swap a
       mov 31h,a
       mov a,r5
       anl a,#0fh
       mov 32h,a
       mov a,r5
       anl a,#0f0h
       swap a
       mov 33h,a
       mov a,r4
       anl a,#0fh
       mov 34h,a
       ret
;*********************************
;*        双字节HEX->BCD         *
;* 入口:R2R3为双字节16位二进制数 *
;* 出口:R4R5R6为转换完的压缩BCD  *
;*********************************
IBTD2:  CLR A
       MOV R4,A
       MOV R5,A
       MOV R6,A
       MOV R7,#16
LM_BCD: CLR C
       MOV A,R3
       RLC A
       MOV R3,A
       MOV A,R2
       RLC A
       MOV R2,A
       MOV A,R6
       ADDC A,R6
       DA A
       MOV R6,A
       MOV A,R5
       ADDC A,R5
       DA A
       MOV R5,A
       MOV A,R4
       ADDC A,R4
       DA A
       MOV R4,A
       DJNZ R7,LM_BCD
       RET
;************************************************
;*                   初始化max7219              *
;* 程序创建时间:2006-04-14                      *
;* 最后修改时间:2006-                           *
;* 影响资源:P1.7--CLK  P1.6--DIN  P1.4--CS7219  *
;* 占用寄存器:50H,51H,52H                       *
;************************************************
       clk bit p1.7
       din bit p1.6
       cs7219 bit p1.4
       scan_lim equ 50h        ;扫描界限
       ctrl_7219 equ 51h       ;控制字
       ctrl_byte equ 52h       ;控制子存储器
init_max7219:
       setb clk
       setb cs7219
       mov scan_lim,#07h
       mov ctrl_7219,#09h      ;译码方式
       mov ctrl_byte,#0ffh
       lcall t_max7219
       mov ctrl_7219,#0ah       ;亮度
       mov ctrl_byte,#0fh
       lcall t_max7219
       mov ctrl_7219,#0bh      ;扫描界限
       mov ctrl_byte,scan_lim
       lcall t_max7219
       mov ctrl_7219,#0ch      ;停机状态
       mov ctrl_byte,#01h
       lcall t_max7219
       mov ctrl_7219,#0fh      ;测试状态
       mov ctrl_byte,#00h
       lcall t_max7219
       ret
;************************
;* 传送16位数据
;*
;************************
t_max7219:
       mov a,ctrl_7219
       mov b,#08h
       clr cs7219
max7219_h8:
       nop
       clr clk
       rlc a
       mov din,c
       nop
       setb clk
       djnz b,max7219_h8
       mov a,ctrl_byte
       mov b,#08h
max7219_l8:
       nop
       clr clk
       rlc a
       mov din,c
       nop
       setb clk
       djnz b,max7219_l8
       setb cs7219
       ret
;*****************************
;* 显示程序
;* 显示缓冲区地址:30H--37H
;************
disp:   setb rs1
       clr rs0
ORL 33H,#80H      ;<---------------------------------
       ORL 36H,#80H      ;<---------------------------------
       mov r0,scan_lim                 ;循环扫描次数
       inc r0
       mov a,scan_lim
       add a,#30h
       mov r1,a                        ;显示缓冲区地址
lp
附件:
[本地下载]
06-08-27 12:23
1楼
该帖内容不符合相关规定!
06-08-28 23:59
ding!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
07-10-05 19:08
顶个
08-05-27 00:20

工控新闻

更多新闻资讯