程序编写使用的是汇编语言,还有一些小问题,就是调温之后显示的温度值不改变,需要按几下复位键之后显示才会改变。
单片机源程序如下:
- 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提供下载:
由于有会员测试打不开,已经被管理删除
|