📄 ds18b20.lst
字号:
C51 COMPILER V7.00 DS18B20 11/14/2005 20:20:15 PAGE 1
C51 COMPILER V7.00, COMPILATION OF MODULE DS18B20
OBJECT MODULE PLACED IN ds18b20.OBJ
COMPILER INVOKED BY: D:\MCU\Keil51\C51\BIN\C51.EXE ds18b20.c ROM(SMALL) BROWSE DEBUG OBJECTEXTEND
stmt level source
1 #include <intrins.h>
2 #include <reg51.h>
3
4 //这里以11.0592M晶体为例,不同的晶体速度可能需要调整延时的时间
5 sbit DQ = P3^5;
6 unsigned char m_CRC(unsigned char CRC0,unsigned char InByt);
7
8 //延时
9 void delay(unsigned int useconds)
10 {
11 1 for(;useconds>0;useconds--);
12 1 }
13 void delay750()
14 {
15 1 int x;
16 1 for(x=0;x<20000;x++) {}
17 1 for(x=0;x<20000;x++) {}
18 1 for(x=0;x<20000;x++) {}
19 1 for(x=0;x<20000;x++) {}
20 1 for(x=0;x<20000;x++) {}
21 1 for(x=0;x<20000;x++) {}
22 1 for(x=0;x<20000;x++) {}
23 1 for(x=0;x<20000;x++) {}
24 1 }
25
26 //复位
27 bit ow_reset(void) // 0=presence, 1 = no part
28 {
29 1 bit presence;
30 1 char count;
31 1 DQ = 0; //pull DQ line low
32 1 delay(42); // leave it low for 480us
33 1 DQ = 1; // allow line to return high
34 1 count = 0;
35 1 delay(2);
36 1 do
37 1 {
38 2 delay(1); // the first is for recover period
39 2 presence = DQ;
40 2 count++;
41 2 } while (presence && (count<8));
42 1 if(count>=8) return 1;
43 1 count = 0;
44 1 do
45 1 {
46 2 delay(1);
47 2 presence = DQ;
48 2 count++;
49 2 } while (!presence&&(count<60));
50 1 if(count>=60) return 1; // 如果拉死,也认为不存在
51 1 delay(36);
52 1 return 0;
53 1 }
54
55 //从 1-wire 总线上读取一个字节
C51 COMPILER V7.00 DS18B20 11/14/2005 20:20:15 PAGE 2
56 unsigned char read_byte(void)
57 {
58 1 unsigned char i;
59 1 unsigned char value = 0;
60 1 for (i=8;i>0;i--)
61 1 {
62 2 value>>=1;
63 2 DQ = 0; // pull DQ low to start timeslot
64 2 DQ = 0; // then return high
65 2 DQ = 1; // then return high
66 2 DQ = 1; // then return high
67 2 //
68 2 _nop_();
69 2 _nop_();
70 2 _nop_();
71 2 _nop_();
72 2 _nop_();
73 2 _nop_();
74 2 _nop_();
75 2 _nop_();
76 2 if(DQ)value|=0x80;
77 2 delay(4); // wait for rest of timeslot
78 2 }
79 1 return(value);
80 1 }
81
82 //向 1-WIRE 总线上写一个字节
83 void write_byte(char val)
84 {
85 1 unsigned char i;
86 1 for (i=8; i>0; i--) // writes byte, one bit at a time
87 1 {
88 2 DQ = 0; // pull DQ low to start timeslot
89 2 DQ = 0; //pull DQ line low
90 2 DQ = val&0x01;
91 2 delay(5); // hold value for remainder of timeslot
92 2 DQ = 1;
93 2 val=val/2;
94 2 }
95 1 delay(5);
96 1 }
97
98 //读取温度
99 int Read_Temperature(void)
100 {
101 1 unsigned char xl,xh;
102 1 unsigned char cfg;
103 1 unsigned int x;
104 1 unsigned char crc;
105 1 do
106 1 {
107 2 ow_reset();
108 2 write_byte(0xCC); // Skip ROM
109 2 write_byte(0x44); // Start Conversion
110 2 delay(2);
111 2 delay750();
112 2 ow_reset();
113 2 write_byte(0xCC); // Skip ROM
114 2 write_byte(0xBE); // Read Scratch Pad
115 2 xl = read_byte();
116 2 crc = m_CRC(0,xl);
117 2 xh = read_byte();
C51 COMPILER V7.00 DS18B20 11/14/2005 20:20:15 PAGE 3
118 2 crc = m_CRC(crc,xh);
119 2 cfg = read_byte(); // TH
120 2 crc = m_CRC(crc,cfg);
121 2 cfg = read_byte(); // TL
122 2 crc = m_CRC(crc,cfg);
123 2 cfg = read_byte(); // config
124 2 crc = m_CRC(crc,cfg);
125 2 cfg = read_byte(); // Reserve0
126 2 crc = m_CRC(crc,cfg);
127 2 cfg = read_byte(); // Reserve1
128 2 crc = m_CRC(crc,cfg);
129 2 cfg = read_byte(); // Reserve2
130 2 crc = m_CRC(crc,cfg);
131 2 cfg = read_byte(); // CRC read from inside
132 2 } while(cfg!=crc);
133 1 // ow_reset();
134 1
135 1 x = xh;
136 1 x = (x<<8)+xl + 3; // 4 舍 5 入
137 1 x = (x>>3);
138 1 x = x + (x<<2);
139 1 // x = cfg;
140 1 return x;
141 1 }
142
143 int Read_ROM(char k)
144 {
145 1 unsigned char x[8];
146 1 char i;
147 1 ow_reset();
148 1 write_byte(0x33); // Skip ROM
149 1 for(i = 0;i<8;i++) x[i] = read_byte();
150 1 ow_reset();
151 1 return x[k];
152 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 498 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = ---- 10
IDATA SIZE = ---- ----
BIT SIZE = ---- 1
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -