程序:
ORG 0000H
LJMP MAIN
ORG 0003H
LJMP TS
ORG 000BH
LJMP T_0
ORG 0030H
MAIN:
MOV SP,#3FH ;设置堆栈
MOV 60H,#0 ;采集数据显示缓冲区
MOV 70H,#10 ;设置数据显示缓冲区
MOV R0,#60H
MOV R1,#70H
MOV R6,#50
MOV R7,#200 ;1S计数值
CLR 20H ;报警状态标志位
CLR 21H ;设置数据标志位
CLR P1.0 ;音频报警
CLR P1.1 ;继电器
CLR P1.2 ;LED
MOV TH0,#0F6H ;定时器0装初值
MOV TL0,#3CH
SETB IT0 ;外部中断触发方式设置
MOV IE,#83H ;开总中断,外部中断0,定时器中断0
SETB TR0 ;启动定时器
MOV A,#0
MOV DPTR,#8000H ;片选ADC0809
MOVX @DPTR,A ;启动AD
LOOP:
LCALL DISPLAY ;调用显示
LCALL KEY ;扫描键盘
LJMP LOOP
KEY:
PUSH ACC ;保护现场
PUSH PSW
PUSH DPH
PUSH DPL
LCALL KEY_VALUE
JB 21H,KEY0_0 ;判断是否处于设置数据状态
KEY0:
CJNE A,#01H,RETURN ;判断键值
LCALL DISPLAY ;调用显示延时,消抖
CJNE A,#01H,RETURN
LCALL KEY_VALUE
JNZ KEY0 ;等键释放
SETB 21H ;设置数据状态标志位置1
LJMP RETURN ;返回
KEY0_0:
CJNE A,#01H,KEY1 ;判断键值
LCALL DISPLAY ;调用显示延时消抖
CJNE A,#01H,KEY1
LCALL KEY_VALUE
JNZ KEY0_0 ;等键释放
CLR 21H ;设置完成,清除标志位
LJMP RETURN ;返回
KEY1:
CJNE A,#02H,KEY2 ;判断键值
LCALL DISPLAY ;调用显示延时,消抖
CJNE A,#02H,KEY2
LCALL KEY_VALUE
JNZ KEY1 ;等键释放
INC 70H ;设置数据缓冲区加1
CJNE @R1,#20,RETURN;判断是否到最大值20
MOV 70H,#0 ;是,归0
LJMP RETURN ;返回
KEY2:
CJNE A,#04H,RETURN ;判断键值
LCALL DISPLAY ;调用显示延时,消抖
CJNE A,#04H,RETURN
LCALL KEY_VALUE
JNZ KEY2 ;等键释放
DEC 70H ;设置数据缓冲区加1
CJNE @R1,#0,RETURN ;判断是否到最小值0
MOV 70H,#20 ;是,变为20
RETURN:
POP DPL ;恢复现场
POP DPH
POP PSW
POP ACC
RET
KEY_VALUE: ;读键值子程序
MOV DPTR,#09002H ;送键盘列码地址
MOV A,#00H
MOVX @DPTR,A ;扫描键盘
MOV DPTR,#08001H ;送行码地址
MOVX A,@DPTR
ANL A,#0FH ;读键值
RET
DISPLAY:
PUSH ACC ;保护现场
PUSH PSW
PUSH DPH
PUSH DPL
MOV A,@R0 ;转换数据
MOV B,#10
DIV AB
MOV DPTR,#TAB ;查表
MOVC A,@A+DPTR
MOV DPTR,#09004H;送段码地址
MOVX @DPTR,A ;送采样数据十位数段码
MOV DPTR,#09002H;送位码地址
MOV A,#02H ;送位码
MOVX @DPTR,A
MOV A,B ;显示采样数据个位数据
MOV DPTR,#TAB
MOVC A,@A+DPTR
MOV DPTR,#09004H
MOVX @DPTR,A
MOV DPTR,#09002H
MOV A,#01H
MOVX @DPTR,A
MOV A,#0
MOVX @DPTR,A
MOV A,@R1 ;显示设置数据
MOV B,#10
DIV AB
MOV DPTR,#TAB
MOVC A,@A+DPTR
MOV DPTR,#09004H
MOVX @DPTR,A
MOV DPTR,#09002H
MOV A,#08H
MOVX @DPTR,A
MOV A,B
MOV DPTR,#TAB
MOVC A,@A+DPTR
MOV DPTR,#09004H
MOVX @DPTR,A
MOV DPTR,#09002H
MOV A,#04H
MOVX @DPTR,A
LJMP RETURN ;返回
DELAY: ;延时函数
MOV R6, #50
DELAY_LOOP:
DJNZ R6,DELAY_LOOP
RET
TS:
PUSH ACC ;保护现场
PUSH PSW
PUSH DPH
PUSH DPL
MOV DPTR,#8000H ;AD片选
MOVX A,@DPTR ;读取AD值
MOV B,#5 ;数据转换
DIV AB
MOV B,#2
MUL AB
MOV B,#5
DIV AB
MOV @R0,A ;送入采样数据显示缓冲区
SETB C
CJNE A,70H,NEXT ;判断是否达到报警值
NEXT:
JNC NEXT0 ;是,转到NEXT0
CLR 20H ;清除报警标志位,正常工作
CLR P1.1 ;清除报警,继电器正常
CLR P1.2
LJMP BACK ;返回
NEXT0:
SETB 20H ;报警标志位置1
SETB P1.1 ;继电器断开
SETB P1.2 ;LED亮
LJMP BACK ;返回
T_0:
PUSH ACC ;保护现场
PUSH PSW
PUSH DPH
PUSH DPL
MOV TH0,#0F6H ;重装初值
MOV TL0,#3CH
JB 20H,NEXT1 ;判断报警标志位,是1,转到NEXT1
NEXT2:
DJNZ R7,BACK ;判断是否够1S,不到,返回
MOV R7,#200 ;重置1S计数初值
MOV A,#0 ;启动AD
MOV DPTR,#8000H
MOVX @DPTR,A
BACK: ;中断返回函数
POP DPL ;恢复现场
POP DPH
POP PSW
POP ACC
RETI
NEXT1:
CPL P1.0 ;扬声器驱动
LJMP NEXT2 ;跳转到NFTX2,判断是否到1S
TAB:
DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH