标题:
基于51单片机的DS18b20数字温度计(汇编)(原程序+protues仿真)
[打印本页]
作者:
韩国电风扇
时间:
2019-6-10 11:20
标题:
基于51单片机的DS18b20数字温度计(汇编)(原程序+protues仿真)
程序编写使用的是汇编语言,还有一些小问题,就是调温之后显示的温度值不改变,需要按几下复位键之后显示才会改变。
单片机源程序如下:
TEMPER_L EQU 36H ;存放读出温度低位数据
TEMPER_H EQU 35H ;存放读出温度高位数据
TEMPER_NUM EQU 60H ;存放转换后的温度值
FLAG1 BIT 00H
DQ BIT P3.2 ;一线总线控制端口
ORG 0000H
LJMP MAIN
ORG 0100H
MAIN:
MOV SP,#70H
LCALL GET_TEMPER ;从DS18B20读出温度数据
LCALL TEMPER_COV ;转换读出的温度数据并保存
LCALL SHUJU
LCALL HEX2BCD
LCALL LOOP
LCALL DISPLAY
LCALL TAB
SJMP [ DISCUZ_CODE_3 ]nbsp; ;完成一次数字温度采集
;-------读出转换后的温度值
GET_TEMPER:
SETB DQ ; 定时入口
BCD: LCALL INIT_1820
JB FLAG1,S22
LJMP BCD ; 若DS18B20不存在则返回
S22: LCALL DELAY1
MOV A,#0CCH ; 跳过ROM匹配------0CC
LCALL WRITE_1820
MOV A,#44H ; 发出温度转换命令
LCALL WRITE_1820
NOP
LCALL DELAY
LCALL DELAY
CBA: LCALL INIT_1820
JB FLAG1,ABC
LJMP CBA
ABC: LCALL DELAY1
MOV A,#0CCH ; 跳过ROM匹配
LCALL WRITE_1820
MOV A,#0BEH ; 发出读温度命令
LCALL WRITE_1820
LCALL READ_18200 ;READ_1820
RET
;-------读DS18B20的程序,从DS18B20中读出一个字节的数据
READ_1820:
MOV R2,#8
RE1: CLR C
SETB DQ
NOP
NOP
CLR DQ
NOP
NOP
NOP
SETB DQ
MOV R3,#7
DJNZ R3,$
MOV C,DQ
MOV R3,#23
DJNZ R3,$
RRC A
DJNZ R2,RE1
RET
;-------写DS18B20的程序
WRITE_1820:
MOV R2,#8
CLR C
WR1: CLR DQ
MOV R3,#6
DJNZ R3,$
RRC A
MOV DQ,C
MOV R3,#23
DJNZ R3,$
SETB DQ
NOP
DJNZ R2,WR1
SETB DQ
RET
;-------读DS18B20的程序,从DS18B20中读出两个字节的温度数据
READ_18200:
MOV R4,#2 ; 将温度高位和低位从DS18B20中读出
MOV R1,#36H ; 低位存入36H(TEMPER_L),高位存入35H(TEMPER_H)
RE00: MOV R2,#8
RE01: CLR C
SETB DQ
NOP
NOP
CLR DQ
NOP
NOP
NOP
SETB DQ
MOV R3,#7
DJNZ R3,$
MOV C,DQ
MOV R3,#23
DJNZ R3,$
RRC A
DJNZ R2,RE01
MOV @R1,A
DEC R1
DJNZ R4,RE00
RET
;-------将从DS18B20中读出的温度数据进行转换
TEMPER_COV:
MOV A,#0F0H
ANL A,TEMPER_L ; 舍去温度低位中小数点后的四位温度数值
SWAP A
MOV TEMPER_NUM,A
MOV A,TEMPER_L
JNB ACC.3,TEMPER_COV1 ; 四舍五入去温度值
INC TEMPER_NUM
TEMPER_COV1:
MOV A,TEMPER_H
ANL A,#07H
SWAP A
ADD A,TEMPER_NUM
MOV TEMPER_NUM,A ; 保存变换后的温度数据
RET
;-------DS18B20初始化程序
INIT_1820:
CLR DQ
MOV R0,#0FBH
TSR1: DJNZ R0,TSR1 ; 延时
SETB DQ
MOV R0,#25H ;96US-25H
TSR2: DJNZ R0,TSR2
TSR3: SETB FLAG1 ; 置标志位,表示DS1820存在
TSR6: DJNZ R0,TSR6 ; 延时
TSR7: SETB DQ
RET
;-------重新写DS18B20暂存存储器设定值
RE_CONFIG:
JB FLAG1,RE_CONFIG1 ; 若DS18B20存在,转RE_CONFIG1
RET
RE_CONFIG1:
MOV A,#0CCH ; 发SKIP ROM命令
LCALL WRITE_1820
MOV A,#4EH ; 发写暂存存储器命令
LCALL WRITE_1820
MOV A,#00H ; TH(报警上限)中写入00H
LCALL WRITE_1820
MOV A,#00H ; TL(报警下限)中写入00H
LCALL WRITE_1820
MOV A,#7FH ; 选择12位温度分辨率
LCALL WRITE_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
SHUJU:
MOV R0, #0H
MOV R1, TEMPER_NUM
CALL HEX2BCD ;调用子程序把R0 R1中的数字,转换成BCD码,送到R2 R3 R4;-------下面,把万千百十个位,分别存入R4 R3 R2 R1 R0
MOV A, R4
MOV B, #16
DIV AB ;除以16,目的是分离出高、低四位
MOV 42H, A ;存放十位
MOV 43H, B ;存放个位;
MOV A, R2
MOV R4, A ;存放万位;
MOV A, R3
MOV B, #16
DIV AB
MOV 40H, A
MOV 41H, B
SJMP DISPLAY
HEX2BCD: CLR A ;把R0 R1中的数字,转换成BCD码,送到R2 R3 R4
MOV R2, A ;先清零
MOV R3, A
MOV R4, A
MOV R5, #16 ;共转换十六位数
LOOP: CLR C
MOV A,R1 ;从待转换数的高端移出一位到Cy
RLC A
MOV R1,A
MOV A, R0 ;搜索
RLC A
MOV R0,A
MOV A,R4 ;送到BCD码的低端
ADDC A,R4 ;带进位加。自身相加,相当于左移一位
DA A ;十进制调整,变成BCD码
MOV R4,A
MOV A,R3
ADDC A,R3
DA A
MOV R3,A
MOV A,R2
ADDC A,R2
MOV R2, A
DJNZ R5, LOOP ;共转换十六位数
RET
DISPLAY:MOV R1,#40H
INC R1
INC R1
MOV R5,#0F1H
MOV A,R5
MOV P0,#0FFH
MOV P2,A
MOV A,@R1
MOV DPTR,#TAB
MOVC A,@A+DPTR
MOV P0,A
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
INC R1
MOV R5,#0F2H
MOV A,R5
MOV P0,#0FFH
MOV P2,A
MOV A,@R1
MOV DPTR,#TAB
MOVC A,@A+DPTR
MOV R2,#80H
ADD A,R2
MOV P0,A
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
AJMP DISPLAY
TAB: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,0FFH,88H,0BFH
END
复制代码
所有资料51hei提供下载:
由于有会员测试打不开,已经被管理删除
作者:
筱豆先生
时间:
2019-11-15 13:58
给的仿真文件打开之后是损坏的,资料无用
作者:
133456789
时间:
2021-3-23 16:14
可惜没有仿真图
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1