⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sht10.asm

📁 一个温湿度控制的全部源程序
💻 ASM
📖 第 1 页 / 共 4 页
字号:
		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 + -