用单片机控制DS18B20温度传感器,可测量温度读取数据,并对DS18B20转换后的数据进行处理,最终在显示器上显示出测量的温度值。
1 硬件设计
如图8-9所示为一个由单总线构成的多个DS18B20温度传感器监测系统仿真图。
图8-9 单总线构成的多温度监测系统仿真图
在图8-9中,4个温度传感器DS18B20通过4个电子开关闭合挂在单片机P1.7单总线上。采用寄生供电模式,4个DS18B20编号自上向下为1、2、3、4。要求6个数码管循环显示4个传感器温度值,显示格式为:自左向右,第1位,DS18B20的编号;第2位,不显(灭);后4位显示相应DS18B20温度值(BCD码)。小数与字形码的对应关系见表8-5。
表8-5 小数与字形码的对应关系
2 程序设计
/***DS18B20_onewire.A51***/
DQ BIT P1.7
TEMP_9byte EQU 50H;转换温度值保存单元首地址
ORG 0000H
AJMP MAIN
ORG 0020H
MOV SP,#60H
MAIN:LCALL GET_TEMP;调用读转换子程序
LCALL BCD_CONV;调用BCD码显示格式转换子程序
LCALL DISPLAY;调用数码管显示子程序
SJMP MAIN
/******读转换子程序******/
GET_TEMP:MOV R0,#TEMP_9byte
LCALL INT;调用初始化子程序
MOV A,#0CCH
LCALL WRBYTE;送入忽略ROM命令
MOV A,#44H
LCALL WRBYTE;送入温度转换命令
LCALL INT;温度转换完成,再次初始化
MOV A,#0CCH
LCALL WRBYTE;送入忽略ROM命令
MOV A,#0BEH
LCALL WRBYTE;送入读温度暂存器命令
LCALL RDBYTE
MOV @R0,A;读出温度值低字节存入温度值保存单元
INC R0;转换温度值保存单元地址+1
LCALL RDBYTE
MOV @R0,A;读出温度值高字节存入温度值保存单元
MOV 73H,R0;暂存转换温度值保存单元地址
RET
/******初始化子程序******/
INT:CLR EA;关中断
L0:CLR DQ;总线低电平复位
MOV R2,#240
L1:DJNZ R2,L1;总线复位保持480μs
SETB DQ;释放总线
MOV R2,#30
L4:DJNZ R2,L4;释放总线保持60μs
CLR C;进位C清0
ORL C,DQ
JC L0;有应答信号吗?无则重新来
MOV R6,#20;有应答,保持90μs
L5:ORL C,DQ
JC L3
DJNZ R6,L5
SJMP L0
L3:MOV R2,#240
L2:DJNZ R2,L2
SETB EA;开中断
RET
/******写一个字节子程序******/
WRBYTE:CLR EA;关中断
MOV R3,#8;写入DS18B20的字节数,一个字节8位,存在A中
WR1:SETB DQ
MOV R4,#8
RRC A;把一个字节分成8位移给C
CLR DQ;开始写入DS18B20总线复位低电平状态
WR2:DJNZ R4,WR2;总线复位保持16μs
MOV DQ,C;写入一位
MOV R4,#20
WR3:DJNZ R4,WR3;等待40μs
DJNZ R3,WR1;写入下一位
SETB DQ;重新释放总线
SETB EA
RET
/******读一个字节******/
RDBYTE:CLR EA
MOV R6,#8
RE1:CLR DQ;读之前总线保持为低(www.xing528.com)
MOV R4,#4
NOP
SETB DQ;释放总线
RE2:DJNZ R4,RE2;持续8μs
MOV C,DQ;从总线读得一个位
RRC A;把读的位移给A
MOV R5,#30
RE3:DJNZ R5,RE3;持续60μs
DJNZ R6,RE1;读下一个位
SETB DQ
RET
/******BCD码显示格式转换子程序******/
BCD_CONV:MOV 79H,#11H;获取不亮字形码索引
MOV 7AH,#11H
MOV R0,73H;温度值高字节的地址送R0
MOV A,@R0;读A-D转换的高8位
ANL A,#0FH;获取低4位数值
SWAP A;高低字节交换,获得12位转换值的高4位
MOV R3,A;保存高4位
DEC R0
MOV A,@R0;读A-D转换的低8位
ANL A,#0F0H;获得12位转换值的中4位
SWAP A
ORL A,R3;将12位转换值的高、中4位转换得整数部分
JB ACC.7,NEGAT;判断该值符号位,负数转DATA2处
CHANG:MOV B,#100
DIV AB;正数除以100
MOV 7BH,A;获得百位数送显示缓冲区7BH单元
CHANG1:MOV A,B
MOV B,#10
DIV AB;除以100后的余数除以10
MOV 7CH,A;获得十位数送显示缓冲区7CH单元
MOV 7DH,B;个位数送显示缓冲区7DH单元
MOV A,@R0;读取采集的第二字节低8位值
JB ACC.3,XIAOSU;判断小数最高位是1转XIAOSU
MOV 7EH,#00H;第二字节最高位为0,送0到显示缓冲区7EH单元
AJMP DATAEND
XIAOSU:MOV 7EH,#05H;第二字节最高位为1,送5到显示缓冲区7EH单元
DATAEND:RET
INC A
MOV 7BH,#10H;将能获取符号的字形码送显示缓冲区7BH单元
AJMP CHANG1
/******数码管显示子程序******/
DISPLAY:MOV R0,#79H;显示缓冲区首地址送R0
MOV R3,#01H ;字位码送R3保存
MOV A,R3
LD0:MOV P2,A;字位码送位码端口P2,点亮该位
MOV A,@R0;取出一位要显示数据
MOV DPTR,#TAB1;表首地址送DPTR
MOVC A,@A+DPTR;查表获取该数据的字形码
CJNE R3,#10H,DIR1;判断带小数点位
ANL A,#7FH;获取带小数点字形码
DIR1:MOV P0,A;字形码送段码端口P0
ACALL DL11;调用延时子程序
INC R0 ;缓冲区地址加1
MOV A,R3;取出位码
JB ACC.5,LD1;判断6位数码管显示完?是转LD1
RL A;未完左移一位
MOV R3,A;保存位码
AJMP LD0
LD1:RET;子程序返回
TAB1:DB 0C0H,0F9H,0A4H,0B0H,99H,92H
DB 82H,0F8H,80H,90H,88H,83H,0C6H,0A1H
DB 86H,8EH,0BFH,0FFH,0FFH
/******延时子程序******/
DL11:MOV R7,#02H
DL:MOV R6,#0FFH
DL6:DJNZ R6,DL6
DJNZ R7,DL
RET
END
3 LCD显示温度测试
在图8-10所示电路中使用LCD替换数码管进行显示,即在例中的程序里增加了调用子程序(读ROM)方式,程序运行可在LCD中显示出DS18B20的ROM编码,每只DS18B20都有一个唯一存储在ROM中的64位编码,最低8位是单线系列编码28H,接着的48位是一个唯一的序列号,最高8位是以上56位的CRC编码。图8-10所示电路可以用DS18B20独有的64位芯片序列号(ID)辨认器件。电路设置单片机端口一条线作为单总线,具有单总线特性DS18B20作为从芯片,DS18B20传感电路通常通过在数据线和VCC之间连一个分立电阻实现。
DS18B20温度传感器内部有温度上下限的限制,当测试温度超过限制值时,对应LED灯闪烁,按键开关切换显示转换输出。
图8-10 LCD显示温度测试
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。