📄 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 + -