标题:
温度箱的自动设计系统 单片机汇编程序
[打印本页]
作者:
青123456
时间:
2017-5-13 11:20
标题:
温度箱的自动设计系统 单片机汇编程序
仿真.png
(17.63 KB, 下载次数: 73)
下载附件
2017-5-13 11:20 上传
单片机汇编程序:
TEMPER_L EQU 31H ;用于保存读出温度低字节
TEMPER_H EQU 30H ;用于保存读出温度高字节
TEMPER_SET EQU 32H ;用于保存设定的预期温度
FLAG EQU 33H ;是否检测到DS18B20标志位
ORG 0000H
LJMP MAIN
ORG 0030H
MAIN:
MOV R0,#20 ;系统默认预期温度为20℃
START:
CLR P2.6 ;点亮“实时温度”指示灯
SETB P2.5 ;熄灭“设定温度”指示灯
JNB P2.2,SELSUB ;是进入温度设定
LCALL GET_TEMPER ;调用温度获取子程序
LCALL COMPARE ;调用温度比较子程序
LCALL DISPLAY ;调用显示子程序
LCALL KEY ;调用显示切换子程序
LJMP START
SELSUB:
MOV A,R0
MOV B,#10
DIV AB
MOV R1,A ;温度十位存R1
MOV R2,B ;温度个位存R2
LCALL DISPLAY ;显示温度
JNB P2.3,INC0
JNB P2.4,DEC0
JB P2.2,BACK
LJMP SELSUB
INC0: ;温度加1℃
MOV A,R1
CJNE A,#63H,ADD0 ;温度是否为99℃,不是则跳到ADD0
MOV R1,#00H
INC1:
LCALL DELAY1 ;延时显示
JNB P2.3,INC1 ;按键是否松开,松开则程序往下执行
LJMP SELSUB
ADD0:
INC R0
LCALL DELAY1
LJMP SELSUB
DEC0: ;温度减1℃
MOV A,R1
JZ SETR1 ;温度是0℃则跳到SETR1
DEC R0
DEC1:
LCALL DELAY1
JNB P2.4,DEC1 ;按键是否松开,松开则程序往下执行
LJMP SELSUB
SETR1:
MOV R1,#63H
LCALL DELAY1
LJMP SELSUB
BACK:
LJMP START
GET_TEMPER:
SETB P1.2
LCALL SET_1820 ;DS18B20初始化
JB FLAG,TSS2 ;检测到DS18B20跳到TSS2
RET
TSS2:
MOV A,#0CCH ;跳过ROM匹配
LCALL WRITE_1820 ;写DS18B20子程序
MOV A,#44H ;发出温度转换命令
LCALL WRITE_1820
LCALL DISPLAY ;用显示温度来等待AD转换结束
LCALL SET_1820
MOV A,#0CCH ;跳过ROM匹配
LCALL WRITE_1820
MOV A,#0BEH ;发出读温度命令
LCALL WRITE_1820
LCALL READ_1820 ;读DS18B20的温度数据
MOV A,TEMPER_L
MOV R3,#4
L1:
SETB C
RRC A
DJNZ R3,L1
MOV TEMPER_L,A
MOV A,TEMPER_H
MOV R3,#4
L2:
SETB C
RLC A
DJNZ R3,L2
ANL A,TEMPER_L
MOV R7,A ;读出的温度转化问摄氏温度存R7中
MOV B,#10
DIV AB
MOV R1,A ;读出的温度十位存R1
MOV R2,B ;读出的温度个位存R2
RET
SET_1820: ;DS18B20复位初始化子程序
SETB P1.2
NOP
CLR P1.2
MOV R3,#3 ;主机发出延时537微秒的复位低脉冲
TSR1:
MOV R4,#107
DJNZ R4,$
DJNZ R3,TSR1
SETB P1.2 ;然后拉高数据线
NOP
NOP
NOP
MOV R4,#25H
TSR2:
JNB P1.2,TSR3 ;等待DS18B20回应
DJNZ R4,TSR2
LJMP TSR4 ;延时
TSR3:
SETB FLAG ;置标志位,表示DS18B20存在
LJMP TSR5
TSR4:
CLR FLAG ;清标志位,表示DS18B20不存在
LJMP TSR7
TSR5:
MOV R4,#117
TSR6:
DJNZ R4,TSR6 ;时序要求延时一段时间
TSR7:
SETB P1.2
RET
WRITE_1820:
MOV R3,#8 ;一共8位数据
CLR C
WR1:
CLR P1.2
MOV R4,#6
DJNZ R4,$
RRC A
MOV P1.2,C
MOV R4,#23
DJNZ R4,$
SETB P1.2
NOP
DJNZ R3,WR1
SETB P1.2
RET
READ_1820: ;将温度高位和地位从DS18B20中读出
MOV R4,#8
RE01:
CLR C
SETB P1.2
NOP
NOP
CLR P1.2
NOP
NOP
NOP
SETB P1.2
MOV R6,#4
DJNZ R6,$
MOV C,P1.2
RRC A
MOV R6,#30
DJNZ R6,$
DJNZ R4,RE01
MOV TEMPER_L,A ;地位存入31H
MOV R4,#8
RE02:
CLR C
SETB P1.2
NOP
NOP
CLR P1.2
NOP
NOP
NOP
SETB P1.2
MOV R6,#4
DJNZ R6,$
MOV C,P1.2
RRC A
MOV R6,#30
DJNZ R6,$
DJNZ R4,RE02
MOV TEMPER_H,A ;高位存入32H
RET
COMPARE: ;比较温度子程序
MOV TEMPER_SET,R0
MOV A,R7
CJNE A,TEMPER_SET,COMP ;设定温度与实时温度不等则跳COMP
SETB P1.0 ;关加热器
SETB P1.1 ;关制冷器
RET
COMP:
MOV A,R7 ;实时温度存入A
MOV B,R0 ;设定温度存入B
DIV AB ;A除以B,商给A
CJNE A,#0H,COMP1 ;若A不等于0,即实时温度高,跳转
SETB P1.1 ;关制冷器
CLR P1.0 ;开加热器
LJMP EXIT
COMP1:
SETB P1.0 ;关加热器
CLR P1.1 ;开制冷器
EXIT:
RET
DISPLAY: ;显示子程序
MOV DPTR,#DAT
MOV A,R1
MOVC A,@A+DPTR
CLR P2.0
SETB P2.1
MOV P0,A ;动态扫描,显示十位
LCALL DELAY ;延时约12毫秒
MOV A,R2
MOVC A,@A+DPTR
SETB P2.0
CLR P2.1
MOV P0,A ;动态扫描,显示个位
LCALL DELAY
SETB P2.0
SETB P2.1 ;关显示
RET
DAT:
DB3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,00H
;“0”,“1”,“2”,“3”,“4”,“5”,“6”,“7”,“8”,“9”,“灭”
DELAY1: ;延时子程序,延时并显示
MOV 36H,#08H
LOOP0:
LCALL DISPLAY
DJNZ 36H,LOOP0
RET
DELAY: ;延时子程序,延时约12ms
MOV 34H,#24H
LOOP:
MOV 35H,#0AFH
LOOP1:
DJNZ 35H,LOOP1
DJNZ 34H,LOOP
RET
KEY: ;显示切换子程序
JNB P2.7,KEY1
RET
KEY1:
LCALL DELAY ;延时去抖动
JNB P2.7,KEY2
RET
KEY2:
LCALL INT
RET
INT:
MOV A,R0 ;显示设定温度
MOV B,#10
DIV AB
MOV R1,A
MOV R2,B
MOV R6,#50
LCALL DELAY1
DJNZ R6,$
RET
END
复制代码
作者:
青123456
时间:
2017-5-13 11:45
汇编程序
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1