硬件资源的介绍
  三种使用方式
  At24c02的使用
  DS18b20的使用
  DS18b20液晶显示
  1602液晶的使用
  单个数码管的显示实验
  4个数码管的显示实验
  继电器的使用
  发光二极管的使用
  蜂鸣器的实验
  红外线解码(PWM制式)
  成品发售形式
  配套产品
实验工具>>实验板>>DS18b20的使用
一、 实验目的:
1、 看懂电路原理图,明白18b20的编程方式。
2、 看懂参考程序,学会使用扫描法来对4个数码管进行扫描显示。学会使用定时器。
二、 实验设备:
51通用实验板一个,51仿真器一个,40针仿真头一个,12V电源一个,18b20一个。
三、 实验电路原理图:

四、 实验内容:
读出18b20的温度值,把它转化为十进制数,送到数码码显示。对定时零进行设定。
安实物图的形式把实验设备连接在一起。

五、 参考程序:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;功能: DS18b20的显示实验
;使用环境:板上18b20接口,上拉电阻存在,只需把18B20的三根线接到相应位置即可,晶振为11.0592MHz
;使用资源:使用P2.7采集温度,4位数码管使用P0口,p2.0,p2.1,p2.2,p2.3控制显示,采用描绘显示方法
; 测试18B20存在P1.7口L8灯亮,不存在P1.0口L1灯亮
;声 明: 此程序仅共参考,不一定准确,就算给大家一个"例程"吧,如果大家有不同意见,希望多多指正!
;提供者: 单片机试验网
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;////////////数据定义///////////////////////////
TH EQU 38 ;高温报警点
TL EQU 10 ;低温报警点
TEMPH EQU 40H ;读出寄存器5个单元的内容
TEMPL EQU 41H
REG2 EQU 42H
REG3 EQU 43H
REG4 EQU 44H
CONFIG9 EQU 1FH ;9位精度的CONFIG数据
COMFIG10 EQU 3FH ;10位精度的CONFIG数据
CONFIG11 EQU 5FH ;11位精度的CONFIG数据
CONFIG12 EQU 7FH ;12位精度的CONFIG数据
CNT EQU 20H ;中断转换时间
DAT EQU P2.7;数据线
FLAG1 BIT 00H ;测试DS18B20的存在
;/////////////程序开始///////////////////////////
ORG 0000H
LJMP MAIN
ORG 000BH
LJMP TIM0 ;定时器0中断
ORG 0030H
MAIN:
MOV SP,#07H ;设定堆栈指针

LCALL RESET ;18b20复位
LCALL INIT ;初始化数码管

MOV TMOD,#21H ;定时器0设置
MOV TH0,#00H
MOV TL0,#00H
SETB EA
SETB ET0
SETB TR0

STAR: LCALL DISP ;显示温度值
LJMP STAR

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
RESET:;18B20复位程序,11.0592Mz单周期1US
SETB DAT
NOP
CLR DAT
;主机发出延时537微秒的复位低脉冲
MOV R1,#3
TSR1: MOV R0,#107
DJNZ R0,$
DJNZ R1,TSR1
MOV R0,#0FFH
SETB DAT ;然后拉高数据线
TSR2: JNB DAT,TSR3;等待DS18B20回应
DJNZ R0,TSR2
LJMP TSR4 ; 延时
TSR3: SETB FLAG1 ; 置标志位,表示DS1820存在
CLR P1.7 ;检查到DS18B20就点亮P1.7LED
LJMP TSR5
TSR4: CLR FLAG1 ; 清标志位,表示DS1820不存在
CLR P1.0
LJMP TSR7
TSR5: MOV R0,#117
TSR6: DJNZ R0,TSR6 ; 时序要求延时一段时间
TSR7: SETB DAT
RET

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;-------------------写DS18B20的程序
WRITE: ;18B20写入1个字节子程序
MOV R2,#8
CLR C
WR1: CLR DAT
MOV R3,#6
DJNZ R3,$
RRC A
MOV DAT,C
MOV R3,#23
DJNZ R3,$
SETB DAT
NOP
DJNZ R2,WR1
SETB DAT
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;-------------------读DS18B20的程序,从DS18B20中读出两个字节的温度数据
;读出温度值的子程序RDTEMP
RDTEMP:
MOV R4,#2 ; 将温度高位和低位从DS18B20中读出
MOV R1,#TEMPL ; 低位存入41H(TEMPL),高位存入40H(TEMPH)

