我在做一个客车超载检测系统,感觉写的程序比较简单清楚,但是功能就是实现不了,我通过P1.3(加)和P1.4(减)来设置规定人数, 通过图片右下的两个D触发器来设置上车的中断,通过中断来计数实际的人数,通过实际人数和规定人数做差来完成报警,感觉思路很清晰,硬件
电路感觉也没错,程序的标注比较全面,请求大侠帮忙看看………(其中司机钥匙位不开始的话,报警装置不动作)
YAOSHI_SET BIT P1.2 ;司机钥匙
ADD_SET BIT P1.3 ;设置加位
DEC_SET BIT P1.4 ;设置减位
JIANCE EQU 30H ;检测位地址赋值
SHEZHI EQU 80H ;设置位地址赋值
ORG 0000H
LJMP MAIN
ORG 000BH
LJMP IT0P
ORG 001BH
LJMP IT1P
ORG 0050H
MAIN: MOV SP,#60H ;设置堆栈区
MOV TMOD,#66H ;设置工作方式2
MOV TL0,#0FFH ;设置初值
MOV TH0,#0FFH
MOV TL1,#0FFH ;设置初值
MOV TH1,#0FFH
SETB TR1 ;启动T1工作
SETB ET1 ;允许T1中断
SETB TR0 ;启动T0工作
SETB ET0 ;允许T0中断
SETB EA ;开总中断允许
MOV DPTR,#TABLE
MOV SHEZHI,#0 ;初始化
MOV JIANCE,#0
MOV P2,#0F3H ;设置数码管位选、设置F3目的在于避免使继电器初始误动作,因为我们用的是7406反相驱动器
MOV P0,#3FH ;数码管段选的初始赋值
START: LCALL AJ ;长调用AJ
LCALL CONTROL
LJMP START
;**************************************************
IT0P: PUSH PSW ;通过两个中断服务来改变检测值
PUSH ACC
INC JIANCE
POP ACC
POP PSW
RE
ti
;******************
IT1P: PUSH PSW
PUSH ACC
DEC JIANCE
POP ACC
POP PSW
RETI
;****************************************************
;判断是否有控制键按下,是哪一个键按下
AJ: LCALL DISPLAY ;嵌套长调用显示
JNB ADD_SET,S1
JNB DEC_SET,S2
RET
S1: LCALL DELAY ;延时消抖
JB ADD_SET,AJ ;若的确加键按下,执行K1,否则返回按键
K1: INC SHEZHI
MOV A,SHEZHI
CJNE A,#40,J1 ;设置人数超过40人自动归零
MOV SHEZHI,#0
LJMP AJ
S2: LCALL DELAY
JB DEC_SET,AJ ;若的确减键按下,执行K2,否则返回按键
K2: DEC SHEZHI
MOV A,SHEZHI
CJNE A,#40,J2
MOV SHEZHI,#0
LJMP AJ
;**************************
;等待按键抬起
J1: JB ADD_SET,AJ
LCALL DISPLAY
SJMP J1
J2: JB DEC_SET,AJ
LCALL DISPLAY
SJMP J2
;****************************************************************
CONTROL: CLR C
MOV A,SHEZHI
SUBB A,JIANCE
JNC MIE
JB YAOSHI_SET,CONTROL ;司机钥匙未启动前,声光报警部分不动作
LCALL DELAY
JNC YAOSHI_SET,ZHIXING
RET
ZHIXING:CLR P2.7 ;继电器工作,锁定电路,并用发光二极管指示
CLR P1.0 ;蜂鸣器工作报警
LOOP:CLR P1.1 ;发光二极管亮并且闪烁
LCALL DELAY1
LCALL DELAY1
SETB P1.1
LCALL DELAY1
SJMP LOOP
;*************************
MIE: SETB P2.7 ;关断声光报警,关闭继电器
SETB P1.1
SETB P1.0
RET
;*****************************************************************
;显示控制子程序
DISPLAY:MOV A,JIANCE ;显示车内检测人数
MOV B,#10
DIV AB
CLR P2.1 ;先显示十位数字,个位位选置高
MOVC A,@A+DPTR
MOV P0,A
LCALL DELAY ;延迟
CLR P2.0 ;不选择十位了
MOV A,B
SETB P2.1 ;显示个位数字
MOVC A,@A+DPTR
MOV P0,A
LCALL DELAY ;再次余辉延迟
CLR P2.1 ;个位也不选择了
RET
;****************************************************************
TABLE:DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH
DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH
DELAY: MOV R7,#40
D3:MOV R6,#125
D2:DJNZ R6,D2
DJNZ R7,D3
RET ;一共延时约为10ms,并非精确值
DELAY1: MOV R5,#100
D1: DJNZ R5,D1
RET ;发光二极管闪烁延时
END
-
一周热门 更多>