|
最近编了一个自行车速度里程表程序,大家一起分享,程序的基本思路如流程图(自行车速度里程表(2-流程图))所示,速度可用V=S/T,记每一圈的时间。里程记圈数,用记数总圈数除以一公里需要的圈数即要显示的公里数。请大家多提宝贵意见。 sda equ p1.4 ;EEPROM数据线 scl equ p1.5 ;EEPROM时钟线 quan equ 30h ;存放圈数 ;?************************************ org 00h jmp main org 03h jmp int00 org 0bh reti org 13h jmp int_1 org 1bh jmp intt1 org 23h reti ;************************************* ;主程序 ;************************************* org 30h main:call clear l1: jb p1.2,key1 mov quan,#22 jmp datain key1: jb p1.3,key2 mov quan,#24 jmp datain key2: jb p1.6,key3 mov quan,#26 jmp datain key3: jb p1.7,err1 mov quan,#28 jmp datain err1:call err jmp l1
datain :call cmd ;车圈长度调入子程序 mov ie,#10001101b ;8bh setb tr1 clr p3.1 call read ;eeprom数据调入 l2: jb p3.0,long ;里程处理 call disv ;速度处理 jmp l2 long: call diss jmp l2 ;*************************************** ; 初始化 ;*************************************** clear: mov tmod,#90h ;设置T1,门控,方式一? mov tcon,#05h ;INT0,INT1边沿触发 setb px0 ; INT0中断优先级最高 mov sp,#70h ;设置堆栈 clr 20h.0 clr a mov r0,#2fh clear_loop:inc r0 mov @r0,a cjne r0,#40h,clear_loop mov p1,#0ffH ;p1置高电平 ret ;*************************************** int00:push acc push psw inc 54h clr a cjne a,54h,int0_rom inc 55h cjne a,55h,int0_rom inc 56h int0_rom:call romw pop psw pop acc reti ;************************************* int_1: push acc push psw clr ex1 ;关外部中断一 jnb 20h.0,intl1_l1 ;判断标志位,为0未超速 mov 33h,#0ffh ;超速处理 mov 34h,#0ffh mov 35h,#0ffh mov 36h,#0ffh jmp intl1_l2 intl1_l1: mov 33h,tl1 ;计数单元保存 mov 34h,th1 mov 35h,31h mov 36h,32h intl1_l2: mov tl1,#00 ; 计数单元清零 mov th1,#00 mov 31h,#00 mov 32h,#00 clr 20h.0 setb ex1 pop psw pop acc reti ;********************************************** intt1:push acc push psw inc 31h clr a cjne a,31h,tim1 inc 32h cjne a,32h,tim1 setb 0h tim1:pop psw pop acc ret ;******************************************** ; 出错处理 ;******************************************** err: cpl p3.1 call delay_1ms ret ;******************************************** ;车圈长度调入子程序 ;******************************************** cmd: mov a,30h cjne a,#22,cmd_24 mov 4fh,#00 mov 4eh,#2dh mov 4dh,#0c6h mov 4ch,#0c0h mov 2fh,#01h ;一公里转500圈 mov 2eh,#0f4h jmp cmd_out cmd_24: cjne a,#24,cmd_26 mov 4fh,#00h mov 4eh,#2dh mov 4dh,#0c6h mov 4ch,#0c0h mov 2fh,#01h ;一公里转450圈 mov 2eh,#0c2h jmp cmd_out cmd_26: cjne a,#26,cmd_28 mov 4fh,#00h mov 4eh,#2dh mov 4dh,#0c6h mov 4ch,#0c0h mov 2fh,#01h ;一公里400圈 mov 2eh,#90h jmp cmd_out cmd_28: cjne a,#28,cmd_out mov 4fh,#00h mov 4eh,#2dh mov 4dh,#0c6h mov 4ch,#0c0h mov 2fh,#01h ;一公里350圈 mov 2eh,#5eh cmd_out: ret ;******************************************** ;eeprom写 ;******************************************** romw: mov r3,#0a0h ;设置器件地址 mov 4bh,#00 ;eeprom首址 mov r1,#54h ;要送出数据首址 mov r7,#3 ;共三个字节 setb sda setb scl clr sda mov a,r3 call subs mov a,4bh call subs w_again: mov a,@r1 call subs inc r1 djnz r7,w_again clr sda call de_w setb scl call de_w setb sda ret subs: mov r0,#08h subs_loop:clr scl rlc a mov sda,c nop setb scl call de_w djnz r0,subs_loop clr scl call de_w setb scl rep: mov c,sda jc rep clr scl ret de_w: nop nop ret
;******************************************** read : mov r3,#0a0h ;设置器件地址 mov 4bh,#00 ;eeprom首址 mov r1,#54h ;要送出数据首址 mov r7,#3 setb sda setb scl clr sda mov a,r3 call subs mov a,4bh call subs setb sda setb scl clr sda mov a,r3 setb acc.0 call subs more: call subr mov @r1,a inc r1 djnz r7,more clr sda call de_w setb scl call de_w setb sda ret subr: mov r0,#08 r_loop: setb scl call de_w mov c,sda rlc a clr scl call de_w djnz r0,r_loop cjne r7,#01h,low1 setb sda jmp setok low1: clr sda setok: call de_w setb scl call de_w clr scl call de_w setb sda ret ;********************************************* ;里程处理 ;********************************************* diss:setb p1.1 clr p1.0 ;开里程指示 call quans call play ret quans: mov 45h,#00 mov 44h,#00 mov 43h,#00 mov 42h,#00 mov 41h,#00h mov 40h,56h mov 3fh,55h mov 3eh,54h ;被除数赋初值 mov 4ah,#00h mov 49h,#00h mov 48h,2fh mov 47h,2eh ;除数赋初值 jmp divst ret
;**************************************** ;速度处理子程序 ;**************************************** disv: setb p1.0 ;关里程显示 clr p1.1 ;开速度显示 call kmph ;调速度转换子程序 mov a,#0ffh cjne a,36h,dsp11 ;与设置速度比较,超速报警 setb p3.1 ;报警指示灯亮 jmp exit dsp11: clr p3.1 ; 关报警指示灯 call play ; 调显示子程序 exit: ret ;************************ ; 速度转换子程序 (v=L/t) ;************************ kmph: mov 45h,#00 mov 44h,#00 mov 43h,#00 mov 42h,#00 mov 41h,4fh mov 40h,4eh mov 3fh,4dh mov 3eh,4ch ;被除数赋初值 mov 4ah,36h mov 49h,35h mov 48h,34h mov 47h,33h ;除数赋初值 jmp divst ;调除法子程序 kkk: nop call bcdst ;调bcd码转换子程序 mov a,50h anl a,#0fh mov 3ah,a mov a,50h swap a anl a,#0fh mov 3bh,a mov a,51h anl a,#0fh mov 3ch,a ret ; ************************** ; 除法子程序 ;************************** divst: setb rs0 setb rs1 ;用寄存器1 clr c mov a,3eh subb a,47h mov a,3fh subb a,48h mov a,40h subb a,49h mov a,41h subb a,4ah jnc div_out mov r2,#20h div_loop:clr c mov a,3eh rlc a mov 3eh,a mov a,3fh rlc a mov 3fh,a mov a,40h rlc a mov 40h,a mov a,41h rlc a mov 41h,a mov a,42h rlc a mov 42h,a mov a,43h rlc a mov 43h,a mov a,44h rlc a mov 44h,a mov a,45h rlc a mov 45h,a mov f0,c clr c mov a,42h subb a,47h mov r3,a mov a,43h subb a,48h mov r4,a mov a,44h subb a,49h mov r5,a mov a,45h subb a,4ah jb f0,div_loop1 jc div_loop2 div_loop1: mov 45h,a mov a,r5 mov 44h,a mov a,r4 mov 43h,a mov a,r3 mov 42h,a inc 3eh div_loop2: djnz r2,div_loop clr f0 div_out: clr rs0 clr rs1 jmp kkk div_out1: setb f0 jmp div_out ;************************* ; bcd码转换子程序 ;************************* bcdst: mov r7,#10h clr c mov 50h,#00 mov 51h,#00 bcdst_loop:mov a,3eh rlc a mov 3eh,a mov a,3fh rlc a mov 3fh,a mov a,50h addc a,50h da a mov 50h,a mov a,51h addc a,51h da a mov 51h,a djnz r7,bcdst_loop ret ;********************** ; 显示子程序 ;********************** play: mov r1,#3ah mov r2,#0feh play_loop: mov a,r2 mov p2,a mov a,@r1 anl a,#0fh mov dptr,#tab movc a,@a+dptr mov p0,a call delay_1ms ;显示1ms inc r1 mov a,r2 jnb p2.2,play_out rl a mov r2,a jmp play_loop play_out: mov p2,#0ffh ;关显示 ret tab: db 3fh,06h,5bh,4fh,66h,6dh,7dh,07h db 7fh,6fh,77h,7ch,39h,5eh,79h,71h db 00h ;************************ ;延时1ms子程序 ;************************ delay_1ms:mov r7,#6 delay_l1:mov r6,#2 djnz r6,$ djnz r7,delay_l1 ret end |