📄 ds18b20zibian.lst
字号:
C51 COMPILER V7.07 DS18B20ZIBIAN 02/06/2009 15:27:44 PAGE 1
C51 COMPILER V7.07, COMPILATION OF MODULE DS18B20ZIBIAN
OBJECT MODULE PLACED IN ds18b20zibian.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE ds18b20zibian.c BROWSE DEBUG OBJECTEXTEND
stmt level source
1 #include <reg51.h>
2 #include <intrins.h>//装载
3 #define uchar unsigned char
4 #define uint unsigned int
5
6 //sbit dq=P3^5;
7 sbit DATA=P1^0;
8 sbit CLK=P1^1;
9 sbit DQ=P3^5;
10 sbit TEST=P3^4;
11
12 uchar SEG7[10]={0x03,0x9f,0x25,0x0d,0x99,0x49,0x41,0x1f,0x01,0x09};/*0~9的数码管段码*/
13
14 uchar act[2]={0x01,0x02};//02位数码管位码;
15 unsigned int tens,units,decile,tmp;
16 float tmprt;
17 bit flag_init=0;
18
19 void send164(uchar m);
20 void dis_time(uchar m);
21 void init_timer0(void);
22 uchar discnt;
23 uchar read_temp;
24 uint time_cnt;
25 uchar temp1,temp2,temp;
26
27 void init_timer0(void)
28 {
29 1 TMOD=0X11;
30 1 TH0=0xF4;TL0=0x48;TH1=0X3C;TL1=0XAF;
31 1
32 1 ET0=1;
33 1 ET1=1;
34 1 TR1=1;TR0=1;EA=1;
35 1 }
36 void time1(void) interrupt 3 //50ms
37 {//uchar temp1,temp2,temp;
38 1 TH1=0X3C;TL1=0XAF;
39 1 time_cnt++; // gettempTS();
40 1 if(time_cnt>=20) // 50毫秒计时时间到,读PCF8583的各寄存器的值
41 1 { read_temp=1;
42 2 time_cnt=0;
43 2
44 2 }
45 1
46 1 }
47 ///////*****************显示子函数*******************////////
48 void send164(uchar m)
49 {uchar k,i,b;
50 1 k=SEG7[m];
51 1 i=8;
52 1 CLK=0;
53 1 while (i--)
54 1 {b=k>>i;
55 2 if((b&0x01)==0x01)DATA=1;//判断b的最低位的值是多少
C51 COMPILER V7.07 DS18B20ZIBIAN 02/06/2009 15:27:44 PAGE 2
56 2 else DATA=0;
57 2 CLK=1;
58 2 CLK=0;
59 2 }
60 1
61 1 }
62
63
64 void dis_time(uchar m)
65 {
66 1 //P1&=0XC3;/// 等价于 P1=P1&0xc3;;准备送段码 ,位码口全部清零
67 1 P2=0X00;////准备送段码,位码口全部清零
68 1 {switch(m)
69 2 {case 0:{send164(temp/10);P2=act[m];}break;//P1&=0XC3;
70 3 case 1:{send164(temp%10);P2=act[m];}break;//P1&=0XC3;
71 3
72 3 default:break;}
73 2 }
74 1
75 1 }
76
77 ////******************定时器中断服务程序**************************/////
78 void time0(void) interrupt 1
79 {
80 1 TH0=0xFa;TL0=0x24;//TH0=0xF4;TL0=0x48;
81 1 dis_time(discnt);//}// 显示温度
82 1 discnt++;
83 1 if(discnt>1)discnt=0;// 显示为12位数码管
84 1
85 1
86 1 }
87
88 void Delay_uS(unsigned int tt) //延时时间为(tt*9+16)us.晶振为12MHz
89 {
90 1 while(tt--)
91 1 ;
92 1 }
93
94 void delay15us(void)
95 {
96 1 _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_n
-op_();_nop_();
97 1 }
98 void Delay1mS(unsigned int tt) //延时时间为tt ms.晶振为12MHz
99 {
100 1 unsigned char i;
101 1 while(tt--)
102 1 for(i=113;i>0;i--)
103 1 ;
104 1 }
105
106 void DS18B20_init(void)
107 { uint i;
108 1 start: DQ=1;
109 1 _nop_();
110 1 DQ=0;
111 1 for(i=0;i<8;i++){delay15us();delay15us();delay15us();delay15us();delay15us();}
112 1 //Delay_uS(54);
113 1 DQ=1;
114 1 delay15us();delay15us(); //Delay_uS(4);
115 1 while(DQ)
116 1 {
C51 COMPILER V7.07 DS18B20ZIBIAN 02/06/2009 15:27:44 PAGE 3
117 2 i++;
118 2 if(i>2000)
119 2 {goto start;
120 3 }
121 2 }
122 1 DQ=1;
123 1 for(i=0;i<8;i++){delay15us();delay15us();delay15us();delay15us();}//Delay_uS(45);
124 1
125 1 }
126 /*void DS18B20_init(void)
127 {
128 flag_init=1; //初始化成功标志位,0为成功
129 DQ=1; //DQ复位
130 _nop_();
131 DQ=0; //拉低DQ
132 Delay_uS(58); //延时484us(此信号要求480us~960us)
133 DQ=1; //释放DQ
134 Delay_uS(5); //延时61us (在检测到 I/O 引脚上的上升沿之后DS18B20等待15us~60us并且接着发送存在脉冲60-240us
-的低电平信号)
135 while(DQ);
136 Delay_uS(25); //延时241us(DS18B20发送存在脉冲的低电平信号60~240us)
137 }
138 */
139 /*unsigned char Readonechar(void) //读一个字节
140 {
141 unsigned char i,dat=0;
142 for(i=8;i;i--)
143 {
144 DQ=0;
145 dat>>=1;
146 DQ=1;
147 if(DQ)
148 dat|=0x80;
149 Delay_uS(6);//延时61us(所有读时间片的最短持续期限为60us,各个读时间片之间必须有最短为1us的恢复时间)
150 }
151 return dat;
152 }
153 */
154 bit readTS(void) //读DS18B20数据位
155 {
156 1 bit b;
157 1 DQ=1;
158 1 DQ=0;
159 1 _nop_();_nop_();//_nop_();
160 1 DQ=1;
161 1 _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();//_nop_();_nop_();_nop_();_nop_();
-_nop_();_nop_();_nop_();
162 1 b=DQ;_nop_();_nop_();
163 1 DQ=1;
164 1 Delay_uS(5);//delay15us();delay15us();delay15us();delay15us();
165 1 //DQ=1;
166 1 return b;
167 1 }
168
169 /*uchar readBTS(void) //读1字节
170 {unsigned char i,dat=0;
171 bit b;
172 for(i=0;i<8;i++)
173 {
174 dat>>=1;
175 b=readTS();
176 if(b)
C51 COMPILER V7.07 DS18B20ZIBIAN 02/06/2009 15:27:44 PAGE 4
177 dat|=0x80;
178
179 }
180 return b;
181 }*/
182 uchar readBTS(void) //读1字节
183 {char i,j;
184 1 bit b;
185 1 uchar a;
186 1 j=0;
187 1 for(i=0;i<8;i++)
188 1 {
189 2 b=readTS();
190 2 if(b)j+=1;
191 2 j=_cror_(j,1);
192 2 }
193 1 a=(uchar)j;
194 1 return a;
195 1 }
196
197 void write0TS(void) //写DS18B20数据位0
198 {
199 1 DQ=1;
200 1 DQ=0;
201 1 Delay_uS(5);//delay15us();delay15us();delay15us();delay15us();delay15us(); delay15us();delay15us();
202 1 _nop_();_nop_();_nop_();_nop_();_nop_();
203 1 DQ=1;
204 1 _nop_();
205 1 _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
206 1 }
207 //********************************************************
208 void write1TS(void) //写DS18B20数据位1
209 {
210 1 DQ=1;
211 1 DQ=0;
212 1 _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
213 1 DQ=1;
214 1 //_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
215 1 Delay_uS(5);//delay15us();delay15us();delay15us();delay15us();delay15us();delay15us();delay15us();
216 1 }
217
218 void writeBTS(uchar byte) //写1字节
219 {uchar i;
220 1 for(i=0;i<8;i++)
221 1 {
222 2 if(byte&0x01)
223 2 write1TS();
224 2 else
225 2 write0TS();
226 2 byte=byte>>1;
227 2 }
228 1 }
229
230 /*void Writeonechar(unsigned char dat) //写一个字节
231 {
232 unsigned char i;
233 for(i=8;i;i--)
234 {
235 DQ=0;
236 DQ=dat&0x01;
237 Delay_uS(5); //延时61us(在I/O线由高电平变为低电平之后DS1820在15us~60us之间对 I/O 线采样)
238 DQ=1;
C51 COMPILER V7.07 DS18B20ZIBIAN 02/06/2009 15:27:44 PAGE 5
239 dat>>=1;
240 }
241 }
242 */
243 /*void Readtemperature(void)
244 {
245 tens=0;units=0;decile=0;tmp=0;
246 tmprt=0;
247 DS18B20_init();
248 Writeonechar(0xcc);// 跳过读序列号的操作
249 Writeonechar(0x44);// 启动温度转换
250 Delay1mS(100);
251 DS18B20_init();
252 Writeonechar(0xcc);//跳过读序号列号的操作
253 Writeonechar(0xbe);//读取温度寄存器
254
255 units=Readonechar();//读低八位
256 tens=Readonechar(); //读高八位
257
258 tens<<=8;
259 tens|=units; //高低位合并
260 tmprt=tens*0.0625; //计算温度值
261 tmp=tmprt*10+0.5; //放大10倍输出并四舍五入
262
263 tens=tmp/100; //十位
264 units=tmp/10%10; //个位
265 temp1=(uchar)units;
266 temp2=(uchar)tens;
267 decile=tmp%10; //小数位
268 }*/
269
270 void gettempTS(void) //读取测得的环境温度
271 {uchar a,b;
272 1 DS18B20_init();
273 1 writeBTS(0xcc);
274 1 writeBTS(0x44);
275 1 Delay1mS(700);
276 1 DS18B20_init();
277 1 writeBTS(0xcc);
278 1 writeBTS(0xbe);
279 1 temp2=readBTS();_nop_();_nop_();
280 1 temp1=readBTS();
281 1 readBTS();readBTS();readBTS();readBTS();
282 1 readBTS();readBTS();readBTS();
283 1 a=(temp2&0xf0)>>4;
284 1 b=(temp1&0x07)<<4;
285 1 temp=a|b;
286 1 /*temp1=temp1<<4;
287 1 temp1+=(temp2&0xf0)>>4;
288 1 temp2=(temp2&0x0f)?5:0;*/
289 1 }
290
291 //********主函数*********
292 void main(void)
293 {
294 1 Delay1mS(100);
295 1 init_timer0();//初始化定时器T0
296 1 Delay1mS(900);
297 1 DS18B20_init(); //温度传感器DS18B20初始化
298 1 temp=2;
299 1 while(1)
300 1 {
C51 COMPILER V7.07 DS18B20ZIBIAN 02/06/2009 15:27:44 PAGE 6
301 2 { if( read_temp==1)
302 3 //read_temp=0;//TEST=~TEST;
303 3 { gettempTS(); read_temp=0;} //读DS18B20检测到的温度Delay1mS(600);
304 3 }
305 2 //Display();
306 2 }
307 1 /*while(1)
308 1 {
309 1
310 1 if( read_temp==1)
311 1 {
312 1 read_temp=0;TEST=~TEST;}
313 1 tmstart(); // ds1820开始转换
314 1 dmsec(2);
315 1 temp1=tmrtemp(); // 读取温度
316 1
317 1
318 1 if(read_temp==1)
319 1 {//temp1=34;gettempTS();
320 1
321 1 read_temp=0;
322 1 }
323 1
324 1 }*/
325 1 }
326
327
328
329
330
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 603 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 31 ----
IDATA SIZE = ---- ----
BIT SIZE = 1 2
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -