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

📄 5555.asm

📁 ds18b20相关程序 单点温度读取 64位光刻序列读取
💻 ASM
字号:


;。。单片机内存分配申明!
    sbit TMDAT  =P0^0  ;数据脚
    TEMPER_L EQU 29H;用于保存读出温度的低8位
    TEMPER_H EQU 28H;用于保存读出温度的高8位
    FLAG1 EQU 38H;是否检测到DS18B20标志位
    a_bit equ 20h ;数码管个位数存放内存位置
    b_bit equ 21h ;数码管十位数存放内存位置
    C_BIT equ 22h; 数码管第一位小数存放内存位置
    D_BIT EQU 23H;数码管第2位小数存放内存位置
    org 0000h
main:
    MOV P1,#00H;
    CLR P3.5;
    LCALL GET_TEMPER;调用读温度子程序
;因为12位转化时每一位的精度为0.0625度,我们不要求显示小数所以可以抛弃29H的低4位
;将28H中的低4位移入29H中的高4位,这样获得一个新字节,这个字节就是实际测量获得的温度
   MOV A,29H
   MOV 22H,29H
   ANL 22H,#0FH
   MOV C,40H;将28H中的最低位移入C
   RRC A
   MOV C,41H
   RRC A
   MOV C,42H
   RRC A
   MOV C,43H
   RRC A
   MOV 29H,A
   LCALL DISPLAY;调用数码管显示子程序
   CPL P0.1
   AJMP MAIN
;。。。。。 这是DS18B20复位初始化子程序
INIT_1820:
   SETB TMDAT
   NOP
   CLR TMDAT
;主机发出延时537微秒的复位低脉冲
   MOV R1,#3
 TSR1:MOV R0,#107
   DJNZ R0,$
   DJNZ R1,TSR1
   SETB TMDAT;然后拉高数据线
   NOP
   NOP
   NOP
   MOV R0,#25H
 TSR2:
   JNB TMDAT,TSR3;等待DS18B20回应
   DJNZ R0,TSR2
   LJMP TSR4 ; 延时
 TSR3:
   SETB FLAG1 ; 置标志位,表示DS1820存在
   CLR P0.7;检查到DS18B20就点亮P1.7LED
   LJMP TSR5
 TSR4:
   CLR FLAG1 ; 清标志位,表示DS1820不存在
   CLR P0.2;点亮P1。1脚LED表示温度传感器通信失败
   LJMP TSR7
 TSR5:
   MOV R0,#117
 TSR6:
   DJNZ R0,TSR6 ; 时序要求延时一段时间
 TSR7:
   SETB TMDAT
   RET
;。。。。。 读出转换后的温度值
GET_TEMPER:
   SETB TMDAT
   LCALL INIT_1820;先复位DS18B20
   JB FLAG1,TSS2
   CLR P0.3
   RET ; 判断DS1820是否存在?若DS18B20不存在则返回
 TSS2:
   CLR P0.4;DS18B20已经被检测到!!!!!!!!!!!!!!!!!!
   MOV A,#0CCH ; 跳过ROM匹配
   LCALL WRITE_1820
   MOV A,#44H ; 发出温度转换命令
   LCALL WRITE_1820
;这里通过调用显示子程序实现延时一段时间,等待AD转换结束,12位的话750微秒
   LCALL DISPLAY
   LCALL INIT_1820;准备读温度前先复位
   MOV A,#0CCH ; 跳过ROM匹配
   LCALL WRITE_1820
   MOV A,#0BEH ; 发出读温度命令
   LCALL WRITE_1820
   LCALL READ_18200; 将读出的温度数据保存到35H/36H
   CLR P0.5
   RET
;。。。。。。写DS18B20的子程序(有具体的时序要求)
WRITE_1820:
   MOV R2,#8;一共8位数据
   CLR C
 WR1:
   CLR TMDAT
   MOV R3,#6
   DJNZ R3,$
   RRC A
   MOV TMDAT,C
   MOV R3,#23
   DJNZ R3,$
   SETB TMDAT
   NOP
   DJNZ R2,WR1
   SETB TMDAT
   RET
;。。。。 读DS18B20的程序,从DS18B20中读出两个字节的温度数据
READ_18200:
   MOV R4,#2 ; 将温度高位和低位从DS18B20中读出
   MOV R1,#29H ; 低位存入29H(TEMPER_L),高位存入28H(TEMPER_H)
       ;mov a,29h
       ;anl a,#0fh
       ;mov 22h,a
       ;clr a
 RE00:
   MOV R2,#8;数据一共有8位
 RE01:
   CLR C
   SETB TMDAT
   NOP
   NOP
   CLR TMDAT
   NOP
   NOP
   NOP
   SETB TMDAT
   MOV R3,#9
 RE10:
   DJNZ R3,RE10
   MOV C,TMDAT
   MOV R3,#23
 RE20:
   DJNZ R3,RE20
   RRC A
   DJNZ R2,RE01
   MOV @R1,A
   DEC R1
   DJNZ R4,RE00
   RET
;。。。。。显示子程序
display: 
   mov a,29H;将29H中的十六进制数转换成10进制
   mov b,#10 ;10进制/10=10进制
   div ab
   mov b_bit,a ;十位在a
   mov a_bit,b ;个位在b
         mov a,22h
         MOV   B,#10
         MUL   AB
         MOV   B,#16
         DIV   AB
         mov c_bit,a 
	    MOV D_BIT,B
            mov a,D_BIT
            MOV   B,#10
            MUL   AB
            MOV   B,#16
            DIV   AB
            mov D_bit,a 
   mov dptr,#numtab ;指定查表启始地址
   mov r0,#4
 dpl1: 
   mov r1,#250 ;显示1000次
 dplop:
       mov a,D_bit ;取小数
       MOVC A,@A+DPTR ;查询小数的7位段码
       mov p2,a ;送出小数的断码
       MOV P1,#08H ;开小数位显示
       acall d1ms ;显示1ms
       acall d1ms
       
       mov a,c_bit ;取小数
       MOVC A,@A+DPTR ;查询小数的7位段码
       mov p2,a ;送出小数的断码
       MOV P1,#04H ;开小数位显示
       acall d1ms ;显示1ms
       acall d1ms
   mov a,a_bit ;取个位数
   MOVC A,@A+DPTR ;查个位数的7段代码
   mov p2,a ;送出个位的7段代码
   SETB P2.7
   MOV P1,#02H
   ;clr p1.0 ;开个位显示
   acall d1ms ;显示1ms
   acall d1ms
   ;setb p1.0
   CLR P2.7
   mov a,b_bit ;取十位数
   MOVC A,@A+DPTR ;查十位数的7段代码
   mov p2,a ;送出十位的7段代码
   MOV P1,#01H
   ;clr p1.1 ;开十位显示
   acall d1ms ;显示1ms
   acall d1ms
   ;setb p1.1
   djnz r1,dplop ;100次没完循环
   djnz r0,dpl1 ;4个100次没完循环
   ret
;。。。1MS延时(按12MHZ算)
D1MS: 
   MOV R7,#80
   DJNZ R7,$
   RET
;实验板上的7段数码管0~9数字的共阴显示代码
numtab: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,39H,63H,40H

end

⌨️ 快捷键说明

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