📄 +-
字号:
DUAN_ADDR equ p0
LIGHT_ADDR equ p1
WEI_ADDR equ p2
KEY_ADDR equ p3
SPEAKER bit p2.0
dat bit p3.7
duan equ 30h //30h~33h为led显示段码
tem1 equ 34h
tem2 equ 35h //温度值,未处理
temset1 equ 36h //设置值上限
temset2 equ 37h //设置值下限
keybuff equ 38h //键值缓冲
tembuff equ 39h //温度值,已处理
pbuff equ 3ah //用于设定鸣叫频率
vewsign equ 3bh //温度显示和设置值显示切换标志,vewsign=0,1,2为温度值、设置值上限、设置值下限显示
ledsign bit p1.0 //light0亮代表警报功能启动
speaksign bit 20h.1 //警报启动标志,speaksign=1为启动
istem1 bit 20h.0 //istem1=1代表此时设置的是设置值上限,否则为下限
ledtem1 bit p1.6
ledtem2 bit p1.7 //light6、7亮分别代表设置上限或下限
NOKEY equ 0x00
KEY1 equ 0x01
KEY2 equ 0x02
KEY3 equ 0x03
KEY4 equ 0x04 //键值
org 0000h
ajmp main
org 0030h
main:mov temset1,#35
mov temset2,#20
mov pbuff,#0
mov vewsign,#0
clr speaksign
setb ledsign
setb ledtem1
setb ledtem2
clr SPEAKER
mn1:acall ledforset
acall gettem
acall keyprocess
mov r0,#vewsign
cjne @r0,#0,mn2
acall duan_tem
mov a,#2
ajmp mn3
mn2:acall duan_set
mov a,#4
mn3:acall led
acall alarm
mov r0,#pbuff
cjne @r0,#0ah,mn4
mov @r0,#00h
ajmp mn5
mn4:inc @r0
mn5:ajmp mn1
duan_set:mov r0,#temset1 //设置值段码处理程序
mov r1,#duan
mov a,@r0
mov b,#10
div ab
mov dptr,#DUAN_CODE
movc a,@a+dptr
mov @r1,a
inc r1
mov a,b
movc a,@a+dptr
mov @r1,a
inc r1
inc r0
mov a,@r0
mov b,#10
div ab
movc a,@a+dptr
mov @r1,a
inc r1
mov a,b
movc a,@a+dptr
mov @r1,a
mov a,31h //加入小数点,以区别上限值和下限值,此行及以下程序段可去掉
subb a,#80h
mov 31h,a
ret
duan_tem:mov r0,#tem1 //温度值段码处理程序
mov r1,#duan
mov a,@r0
anl a,#07h
mov r2,#4
dt1:rl a
djnz r2,dt1
mov r2,a
inc r0
mov a,@r0
anl a,#0f0h
mov r3,#4
dt2:rr a
djnz r3,dt2
orl a,r2
mov tembuff,a
mov b,#10
div ab
mov dptr,#DUAN_CODE
movc a,@a+dptr
mov @r1,a
inc r1
mov a,b
movc a,@a+dptr
mov @r1,a
ret
led:mov r0,#duan //数码管显示程序,由a传入显示的数码管位数
mov r1,#0
mov r2,a
mov dptr,#WEI_CODE
ld1:mov a,#4
movc a,@a+dptr
mov c,SPEAKER
mov acc.0,c
mov WEI_ADDR,a
mov DUAN_ADDR,@r0
mov a,r1
movc a,@a+dptr
mov c,SPEAKER
mov acc.0,c
mov WEI_ADDR,a
acall delay5ms
inc r0
inc r1
djnz r2,ld1
ret
delay5ms:mov r7,#200 //5ms延时
delay5ms00:mov r6,#11
delay5ms01:djnz r6,delay5ms01
djnz r7,delay5ms00
ret
delay10ms:mov r7,#200 //10ms延时
delay10ms00:mov r6,#24
delay10ms01:djnz r6,delay10ms01
djnz r7,delay10ms00
ret
getkey:nop //读键,返回时键值由a传递
mov a,KEY_ADDR
anl a,#0x3c
cjne a,#0x38,getkey00
mov a,#KEY1
ajmp getkeyend
getkey00:cjne a,#0x34,getkey01
mov a,#KEY2
ajmp getkeyend
getkey01:cjne a,#0x2c,getkey02
mov a,#KEY3
ajmp getkeyend
getkey02:cjne a,#0x1c,getkey03
mov a,#KEY4
ajmp getkeyend
getkey03:mov a,#NOKEY
getkeyend:ret
//按键处理程序
//key1用于启动或关闭报警功能
//key2用于切换温度显示、警戒值上限设置和显示、警戒值下限设置和显示三种状态
//key3/4用于修改警戒值,KEY3增加,KEY4减少
//KEY3/4修改警戒值时,会进行一系列的判断
//如判断是对上限值还是下限值修改,同时保证上限大于或等于下限,下限小于或等于上限
keyprocess:acall getkey
mov keybuff,a
cjne a,#NOKEY,kp1
ajmp kpend
kp1:acall delay10ms
cjne a,keybuff,kpend
acall keyup
mov a,keybuff
mov r1,#vewsign
cjne a,#KEY2,kp4
cjne @r1,#2,kp2
mov @r1,#0
ajmp kpend
kp2:jc kp3
mov @r1,#0
ajmp kpend
kp3:inc @r1
ajmp kpend
kp4:cjne a,#KEY1,kp5
cpl speaksign
cpl ledsign
ajmp kpend
kp5:cjne @r1,#1,kp6
mov r0,#temset1
setb istem1
ajmp kp8
kp6:jnc kp7
ajmp kpend
kp7:mov r0,#temset2
clr istem1
kp8:cjne a,#KEY3,kp13
jb istem1,kp10
mov a,@r0
cjne a,temset1,kp9
ajmp kpend
kp9:jc kp12
mov a,temset1
mov @r0,a
ajmp kpend
kp10:cjne @r0,#99,kp11
ajmp kpend
kp11:jc kp12
mov @r0,#99
ajmp kpend
kp12:inc @r0
ajmp kpend
kp13:cjne a,#KEY4,kpend
jnb istem1,kp15
mov a,@r0
cjne a,temset2,kp14
ajmp kpend
kp14:jnc kp17
mov a,temset2
mov @r0,a
ajmp kpend
kp15:cjne @r0,#0,kp16
ajmp kpend
kp16:jnc kp17
mov @r0,#0
ajmp kpend
kp17:dec @r0
kpend:ret
keyup:mov a,KEY_ADDR //判断按键松开
anl a,#0x3c
cjne a,#0x3c,keyup
ret
alarm:mov a,tembuff //对当前温度进行上限和下限的比较,判断是否报警
cjne a,temset1,am1
ajmp amdont
am1:jnc amdo
cjne a,temset2,am2
ajmp amdont
am2:jc amdo
ajmp amdont
amdo:jnb speaksign,amdont
mov a,pbuff
cjne a,#00h,amend
cpl SPEAKER
ajmp amend
amdont:clr SPEAKER
amend:ret
temit:clr ea //DS18B20初始化
tt1:setb dat
mov r2,#200
tt2:clr dat
djnz r2,tt2
setb dat
mov r2,#30
tt3:djnz r2,tt3
clr c
orl c,dat
jc tt1
mov r6,#80
tt4:orl c,dat
jc tt5
djnz r6,tt4
ajmp tt1
tt5:mov r2,#240
tt6:djnz r2,tt6
ret
write:clr ea //DS18B20写操作
mov r3,#8
wt1:setb dat
mov r4,#8
rrc a
clr dat
wt2:djnz r4,wt2
mov dat,c
mov r4,#20
wt3:djnz r4,wt3
djnz r3,wt1
setb dat
ret
read:clr ea //DS18B20读操作
mov r6,#8
rd1:clr dat
mov r4,#4
nop
setb dat
rd2:djnz r4,rd2
mov c,dat
rrc a
mov r5,#30
rd3:djnz r5,rd3
djnz r6,rd1
setb dat
ret
gettem:acall temit //DS18B20采集一次温度
mov a,#0cch
acall write
mov a,#44h
acall write
acall temit
mov a,#0cch
acall write
mov a,#0beh
acall write
acall read
mov tem2,a
acall read
mov tem1,a
ret
ledforset:mov a,vewsign //改变light6、7的亮灭,用于显示操作在什么状态。
cjne a,#1,lf1 //如light6亮、7灭就代表此时正在设置警戒值上限
clr ledtem1
setb ledtem2
ajmp lfend
lf1:jnc lf2
setb ledtem1
setb ledtem2
ajmp lfend
lf2:clr ledtem2
setb ledtem1
lfend:ret
WEI_CODE:db 0X70,0XB0,0XD0,0XE0,0XF0 //位码表,最后一个为全灭
DUAN_CODE:db 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8
db 0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xff //段码表,0~f和无字符
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -