?? ds1820.lst
字號:
C51 COMPILER V8.08 DS1820 07/04/2008 11:10:12 PAGE 1
C51 COMPILER V8.08, COMPILATION OF MODULE DS1820
OBJECT MODULE PLACED IN DS1820.OBJ
COMPILER INVOKED BY: C:\Program Files\keil\C51\BIN\C51.EXE DS1820.c BROWSE DEBUG OBJECTEXTEND
line level source
1 #include <stdio.h> //頭文件
2 #include <reg52.h>
3
4 #define FALSE 0
5 #define TRUE 1
6 #define uchar unsigned char //預定義
7
8 sbit DS18S20_DQ = P2^0; //定義P2^0引腳為DS18S20的DQ引腳
9
10 /******************************* 全局變量聲明 ********************************/
11 uchar DS18S20ROM[8]; // DS18S20 ROM位
12 uchar LastData = 0;
13 uchar EndFlag = 0;
14 uchar ROMFound[5][8]; // DS18S20的ROM 代碼表
15 uchar numROMs;
16 uchar CRCdsc; //用于CRC校驗
17
18 uchar code dsc[] = {
19 0, 94,188,226, 97, 63,221,131,194,156,126, 32,163,253, 31, 65,
20 157,195, 33,127,252,162, 64, 30, 95, 1,227,189, 62, 96,130,220,
21 35,125,159,193, 66, 28,254,160,225,191, 93, 3,128,222, 60, 98,
22 190,224, 2, 92,223,129, 99, 61,124, 34,192,158, 29, 67,161,255,
23 70, 24,250,164, 39,121,155,197,132,218, 56,102,229,187, 89, 7,
24 219,133,103, 57,186,228, 6, 88, 25, 71,165,251,120, 38,196,154,
25 101, 59,217,135, 4, 90,184,230,167,249, 27, 69,198,152,122, 36,
26 248,166, 68, 26,153,199, 37,123, 58,100,134,216, 91, 5,231,185,
27 140,210, 48,110,237,179, 81, 15, 78, 16,242,172, 47,113,147,205,
28 17, 79,173,243,112, 46,204,146,211,141,111, 49,178,236, 14, 80,
29 175,241, 19, 77,206,144,114, 44,109, 51,209,143, 12, 82,176,238,
30 50,108,142,208, 83, 13,239,177,240,174, 76, 18,145,207, 45,115,
31 202,148,118, 40,171,245, 23, 73, 8, 86,180,234,105, 55,213,139,
32 87, 9,235,181, 54,104,138,212,149,203, 41,119,244,170, 72, 22,
33 233,183, 85, 11,136,214, 52,106, 43,117,151,201, 74, 20,246,168,
34 116, 42,200,150, 21, 75,169,247,182,232, 10, 84,215,137,107, 53};
35
36
37 void Delay(int useconds)
38 {
39 1 int s;
40 1 for (s=0; s<useconds;s++); //空循環語句實現延時
41 1 }
42
43
44 uchar Reset(void)
45 {
46 1 uchar PresenceSignal;
47 1 DS18S20_DQ = 0; //拉低數據線DQ
48 1 Delay(30); //延時
49 1 DS18S20_DQ = 1; //置數據線DQ為高電平
50 1 Delay(3); //延時
51 1 PresenceSignal = DS18S20_DQ; //讀取存在信號
52 1 Delay(30); //延時,等待時間隙結束
53 1 return PresenceSignal; //返回存在信號
54 1 }
55
C51 COMPILER V8.08 DS1820 07/04/2008 11:10:12 PAGE 2
56
57
58 void WriteBit(char val)
59 {
60 1 DS18S20_DQ = 0; //拉低數據線DQ開始寫時間隙
61 1 if(val==1)
62 1 DS18S20_DQ =1; //數據線DQ置1,寫1
63 1 else
64 1 DS18S20_DQ=0; //數據線DQ置0,寫0
65 1 Delay(5); //延時,在時間隙內保持電平值,
66 1 DS18S20_DQ = 1; //拉高數據線DQ
67 1 }
68
69
70
71 void WriteByte(char val)
72 {
73 1 uchar i;
74 1 uchar temp;
75 1 for (i=0; i<8; i++) //循環寫入字節,每次寫入一位
76 1 {
77 2 temp = val>>i; //移位
78 2 temp &= 0x01;
79 2 WriteBit(temp); //調用位寫入函數
80 2 }
81 1 Delay(5);
82 1 }
83
84
85 uchar ReadBit(void)
86 {
87 1 uchar i;
88 1 DS18S20_DQ = 0; //拉低數據總線DQ開始讀時間隙
89 1 DS18S20_DQ = 1; //DQ置1
90 1 for (i=0; i<3; i++); //延時
91 1 return DS18S20_DQ ; //返回數據總線DQ上的位數據
92 1 }
93
94 uchar ReadByte(void)
95 {
96 1 uchar i;
97 1 uchar value = 0;
98 1 for (i=0;i<8;i++) //讀取字節,每次讀取一位
99 1 {
100 2 if(ReadBit())
101 2 value|=0x01<<i; //循環左移
102 2 Delay(7);
103 2 }
104 1 return(value); //返回字節數據
105 1 }
106
107
108 void ReadROMSerialNumber(void)
109 {
110 1 int n;
111 1 char dat[9];
112 1 printf("\nReading DS18S20 ROM Code\n"); //輸出信息
113 1 Reset(); //復位函數
114 1 WriteByte(0x33); //讀出ROM序列號命令
115 1 for (n=0;n<8;n++)
116 1 {
117 2 dat[n]=ReadByte(); //循環讀ROM序列號
C51 COMPILER V8.08 DS1820 07/04/2008 11:10:12 PAGE 3
118 2 }
119 1 printf("\nDS18S20 ROMCode=%X%X%X%X\n",//輸出ROM序列號
120 1 dat[7],dat[6],dat[5],dat[4],dat[3],dat[2],dat[1],dat[0]);
121 1 }
122
123
124 uchar CRCCheck( uchar x)
125 {
126 1 CRCdsc = dsc[CRCdsc^x]; //查表校驗
127 1 return CRCdsc;
128 1 }
129
130 uchar SearchDevice(void)
131 {
132 1 uchar m = 1; //DS18S20 ROM 位索引
133 1 uchar n = 0; //DS18S20 ROM 字節索引
134 1 uchar k = 1;
135 1 uchar x = 0;
136 1 uchar discrepMarker = 0;
137 1 uchar g;
138 1 uchar nxt;
139 1 int flag;
140 1 nxt = FALSE;
141 1 CRCdsc = 0;
142 1 flag = Reset(); //復位函數
143 1 if(flag||EndFlag) //如果沒有其它器件
144 1 {
145 2 LastData = 0;
146 2 return FALSE; //返回"假"
147 2 }
148 1 WriteByte(0xF0); //搜索ROM 命令
149 1 do //循環
150 1 {
151 2 x = 0;
152 2 if(ReadBit()==1) x = 2;
153 2 Delay(8);
154 2 if(ReadBit()==1) x |= 1;
155 2 if(x ==3) break;
156 2 else
157 2 {
158 3 if(x>0)
159 3 g = x>>1;
160 3 else
161 3 {
162 4 if(m<LastData)
163 4 g = ((DS18S20ROM[n]&k)>0);
164 4 else
165 4 g = (m==LastData);
166 4 if (g==0) discrepMarker = m;
167 4 }
168 3 if(g==1)
169 3 DS18S20ROM[n] |= k;
170 3 else
171 3 DS18S20ROM[n] &= ~k;
172 3 WriteBit(g); //位寫入函數
173 3 m++;
174 3 k = k<<1;
175 3 if(k==0)
176 3 {
177 4 CRCCheck(DS18S20ROM[n]); //CRC校驗
178 4 n++; k++;
179 4 }
C51 COMPILER V8.08 DS1820 07/04/2008 11:10:12 PAGE 4
180 3 }
181 2 }while(n<8); //直到全部ROM字節0~7都完成
182 1 if(m<65||CRCdsc)
183 1 LastData=0;
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -