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

📄 +-

📁 51最小系统版实验程序
💻
字号:
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 + -