?? 7.asm
字號:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; SPEED/MILE FOR BIKE PROGRAM ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;
; 60H,61H,62H作里程計數單元,6CH,6DH作T1計數擴充單元,
; 68H,69H,6AH,6BH存放自行車每圈時間數,70H,71H,72H,73H
; 作顯示BCD碼存放數用,11H--15H存放被除數,16H-19H存放除數
;
;
; 定義
VSDA EQU P1.5 ; EEPROM數據傳送口
VSCL EQU P1.4 ; EEPROM時鐘傳送口
SLA EQU 50H ; EEPROM器件尋址字節存放單元
NUMBYT EQU 51H ; EEPROM傳送字節數存放單元
MTD EQU 30H ; EEPROM發送數據緩沖單元
MRD EQU 40H ; EEPROM讀出數據存放單元
SLAW EQU 0A0H ; EEPROM尋址字節寫
SLAR EQU 0A1H ; EEPROM尋址字節讀
DPHH EQU 62H ; DPTR計數擴展高8位
TH1H EQU 6CH ; 定時器T1擴展高8位
TH1HH EQU 6DH ; 定時器T1擴展高8-16位
;
;;;;;;;;;;;;;;;;;;;;
;; PROGRAM INPUT ;;
;;;;;;;;;;;;;;;;;;;;
;
ORG 0000H ;程序執行開始地址
LJMP START ;跳至START
ORG 0003H ;外中斷0中斷程序入口
LJMP INTEX0 ;跳至INTEX0中斷服務程序
ORG 000BH ;定時器T0中斷程序入口
RETI ;中斷返回
ORG 0013H ;外中斷1中斷入口
LJMP INTEX1 ; 跳至INTEX1中斷服務程序
ORG 001BH ; 定時器T1中斷程序入口
LJMP INTT1 ; 跳至INTT1中斷服務程序
ORG 0023H ;串口中斷入口地址
RETI ;中斷返回
ORG 002BH ;定時器T2中斷入口地址
RETI ;中斷返回
;
;
;;;;;;;;;;;;;;;;;;;;
;; PROGRAM CLEAR ;;
;;;;;;;;;;;;;;;;;;;;
;上電初始化程序
CLEARMEN: MOV TMOD,#90H ;T1為16位外部控制定時器
MOV SP,#75H ;堆棧在75H開始
SETB PX0 ;外中斷0優先級為1
SETB IT0 ;外中斷0用邊沿觸發
SETB IT1 ;外中斷1用邊沿觸發
CLR A ;清A
MOV 20H,A ;清內存中特定單元
MOV 6CH,A ;
MOV 6DH,A ;
MOV 70H,A ;
MOV 71H,A ;
MOV 72H,A ;
MOV 73H,A ;
MOV 60H,A ;
MOV 61H,A ;
MOV 62H,A ;
MOV 63H,A ; 清內存中特定單元
DEC A ;A為#0FFH
MOV 68H,A ;內存置數據#0FFH
MOV 69H,A ; 內存置數據#0FFH
MOV 6AH,A ; 內存置數據#0FFH
MOV 6BH,A ; 內存置數據#0FFH
MOV P1, A ;P1口置1
CLEAR1: JB P1.2,KEY1 ;根據P1.2,P1.3,P1.6,P1.7設置狀態,
;在21H地址單元賦自行車周長值
MOV 21H,#0FH ;22寸自行車周長值
LJMP CLEAR2 ;轉CLEAR2
KEY1: JB P1.3,KEY2 ;
MOV 21H,#12H ; 24寸自行車周長值
LJMP CLEAR2 ; 轉CLEAR2
KEY2: JB P1.6,KEY3 ;
MOV 21H,#14H ; 26寸自行車周長值
LJMP CLEAR2 ; 轉CLEAR2
KEY3: JB P1.7,ERR ;四個開關都沒合上,轉出錯處理
MOV 21H,#19H ; 28寸自行車周長值
CLEAR2: SETB TR1 ;開定時器T1
SETB EA ;開中斷允許
SETB EX0 ;開外中斷0
SETB ET1 ;開定時中斷T1
SETB P3.1 ;關報警器
LCALL VIICREAD ;將EEPROM中原里程數據調入內存
RET ;子程序返回
ERR: CPL P3.1 ;輪周長設置出錯,LED燈閃爍堤醒
LCALL DL5S ;延時
LJMP CLEAR1 ;重新初始化,等待輪周長設置開關合上
;
;;;;;;;;;;;;;;;;;;;;
;; PROGRAM START ;;
;;;;;;;;;;;;;;;;;;;;
;
START: LCALL CLEARMEN ;上電初始化
START1: JB P3.0,DISPLAYS ;P3.0=1,顯示里程
LCALL DISPLAYV ;顯示速度
START2: SJMP START1 ;轉START1循環
;
;;;;;;;;;;;;;;;;;;;;
;;INTEX0 PROGRAM ;;
;;;;;;;;;;;;;;;;;;;;
; 里程計數程序,用外中斷0實現,計數用60H-62H內存單元。
INTEX0: PUSH ACC ; 累加器堆棧保護
PUSH PSW ;狀態字堆棧保護
INC 60H ;圈加1
CLR A ;清A
CJNE A,60H,INTEX0OUT ;計數沒溢出轉INTEX0OUT
INC 61H ;溢出進位(61H加1)
CJNE A,61H,INTEX0OUT ; 計數沒溢出轉INTEX0OUT
INC 62H ; 溢出進位(62H加1)
INTEX0OUT: LCALL VIICWRITE ;里程數據存入EEPROM
SETB EX1 ;開外中斷1
POP PSW ;狀態字恢復
POP ACC ;累加器恢復
RETI ;中斷返回
;;;;;;;;;;;;;;;;;;;;
;;INTEX1 PROGRAM ;;
;;;;;;;;;;;;;;;;;;;;
; 每轉1圈時間計數處理程序,每圈時間放在68H-6BH單元中。
INTEX1: PUSH ACC ; 堆棧保護
PUSH PSW ;
CLR EX1 ;關外中斷1
JNB 00H,INTEX11 ;溢出標志為0轉INTEX11
MOV TL1,#0FFH ;溢出時計時單元賦#0FFH(顯示速度為零)
MOV TH1,#0FFH ;
MOV 6CH,#0FFH ;
MOV 6DH,#0FFH ;
INTEX11: MOV 68H,TL1 ;將時間計數值移入暫存單元68H-6BH
MOV 69H,TH1 ;
MOV 6AH,6CH ;
MOV 6BH,6DH ;
CLR A ;清A
MOV TL1,A ;計時單元置0
MOV TH1,A ;
MOV 6CH,A ;
MOV 6DH,A ;
CLR 00H ;清溢出標志
POP PSW ;堆棧恢復
POP ACC ;
RETI ;中斷返回
;
;;;;;;;;;;;;;;;;;;;;
;;INTT1 PROGRAM ;;
;;;;;;;;;;;;;;;;;;;;
;
; T1計數器中斷服務程序。(計數器T1由外中斷1輸入控制,當為高電平時計時開始)
INTT1: PUSH ACC ;堆棧保護
PUSH PSW ;
INC 6CH ;6CH計時 單元加1
MOV A,6CH ;移入A
JNZ INTT11 ;不等于0轉INTT11
INC 6DH ;進位,6DH單元加1
MOV A,6DH ;移入A
JNZ INTT11 ; 不等于0轉INTT11
SETB 00H ;計時器溢出,置溢出標志
INTT11: POP PSW ;恢復堆棧
POP ACC ;
RETI ;中斷返回
;
;;;;;;;;;;;;;;;;;;;;
;;DISPLAY S ;;
;;;;;;;;;;;;;;;;;;;;
;
;里程顯示控制程序
DISPLAYS: SETB P1.0 ;點亮LED1(顯示里程狀態)
CLR P1.1 ;關閉速度指示燈
SETB P3.7 ;顯示小數點(最小顯示為0.1公里)
LCALL SSS ;將圈數轉為公里數
LCALL DISPLAY ;顯示公里數據
LJMP START1 ;跳回START1
;
;
;;;;;;;;;;;;;;;;;;;;
;;DISPLAY V ;;
;;;;;;;;;;;;;;;;;;;;
;速度顯示控制程序
DISPLAYV: CLR P1.0 ;關閉LED1(里程)燈
SETB P1.1 ;點亮LED2(顯示時速狀態)
CLR P3.7 ;關小數點顯示
LCALL VVV ;每圈時間換算為公里/小時程序
MOV A,71H ;將十位數(BCD碼)值移入A
SUBB A,#04H ; 與預定報警值比較
JNC WARING ; 時速超過40時報警
SETB P3.1 ;關報警燈
V1: LCALL DISPLAY ;顯亮一次(為了改善閃爍)
RET ;子程序返回
WARING: CLR P3.1 ; 報警燈LED3點亮(并嗚叫)
AJMP V1 ;轉V1退出
;
;;;;;;;;;;;;;;;;;;;;
;;VIICWRITE ;;
;;;;;;;;;;;;;;;;;;;;
;歸一化EEPROM存入程序(12M時鐘),存入數在50H起單元
VIICWRITE: ACALL WMOV9
MOV SLA,#SLAW
MOV NUMBYT,#09H
LCALL WRNBYT
RET
WMOV9: MOV 5FH,#50H
MOV R0,#MTD
MOV R1,#5FH
MOV R2,#09H
WMOV: MOV A,@R1
MOV @R0,A
INC R0
INC R1
DJNZ R2,WMOV
RET
;
;;;;;;;;;;;;;;;;;;;;
;;VIICREAD ;;
;;;;;;;;;;;;;;;;;;;;
; 歸一化EEPROM讀出程序(12M時鐘),讀出數放入60H-67H單元
VIICREAD: MOV MTD,#50H ;
MOV SLA,#SLAW
MOV NUMBYT,#01H
LCALL WRNBYT
MOV SLA,#SLAR
MOV NUMBYT,#08H
LCALL RDNBYT
ACALL RMOV8
RET
RMOV8: MOV R0,#MRD
MOV R1,#60H
MOV R2,#08H
RMOV: MOV A,@R0
MOV @R1,A
INC R0
INC R1
DJNZ R2,RMOV
RET
;
;;;;;;;;;;;;;;;;;;;;
;;VIIC PROGRAM ;;
;;;;;;;;;;;;;;;;;;;;
; I2C串行歸一化存儲子程序
STA: SETB VSDA
SETB VSCL
NOP
NOP
NOP
NOP
CLR VSDA
NOP
CLR VSDA
NOP
NOP
NOP
NOP
CLR VSCL
RET
STOP: CLR VSDA
SETB VSCL
NOP
NOP
NOP
NOP
SETB VSDA
NOP
NOP
NOP
NOP
CLR VSDA
CLR VSCL
RET
MACK: CLR VSDA
SETB VSCL
NOP
NOP
NOP
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -