1、33 pf电容 210 uf电容 14.7k电阻 710k电阻 50.1k电阻 11 k电阻 45V电源 1四硬件原理图 室内温度检测系统硬件原理图五硬件原理图与其软件配合介绍DS18B20的DQ端与单片机的P2.0口相连,进行数据传送。DSl8820内部结构主要由4部分组成:64位光刻ROM、温度传感器、非挥发的温度报警触发器TH和TL、配置寄存器。根据DSl8820的通信协议,主机控制DSl8820完成温度转换必须经过3个步骤:每一次读写之前都要对其进行复位,复位成功后发送1条ROM指令,最后发送RAM指令,这样才能对DSl8820进行预定的操作。复位要求主CPU将数据线下拉500s,然后
2、释放,DSl8820收到信号后等待1660s左右,后发出60240s的存在低脉冲,主CPU收到此信号表示复位成功。由于DSl8820采用的是单线进行控制与读取数据,因此对操作的时序要求非常严格,否则由于时序不匹配,将无法完成对器件的正确操作。P0口与4位LED显示的“字型码”端相连,P1口的低四位与4位LED显示的“位”选择相连,实现将从DS18B20中读取的数据显示出来。P1口的高四位,分别接四个按钮,实现对温度的设置。P1.4接“温度设置”按钮,P1.5接“开始测温”按钮,P1.6接“增加温度”按钮,P1.7接“减小温度”按钮。P3.4口接警铃,当温度高于设定温度时,可实现报警功能。每次用
3、P1口读入数据时,都要先置1,而后读入数据,如:SETB P1.4 相关代码如下:SET_TEMPER ;设置温度上限LCALL INIT_18B20 ;对DS18B20初始化LCALL GET_TEMPER ;获取温度数据 LCALL CHANGE16 ;将得到的16进制温度值转换为10进制数 LCALL DISPLAY ;将得到的温度显示出来MOV DPTR,#NUMTAB ;采用查表法显示温度 MOVC A,A+DPTR六程序流程图 温度上限 初值设置 读温度 初始化DS18B20 写DS18B20 获得温度整数部分 结果送显示七源程序清单;-部分内存分配声明-TEMPER_L EQU
4、31H ;用于保存读出温度的低字节TEMPER_H EQU 30H ;用于保存读出温度的高字节DAT BIT P2.2 ;DS18B20数据线-设置上限温度-ORG 0000H MOV SP,#80H MOV 66H,#26 ;66H为温度初值存储地址(温度上限) CLR C ;欲设温度上限为26度 MOV P3.4,C ;关闭蜂鸣器 MOV R3,#0F0H ;延时WAIT1:MOV 60H,66H ;初始温度 送显示,60H为16进制数暂存地址 LCALL CHANGE16_0 LCALL DISPLAY DJNZ R3,WAIT1 CLR P1.4 CLR P1.5WAIT4:CLR C
5、 SETB P1.4 SETB P1.5 NOP JNB P1.4,SET_TEMPER ;判断是否需要设置温度 JNB P1.5,START AJMP WAIT4-设置温度子程序-SET_TEMPER: CLR P1.6 CLR P1.7 SETB P1.6 SETB P1.7SET_1: JNB P1.6,UP1 ;温度值加1 JNB P1.7,DOWN1 ;温度值减1 JNB P1.5,START ;开始测温 AJMP SET_1-加 温度子程序-UP1:MOV A,66H ADDC A,#01H MOV 66H,A MOV R3,#0FFHWAIT2:MOV 60H,66H DJNZ
6、R3,WAIT2 LJMP SET_TEMPER-减 温度子程序-DOWN1: MOV A,66H SUBB A,#01HWAIT3: DJNZ R3,WAIT3-主函数开始-START: LCALL GET_TEMPER ;调用读温度子程序 LCALL CHANGE16 ;将读出的2字节温度整合,并转换为压缩BCD码 LCALL DISPLAY ;显示温度 LJMP START-DS18B20的温度转换子程序-GET_TEMPER: LCALL INIT_18B20TSS:MOV A,#0CCH ;跳过ROM匹配 LCALL WRITE_18B20 MOV A,#44H ;发出温度转换命令L
7、CALL DISPLAY ;用显示温度(持续1s左右)来等待AD转换结束 ;12位的话要转换750msLCALL INIT_18B20 ;准备读温度前先初始化 MOV A,#0CCH ; MOV A,#0BEH ;发出读温度命令 LCALL READ_18B20 RET-DS18B20初始化程序-INIT_18B20: SETB DAT CLR DAT MOV R2,#250 ;主机发出延时500微秒的复位低脉冲 DJNZ R2,$ SETB DAT ;然后拉高数据线 MOV R2,#30 DJNZ R2,$ ;延时240us JNB DAT,INIT1 ;数据变高,初始化成功 LJMP IN
8、IT_18B20 INIT1:MOV R2,#120 DJNZ R2,$ JB DAT,INIT2 LJMP INIT_18B20INIT2:MOV R2,#240-写DS18B20的子程序(有具体的时序要求)-WRITE_18B20: MOV R2,#8 ;一共8位数据 CLR CWR0:CLR DAT MOV R3,#5 DJNZ R3,$ RRC A MOV DAT,C MOV R3,#21 DJNZ R2,WR0-读DS18B20的程序,从DS18B20中读出两个字节的温度数据-READ_18B20: MOV R4,#2 ;将温度高位和低位从DS18B20中读出 MOV R1,#TEM
9、PER_L ;低位存入31H(TEMPER_L)RE0:MOV R2,#8RE1:CLR C NOP MOV R3,#4 MOV C,DAT MOV R3,#30 DJNZ R2,RE1 MOV R1,A DEC R1 ;高位存入30H(TEMPER_H) DJNZ R4,RE0-整合读出的两字节温度(关于DS18B20读出的2字节温度格式请参考资料)-CHANGE16: MOV P3.4,C MOV R0,#65H MOV A,TEMPER_L SWAP A MOV R0,A MOV A,TEMPER_H XCHD A,R0 MOV 60H,A ;获得整数部分(1字节) SUBB A,60H ;判断实际温度是否高于温度上限 JNB ACC.7,CHANGE16_0 SETB C-将得到的16进制温度转化为10进制数-CHANGE16_0: MOV A,60H JB ACC.7,FUSHU ;判断是否为负数 MOV 64H,#00H MOV B,#100 ;将16进制数转换为10进制数 DIV AB MOV 63H,A MOV A,B MOV B,#10 MOV 62H,A MOV 61H,A AJMP BACK1FUSHU:MOV 64H,#0AH CPL A INC A MOV 60H,A MOV B,#100
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1