📄 sht10.asm
字号:
call de10ms
jb keyadd,scan2
mov a,#02h ;ADD=2
jmp key_scan_end
scan2: jb keysubb,scan3
call de10ms
jb keysubb,scan3
mov a,#03h
jmp key_scan_end ;SUBB=3
scan3: jb keyzhao,key_scan_end
call de10ms
jb keyzhao,key_scan_end
mov a,#04 ;ZHAO=4
key_scan_end: call dog
ret
;################## 1秒中断 ##########################
;##################主要设置1秒的标志位 yimiao_f###########
time0: push psw
push acc
push dph
push dpl
mov th0,#4ch ;50ms
mov tl0,#3fh
djnz cnt_1s,time0_end ;定时1秒
jnb xunxian_f,time0_0
cpl first_f ;使second_f标志位2秒反转1次
jb first_f,time0_0
cpl second_f
;**************************************************
;设置8次标志位(开机读数用) ,SHT10不用
time0_0: djnz cnt_8ci,time0_1
setb baci_f
mov cnt_8ci,#1
jmp time0_2
time0_1: clr baci_f
;**************************************************
time0_2: setb yimiao_f
time0_3: inc cnt_keyno ;键盘2分钟退出标志位
mov a,cnt_keyno
cjne a,#120,time0_4
time0_4: jc time0_end
setb keyno_f ;超过2分钟键盘程序退出
time0_end: pop dpl
pop dph
pop acc
pop psw
reti
;**********************************
; ***** 温度处理函数 *******
;**********************************
;温度测量(温度采样)
;-------------------------------------------------------
;8次求平均
;-------------------------------------------------------
; 数字滤波
;此为滑动滤波算法
;作用:先右移2字节,再求和,然后/8
;入口:zan1、zan2要移入的数据。r0:要滤波的地址入口
;出口:zan1,zan2
;--------------------------------------------------------
;
;**********************************
lvbo: mov zan8,r0 ;暂存入口地址
mov r2,#14 ;移16次(先移后14个数(7个双字节数))
clr c
mov a,r0
add a,#15 ;修改数据指针
mov r0,a
lv_0: dec r0
dec r0
mov a,@r0
inc r0
inc r0
mov @r0,a
dec r0
djnz r2,lv_0 ;16位,即8个双字节数移完
mov @r0,zan2
dec r0
mov @r0,zan1
lv_1: mov r0,zan8 ;恢复r0的值(lvdata1_0=0bah)
mov zan6,#00h ;刚开始想加时,初始化暂存器
mov zan7,#00h
mov zan8,#00h
inc r0
;inc r0
;inc r0
mov r2,#8
lv_2: clr c ;8个双字节数相加
mov a,@r0
add a,zan8
mov zan8,a
dec r0
mov a,@r0
addc a,zan7
mov zan7,a
jnc lv_3
inc zan6
lv_3: inc r0
inc r0
inc r0
djnz r2,lv_2
mov r3,zan6 ;和/8
mov r4,zan7
mov r5,zan8
mov r7,#8
call dv30
mov zan1,r4
mov zan2,r5
lv_end: ret
;232串口通讯,入口参数:R0(数据地址),R2(字节数)
rs232: clr ti
mov sbuf,@r0
jnb ti,$
clr ti
inc r0
djnz r2,rs232
ret
;**********************************
zhuangtai: orl p0,#00111111b ;读口之前先写1
nop
nop
nop
nop
nop
nop
mov c,p0.3 ;实验位置
mov acc.0,c
mov c,p0.2 ;工作位置
mov acc.1,c
mov c,p0.5 ;断路器合
mov acc.2,c
mov c,p0.4 ;断路器分
mov acc.3,c
mov c,p0.0 ;储能
mov acc.4,c
mov c,p0.1 ;接地
mov acc.5,c
cpl a
anl a,#00111111b
mov zhuangtai_485,a
ret
;**********************************
;控制继电器函数
;**********************************
;----------------------------------------
; 显示子程序
;----------------------------------------
disp: call cha_disp ;查显示码的对应数据
mov r0,#zan1
mov r2,#8
disp1:
mov a,@r0
call tec6122
inc r0
djnz r2,disp1
nop
nop
nop
setb lcp_6122
nop
nop
nop
clr lcp_6122
ret
;查表后的显示码放入相应的ZAN_d1~ZAN_d16中
cha_disp: ;mov a,#11111100b ;指示灯的显示
;anl a,20h
;mov s21,a
mov dptr,#disp_tab
mov r0,#s11
mov r1,#zan1
mov r2,#8
cha1: mov a,@r0
movc a,@a+dptr
mov @r1,a
inc r0
inc r1
djnz r2,cha1
;mov a,20h ;显示指示灯
;clr c
;mov r1,#zan1
;mov r2,#8
;cha1_0: rrc a
;jnc cha1_1
;inc @r1
;cha1_1: inc r1
; djnz r2,cha1_0
jnb dian13,cha1_2 ;点亮2个小数点
inc zan3
cha1_2: jnb dian23,cha1_2_0
inc zan7
cha1_2_0: clr a ;显示指示灯
jnb led_a,cha1_3
orl a,#10000000b
cha1_3: jnb led_b,cha1_4
orl a,#01000000b
cha1_4: jnb led_jiare_a,cha1_5
orl a,#00100000b
cha1_5: jnb led_jiare_b,cha1_6
orl a,#00010000b
cha1_6: jnb led_shoudong,cha1_7
orl a,#00001000b
cha1_7: jnb led_paifeng,cha1_8
orl a,#00000100b
cha1_8: mov zan5,a
cha_end: ret
;入口为A,占用R1,
tec6122: clr lcp_6122
clr c
mov r1,#8
tec_1: clr scp_6122
rrc a
mov si_6122,c
nop
nop
nop
setb scp_6122
nop
nop
nop
djnz r1,tec_1
ret
disp_tab:
db 0FCH,060H,0DAH,0F2H,066H,0B6H,0BEH,0E0H,0FEH,0F6H
;显示 0 1 2 3 4 5 6 7 8 9
db 0eeh,3eh,1ah,7ah,9eh,02h;8eh
;显示 A b c d E -
db 00H,0ffh,02h,1eh,6eh,1ch,62h,0ech;2ah
;显示 消隐 全亮 — t H L -1 n
db 3ah,0ceh,10h,70h,60h,0ah,38h,0fdh
; o P _ J i r u 0.
db 76h
; y
;*****************************************
;****************************************
;485通讯
;****************************************
message:
push psw
push acc
push zan1
push zan2
push zan3
push zan4
setb rs1 ;用02组工作积存器
setb rs0
call dog
clr ea
;clr ri ;这句害人不浅
call r_byte
cjne a,no_485,ms_end
call crc_16
clr sm2 ;可以接受所有数据
call r_byte
cjne a,#04h,ms_end ;不=04,退出
call crc
mov r7,#4h
ms1: call r_byte
call crc
djnz r7,ms1
call r_byte
mov zan1,a ;crc16校验低位
call r_byte
mov zan2,a ;crc16校验高位
mov a,zan3
cjne a,zan1,ms_end
mov a,zan4
cjne a,zan2,ms_end
call read2
ms_end: clr ti
clr ri
setb sm2 ;恢复只读机号
setb es
clr de_184
setb ea
pop zan4
pop zan3
pop zan2
pop zan1
pop acc
pop psw
reti
;发送数据
read2: clr sm2
setb de_184 ;DE/RE脚置高
clr ti
mov a,no_485
mov sbuf,a
call crc_16
jnb ti,$
clr ti
mov sbuf,#04h
mov a,#04h
call crc
jnb ti,$
clr ti
mov sbuf,#09h ;9个字节
mov a,#09h
call crc
jnb ti,$
clr ti
mov r7,#09h
mov r0,#t1h_485
r_0: mov sbuf,@r0
mov a,@r0
call crc
jnb ti,$
clr ti
inc r0
djnz r7,r_0
mov sbuf,zan3 ;校验码送出
jnb ti,$
clr ti
mov sbuf,zan4
jnb ti,$
ret
r_byte: mov r2,#200
rb_1: mov r1,#200
rb_2: jb ri,rb_3
mov b,#00h
mov b,#00h
mov b,#00h
djnz r1,rb_2
djnz r2,rb_1
mov a,#88h ;当A=88H时,为接收错误
call dog
jmp byte_end
rb_3: clr ri
mov a,sbuf
byte_end: ret
;-------------------------------------
;入口:a(待校验的8位数)zan4(高),zan3
;没用r0,r1指针
;出口: zan4(高)zan3
;-------------------------------------
crc_16:
mov zan3,#0ffh
mov zan4,#0ffh
crc: xrl a,zan3
mov zan3,a
mov r6,#08h
crc1: clr c ;低8位与数异或,16位向右移动
mov a,zan4 ;第一位添0,移出的一位判断0,1
rrc a ;是一异或0a001h
mov zan4,a
mov a,zan3
rrc a
mov zan3,a
jnc crc2
xrl zan4,#0a0h
xrl zan3,#01h
crc2: djnz r6,crc1
ret
;-----------------------------------
;看门狗
dog: mov wdt_con,#00111100b
ret
;*****************************************
de10us: mov count_10us,#40 ;STC单片机的10us
;mov count_10us,#5
djnz count_10us,$
ret
de10ms: ;mov r6,#20
mov r6,#100
de1: mov r7,#248
djnz r7,$
djnz r6,de1
call dog
ret
de100ms: mov r5,#10 ;STC单片机的10ms
de2: call de10ms
djnz r5,de2
ret
de1s: mov b,#100
de1s_1: call de10ms
djnz b,de1s_1
ret
;************ 数学函数 **************
;***************************************
nadd: clr c
mov a,r5 ;r2r3+r4r5-->r6r7
add a,r3
mov r7,a
mov a,r4
addc a,r2
mov r6,a
ret
;
nsubb: clr c
mov a,r5 ;r4r5-r6r7-->r2r3
subb a,r7
mov r3,a
mov a,r4
subb a,r6
mov r2,a
ret
;************ 三字节/一字节的除法子函数 **************
;*******************************************************
;入口条件:被除数在R3、R4、R5(由高到低)中,除数在R7中。
;出口信息:双字节商在R4、R5中,
dv31: clr c
mov a,r3
subb a,r7
jc dv30
setb ov
ret
dv30: mov r2,#10h ;求R3R4R5/R7==R4R5
dm23: clr c
mov a,r5
rlc a
mov r5,a
mov a,r4
rlc a
mov r4,a
mov a,r3
rlc a
mov r3,a
mov f0,c
clr c
subb a,r7
anl c,/f0
jc dm24
mov r3,a
inc r5
dm24: djnz r2,dm23
mov a,r3 ;四舍五入
add a,r3
jc dm25
subb a,r7
jc dm26
dm25: inc r5
mov a,r5
jnz dm26
inc r4
dm26: ret ;商在R4R5中
;**********************************************
;********* 双字节乘法子程序 **************
;r2r3*r6r7==r2r3r4r5
;入口条件:被乘数在R2(高)、R3(低)中,乘数在R6、R7中
;出口信息:乘积在R2、R3、R4、R5中
muld:
mov a,r3 ;计算r3乘r7
mov b,r7
mul ab
mov r4,b ;暂存部分积
mov r5,a
mov a,r3 ;计算r3乘r6
mov b,r6
mul ab
add a,r4 ;累加部分积
mov r4,a
clr a
addc a,b
mov r3,a
mov a,r2 ;计算r2乘r7
mov b,r7
mul ab
add a,r4 ;累加部分积
mov r4,a
mov a,r3
addc a,b
mov r3,a
clr a
rlc a
xch a,r2 ;计算r2乘r6
mov b,r6
mul ab
add a,r3 ;累加部分积
mov r3,a
mov a,r2
addc a,b
mov r2,a; ;r2,r3,r4,r5乘积出口,由高到低
ret
;*********************************************************
;(7) 标号: divd 功能:双字节二进制无符号数除法
;入口条件:被除数在R2、R3、R4、R5中,除数在R6、R7中。
;出口信息:OV=0 时,双字节商在R2、R3中,OV=1 时溢出。
;影响资源:PSW、A、B、R1~R7 堆栈需求:2字节
;r2r3r4r5/r6r7=r2r3
divd: clr c ;比较被除数和除数
mov a,r3
subb a,r7
mov a,r2
subb a,r6
jc dvd1
setb ov ;溢出
ret
dvd1: mov b,#10h ;计算双字节商
dvd2: clr c ;部分商和余数同时左移一位
mov a,r5
rlc a
mov r5,a
mov a,r4
rlc a
mov r4,a
mov a,r3
rlc a
mov r3,a
xch a,r2
rlc a
xch a,r2
mov f0,c ;保存溢出位
clr c
subb a,r7 ;计算(R2R3-R6R7)
mov r1,a
mov a,r2
subb a,r6
anl c,/f0 ;结果判断
jc dvd3
mov r2,a ;够减,存放新的余数
mov a,r1
mov r3,a
inc r5 ;商的低位置一
dvd3: djnz b,dvd2 ;计算完十六位商(R4R5)
mov a,r4 ;将商移到R2R3中
mov r2,a
mov a,r5
mov r3,a
clr ov ;设立成功标志
ret
mov r4,#0
mov r5,#0
mov r2,#0
jmp divd
;*************************************************
;************* bcd码转换子程序 *****************
;入口在R1,R2,R3中
;出口在R1,R2,R3,R4,R5,R6中
;*************************************************
bcd: clr a
mov r4,a
mov r5,a
mov r6,a
mov r7,#18h
bcd1: clr c
mov a,r3
rlc a
mov r3,a
mov a,r2
rlc a
mov r2,a
mov a,r1
rlc a
mov r1,a
mov a,r6
addc a,r6
da a
mov r6,a
mov a,r5
addc a,r5
da a
mov r5,a
mov a,r4
addc a,r4
da a
mov r4,a
djnz r7,bcd1
mov a,r4
anl a,#0f0h
swap a
mov r1,a
mov a,r4
anl a,#0fh
mov r2,a
mov a,r5
anl a,#0f0h
swap a
mov r3,a
mov a,r5
anl a,#0fh
mov r4,a
mov a,r6
anl a,#0f0h
swap a
mov r5,a
mov a,r6
anl a,#0fh
mov r6,a
ret
;串口输出
;mov r0,#zan1
;mov r2,#2
;call rs232
;*****************************************
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -