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

📄 温度计.txt

📁 温度计最大转化时间750微秒,显示温度-55到+125度,显示精度为0.1度显示采用4LE共阳显示测温值。
💻 TXT
📖 第 1 页 / 共 2 页
字号:
;*************************************************
;单片机内存分配申明!
;*************************************************
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 + -