RE00: MOV R2,#8
RE01: CLR C
SETB DAT
NOP
NOP
CLR DAT
NOP
NOP
NOP
SETB DAT
MOV R3,#7
DJNZ R3,$
MOV C,DAT
MOV R3,#23
DJNZ R3,$
RRC A
DJNZ R2,RE01
MOV @R1,A
DEC R1
DJNZ R4,RE00
RET

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
DIVV:;数据处理子程序DIVV
MOV A,41H
MOV B,#16
DIV AB
MOV 74H,A ;将41H的高4位右移4位,存入74H中
MOV A,B
MOV B,#10
MUL AB
MOV B,#16
DIV AB
MOV 73H,A;70 ;将41H的低4位X10/16得小数后1位数
MOV A,40H
MOV B,#16
MUL AB
ADD A,74H
MOV B,#10
DIV AB
MOV 72H,B;71 ;将个位数存入72H中
MOV B,#10
DIV AB
MOV 71H,B;72 ;将十位数存入71H中
MOV A,40H
MOV 70H,#10H;73 ;如果为负则符号位为#10H
JB ACC.7,SA
MOV 70H,#00H ;如果为正则符号位为#00H
SA:
RET
;------------------读出转换后的温度值
GET_TEMPER:
SETB DAT ; 定时入口
BCD: LCALL RESET
JB FLAG1,S22
LJMP BCD ; 若DS18B20不存在则返回

S22: LCALL DELAY1
MOV A,#0CCH ; 跳过ROM匹配------0CC
LCALL WRITE
MOV A,#44H ; 发出温度转换命令
LCALL WRITE
NOP
LCALL DELAY
LCALL DELAY
CBA: CALL RESET
JB FLAG1,ABC
LJMP CBA
ABC: LCALL DELAY1
MOV A,#0CCH ; 跳过ROM匹配
LCALL WRITE
MOV A,#0BEH ; 发出读温度命令
LCALL WRITE
LCALL RDTEMP ;READ_1820
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;------------------延时子程序
DELAY: MOV R7,#00H
MIN: DJNZ R7,YS500
RET
YS500: LCALL YS500US
LJMP MIN
YS500US:MOV R6,#00H
DJNZ R6,$
RET
DELAY1: MOV R7,#20H
DJNZ R7,$
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
DISP: ;数码管显示程序,此程序要注意的是P2.7口的DS18B20数据采集,不能影响此口
MOV R1,#70H
DISP1:
CLR P2.0;第一个数码管亮
SETB P2.1
SETB P2.2
SETB P2.3
MOV A,@R1
MOV DPTR,#TAB
MOVC A,@A+DPTR
MOV P0,A
LCALL DLYS
INC R1;
SETB P2.0;第二个数码管亮
CLR P2.1
SETB P2.2
SETB P2.3
MOV A,@R1
MOV DPTR,#TAB
MOVC A,@A+DPTR
MOV P0,A
LCALL DLYS
INC R1;
SETB P2.0;第三个数码管亮
SETB P2.1
CLR P2.2
SETB P2.3
MOV A,@R1
MOV DPTR,#TAB
MOVC A,@A+DPTR
ADD A,#80H;点亮小数点
MOV P0,A
LCALL DLYS
INC R1;
SETB P2.0;第四个数码管亮
SETB P2.1
SETB P2.2
CLR P2.3
MOV A,@R1
MOV DPTR,#TAB
MOVC A,@A+DPTR
MOV P0,A
LCALL DLYS
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;------------------重新写DS18B20暂存存储器设定值
RE_CONFIG:
JB FLAG1,RE_CONFIG1 ; 若DS18B20存在,转RE_CONFIG1
RET
RE_CONFIG1:
MOV A,#0CCH ; 发SKIP ROM命令
LCALL WRITE
MOV A,#4EH ; 发写暂存存储器命令
LCALL WRITE
MOV A,#00H ; TH(报警上限)中写入00H
LCALL WRITE
MOV A,#00H ; TL(报警下限)中写入00H
LCALL WRITE
MOV A,#7FH ; 选择12位温度分辨率
LCALL WRITE
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
TIM0: ;中断处理程序
CLR TR0
CLR EA
MOV A,CNT
INC A
MOV CNT,A
CJNE A,#10,TZ ;刷新时间到一定的时间,就采集温度,注意采集时间不能太快,太快就能时实显示
MOV CNT,#00H
LCALL GET_TEMPER
LCALL DIVV

TZ: MOV TH0,#00H ;设定定时器0的参数
MOV TL0,#00H
SETB EA
SETB TR0
RETI

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
INIT: ;初始化70H---73H中的数据,使用R0,R1,R3

MOV 70H,#00H ;初始化数码管的显示内容
MOV 71H,#00H
MOV 72H,#00H
MOV 73H,#00H
MOV CNT,#00H ;刷新时间初始化

LCALL RE_CONFIG ;配置DS18B20程序
LCALL GET_TEMPER ;获得温度值
LCALL DIVV ;温度值进行转换
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
DLYS: MOV R6,#1 ;延时处理程序
DLYS0:MOV R5,#60
DJNZ R5,$
DJNZ R6,DLYS0
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
TAB:
DB 0C0H,0F9H,0A4H,0B0H; 0,1,2,3
DB 99H,92H,82H,0F8H;?,5,6,7
DB 80H,90H,88H,83H;?,9,A,B
DB 0C6H,0A1H,86H,8EH;C,D,E,F
DB 8CH,89H,07fh,0bFH;P,H,.,-11001011
END


                 回到顶部
                     51单片机实验网   津ICP备05003923
               关于我们  | 下载说明  |  联系站长  | 本站声明