📄 ds18b20.lst
字号:
C51 COMPILER V6.12 DS18B20 09/21/2005 16:38:00 PAGE 1
C51 COMPILER V6.12, COMPILATION OF MODULE DS18B20
OBJECT MODULE PLACED IN G:\C51PRJ\TMPLED\DS18B20.OBJ
COMPILER INVOKED BY: e:\keil\c51\BIN\C51.EXE G:\C51PRJ\TMPLED\DS18B20.C DB SB OE
stmt level source
1 /****************************************************************************/
2 /* */
3 /* Copyright (c) 2005, 老树工作室 */
4 /* All rights reserved. */
5 /* */
6 /* http://www.saintone.net Email:hxm0902@163.com */
7 /* QQ:112431149 Tel:010-62966630 */
8 /* */
9 /****************************************************************************/
10 /****************************************************************************/
11 /* 文件名:ds18b20.c */
12 /* 版 本:Version 1.0 */
13 /* 描 述:在数码管上显示ds18b20测出的温度值 */
14 /* 作 者:spot */
15 /* 函 数: */
16 /* delay_18b20 */
17 /* ow_reset */
18 /* read_bit */
19 /* write_bit */
20 /* read_byte */
21 /* write_byte */
22 /* get_temperature */
23 /* */
24 /* 历史记录: */
25 /* spot 2005-07-15 Creat Inital version. (Version 1.0) */
26 /****************************************************************************/
27
28 #include <reg52.h>
29 #include <absacc.h>
30 #include <intrins.h>
31 #include "../includes/types.h"
32
33 #define ERR 0xffff;
34
35 sbit DQ = P0^3;
36
37 /* 函数声明 */
38 bit ow_reset(void); /* 初始化DS18B20子程序 */
39 bit read_bit(void); /* 从DS18B20读出1位 */
40 void write_bit(u_char bitval); /* 向DS18B20写入1位 */
41 u_char read_byte(void); /* 从DS18B20读出1个字节 */
42 void write_byte(u_char val); /* 向DS18B20写入1个字节 */
43 u_int get_temperature(void); /* 读取温度子程序 */
44 void display_temperature(u_int current_tempreature);/* 在数码管上显示当前温度 */
45 extern void load_number(u_char number, bit dp);
46 extern void send_latch_clock(void);
47 extern void clear_led(void);
48 /* 声明结束 */
49
50 /* 延时子程序 */
51 void delay_18b20 (u_int us)
52 {
53 1 while (us--);
54 1 }
55
C51 COMPILER V6.12 DS18B20 09/21/2005 16:38:00 PAGE 2
56 /* 初始化DS18B20子程序 */
57 bit ow_reset(void)
58 {
59 1 bit presence = 0;
60 1 DQ = 1;
61 1 DQ = 0;
62 1 delay_18b20(80); /* 保持低电平480μs以上 */
63 1 DQ = 1;
64 1 delay_18b20(13); /* 等待DS18B20响应 */
65 1 presence = DQ;
66 1
67 1 return presence;
68 1 }
69
70 /* 从DS18B20读出1位 */
71 bit read_bit(void)
72 {
73 1 DQ = 0;
74 1 delay_18b20(0); /* 保持低电平1us以上 */
75 1 DQ = 1;
76 1
77 1 if(DQ)
78 1 {
79 2 return 1;
80 2 }
81 1 else
82 1 {
83 2 return 0;
84 2 }
85 1 }
86
87 /* 向DS18B20写入1位 */
88 void write_bit(u_char bitval)
89 {
90 1 DQ = 0;
91 1 delay_18b20(0); /* 主机在大于1us小于15us之内写数据 */
92 1 if(bitval)
93 1 {
94 2 DQ = 1;
95 2 }
96 1 delay_18b20(9); /* DS18B20在15us到60us内采样数据 */
97 1
98 1 DQ = 1;
99 1 }
100
101 /* 从DS18B20读出1个字节 */
102 u_char read_byte(void)
103 {
104 1 u_char i;
105 1 u_char value = 0;
106 1
107 1 for (i = 0; i < 8; i++)
108 1 {
109 2 if(read_bit())
110 2 {
111 3 value |= (0x01<<i);
112 3 }
113 2 delay_18b20(9); /* 读时序至少60us */
114 2 }
115 1 return(value);
116 1 }
117
C51 COMPILER V6.12 DS18B20 09/21/2005 16:38:00 PAGE 3
118 /* 向DS18B20写入1个字节 */
119 void write_byte(u_char val)
120 {
121 1 u_char i;
122 1 u_char temp;
123 1
124 1 for (i = 0; i < 8; i++) /* 从LSB开始写入,每次写1位 */
125 1 {
126 2 temp = val>>i;
127 2 temp &= 0x01;
128 2 write_bit(temp);
129 2 }
130 1 }
131
132 /* 读取温度子程序 */
133 u_int get_temperature(void)
134 {
135 1 u_char tempture_msb;
136 1 u_char tempture_lsb;
137 1 u_int temperature = 0;
138 1
139 1 ow_reset(); /* 发送复位信号 */
140 1 delay_18b20(20);
141 1 write_byte(0xcc); /* 跳过ROM */
142 1 write_byte(0x44); /* 发送转换温度命令 */
143 1 ow_reset();
144 1 delay_18b20(14);
145 1 write_byte(0xcc);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -