51单片机用什么采样温度
来源:学生作业帮助网 编辑:六六作业网 时间:2024/09/09 04:02:08
51单片机用什么采样温度
51单片机用什么采样温度
51单片机用什么采样温度
;蜂鸣器和继电器分别使用9013和8550驱动
;继电器引脚需加驱动电阻
;DS18B20测量温度
KEY_UP BIT P1.0 ;上限/加
KEY_DN BIT P1.1 ;下限/减
KEY_ENT BIT P1.2 ;确认,
DISPH EQU P0 ;高位
DISPL EQU P2 ;低位显示
SPKER BIT P1.3 ;报警
HOTTER BIT P3.2 ;加热
DQ BIT P3.1 ;信号线
MAX EQU 30H
MAX_T EQU 35 ;上限
MIN EQU 31H
MIN_T EQU 25 ;下限
UP_C EQU 33H
DN_C EQU 34H
ENT_C EQU 35H
COUNT EQU 20 ;检测按键按下的次数
TEMP_CUR EQU 37H ;当前温度
RESULT_L EQU 39H
RESULT_H EQU 3AH ;原始温度
FLAG_UP BIT 20H.3 ;上/+按下
FLAG_DN BIT 20H.4 ;下/-按下
FLAG_MAX BIT 20H.0
FLAG_MIN BIT 20H.1 ;选择
FLAG_FLASH BIT 20H.2 ;闪烁
FLAG_ENT BIT 20H.5 ;确认
FLAG_EXIST BIT F0 ;DS18B20存在的标志位
ORG 0000H
AJMP MAIN
ORG 0003H
RETI
ORG 000BH
AJMP KEY_FLASH
ORG 0013H
RETI
ORG 001BH
RETI
ORG 0023H
RETI
ORG 002BH
RETI
ORG 0100H
MAIN:
CLR SPKER
MOV R0,#20H
MOV R1,#20H
WT:MOV @R0,#0
INC R0
DJNZ R1,WT
MOV MAX,#MAX_T
MOV MIN,#MIN_T
MOV UP_C,#COUNT
MOV DN_C,#COUNT
MOV ENT_C,#COUNT
MOV TMOD,#01H
MOV TH0,#3CH
MOV TL0,#0B0H
MOV IE,#82H
SETB TR0 ;T0
WT1:ACALL DS18B20 ;测量温度
ACALL KEY ;检查按键
JB FLAG_MAX,ST1 ;处于调整状态
JB FLAG_MIN,ST1
MOV A,TEMP_CUR
ACALL DISP ;正常显示温度
NOP
NOP
NOP
ST1:MOV A,TEMP_CUR
CJNE A,MIN,YT1 ;不等于下限(CJNE指令会影响Cy的状态,当AMIN,Cy=1)
CLR SPKER
AJMP WT1 ;等于下线跳转至XT1
YT1:JC XT2 ;小于下限开加热和报警
AJMP XT1 ;大于下限跳转至XT1
XT2:CLR HOTTER
SETB SPKER
AJMP WT1 ;
XT1:MOV A,TEMP_CUR
CJNE A,MAX,IR ;不等于上限
CLR SPKER ;等于上限关闭报警,加热维持原状态
AJMP WT1
IR:JC IR1
SETB SPKER ;高于上限报警,关加热
SETB HOTTER
IR1:AJMP WT1 ;小于上限维持原状态
;定时器0中断中检查按键和控制闪烁显示
KEY_FLASH:PUSH ACC
MOV TH0,#3CH
MOV TL0,#0B0H
CPL FLAG_FLASH
JNB KEY_UP,K1
JNB KEY_DN,K2
JNB KEY_ENT,K3
AJMP EXT
K1:DJNZ UP_C,EXT ;上限
MOV UP_C,#COUNT
SETB FLAG_UP
AJMP EXT
K2:DJNZ DN_C,EXT ;下限
MOV DN_C,#COUNT
SETB FLAG_DN
AJMP EXT
K3:DJNZ ENT_C,EXT ;确认
MOV ENT_C,#COUNT
SETB FLAG_ENT
EXT:JB FLAG_MAX,KS1 ;调整上限
JB FLAG_MIN,KS2 ;调整下限
POP ACC
RETI
KS1:JB FLAG_FLASH,KA1 ;亮/灭标志,为0灭,为1亮
AB1:MOV DISPH,#0FFH
MOV DISPL,#0FFH
POP ACC
RETI
KA1:MOV A,MAX ;闪烁显示上限
ACALL DISP
POP ACC
RETI
KS2:JB FLAG_FLASH,KA2
AJMP AB1
KA2:MOV A,MIN ;闪烁显示下限
ACALL DISP
POP ACC
RETI
;处理按键
KEY:PUSH ACC
JB FLAG_UP,CK1 ;上限/加
JB FLAG_DN,CK2 ;下限/减
JB FLAG_ENT,CK3 ;确认
POP ACC
RET
CK1:CLR FLAG_UP
JB FLAG_MAX,DK1 ;调整上限
JB FLAG_MIN,DK2 ;调整下限
SETB FLAG_MAX ;都不是则选择调整上限
CLR FLAG_MIN
POP ACC
RET
DK1:CLR FLAG_MIN
INC MAX ;上限加1
POP ACC
RET
DK2:CLR FLAG_MAX
INC MIN ;下限加1
POP ACC
RET
CK2:CLR FLAG_DN
JB FLAG_MAX,EK1
JB FLAG_MIN,EK2
SETB FLAG_MIN
CLR FLAG_MAX
POP ACC
RET
EK1:CLR FLAG_MIN
DEC MAX ;上限减1
POP ACC
RET
EK2:CLR FLAG_MAX
DEC MIN ;下限减1
POP ACC
RET
CK3:CLR FLAG_ENT
MOV 20H,#0
MOV 21H,#0 ;确认则退出调整状态
MOV A,TEMP_CUR
ACALL DISP
POP ACC
RET
;显示
DISP:PUSH ACC
MOV B,#10
DIV AB
MOV DPTR,#TAB
MOVC A,@A+dPTR
MOV DISPH,A
XCH A,B
MOVC A,@A+DPTR
MOV DISPL,A
POP ACC
RET
;DS18B20测量温度
DS18B20:CLR EA
PUSH ACC
ACALL INIT_18B20 ;初始化18B20
JNB FLAG_EXIST,ALM ;没有检测到则报警
MOV A,#0CCH
ACALL WRITE_18B20; ;跳过ROM
MOV A,#44H
ACALL WRITE_18B20; 启动温度转换
ACALL INIT_18B20
JNB FLAG_EXIST,ALM
MOV A,#0CCH
ACALL WRITE_18B20;
MOV A,#0BEH
ACALL WRITE_18B20;
ACALL READ_18B20; ;读温度
POP ACC
SETB EA
RET
ALM:SETB SPKER
AJMP $
;复位
INIT_18B20:SETB DQ
CLR DQ
MOV R7,#250
DJNZ R7,$
SETB DQ
MOV R7,#30
DJNZ R7,$
MOV R7,#60
RA:JNB DQ,EU
DJNZ R7,RA
CLR FLAG_EXIST ;失败
RET
EU:JNB DQ,$
SETB FLAG_EXIST ;成功
RET
;写操作
WRITE_18B20:MOV R6,#8
RB:SETB DQ
CLR DQ
MOV R7,#10
DJNZ R7,$
RRC A
MOV DQ,C
MOV R7,#30
DJNZ R7,$
SETB DQ
NOP
DJNZ R6,RB
RET
;读操作
READ_18B20:MOV R5,#2
MOV R0,#RESULT_L
RC:MOV R6,#8
RE:SETB DQ
CLR DQ
NOP
NOP
NOP
SETB DQ
MOV R7,#10
DJNZ R7,$
NOP
MOV C,DQ
RRC A
MOV R7,#30
DJNZ R7,$
SETB DQ
NOP
DJNZ R6,RE
MOV @R0,A
INC R0
DJNZ R5,RC
NOP
MOV A,RESULT_L
ANL A,#0F0H
ADD A,RESULT_H
SWAP A
MOV TEMP_CUR,A ;保存采集到的温度
RET
TAB:DB 81H,0E7H,92H,0C2H,0E4H,0C8H,88H,0E3H,80H,0C0H
END