利用AT89S2051采用DS18B20作为测温传感器,用AT89C2051作处理器,用数码管显示,并用LED灯作报警器。当测量温度高于100℃或低于-20℃时,发出警报。
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载):
单片机源程序如下:
- ORG 0000H
- LJMP MAIN
- ORG 0030H
- MAIN:LCALL CSH0 ;DS18B20初始化
- MOV A,#0CCH ;单点测温时执行跳过ROM命令节省访问时间
- LCALL WRITE
- MOV A,#44H ;发开始温度转换命令
- LCALL WRITE
- LCALL CSH0 ;DS18B20初始化
- MOV A,#0CCH ;单点测温时执行跳过ROM命令节省访问时间
- LCALL WRITE
- MOV A,#0BEH ;读存储器命令(读的字节暂存存储器,此后读操作)
- LCALL WRITE
- LCALL READ ;读出已转换的温度值低字节
- MOV 2BH,A
- LCALL READ ;读出已转换的温度值高字节
- MOV 2CH,A
- LCALL ERSH ;二进制转化成十进制
- LCALL DISPL ;调用动态显示的子程序
- LCALL MAXorMIN;***判断是否超出上下限***
- LJMP MAIN
- ;******************第一个DS18B20初始化子程序*******************
- CSH0:CLR P3.0
- MOV R2,#250
- CSH1:DJNZ R2, CSH1 ;主机发置位脉冲持续2μs*240=480μs
- SETB P3.0 ;主机释放总线控制P3.2口改为输入
- MOV R2,#30
- CSH4:DJNZ R2, CSH4 ;DS18B20等待2μs*30=60μs
- JB P3.0,CSH0 ;DS18B20没准备好,重来
- MOV R3,#120 ;DS18B20数据线变低
- CSH5:DJNZ R3,CSH5 ;DS18B20数据线低电平状态可持续2μs*120=240us
- JB P3.0,CSH3 ;18B20数据线变高,初始化成功
- LJMP CSH0 ;初始化失败,重来
- CSH3:MOV R2,#240
- CSH2:DJNZ R2, CSH2;18B20应答过程最少2μs*240=480μs
- RET
- ;******************写DS18B20子程序**********************
- WRITE:MOV R3,#8
- WR1: SETB P3.0 ;保证连续写2位间的间隙大于1μs
- MOV R4,#7
-
- CLR P3.0
- RRC A
- WR2: DJNZ R4,WR2 ;18B20数据线变低后2μs*7+1=15μs开始采样数据
- MOV P3.0,C ;将命令字从低位按位依次送18B20
- MOV R4,#22
- WR3: DJNZ R4,WR3;保证整个写过程持续2μs*22+1=45μS
- DJNZ R3,WR1;送完整个命令字
- SETB P3.0
- RET
- ;********************读DS18B20子程序*********************
- READ:MOV R3,#8
- RE1: CLR P3.0
- MOV R4,#4
- NOP ;低电平持续2μs
- SETB P3.0 ;P3.0口设为输入口
- RE2: DJNZ R4,RE2 ;等待2μs*4=8μs
- MOV C,P3.0 ;主机(从低位)按位读入18B20数据
- RRC A ;数据逐位(先低位后高位)送入A
- MOV R4,#30
- RE3: DJNZ R4,RE3 ;保证读数据过程持续2μs*30=60μs
- DJNZ R3,RE1 ;读完整个转换值(不含符号位)并存21H中
- RET
- ;************判断是否为负、温度精度转换********************
- ERSH: MOV A,2CH ;把温度的高字节给了A
- JB ACC.7,BB ;温度为负转变补(BB)程序段
- SETB F0 ;F0作为是否为负数的标志
- MOV R7,#0FFH ;温度为正不点亮
- ZHCH: MOV A,2BH ;屏蔽温度低字节的小数位
- ANL A,#0F0H
- SWAP A
- MOV 2DH,A
- MOV A,2CH ;屏蔽温度高字节的符号位
- ANL A,#07H
- SWAP A
- ADD A,2DH
- CFZH: MOV B,#10
- DIV AB
- MOV 41H,B ;41H中为个位
- MOV B,#10
- DIV AB
- MOV 42H,B ;42H中存放十位
- MOV B,#10
- DIV AB
- MOV 43H,B ;43H中为百位
- ESHD: MOV A,2BH ;低精度二十进制转换小数处理程序
- JB ACC.3,XS ;小数十分位为1,则跳转到XS
- MOV 40H,#00H
- RET
- XS: MOV 40H,#05H ;43H中存放小数位
- RET
- BB: CLR F0
- MOV R7,#0BFH ;负数让第1个数码管显示为"-"
- MOV A,2BH ;负数补码求补
- CPL A
- ADD A,#1
- MOV 2BH,A ;负温度低字节求补后送2BH
- MOV A,2CH
- CPL A
- ADDC A,#0
- MOV 2CH,A ;负温度高字节求补后送2CH
- LJMP ZHCH ;负数求补后转到ZHCH
- ;*************************显示子程序**************************
- DISPL:MOV A,R7 ;取显示的正负号
- MOV P1,A ;发送字段代码
- CLR P3.5 ;Y5=0, K5=1
- ACALL DL2MS ;符号位
- SETB P3.5 ;138A脚置1,关闭所有位码
- MOV DPTR,#CSTAB;字段码表首址送DPTR
- MOV R1,#40H
- MOV A,@R1
- MOVC A,@A+DPTR
- MOV P1,A
- CLR P3.4
- CLR P3.7 ;Y2=0,K1=1
- ACALL DL2MS ;小数
- SETB P3.4
- SETB P3.7
- INC R1
- MOV A,@R1
- MOVC A,@A+DPTR
- ANL A,#7FH ;个位小数点亮 数码管的Dp段点亮,其他段跟随A中的值
- MOV P1,A
- CLR P3.7 ;Y3=0,K2=1
- ACALL DL2MS ;个位
- SETB P3.7
-
- INC R1
- MOV A,@R1
- MOVC A,@A+DPTR
- MOV P1,A
- CLR P3.4 ;Y3=0,K3=1
- CLR P3.5
- ACALL DL2MS ;十位
- SETB P3.4
- SETB P3.5
- INC R1
- MOV A,@R1
- MOVC A,@A+DPTR
- MOV P1,A
- CLR P3.4 ;Y6=0,K4=1
- ACALL DL2MS ;百位
- SETB P3.4
- RET
- ;*************************上下限判断子程序**************************
- MAXorMIN: PUSH ACC
- JNB F0,MIN
- MAX: MOV A,43H ;正温度时,判断是否超过上限100℃
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
温度上下限 (4).zip
(2.29 MB, 下载次数: 56)
|