📄 ds18b20.asm
字号:
;*****************************************************************************************
; MCS8051-III学习板演示程序
;
; (c) Copyright 2007-2007,广州恒芯电子
; All Rights Reserved
;*****************************************************************************************
;*****************************************************************************************
;程序说明
;*****************************************************************************************
;名称: MCS8051-III学习板演示程序(温度芯片测试)
;功能: 读取芯片DS18B20的温度,并在数码管显示
;版本:2007-07-01
;*****************************************************************************************
;硬件说明
;*****************************************************************************************
;单片机: 兼容MCS-51单片机/STC89C51
;晶振频率: 12MHz
;*****************************************************************************************
;说明:程序预定义
;*****************************************************************************************
LED7A_CTRL EQU P1.7 ;数码管第一位控制引脚(0为有效,1为无效)
LED7B_CTRL EQU P1.6 ;数码管第二位控制引脚(0为有效,1为无效)
LED7C_CTRL EQU P1.5 ;数码管第三位控制引脚(0为有效,1为无效)
LED7D_CTRL EQU P1.4 ;数码管第四位控制引脚(0为有效,1为无效)
LED7_STATUS EQU P0 ;数码管状态引脚(0为有效,1为无效)
LED7A_DATA EQU 70H ;数码管第一位显示值(千位)
LED7B_DATA EQU 71H ;数码管第二位显示值(百位)
LED7C_DATA EQU 72H ;数码管第三位显示值(十位)
LED7D_DATA EQU 73H ;数码管第四位显示值(个位)
LED7_NUM EQU 74H ;数码管动态扫描值(值为从0到3)
DQ EQU P3.2 ;温度芯片数据端
TEML EQU 76H ;温度数据低位
TEMH EQU 77H ;温度数据高位
;*****************************************************************************************
;说明:程序开始
;*****************************************************************************************
ORG 0000H ;程序首地址 PC=0000H
JMP START ;程序跳转到START PC=0030H
ORG 000BH ;T0中断程序入口
JMP LED7SCAN ;跳到数码管动态扫描处理程序
ORG 0030H ;程序开始
START:
MOV DPTR, #LED7TAB ;数码管显示码表地址送DPTR
MOV LED7_NUM, #0 ;数码管动态扫描值至0,扫描第一位
;T0中断设定
MOV TMOD, #00000001B ;使用T0:GATE=0,C/T=0(定时),M1 M0=01(工作方式1)
MOV TH0, #0ECH ;中断时间为5毫秒
MOV TL0, #078H
SETB ET0 ;允许T0中断
SETB TR0 ;使T0工作
SETB EA ;总中断开启
L1:
MOV LED7A_DATA, #16 ;数码管第一位初始值
MOV LED7B_DATA, #16 ;数码管第二位初始值
MOV LED7C_DATA, #0 ;数码管第三位初始值
MOV LED7D_DATA, #0 ;数码管第四位初始值
L2:
CLR TR0
SETB DQ
CALL INIT ;初始化
MOV A, #0CCH ;跳过ROM匹配
CALL WRITE
MOV A, #44H ;发出温度转换命令
CALL WRITE
SETB TR0
MOV R7, #50H ;延时750ms转换时间
CALL DELAY
CLR TR0
CALL INIT ;准备读温度前先复位
MOV A, #0CCH ;跳过ROM匹配
CALL WRITE
MOV A, #0BEH ;发出读温度命令
CALL WRITE
CALL READ ;读出温度
MOV TEML, A
CALL READ
MOV TEMH, A
SETB TR0
MOV A, TEML ;温度转换
ANL A, #0F0H
SWAP A
MOV TEML, A
MOV A, TEMH
ANL A, #0FH
SWAP A
ORL A, TEML
MOV R3, A
CLR A
CLR C
L3: ADD A, #01H
DA A
DJNZ R3, L3
MOV TEML, A
ANL A, #0FH ;显示数据
MOV LED7D_DATA, A
MOV A, TEML
SWAP A
ANL A, #0FH
MOV LED7C_DATA, A
MOV R7, #0FFH ;延时
CALL DELAY
MOV R7, #0FFH ;延时
CALL DELAY
MOV R7, #0FFH ;延时
CALL DELAY
MOV R7, #0FFH ;延时
CALL DELAY
MOV R7, #0FFH ;延时
CALL DELAY
MOV R7, #0FFH ;延时
CALL DELAY
JMP L2 ;循环
;*****************************************************************************************
;函数:INIT
;说明: 初始化子程序
;参数: 无
;返回; 无
;*****************************************************************************************
INIT:
SETB DQ
NOP
CLR DQ
MOV R7,#34 ;延时510ms
CALL DELAY
SETB DQ
MOV R7,#04 ;延时60ms
CALL DELAY
MOV R7,#28 ;延时420ms
CALL DELAY
SETB DQ ;然后拉高数据线
BACK:RET
;*****************************************************************************************
;函数:WRITE
;说明: DS18B20写字节操作
;参数: A存放写入数据
;返回; 无
;*****************************************************************************************
WRITE:
CLR C
MOV R2,#8 ;一共8位数据
WR1:
CLR DQ
MOV R7,#1
CALL DELAY
RRC A
MOV DQ,C
MOV R7,#1
CALL DELAY
SETB DQ
NOP
DJNZ R2,WR1
SETB DQ
RET
;*****************************************************************************************
;函数:READ
;说明: DS18B20读字节操作
;参数: 无
;返回; A存放读出数据
;*****************************************************************************************
READ:
MOV R2,#8 ;数据一共有8位
WIN01:
CLR C
SETB DQ
NOP
NOP
CLR DQ
NOP
NOP
NOP
SETB DQ
MOV R7,#01
CALL DELAY
MOV C,DQ
MOV R7,#03
CALL DELAY
RRC A
DJNZ R2,WIN01
RET
;*****************************************************************************************
;函数:LEDSCAN
;说明: 数码管动态扫描处理程序
;参数: 无
;返回; 无
;*****************************************************************************************
LED7SCAN:
PUSH ACC ;ACC入栈
PUSH PSW ;PSW入栈
MOV A, LED7_NUM ;数码管动态扫描值送A
CJNE A, #0, LED7SCAN_1 ;若数码管动态扫描值为0,则处理数码管的第一位,否则跳转到LED7SCAN_1
SETB LED7D_CTRL ;设置数码管第四位无效
MOV A, LED7A_DATA ;将千位值送A
MOVC A, @A+DPTR ;将显示码送A
CLR LED7A_CTRL ;设置数码管第一位有效
JMP LED7SCAN_4 ;跳转到LED7SCAN_4
LED7SCAN_1:
CJNE A, #1, LED7SCAN_2 ;若数码管动态扫描值为1,则处理数码管的第二位,否则跳转到LED7SCAN_2
SETB LED7A_CTRL ;设置数码管第一位无效
MOV A, LED7B_DATA ;将百位值送A
MOVC A, @A+DPTR ;将显示码送A
CLR LED7B_CTRL ;设置数码管第二位有效
JMP LED7SCAN_4 ;跳转到LED7SCAN_4
LED7SCAN_2:
CJNE A, #2, LED7SCAN_3 ;若数码管动态扫描值为2,则处理数码管的第三位,否则跳转到LED7SCAN_3
SETB LED7B_CTRL ;设置数码管第二位无效
MOV A, LED7C_DATA ;将十位值送A
MOVC A, @A+DPTR ;将显示码送A
CLR LED7C_CTRL ;设置数码管第三位有效
JMP LED7SCAN_4 ;跳转到LED7SCAN_4
LED7SCAN_3:
SETB LED7C_CTRL ;设置数码管第三位无效
MOV A, LED7D_DATA ;将个位值送A
MOVC A, @A+DPTR ;将显示码送A
CLR LED7D_CTRL ;设置数码管第四位有效
MOV LED7_NUM, #0 ;数码管动态扫描值置0
JMP LED7SCAN_5 ;跳转到LED7SCAN_5
LED7SCAN_4:
INC LED7_NUM ;数码管动态扫描值加1
LED7SCAN_5:
MOV LED7_STATUS, A ;显示码送数码管状态引脚
MOV TH0, #0ECH ;重新设置T0定时值
MOV TL0, #078H
POP PSW ;PSW出栈
POP ACC ;ACC出栈
RETI ;中断返回
;*****************************************************************************************
;函数:DELAY
;说明:程序延时
;参数: R7存放延时数据
;返回: 无
;*****************************************************************************************
DELAY:
MOV R6, #04H
DELAY_1:
DJNZ R6, $
DJNZ R7, DELAY
RET
;*****************************************************************************************
;说明:七段数码管十六进制显示码表
;*****************************************************************************************
LED7TAB:
DB 0C0H,0F9H,0A4H,0B0H,099H,092H,082H,0F8H,080H,090H ;从'0'到'9'
DB 088H,083H,0C6H,0A1H,086H,08EH,0FFH ;从'A'到'F'
;*****************************************************************************************
;说明:程序结束
;*****************************************************************************************
END ;程序结束
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -