📄 ds18d20_test.lst
字号:
C51 COMPILER V6.23a DS18D20_TEST 01/10/2008 02:54:01 PAGE 1
C51 COMPILER V6.23a, COMPILATION OF MODULE DS18D20_TEST
OBJECT MODULE PLACED IN ds18d20_test.OBJ
COMPILER INVOKED BY: D:\Program Files\Keil\C51\BIN\C51.EXE ds18d20_test.c BROWSE DEBUG OBJECTEXTEND
stmt level source
1
2 #include <reg52.h>
3 #include <intrins.h>
4
5 #ifndef uchar
6 #define uchar unsigned char
7 #endif
8 #ifndef uint
9 #define uint unsigned int
10 #endif
11 #define ds1302_set0(x) x=0
12 #define ds1302_set1(x) x=1
13 sbit ds1302_rst=P3^7;
14 sbit ds1302_sclk=P2^0;
15 sbit ds1302_io=P2^1;
16 void ds1302_initial();
17 void ds1302_senddata(uchar dsend);
18 uchar ds1302_receivedata(void);
19 /*******************寄存器********************/
20 unsigned char Ds1302Reg[7]={0}; //ds1302内部日期寄存器 (00-06)
21 unsigned char Date[14]={0};
22 /*********************************************/
23
24
25 sbit dp = P0 ^4; //定义温度器件的数据脚位
26 bit temp_flag;
27 unsigned int idata temp_data;
28 unsigned char idata temp_buff[9];
29 unsigned char idata id_buff[8];
30 unsigned char *p_tempdata;
31 unsigned char code crc_table[256] ={
32 0, 94, 188, 226, 97, 63, 221, 131, 194, 156, 126, 32, 163, 253, 31, 65,
33 157, 195, 33, 127, 252, 162, 64, 30, 95, 1, 227, 189, 62, 96, 130, 220,
34 35, 125, 159, 193, 66, 28, 254, 160, 225, 191, 93, 3, 128, 222, 60, 98,
35 190, 224, 2, 92, 223, 129, 99, 61, 124, 34, 192, 158, 29, 67, 161, 255,
36 70, 24, 250, 164, 39, 121, 155, 197, 132, 218, 56, 102, 229, 187, 89, 7,
37 219, 133, 103, 57, 186, 228, 6, 88, 25, 71, 165, 251, 120, 38, 196, 154,
38 101, 59, 217, 135, 4, 90, 184, 230, 167, 249, 27, 69, 198, 152, 122, 36,
39 248, 166, 68, 26, 153, 199, 37, 123, 58, 100, 134, 216, 91, 5, 231, 185,
40 140, 210, 48, 110, 237, 179, 81, 15, 78, 16, 242, 172, 47, 113, 147, 205,
41 17, 79, 173, 243, 112, 46, 204, 146, 211, 141, 111, 49, 178, 236, 14, 80,
42 175, 241, 19, 77, 206, 144, 114, 44, 109, 51, 209, 143, 12, 82, 176, 238,
43 50, 108, 142, 208, 83, 13, 239, 177, 240, 174, 76, 18, 145, 207, 45, 115,
44 202, 148, 118, 40, 171, 245, 23, 73, 8, 86, 180, 234, 105, 55, 213, 139,
45 87, 9, 235, 181, 54, 104, 138, 212, 149, 203, 41, 119, 244, 170, 72, 22,
46 233, 183, 85, 11, 136, 214, 52, 106, 43, 117, 151, 201, 74, 20, 246, 168,
47 116, 42, 200, 150, 21, 75, 169, 247, 182, 232, 10, 84, 215, 137, 107, 53};
48 void delay(unsigned char us)
49 {
50 1 while (us--);
51 1 }
52 void init_18b20(void)
53 {
54 1 dp =1;
55 1 _nop_();
C51 COMPILER V6.23a DS18D20_TEST 01/10/2008 02:54:01 PAGE 2
56 1 dp =0;
57 1 delay(80); //delay 530us
58 1 dp =1;
59 1 delay(14); //delay 100us
60 1 if (dp == 0)
61 1 temp_flag =1; //detec 18b20 success!
62 1 else
63 1 temp_flag =0; //detec 18b20 fail!
64 1 delay(20);
65 1 dp =1;
66 1 }
67 void write_temp(unsigned char wr)
68 { //写入单字节数
69 1 unsigned char i;
70 1 for (i =0;i<8;i++)
71 1 {
72 2 dp =0;
73 2 _nop_();
74 2 dp =wr&0x01;
75 2 delay(5); //delya 45us
76 2 dp =1;
77 2 wr >>=1;
78 2 }
79 1 }
80 unsigned char read_byte(void)
81 { //读取单字节数
82 1 unsigned char i,u=0;
83 1 for (i =0;i<8;i++)
84 1 {
85 2 dp =0;
86 2 u >>=1;
87 2 dp =1;
88 2 if (dp==1)
89 2 u |=0x80;
90 2 delay(4);
91 2 }
92 1 return(u);
93 1 }
94 void read_bytes(unsigned char j)
95 {
96 1 unsigned char i;
97 1 for (i =0;i<j;i++)
98 1 {
99 2 *p_tempdata=read_byte();
100 2 p_tempdata++;
101 2 }
102 1 }
103 unsigned char crc_conter(unsigned char j)
104 {
105 1 unsigned char i,crc_data =0;
106 1 for (i =0;i <j;i++)
107 1 {
108 2 crc_data =crc_table[crc_data ^ temp_buff[i]];
109 2 }
110 1 return(crc_data);
111 1 }
112 void get_temp(void)
113 {
114 1 read_bytes(9);
115 1 if (crc_conter(9)==0)
116 1 {
117 2 temp_data =(temp_buff[1]*0x100)+temp_buff[0];
C51 COMPILER V6.23a DS18D20_TEST 01/10/2008 02:54:01 PAGE 3
118 2 temp_data *=0.625;
119 2 }
120 1 }
121 void temp_config(void)
122 { //重新配置报警限定值和分辨率
123 1 init_18b20();
124 1 write_temp(0xcc); //skip rom
125 1 write_temp(0x4e); //write scratchpad
126 1 write_temp(0x19); //上限
127 1 write_temp(0x1a); //下限
128 1 write_temp(0x7f); //set 11 bit (0.125)
129 1 init_18b20();
130 1 write_temp(0xcc); //skip rom
131 1 write_temp(0x48); //保存设定值
132 1 init_18b20();
133 1 write_temp(0xcc); //skip rom
134 1 write_temp(0xb8); //回调设定值
135 1 }
136 void read_tempID(void)
137 {
138 1 init_18b20();
139 1 write_temp(0x33);
140 1 read_bytes(8);
141 1 }
142
143
144 void ds1302_senddata(uchar dsend)
145 {
146 1 uchar i;
147 1 for(i=0;i<8;i++)
148 1 {
149 2 ds1302_io=(bit)(dsend&0x01);
150 2 delay(20);
151 2 ds1302_set1(ds1302_sclk);
152 2 dsend=dsend>>1;
153 2 delay(20);
154 2 ds1302_set0(ds1302_sclk);
155 2 delay(20);
156 2 }
157 1 }
158 uchar ds1302_receivedata(void)
159 {
160 1 uchar i,dat=0;
161 1 for(i=0;i<8;i++)
162 1 {
163 2 dat=dat>>1;
164 2 if(ds1302_io) dat=dat|0x80;
165 2 else dat=dat&0x7f;
166 2 delay(20);
167 2 ds1302_set1(ds1302_sclk);
168 2 delay(20);
169 2 ds1302_set0(ds1302_sclk);
170 2 delay(20);
171 2 }
172 1 return(dat);
173 1 }
174
175 void Ds1302Write(char data1,char data2)
176 {
177 1 ds1302_set0(ds1302_rst);
178 1 _nop_();
179 1 _nop_();
C51 COMPILER V6.23a DS18D20_TEST 01/10/2008 02:54:01 PAGE 4
180 1 delay(20);
181 1 ds1302_set0(ds1302_sclk);
182 1 _nop_();
183 1 _nop_();
184 1 delay(20);
185 1 ds1302_set1(ds1302_rst);
186 1 _nop_();
187 1 _nop_();
188 1 delay(20);
189 1 ds1302_senddata(data1);
190 1 ds1302_senddata(data2);
191 1 _nop_();
192 1 _nop_();
193 1 delay(20);
194 1 ds1302_set1(ds1302_sclk);
195 1 _nop_();
196 1 _nop_();
197 1 delay(20);
198 1 ds1302_set0(ds1302_rst);
199 1 }
200 char Ds1302Read(char Addr)
201 {
202 1 unsigned char DataReturn;
203 1 ds1302_set0(ds1302_rst);
204 1 _nop_();
205 1 _nop_();
206 1 delay(20);
207 1 ds1302_set0(ds1302_sclk);
208 1 _nop_();
209 1 _nop_();
210 1 delay(20);
211 1 ds1302_set1(ds1302_rst);
212 1 _nop_();
213 1 _nop_();
214 1 delay(20);
215 1 ds1302_senddata(Addr);
216 1 DataReturn=ds1302_receivedata();
217 1 ds1302_set1(ds1302_sclk);
218 1 _nop_();
219 1 _nop_();
220 1 delay(20);
221 1 ds1302_set0(ds1302_rst);
222 1 return(DataReturn);
223 1 }
224 void Ds1302ReadAll()
225 {
226 1 unsigned char i;
227 1 for(i=0;i<7;i++)
228 1 {
229 2 Ds1302Reg[i]=Ds1302Read(0x81|((i<<1)&0xfe));
230 2 if (i==0)
231 2 {
232 3 if (Ds1302Reg[i]&0x80)
233 3 {
234 4 Ds1302Write(0x8e,0x00);
235 4 Ds1302Write(0x80,0x00);
236 4 Ds1302Write(0x8e,0x80);
237 4 }
238 3 }
239 2 }
240 1 }
241 void Ds1302DataConver()
C51 COMPILER V6.23a DS18D20_TEST 01/10/2008 02:54:01 PAGE 5
242 {
243 1 char Counter=0;
244 1 Ds1302ReadAll();
245 1 //秒 分 时
246 1 Date[5]=Ds1302Reg[0]%0x10;
247 1 Date[4]=((Ds1302Reg[0]>>4)&0x07);
248 1 Date[3]=Ds1302Reg[1]%0x10;
249 1 Date[2]=(Ds1302Reg[1]>>4);
250 1 Date[1]=Ds1302Reg[2]%0x10;
251 1 Date[0]=((Ds1302Reg[2]>>4)&0x01);
252 1 //日 月
253 1 Date[9]=Ds1302Reg[3]%0x10;
254 1 Date[8]=((Ds1302Reg[3]>>4)&0x03);
255 1 Date[7]=Ds1302Reg[4]%0x10;
256 1 Date[6]=((Ds1302Reg[4]>>4)&0x01);
257 1 //星期
258 1 Date[10]=Ds1302Reg[5];
259 1 //年 基数 2000
260 1 Date[11]=Ds1302Reg[6]%0x10;
261 1 Date[12]=((Ds1302Reg[6]>>4)&0x0f);
262 1 for(Counter=0;Counter<13;Counter++)
263 1 Date[Counter]+='0';
264 1 }
265
266 void ds1302_initial()
267 {
268 1 ds1302_set0(ds1302_sclk);
269 1 ds1302_set0(ds1302_rst);
270 1 ds1302_set0(ds1302_io);
271 1 Ds1302Write(0x8e,0x00);
272 1 Ds1302Write(0x80,0x00);
273 1 Ds1302Write(0x82,0x55);
274 1 Ds1302Write(0x84,0x23);
275 1 Ds1302Write(0x86,0x31);
276 1 Ds1302Write(0x88,0x12);
277 1 Ds1302Write(0x8a,0x03);
278 1 Ds1302Write(0x8c,0x08);
279 1 Ds1302Write(0x90,0xa9);
280 1 Ds1302Write(0x8e,0x80);
281 1 }
282
283 void delay_500(void)
284 {
285 1 unsigned int a,i;
286 1 while (a--);
287 1 while (i);
288 1 }
289 void main(void)
290 {
291 1 p_tempdata =id_buff;
292 1 read_tempID();
293 1 temp_config();
294 1 ds1302_initial();
295 1 for (;;)
296 1 {
297 2 init_18b20();
298 2 write_temp(0xcc); //skip rom
299 2 write_temp(0x44);
300 2 init_18b20();
301 2 write_temp(0xcc);
302 2 write_temp(0xbe);
303 2 p_tempdata =temp_buff;
C51 COMPILER V6.23a DS18D20_TEST 01/10/2008 02:54:01 PAGE 6
304 2 get_temp();
305 2 // delay_500();
306 2 Ds1302DataConver();
307 2 delay_500();
308 2 }
309 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 748 ----
CONSTANT SIZE = 256 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 24 6
IDATA SIZE = 19 ----
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 + -