📄 ds18b20.lst
字号:
C51 COMPILER V7.02a DS18B20 08/21/2008 20:02:18 PAGE 1
C51 COMPILER V7.02a, COMPILATION OF MODULE DS18B20
OBJECT MODULE PLACED IN ds18b20.OBJ
COMPILER INVOKED BY: D:\keil c702\C51\BIN\C51.EXE ds18b20.c BROWSE DEBUG OBJECTEXTEND
stmt level source
1 #include <reg52.h>
2 #include <intrins.h>
3
4 #define uchar unsigned char
5
6 #define uint unsigned int
7
8 sbit DS=P3^3; //定义DS18B20接口
9
10 int temp;
11
12 uchar flag1;
13
14 void display(unsigned char *lp,unsigned char lc);//数字的显示函数;lp为指向数组的地址,lc为显示的个数
15
16 void delay();//延时子函数,5个空指令
17
18 code unsigned char table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40,0x08,0x00};
19 //共阴数码管 0-9 - _ 空 表
20
21 unsigned char l_tmpdate[8]={0,0,10,0,0,0,0,0};//定义数组变量,并赋值1,2,3,4,5,6,7,8,就是本程序显示
-的八个数
22 int tmp(void);
23 void tmpchange(void);
24 void tmpwritebyte(uchar dat);
25 uchar tmpread(void);
26 bit tmpreadbit(void);
27 void dsreset(void);
28 void delayb(uint count);
29
30
31 void main() //主函数
32
33 {
34 1 uchar i;
35 1 int l_tmp;
36 1 while(1)
37 1 {
38 2 tmpchange(); //温度转换
39 2 l_tmp=tmp();
40 2 if(l_tmp<0)
41 2 l_tmpdate[0]=10; //判断温度为负温度,前面加"-"
42 2 else
43 2 {
44 3 l_tmpdate[0]=temp/1000; //显示百位,这里用1000,是因为我们之前乖以10位了
45 3 if(l_tmpdate[0]==0)
46 3 l_tmpdate[0]=12;//判断温度为正温度且没有上百,前面不显示
47 3 }
48 2 l_tmp=temp%1000;
49 2 l_tmpdate[1]=l_tmp/100;//获取十位
50 2 l_tmp=l_tmp%100;
51 2 l_tmpdate[2]=l_tmp/10;//获取个位
52 2 l_tmpdate[3]=11;
53 2 l_tmpdate[4]=l_tmp%10;//获取小数第一位
54 2
C51 COMPILER V7.02a DS18B20 08/21/2008 20:02:18 PAGE 2
55 2 for(i=0;i<10;i++){ //循环输出10次,提高亮度
56 3 display(l_tmpdate,5);
57 3
58 3 }
59 2 }
60 1
61 1
62 1 }
63
64 void display(unsigned char *lp,unsigned char lc)//显示
65 {
66 1 unsigned char i; //定义变量
67 1 P2=0; //端口2为输出
68 1 P1=P1&0xF8; //将P1口的前3位输出0,对应138译门输入脚,全0为第一位数码管
69 1 for(i=0;i<lc;i++){ //循环显示
70 2 P2=table[lp[i]]; //查表法得到要显示数字的数码段
71 2 delay(); //延时5个空指令
72 2 if(i==7) //检测显示完8位否,完成直接退出,不让P1口再加1,否则进位影响到第四位数据
73 2 break;
74 2 P2=0; //清0端口,准备显示下位
75 2 P1++; //下一位数码管
76 2 }
77 1 }
78 void delay(void) //空5个指令
79 {
80 1 _nop_();_nop_();_nop_();_nop_();_nop_();
81 1 }
82 void delayb(uint count) //delay
83
84 {
85 1
86 1 uint i;
87 1
88 1 while(count)
89 1
90 1 {
91 2
92 2 i=200;
93 2
94 2 while(i>0)
95 2
96 2 i--;
97 2
98 2 count--;
99 2
100 2 }
101 1
102 1 }
103
104
105 void dsreset(void) //DS18B20初始化
106
107 {
108 1
109 1 uint i;
110 1
111 1 DS=0;
112 1
113 1 i=103;
114 1
115 1 while(i>0)i--;
116 1
C51 COMPILER V7.02a DS18B20 08/21/2008 20:02:18 PAGE 3
117 1 DS=1;
118 1
119 1 i=4;
120 1
121 1 while(i>0)i--;
122 1
123 1 }
124
125
126
127 bit tmpreadbit(void) // 读一位
128
129 {
130 1
131 1 uint i;
132 1
133 1 bit dat;
134 1
135 1 DS=0;i++; //小延时一下
136 1
137 1 DS=1;i++;i++;
138 1
139 1 dat=DS;
140 1
141 1 i=8;while(i>0)i--;
142 1
143 1 return (dat);
144 1
145 1 }
146
147
148
149 uchar tmpread(void) //读一个字节
150
151 {
152 1
153 1 uchar i,j,dat;
154 1
155 1 dat=0;
156 1
157 1 for(i=1;i<=8;i++)
158 1
159 1 {
160 2
161 2 j=tmpreadbit();
162 2
163 2 dat=(j<<7)|(dat>>1); //读出的数据最低位在最前面,这样刚好//一个字节在DAT里
164 2
165 2 }
166 1
167 1 return(dat); //将一个字节数据返回
168 1
169 1 }
170
171
172
173 void tmpwritebyte(uchar dat)
174
175 { //写一个字节到DS18B20里
176 1
177 1 uint i;
178 1
C51 COMPILER V7.02a DS18B20 08/21/2008 20:02:18 PAGE 4
179 1 uchar j;
180 1
181 1 bit testb;
182 1
183 1 for(j=1;j<=8;j++)
184 1
185 1 {
186 2
187 2 testb=dat&0x01;
188 2
189 2 dat=dat>>1;
190 2
191 2 if(testb) // 写1部分
192 2
193 2 {
194 3
195 3 DS=0;
196 3
197 3 i++;i++;
198 3
199 3 DS=1;
200 3
201 3 i=8;while(i>0)i--;
202 3
203 3 }
204 2
205 2 else
206 2
207 2 {
208 3
209 3 DS=0; //写0部分
210 3
211 3 i=8;while(i>0)i--;
212 3
213 3 DS=1;
214 3
215 3 i++;i++;
216 3
217 3 }
218 2
219 2 }
220 1
221 1 }
222
223
224
225 void tmpchange(void) //发送温度转换命令
226
227 {
228 1
229 1 dsreset(); //初始化DS18B20
230 1
231 1 delayb(1); //延时
232 1
233 1 tmpwritebyte(0xcc); // 跳过序列号命令
234 1
235 1 tmpwritebyte(0x44); //发送温度转换命令
236 1
237 1 }
238
239 int tmp() //获得温度
240
C51 COMPILER V7.02a DS18B20 08/21/2008 20:02:18 PAGE 5
241 {
242 1
243 1 float tt;
244 1
245 1 uchar a,b;
246 1
247 1 dsreset();
248 1
249 1 delayb(1);
250 1
251 1 tmpwritebyte(0xcc);
252 1
253 1 tmpwritebyte(0xbe); //发送读取数据命令
254 1
255 1 a=tmpread(); //连续读两个字节数据
256 1
257 1 b=tmpread();
258 1
259 1 temp=b;
260 1
261 1 temp<<=8;
262 1
263 1 temp=temp|a; //两字节合成一个整型变量。
264 1
265 1 tt=temp*0.0625; //得到真实十进制温度值,因为DS18B20
266 1
267 1 //可以精确到0.0625度,所以读回数据的最低位代表的是
268 1
269 1 //0.0625度。
270 1
271 1 temp=tt*10+0.5; //放大十倍,这样做的目的将小数点后第一位
272 1
273 1 //也转换为可显示数字,同时进行一个四舍五入操作。
274 1
275 1 return temp; //返回温度值
276 1
277 1 }
278
279 void readrom() //read the serial 读取温度传感器的序列号
280
281 { //本程序中没有用到此函数
282 1
283 1 uchar sn1,sn2;
284 1
285 1 dsreset();
286 1
287 1 delayb(1);
288 1
289 1 tmpwritebyte(0x33);
290 1
291 1 sn1=tmpread();
292 1
293 1 sn2=tmpread();
294 1
295 1 }
296
297 void delay10ms()
298 {
299 1
300 1 uchar a,b;
301 1
302 1 for(a=10;a>0;a--)
C51 COMPILER V7.02a DS18B20 08/21/2008 20:02:18 PAGE 6
303 1
304 1 for(b=60;b>0;b--);
305 1
306 1 }
307
308
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 547 ----
CONSTANT SIZE = 13 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 11 12
IDATA SIZE = ---- ----
BIT SIZE = ---- 2
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -