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

📄 用89c2051做温度计.asm

📁 可以测量0到125度之间的温度计
💻 ASM
字号:
       ORG     0000H   ;DS18B20.ASM        0-125度的温度计  原创:陈永飞  QQ:49204743  地址:江苏省南京市
       TEMPER_L        EQU     41H     ;用于保存读出温度的低8位          信箱:baiyni888@163.com
       TEMPER_H        EQU     40H     ;用于保存读出温度的高8位
       FLAG1   EQU     38H     ;是否检测到DS18B20标志位
       A_BIT1  EQU     31H     ;数码管个位数存放内存位置
       B_BIT1  EQU     32H     ;数码管十位数存放内存位置
        D_BIT1 EQU     35H     ;数码管百位数存放内存位置
DQ     EQU     P3.2    ;30H,31H,32H,33H:       X       个位    十位    X
MOD7:  MOV     SP,#60H
       LCALL   GET_TEMPER      ;调用读温度子程序
       LCALL   TEMPCOV
       LCALL   DISPLAY ;调用数码管显示子程序
       AJMP    MOD7
TEMP0: INC     A
       AJMP    TEMP1
TEMPCOV:       MOV     A,TEMPER_L      ;数据处理子程序TEMPCOV
       MOV     B,#16
       DIV     AB
       JB      B.3,TEMP0
TEMP1: MOV     34H,A   ;将TEMPER_L的高四位右移四位,存入34H中(温度值)
       MOV     A,B     ;将TEMPER_L的低四位X10/16得小数后一位数.
       MOV     B,#10
       MUL     AB
       MOV     B,#16
       DIV     AB
       MOV     30H,A   ;将小数后一位数.存入30H中
       MOV     A,TEMPER_H      ;TEMPER_H中存放高8位数,权重16
       MOV     B,#16
       MUL     AB
       ADD     A,34H   ;34H中存入温度值的整数部分
       MOV     B,#10
       DIV     AB
       MOV     31H,B   ;个位存入31H中
       MOV     B,#10   ;
       DIV     AB      ;
       MOV     32H,B   ;十位存入32H中
       MOV     B,#10   ;
       DIV     AB      ;
       MOV     35H,B   ;百位存入33H中
       MOV     A,TEMPER_H
       MOV     33H,#10H        ;
       JB      ACC.7,EXIT7
       MOV     33H,#00H
EXIT7: RET
INIT_1820:     ;这是DS18B20复位初始化子程序
       SETB    DQ
       NOP
       CLR     DQ      ;主机发出延时537微秒的复位低脉冲
       MOV     R1,#3
TSR1:  MOV     R0,#107
       DJNZ    R0,$
       DJNZ    R1,TSR1
       SETB    DQ      ;然后拉高数据线
       NOP
       NOP
       NOP
       MOV     R0,#25H
TSR2:  JNB     DQ,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    DQ
       RET
       ;-------------------------------------------------
GET_TEMPER:    ;读出转换后的温度值
       SETB    DQ
       LCALL   INIT_1820       ;先复位DS18B20
       JB      FLAG1,TSS2
       RET     ;判断DS1820是否存在?若DS18B20不存在则返回
TSS2:  MOV     A,#0CCH ;跳过ROM匹配
       LCALL   WRITE_1820
       MOV     A,#44H  ;发出温度转换命令
       LCALL   WRITE_1820
       LCALL   DISPLAY ;等待AD转换结束,12位的话750微秒
       LCALL   INIT_1820       ;准备读温度前先复位
       MOV     A,#0CCH ;跳过ROM匹配
       LCALL   WRITE_1820
       MOV     A,#0BEH ;发出读温度命令
       LCALL   WRITE_1820
       LCALL   READ_18200      ;将读出的温度数据保存到35H/36H
       RET
       ;写DS18B20的子程序(有具体的时序要求)
WRITE_1820:    MOV     R2,#8   ;一共8位数据
       CLR     C
WR1:   CLR     DQ
       MOV     R3,#6
       DJNZ    R3,$
       RRC     A
       MOV     DQ,C
       MOV     R3,#23
       DJNZ    R3,$
       SETB    DQ
       NOP
       DJNZ    R2,WR1
       SETB    DQ
       RET
       ;读DS18B20的程序,从DS18B20中读出两个字节的温度数据
READ_18200:    MOV     R4,#2   ;将温度高位和低位从DS18B20中读出
       MOV     R1,#TEMPER_L    ;低位存入TEMPER_L(TEMPER_L),高位存入(TEMPER_H)
RE00:  MOV     R2,#8   ;数据一共有8位
RE01:  CLR     C
       SETB    DQ
       NOP
       NOP
       CLR     DQ
       NOP
       NOP
       NOP
       SETB    DQ
       MOV     R3,#9
RE10:  DJNZ    R3,RE10
       MOV     C,DQ
       MOV     R3,#23
RE20:  DJNZ    R3,RE20
       RRC     A
       DJNZ    R2,RE01
       MOV     @R1,A
       DEC     R1
       DJNZ    R4,RE00
       RET
       ;显示子程序
DISPLAY:       MOV     DPTR,#TAB       ;指定查表启始地址
       MOV     R0,#4
DPL1:  MOV     R1,#250 ;显示1000次
DPLOP: MOV     A,A_BIT1        ;取个位数
       MOVC    A,@A+DPTR       ;查个位数的7段代码
       MOV     P1,A    ;送出个位的7段代码
       CLR     P2.6    ;开个位显示
       ACALL   D1MS    ;显示1MS
       SETB    P2.6
       MOV     A,B_BIT1        ;取十位数
       MOVC    A,@A+DPTR       ;查十位数的7段代码
       MOV     P1,A    ;送出十位的7段代码
       CLR     P2.5    ;开十位显示
       ACALL   D1MS    ;显示1MS
       SETB    P2.5
       MOV     A,D_BIT1        ;取百位数
       MOVC    A,@A+DPTR       ;查百位数的7段代码
       MOV     P1,A    ;送出百位的7段代码
       CLR     P2.4    ;开百位显示
       ACALL   D1MS    ;显示1MS
       SETB    P2.4
       MOV     P1,#00H
       DJNZ    R1,DPLOP        ;100次没完循环
       DJNZ    R0,DPL1 ;4个100次没完循环
       RET
       ;1MS延时(按12MHZ算)
D1MS:  MOV     R7,#0FFH
       DJNZ    R7,$
       ;       DJNZ    R7,$
       RET
       ;实验板上的7段数码管0~9数字的共阴显示代码
TAB:           DB        07DH;0
        DB        018H;1
        DB        06EH;2
        DB        03EH;3
        DB        01BH;4
        DB        037H;5
        DB        077H;6
        DB        01CH;7
        DB        07FH;8
        DB        03FH;9
       
       END
       

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -