我做的毕业设计是基于单片机的车用数字仪表设计。只需要测车速和里程。我从网上下载了一份。但是由于学校机房出现故障,还没来得急调试。有哪位大哥能帮帮忙看一下吗,这程序到底能不能运行!?
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 ;中断返回
;