智能收費(fèi)系統(tǒng)軟件源代碼
采用mcs-51單片機(jī)時(shí)鐘頻率為6MHZ采用T0工作方式2
OUTBIT EQU 08002h ; 位控制口
OUTSEG EQU 08004h ; 段控制口
IN EQU 08001h ; 鍵盤讀入口
LEDBuf EQU 60h ;顯示緩沖
Hour EQU 40h ;存放時(shí)信息計(jì)數(shù)單元
Minute EQU 41h ;存放分信息計(jì)數(shù)單元
Second EQU 42h ; 存放秒信息計(jì)數(shù)單元
C100us EQU 43h
Tick EQU 10000
T100us EQU 256-50
LGMP StArt ;跳轉(zhuǎn)到程序入口
org 000Bh
T0Int:
PUSH DPL
PUSH DPH
PUSH ACC ;保護(hù)斷點(diǎn)
ORL P1, #01H
ANL P1, #0FEH ;當(dāng)車進(jìn)停車場時(shí)由系統(tǒng)產(chǎn)生下降沿脈沖觸發(fā)硬件電路開始計(jì)時(shí)
MOV A, C100us+1
JNZ Goon
DEC C100us
Goon:
DEC C100us+1
MOV A, C100us
ORL A, C100us+1
JNZ Exit ;判斷是否溢出10000次
MOV C100us, #high(Tick)
MOV C100us+1, #low(Tick) ;從新設(shè)置技術(shù)單元C100us的初值
INC Second ;秒單元加1
MOV A, Second
CJNE A, #60, Exit ;判斷秒技術(shù)單元是否累加到60
MOV Second, #0 ;需要向分計(jì)數(shù)單元進(jìn)位秒計(jì)數(shù)單元先清零
INC Minute ;分計(jì)數(shù)單元加1
MOV A, Minute
CJNE A, #60, Exit ;判斷分計(jì)數(shù)單元是否加到60
MOV Minute, #0 ;需要向時(shí)計(jì)數(shù)單元進(jìn)位分技術(shù)單元先清零
INC Hour ;時(shí)計(jì)數(shù)單元加1
Exit:
POP DPL
POP DPH
POP PSW ;恢復(fù)斷點(diǎn)
RETI
DelAy: ; 延時(shí)子程序
MOV r7, #0
DelAyLoop:
DJNZ r7, DelAyLoop
DJNZ r6, DelAyLoop ;實(shí)現(xiàn)延時(shí)
RET
LEDMAP: ; 八段管顯示碼
dB 3fh, 06h, 5Bh, 4fh, 66h, 6dh, 7dh, 07h
dB 7fh, 6fh, 77h, 7ch, 39h, 5eh, 79h, 71h
DisplAyLED:
MOV r0, #LEDBuf
MOV r1, #6 ; 共6個(gè)八段管
MOV r2, #00100000B ; 從左邊開始顯示
Loop:
MOV DPTR, #OUTBIT
MOV A, #0
MOVX @DPTR, A ; 關(guān)所有八段管
MOV A, @r0
MOV DPTR, #OUTSEG
MOVX @DPTR,A ;將要顯示的值放到段控制口
MOV DPTR, #OUTBIT
MOV A, r2
MOVX @DPTR, A ; 顯示一位八段管
MOV r6, #1
CAll DelAy ;調(diào)用延時(shí)程序
MOV A, r2 ; 顯示下一位
RR A
MOV r2, A
INC r0 ;找到要顯示下一位地址
DJNZ r1, Loop ;判斷是否全部顯示
RET
ToLED:
MOV DPTR, #LEDMAp
MOVC A, @A+DPTR ;查表顯示
RET
StArt:
MOV TMOD, #02h ; 模式2, 定時(shí)器
MOV TH0, #T100us
MOV TL0, #T100us ;給T0賦初值
MOV IE, #10000010B ; EA=1, IT0 = 1
MOV Hour, #0
MOV Minute, #0
MOV Second, #0 ;將時(shí)分秒單元分別清零
MOV C100us, #high(Tick)
MOV C100us+1, #low(Tick) ;設(shè)定計(jì)數(shù)初值
SETB TR0 ; 啟動(dòng)定時(shí)器T0
MLoop:
MOV A, Hour
MOV B, #10
DIV AB ;求的時(shí)的高位放到A
CAll ToLED ;調(diào)用查表程序
MOV LEDBuf, A;將顯示值放到顯示緩沖區(qū)
MOV A, B
CAll ToLED
ORL A, #80h ;得到時(shí)的低位值:
MOV LEDBuf+1, A;將顯示值放到顯示緩沖區(qū)的下一地址
MOV A, Minute
MOV B, #10
DIV AB ;求的分的高位放到A
CAll ToLED ;調(diào)用查表程序
MOV LEDBuf+2, A;將顯示值放到顯示緩沖區(qū)下一地址
MOV A, B
CAll ToLED
ORL A, #80h ;得到時(shí)的低位值:
MOV LEDBuf+3, A ;將顯示值放到顯示緩沖區(qū)的下一地址
MOV A, Second
MOV B, #10
DIV AB
CAll ToLED ;調(diào)用查表程序
MOV LEDBuf+4, A ;將顯示值放到顯示緩沖區(qū)的下一地址
MOV A, B
CAll ToLED ;調(diào)用查表程序
MOV LEDBuf+5, A ;將顯示值放到顯示緩沖區(qū)的下一地址
CAll DisplAyLED ;調(diào)用顯示程序顯示所有的結(jié)果
MOV A, Hour
MOV B, #8
MUL AB
MOV R3,B ;計(jì)算整小時(shí)費(fèi)用
MOV A, Minute
MOV B, #60
DIV AB
MOV B, #8
MUL AB
MOV A, B ;計(jì)算分費(fèi)用
ADD A, R3 ;總費(fèi)用
Ljmp Mloop
End
評(píng)論