📄 18b20_crc.lst
字号:
C51 COMPILER V8.08 18B20_CRC 10/28/2008 16:44:07 PAGE 1
C51 COMPILER V8.08, COMPILATION OF MODULE 18B20_CRC
OBJECT MODULE PLACED IN .\18b20crc\18b20_crc.obj
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE 18b20_crc.c BROWSE DEBUG OBJECTEXTEND TABS(2) OBJECT(.\18b20crc\18b20_crc.o
-bj)
line level source
1 /*DQ为数据口,接于P2.1
2 /*18B20采用三线接法,上拉4.7K电阻,11.0592M*/
3 /*Author:xiaohua */
4 /*Date:05/10/1 */
5
6 #include <reg52.h>
7 #include <intrins.h>
8
9 #define uchar unsigned char
10 #define uint unsigned int
11
12 //
13 sbit dq=P2^1;
14 bit flag;
15 uint temp;
16 uchar temp_buff[9];
17 uchar id_buff[8];
18 uchar *p;
19 uchar crc_data;
20 uchar code crc_table[256]={
21
22 0, 94,188,226, 97, 63,221,131, 194,156,126, 32,163,253, 31, 65, // 0-- 15
23
24 157,195, 33,127,252,162, 64, 30, 95, 1,227,189, 62, 96,130,220, // 16-- 31
25
26 35,125,159,193, 66, 28,254,160, 225,191, 93, 3,128,222, 60, 98, // 32-- 47
27
28 190,224, 2, 92,223,129, 99, 61, 124, 34,192,158, 29, 67,161,255, // 48-- 63
29
30 70, 24,250,164, 39,121,155,197, 132,218, 56,102,229,187, 89, 7, // 64-- 79
31
32 219,133,103, 57,186,228, 6, 88, 25, 71,165,251,120, 38,196,154, // 80-- 95
33
34 101, 59,217,135, 4, 90,184,230, 167,249, 27, 69,198,152,122, 36, // 96--111
35
36 248,166, 68, 26,153,199, 37,123, 58,100,134,216, 91, 5,231,185, //112--127
37
38 140,210, 48,110,237,179, 81, 15, 78, 16,242,172, 47,113,147,205, //128--143
39
40 17, 79,173,243,112, 46,204,146, 211,141,111, 49,178,236, 14, 80, //144--159
41
42 175,241, 19, 77,206,144,114, 44, 109, 51,209,143, 12, 82,176,238, //160--175
43
44 50,108,142,208, 83, 13,239,177, 240,174, 76, 18,145,207, 45,115, //176--191
45
46 202,148,118, 40,171,245, 23, 73, 8, 86,180,234,105, 55,213,139, //192--207
47
48 87, 9,235,181, 54,104,138,212, 149,203, 41,119,244,170, 72, 22, //208--223
49
50 233,183, 85, 11,136,214, 52,106, 43,117,151,201, 74, 20,246,168, //224--239
51
52 116, 42,200,150, 21, 75,169,247, 182,232, 10, 84,215,137,107, 53 }; //240--255
53
54 //
C51 COMPILER V8.08 18B20_CRC 10/28/2008 16:44:07 PAGE 2
55
56 void delay(uchar us)
57 {
58 1 while(us--);
59 1 }
60 //
61
62 void init_18b20(void)
63 {
64 1 dq=1;
65 1 _nop_();
66 1 dq=0;
67 1 delay(80); //delay 530uS
68 1 dq=1;
69 1 delay(14); //delay 100uS
70 1 if(dq==0)
71 1 flag=1; //detect 1820 success!
72 1 else
73 1 flag=0; //detect 1820 fail!
74 1 delay(20);
75 1 dq=1;
76 1 }
77 //
78
79 void write(uchar wr) //单字节写入
80 {
81 1 uchar i;
82 1 for(i=0;i<8;i++)
83 1 {
84 2 dq=0;
85 2 _nop_();
86 2 dq=wr&0x01;
87 2 delay(5); //delay 45 uS
88 2 dq=1;
89 2 wr>>=1;
90 2 }
91 1 }
92 //
93
94 uchar read_byte(void) //读取单字节
95 {
96 1 uchar i,u=0;
97 1 for(i=0;i<8;i++)
98 1 {
99 2 dq=0;
100 2 u>>=1;
101 2 dq=1;
102 2 if(dq==1)
103 2 u|=0x80;
104 2 delay(4);
105 2 }
106 1 return(u);
107 1 }
108 //
109
110 void read_bytes(uchar j)//读取多字节
111 {
112 1 uchar i;
113 1 for(i=0;i<j;i++)
114 1 {
115 2 *p=read_byte();
116 2 p++;
C51 COMPILER V8.08 18B20_CRC 10/28/2008 16:44:07 PAGE 3
117 2 }
118 1 }
119 //
120
121 uchar crc(uchar j)
122 {
123 1 uchar i,crc_data=0;
124 1 for(i=0;i<j;i++) //查表校验
125 1 crc_data=crc_table[crc_data^temp_buff[i]];
126 1 return(crc_data);
127 1 }
128 //
129
130 void get_temp(void)
131 {
132 1 read_bytes(9);
133 1 if(crc(9)==0) //校验正确
134 1 {
135 2 temp=temp_buff[1]*0x100+temp_buff[0];
136 2 temp*=0.625;
137 2 }
138 1 }
139 //
140
141 void config(void) //重新配置报警限定值和分辨率
142 {
143 1 init_18b20();
144 1 write(0xcc); //skip rom
145 1 write(0x4e); //write scratchpad
146 1 write(0x19); //上限
147 1 write(0x1a); //下限
148 1 write(0x7f); //set 11 bit (0.125)
149 1 init_18b20();
150 1 write(0xcc); //skip rom
151 1 write(0x48); //保存设定值
152 1 init_18b20();
153 1 write(0xcc); //skip rom
154 1 write(0xb8); //回调设定值
155 1 }
156 //
157
158 void read_id(void) //读取器件 id
159 {
160 1 init_18b20();
161 1 write(0x33); //read rom
162 1 read_bytes(8);
163 1 }
164 //
165
166 main() //演示程序
167 {
168 1 p=id_buff;
169 1 read_id();
170 1 config();
171 1 for(;;)
172 1 {
173 2 init_18b20();
174 2 write(0xcc); //skip rom
175 2 write(0x44); //temp convert
176 2 init_18b20();
177 2 write(0xcc); //skip rom
178 2 write(0xbe); //read temp
C51 COMPILER V8.08 18B20_CRC 10/28/2008 16:44:07 PAGE 4
179 2 p=temp_buff;
180 2 get_temp();
181 2 }
182 1 }
183 //
184
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 311 ----
CONSTANT SIZE = 256 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 23 2
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 + -