📄 18b20.lst
字号:
C51 COMPILER V8.02 18B20 01/17/2007 01:12:44 PAGE 1
C51 COMPILER V8.02, COMPILATION OF MODULE 18B20
OBJECT MODULE PLACED IN 18b20.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE 18b20.c BROWSE DEBUG OBJECTEXTEND
line level source
1 #include "system.h"
2 #include <INTRINS.H> //为调用nop空指令需要
3
4
5 sbit DQ = P3^7; //温度输入口
6 unsigned char c_b;
7 unsigned char c_b_c;
8 unsigned char n;
9
10 unsigned char data temp_data[2] = {0x00,0x00}; //读出温度暂放
11
12 /****************************延时函数*******************************/
13 void delay(unsigned int t)
14 {
15 1 for(;t > 0; t--);
16 1 }
17
18
19 /****************************DS18B20复位函数*******************************/
20 void ow_reset(void)
21 {
22 1 char presence = 1;
23 1 while (presence)
24 1 {
25 2 while (presence)
26 2 {
27 3 DQ = 1;
28 3
29 3 _nop_();
30 3 _nop_();
31 3
32 3 DQ = 0;
33 3 delay(50);
34 3
35 3 DQ = 1;
36 3 delay(6);
37 3
38 3 presence = DQ;
39 3 }
40 2 delay (45);
41 2 presence = ~DQ;
42 2 }
43 1 DQ = 1;
44 1 }
45
46
47
48
49 /****************************DS18B20写命令函数*******************************/
50 //向1-wire 总线上写一个字节
51 void write_byte(unsigned char val)
52 {
53 1 unsigned char i;
54 1 for(i = 8; i > 0; i--)
55 1 {
C51 COMPILER V8.02 18B20 01/17/2007 01:12:44 PAGE 2
56 2 DQ = 1;
57 2 _nop_();
58 2 _nop_();
59 2
60 2 DQ = 0; //延时5us
61 2 _nop_();
62 2 _nop_();
63 2 _nop_();
64 2 _nop_();
65 2 _nop_();
66 2
67 2 DQ = val & 0x01; //最低位益出
68 2 delay(6); //66us
69 2 val = val / 2; //右移一位
70 2 }
71 1 DQ = 1;
72 1 delay(1);
73 1 }
74
75
76 /****************************DS18B20读字节函数*******************************/
77 unsigned char read_byte(void)
78 {
79 1 unsigned char i;
80 1 unsigned char value = 0;
81 1
82 1 for(i = 8; i > 0; i--)
83 1 {
84 2 DQ = 1;;
85 2 _nop_();
86 2 _nop_();
87 2
88 2 value >>= 1;
89 2 DQ = 0; //4us
90 2 _nop_();
91 2 _nop_();
92 2 _nop_();
93 2 _nop_();
94 2
95 2 DQ = 1; //4us
96 2 _nop_();
97 2 _nop_();
98 2 _nop_();
99 2 _nop_();
100 2
101 2 if(DQ)
102 2 value |= 0x80;
103 2 delay(6); //66us
104 2 }
105 1 DQ = 1;
106 1 return (value);
107 1 }
108
109
110 /***************************读出温度函数******************************/
111 void read_temp()
112 {
113 1
114 1 ow_reset(); //总线复位
115 1 write_byte(0xCC); //发SKIP ROM命令
116 1 write_byte(0xBE); //发读命令
117 1 temp_data[0] = read_byte(); //温度低8位
C51 COMPILER V8.02 18B20 01/17/2007 01:12:44 PAGE 3
118 1 temp_data[1] = read_byte(); //温度高8位
119 1
120 1 n = temp_data[1]; //若n为1则为负温
121 1 if(n)
122 1 {
123 2 temp = (~temp_data[0]+1)/2; //如果为负温则去除其补码
124 2 }
125 1 else
126 1 {
127 2 temp = (temp_data[0])/2;
128 2 }
129 1
130 1 ow_reset();
131 1 write_byte(0xCC);
132 1 write_byte(0x44); //SKIP ROM
133 1 //发转换命令
134 1 }
135
136
137
138
139
140
141
142
143
144
145 /***************************温度数据处理函数******************************/
146 void work_temp()
147 {
148 1 if(temp_data[1] > 127)//负温度处理函数
149 1 {
150 2 temp_data[1] = (256-temp_data[1]); //负温度求补码
151 2 temp_data[3] = (256-temp_data[0]); //负温度求补码
152 2 display[3] = temp_data[3] & 0x0f;
153 2
154 2 display[4] = ((temp_data[0] & 0xf0 >> 4) | (temp_data[1] & 0x0f) << 4); //取出整数
155 2 if(display[4] < 10 & display[4] >= 0)
156 2 {
157 3 display[1] = display[4]/1;
158 3 display[2] = display[3]%10;
159 3 c_b_c = 1;
160 3 n = 1;
161 3 }
162 2 else
163 2 {
164 3 display[1] = display[4]/10;
165 3 display[2] = display[4]%10;
166 3 n = 1;
167 3 }
168 2 }
169 1 else
170 1 {
171 2 display[4] = ((temp_data[0] & 0xf0 >> 4) | (temp_data[1] & 0x0f) << 4); //取出整数
172 2 if(display[4] < 10 & display[4] >= 0)
173 2 {
174 3 display[0] = display[4]/1;
175 3
176 3 //小数位
177 3 display[1] = display[3]/10;
178 3 display[2] = display[3]%10;
179 3 c_b = 1;
C51 COMPILER V8.02 18B20 01/17/2007 01:12:44 PAGE 4
180 3 }
181 2 else
182 2 {
183 3 display[0] = display[4]/10;
184 3 display[1] = display[4]%10;
185 3
186 3 //小数位
187 3 display[2] = display[3]/10;
188 3 c_b_c = 1;
189 3 }
190 2 }
191 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 415 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 5 ----
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -