📄 温度计.txt
字号:
;*************************************************
;单片机内存分配申明!
;*************************************************
TEMPER_L EQU 40H ;用于保存读出温度的低8位
TEMPER_H EQU 41H ;用于保存读出温度的高8位
TMROMVH EQU 42H ;报警上限
TMROMVL EQU 43H ;报警下限
FLAG1 EQU 38H ;是否检测到DS18B20标志位
TEMPL EQU 30H ;用于保存读出温度的低8位
TEMPH EQU 31H ;用于保存读出温度的高8位
TEMPHC EQU 32H ;温度转换寄存器低8位
TEMPLC EQU 33H ;温度转换寄存器高8位
BUF1 EQU 34H ;显示缓冲寄存器小数位
BUF2 EQU 35H ;显示缓冲寄存器个数位
BUF3 EQU 36H ;显示缓冲寄存器十数位
BUF4 EQU 37H ;显示缓冲寄存器百数位
T10MS EQU 29H ;
TMSETVL EQU 28H ;温度下限设定值
TMSETVH EQU 27H ;温度上限设定值
DISL_VL EQU 26H ;报警下限个位数存放内存位置
DISL_VH EQU 25H ;报警下限十位数存放内存位置
DISH_VL EQU 24H ;报警上限个位数存放内存位置
DISH_VH EQU 23H ;报警上限十位数存放内存位置
BT_VL EQU 22H ;比较当前显示数据与设定数据寄存器
;**********************************************
SING BIT P2.3 ;蜂鸣
TEMPDIN BIT P2.4 ;数据脚定义
K6 BIT P2.5 ;按键输入
K5 BIT P2.6 ;
K4 BIT P2.7 ;
K3 BIT P1.0 ;
K2 BIT P1.1 ;
;**********************************************
; BIT FLAG DEFINATION
;**********************************************
TEMPCONV EQU 00H ;
TIME1SOK EQU 01H ;
TEMPONEOK EQU 02H ;
;**********************************************
ORG 0000H ;主程序入口地址
AJMP MAIN ;转主程序
ORG 0003H ;外中断0中断入口
DB 00H,00H,00H,00H,00H,00H,00H;
RETI ;跳至INTEX0执行中断服务程序
ORG 000BH ;定时器T0中断入口地址
AJMP TIMER0 ;
RETI ;跳至定时器T0执行中断服务程序
ORG 0013H ;外中断1中断入口
DB 00H,00H,00H,00H,00H,00H,00H ;
RETI ;跳至INTEX1执行中断服务程序
ORG 001BH ;定时器T1中断入口地址
DB 00H,00H,00H,00H,00H,00H,00H ;
RETI ;中断返回(不开中断)
ORG 0023H ;串行口中断入口地址
DB 00H,00H,00H,00H,00H,00H,00H ;
RETI ;中断返回(不开中断)
;**********************************************
ORG 100H ;
MAIN:
MOV SP, #60H ;
MOV P1, #0FFH ;
MOV TMOD,#01H ;
MOV TH0, #0B1H ;SET T0 VALUE 10MS
MOV TL0, #0E0H ;
MOV DISL_VL,#00H ;
MOV DISL_VH,#00H ;
MOV DISH_VL,#00H ;
MOV DISH_VH,#00H ;
MOV TMSETVL,#30H ;
MOV TMSETVH,#35H ;
CLR EA ;打开CPU总中断请求
CLR TR0 ;
CLR ET0 ;
MOV PSW, #00H ;
CLR TEMPCONV ;
CLR TEMPONEOK ;
;**************************************
LPTEMP: LCALL INIT_1820 ;先复位DS18B20
MOV A,#0CCH ;跳过ROM匹配
LCALL WRITE_1820 ;
MOV A,#0B8H ;发出读温度命令
LCALL WRITE_1820 ;
LCALL GET_TM ;调用读温度子程序
LCALL CONVTEMP ;温度BCD码计算处理子程序
LCALL DISPBCD ;显示区BCD码温度值刷新子程序
;**************************************
MOV A,TMSETVL ;调下限设置值到调整显示寄存
ANL A, #0FH ;
MOV DISL_VL,A ;
MOV A,TMSETVL ;
SWAP A ;
ANL A, #0FH ;
MOV DISL_VH,A ;
MOV A,TMSETVH ;调上限设置值到调整显示寄存
ANL A, #0FH ;
MOV DISH_VL,A ;
MOV A,TMSETVH ;
SWAP A ;
ANL A, #0FH ;
MOV DISH_VH,A ;
;*************************************
LPTEMP1: LCALL KEYWORK ;
LCALL DISPLAY ;调用数码管显示子程序
LCALL BT_WORK ;
;*************************************
MOV A,BT_VL ; 比较当前温度与设定下限温度值
CJNE A,TMSETVL,TEMP_VH1;
CLR P2.3 ;
TEMP_VH1: JNC TEMP_VH ;
CLR P2.3 ;
TEMP_VH: CJNE A,TMSETVH,TM_WORK1;比较当前温度与设定上限温度值
SETB P2.3 ;
TM_WORK1: JC TM_WORK ;
SETB P2.3 ;
;*************************************
TM_WORK:
JB TEMPONEOK,LPTEMP1;
LCALL GET_TEMPER ;调用读温度子程序
LCALL CONVTEMP ;温度BCD码计算处理子程序
LCALL DISPBCD ;显示区BCD码温度值刷新子程序
AJMP LPTEMP1 ;
;**************************************
BT_WORK:
MOV BT_VL,BUF2 ;当前显示保存是转换程序
MOV A,BUF3 ;
SWAP A ;
ORL A,BT_VL ;
MOV BT_VL,A ;
RET ;
;**************************************
KEYWORK:
ORL P1,#00FH ;置列线输入状态
MOV A, P1 ;读入P0口值
ANL A,#00FH ;
MOV B,A ;KEYY口值暂存B中
CJNE A,#0F0H,KEYHIT ;不等于#0FFH,转KEYHIT(有键按下)
KEYOUT: RET ;
KEYHIT:
LCALL DL10MS ;延时去抖动
; LCALL DL10MS ;
MOV A, P1 ;再读入P0口值至A
ANL A,#00FH ;
CJNE A,B,KEYOUT ;A不等于B(是干扰),子程序返回
;**************************************
JNB K4, K4WORK ;
JNB K6, K6WORK ;
JNB K5, K5WORK ;
AJMP KEYOUT ;
;*************************************
K6WORK: JNB TEMPCONV,KEYOUT ; 设定上限值调整程序
INC DISL_VL ;
MOV A, DISL_VL ;
CJNE A, #10,K6OUT ;
MOV DISL_VL,#00H ;
INC DISL_VH ;
MOV A,DISL_VH ;
CJNE A, #10,K6OUT ;
MOV DISL_VH,#00H ;
K6OUT: MOV BUF2,DISL_VL ;
MOV BUF3,DISL_VH ;
AJMP KEYOUT ;
;************************************
K5WORK: JNB TEMPCONV,KEYOUT ;设定下限值调整程序
INC DISH_VL ;
MOV A, DISH_VL ;
CJNE A, #10,K5OUT ;
MOV DISH_VL,#00H ;
INC DISH_VH ;
MOV A,DISH_VH ;
CJNE A, #10,K5OUT ;
MOV DISH_VH,#00H ;
K5OUT: MOV BUF2,DISH_VL ;
MOV BUF3,DISH_VH ;
AJMP KEYOUT ;
;***************************************
K4WORK: LCALL INIT_1820 ;先复位DS18B20
CPL TEMPONEOK ;
CPL TEMPCONV ;
;**************************************
LCALL INIT_1820 ;先复位DS18B20
MOV A,#0CCH ;跳过ROM匹配
LCALL WRITE_1820 ;
MOV A,#4EH ;写入温度限制指令
LCALL WRITE_1820 ;
;***************************************
MOV A,DISL_VL ; 写入设定下限值
MOV TMSETVL,A ;
MOV A,DISL_VH ;
SWAP A ;
ORL A,TMSETVL ;
MOV TMSETVL,A ;
LCALL WRITE_1820 ;
MOV A,DISH_VL ;写入设定上限值
MOV TMSETVH,A ;
MOV A,DISH_VH ;
SWAP A ;
ORL A,TMSETVH ;
MOV TMSETVH,A ;
LCALL WRITE_1820 ;
;***************************************
LCALL INIT_1820 ;先复位DS18B20
MOV A,#0CCH ;跳过ROM匹配
LCALL WRITE_1820 ;
MOV A,#48H ;温度上限和下值COPY回E2PRAM
LCALL WRITE_1820 ;
LCALL WAITREL ;
AJMP KEYOUT ;
;*************************************
WAITREL:
LCALL DLDISP ;调显示程度防止显示闪烁
MOV A, P2 ;
ANL A, #0F0H ;
XRL A, #0F0H ;
JNZ WAITREL ;
RET ;
;***************************************
; 读出转换后的温度值
;***************************************
GET_TEMPER:
SETB TEMPDIN ;
LCALL INIT_1820 ;先复位DS18B20
JB FLAG1,TSS2
RET ;判断DS1820是否存在?若DS18B20不存在则返回
TSS2:
MOV A,#0CCH ;跳过ROM匹配
LCALL WRITE_1820
MOV A,#44H ;发出温度转换命令
LCALL WRITE_1820
;*****************************************
;这里通过调用显示子程序实现延时一段时间,等待AD转换结束,12位的话750微秒
;*****************************************
MOV R3,#5
LPDISP: LCALL DISPLAY
DJNZ R3,LPDISP
;*****************************************
GET_TM: LCALL INIT_1820 ;准备读温度前先复位
MOV A,#0CCH ;跳过ROM匹配
LCALL WRITE_1820
MOV A,#0BEH ;发出读温度命令
LCALL WRITE_1820
LCALL READ_18200 ;将读出的温度数据保存到40H/41H
RET
;*******************************************
;写DS18B20的子程序(有具体的时序要求)
;*******************************************
WRITE_1820:
MOV R2,#8 ;一共8位数据
CLR C ;
WR1:
CLR TEMPDIN ;
MOV R3,#6
DJNZ R3,$
RRC A
MOV TEMPDIN,C ;
MOV R3,#23
DJNZ R3,$
SETB TEMPDIN ;
NOP
DJNZ R2,WR1 ;
SETB TEMPDIN ;
RET
;*************************************
; 这是DS18B20复位初始化子程序
;*************************************
INIT_1820:
SETB TEMPDIN
NOP
CLR TEMPDIN ;主机发出延时537微秒的复位低脉冲
MOV R1,#3
TSR1: MOV R0,#107
DJNZ R0,$
DJNZ R1,TSR1
SETB TEMPDIN ;然后拉高数据线
NOP
NOP
NOP
MOV R0,#25H
TSR2:
JNB TEMPDIN,TSR3 ;等待DS18B20回应
DJNZ R0,TSR2
LJMP TSR4 ;延时
TSR3:
SETB FLAG1 ;置标志位,表示DS1820存在
LJMP TSR5
TSR4:
CLR FLAG1 ;清标志位,表示DS1820不存在
LJMP TSR7
TSR5: MOV R0,#117
TSR6: DJNZ R0,TSR6 ;时序要求延时一段时间
TSR7: SETB TEMPDIN ;
RET
;*************************************
;处理温度BCD码子程序
;*************************************
CONVTEMP: MOV A,TEMPH ;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -