📄 ds18b20.lst
字号:
C51 COMPILER V7.09 DS18B20 08/06/2005 09:34:15 PAGE 1
C51 COMPILER V7.09, COMPILATION OF MODULE DS18B20
OBJECT MODULE PLACED IN DS18B20.OBJ
COMPILER INVOKED BY: d:\Keil\C51\BIN\C51.EXE DS18B20.c BROWSE DEBUG OBJECTEXTEND
line level source
1 #include<reg52.h>
2 #include<string.h>
3 #include <intrins.h>
4 #include<stdio.h>
5 #include<math.h>
6 #define uchar unsigned char
7 #define uint unsigned int
8 typedef unsigned char byte;
9 typedef unsigned int word;
10 //***********************************************//
11 sbit DQ=P0^0; //温度信号输入,根据实际情况定义端口
12 sbit da=P2^0;
13 sbit clk=P2^1;
14 sbit adra=P2^2;
15 sbit adrb=P2^3;
16 bit compare;
17 uchar value;
18 uchar data DD[4];
19 //*********函数声明****************//
20 void delay(word useconds);
21 void sdelay();
22 void disp(uint value);
23 chage1(uint temp);
24 chage2(uint temp);
25 display(uchar val);
26 //****************ds18b20延时***********************//
27 void delay(word useconds)
28 {
29 1 for(;useconds>0;useconds--);
30 1 }
31
32 //********DS18B20初始化子程序***********************//
33 byte ow_reset(void)
34 {
35 1 byte presence;
36 1 DQ = 0; //pull DQ line low
37 1 delay(29); // leave it low for 480us
38 1 DQ = 1; // allow line to return high
39 1 delay(3); // wait for presence
40 1 presence = DQ; // get presence signal
41 1 delay(25); // wait for end of timeslot
42 1 return(presence); // presence signal returned
43 1 } // 0=presence, 1 = no part
44
45 //从 1-wire 总线上读取一个字节
46 byte read_byte(void)
47 {
48 1 byte i;
49 1 byte value = 0;
50 1 for (i=8;i>0;i--)
51 1 {
52 2 value>>=1;
53 2 DQ = 0; // pull DQ low to start timeslot
54 2 DQ = 1; // then return high
55 2 delay(1); //for (i=0; i<3; i++);
C51 COMPILER V7.09 DS18B20 08/06/2005 09:34:15 PAGE 2
56 2 if(DQ)value|=0x80;
57 2 delay(6); // wait for rest of timeslot
58 2 }
59 1 return(value);
60 1 }
61
62 //向 1-WIRE 总线上写一个字节
63 void write_byte(char val)
64 {
65 1 byte i;
66 1 for (i=8; i>0; i--) // writes byte, one bit at a time
67 1 {
68 2 DQ = 0; // pull DQ low to start timeslot
69 2 DQ = val&0x01;
70 2 delay(5); // hold value for remainder of timeslot
71 2 DQ = 1;
72 2 val=val/2;
73 2 }
74 1 delay(5);
75 1 }
76
77 /***读取温度
78 char Read_Temperature(void)
79 {
80 union{
81 byte c[2];
82 int x;
83 }temp;
84
85 ow_reset();
86 write_byte(0xCC); // Skip ROM
87 write_byte(0xBE); // Read Scratch Pad
88 temp.c[1]=read_byte();
89 temp.c[0]=read_byte();
90 ow_reset();
91 write_byte(0xCC); //Skip ROM
92 write_byte(0x44); // Start Conversion
93 return(temp.x/2);
94 }
95
96 //*********读取温度*************/
97 char Read_Temperature(void)
98 {
99 1 uchar a=0;
100 1 uchar b=0;
101 1 uint t=0;
102 1 //float tt=0;
103 1 ow_reset();
104 1 write_byte(0xCC); //跳过读序号列号的操作
105 1 write_byte(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度
106 1 a=read_byte();
107 1 b=read_byte();
108 1 t=b;
109 1 t<<=8;
110 1 t=t|a;
111 1 //tt=t*0.0625;
112 1 ow_reset();
113 1 write_byte(0xCC); // 跳过读序号列号的操作
114 1 write_byte(0x44); // 启动温度转换
115 1 return(t);
116 1 }
117 //****led显示程序*****//
C51 COMPILER V7.09 DS18B20 08/06/2005 09:34:15 PAGE 3
118
119 char code seg[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,
120 0x77,0x7f,0x35,0x3f,0x75,0x71};
121 void disp(uint value)
122 {uint temp;
123 1 temp=value;
124 1 if(temp>0x270f)compare=1;
125 1 else compare=0;
126 1 if(compare==0){
127 2 chage1(temp);
128 2 DD[0]=seg[DD[0]];
129 2 DD[1]=seg[DD[1]];
130 2 DD[2]=seg[DD[2]];
131 2 DD[3]=seg[DD[3]];
132 2 adra=0,adrb=0;
133 2 display(DD[0]);
134 2 adra=1,adrb=0;
135 2 display(DD[1]);
136 2 adra=0,adrb=1;
137 2 display(DD[2]);
138 2 adra=1,adrb=1;
139 2 display(DD[3]);
140 2 }
141 1 if(compare==1){chage2(temp);
142 2 adra=1,adrb=1;
143 2 display(DD[3]);
144 2 adra=0,adrb=1;
145 2 display(DD[2]);
146 2 adra=1,adrb=0;
147 2 display(DD[1]);
148 2 adra=0,adrb=0;
149 2 display(DD[0]);}
150 1 }
151 //***********LED延时子程序****************************//
152 void sdelay(void)
153 {uint t;
154 1 t=0x180;
155 1 while(t--);
156 1 }
157 //***************************************//
158 chage1(uint temp)
159 {
160 1 DD[0]=(int)(temp/1000);
161 1 DD[1]=(int)((temp-DD[0]*1000)/100);
162 1 DD[2]=(int)((temp-DD[0]*1000-DD[1]*100)/10);
163 1 DD[3]=(int)(temp-DD[0]*1000-DD[1]*100-DD[2]*10);
164 1 }
165 //****************************************//
166 chage2(uint temp)
167 {
168 1 temp=0;
169 1 DD[0]=0x71;
170 1 DD[1]=0x3E;
171 1 DD[2]=0x38;
172 1 DD[3]=0x38;
173 1 }
174 //****************************************//
175 display(uchar val)
176 {uchar i;
177 1 bit bin;
178 1 for(i=8;i>0;i--)
179 1 {bin=val&0x80;
C51 COMPILER V7.09 DS18B20 08/06/2005 09:34:15 PAGE 4
180 2 val = val<<1;
181 2 da=bin;
182 2 clk=0;
183 2 clk=1;
184 2 }
185 1 sdelay();
186 1 }
187 //**************************//
188 main()
189 {
190 1 uint temper;
191 1 ow_reset();
192 1 while(1){
193 2 temper=Read_Temperature();
194 2 (uint)temper=temper/16;
195 2 disp(temper);
196 2 }
197 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 525 ----
CONSTANT SIZE = 16 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 5 4
IDATA SIZE = ---- ----
BIT SIZE = 1 1
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -