📄 18b20.lst
字号:
C51 COMPILER V8.06 18B20 05/10/2008 10:01:53 PAGE 1
C51 COMPILER V8.06, COMPILATION OF MODULE 18B20
OBJECT MODULE PLACED IN 18B20.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE 18B20.C BROWSE DEBUG OBJECTEXTEND
line level source
1 #include <intrins.h>
2 #include <reg52.h>
3 #define Uchar unsigned char
4 #define Uint unsigned int
5 #define SomeNOP(); _nop_();
6 sbit DQ = P3^7; //18B20温度传感器
7 sbit JDQ = P3^6; //继电器输出
8 //LCD1602的口线接法
9 sbit E=P2^2;
10 sbit RW=P2^1;
11 sbit RS=P2^0;
12 /*I2C总线要用到的口线定义*/
13 sbit SDA = P3^4;
14 sbit SCL = P3^3;
15
16 //以下为函数声明
17 void TempDelay(unsigned char us);
18 void Ds18b20_rst(void);
19 void WriteByte(unsigned char wrdat);
20 unsigned char ReadByte(void);
21 void Delay(unsigned int t); // delay 40us
22 void SendCommandByte(unsigned char ch);
23 void SendDataByte(unsigned char ch);
24 void InitLcd();
25 //I2C驱动要用到的一些函数
26 void Delay_1ms(Uchar time);
27 void I2CStart(void);
28 void I2CStop(void);
29 void AutoACK(void); //在一定的时间内自动确定ACK的信号//
30 void Writex(Uchar j);
31 Uchar Readx(void);
32 void X24_Write(Uchar Addresslow,Uchar Write_date);
33 Uchar X24_Read(Uchar Addresslow);
34 void ramini(void);
35 void time0(void);
36
37 union
38 {
39 unsigned int iInt;
40 unsigned char cChar[2];
41 }TMP;
42
43 unsigned int nowwd,highwd; //当前的温度,设定报警
44 unsigned char keyscan,teml,temh;
45 unsigned char dssttime,svtime;
46 unsigned char bdata myflag1;
47 sbit keybit = myflag1^0; //按键标志
48 sbit dsokbit = myflag1^1; //DS18B20在线
49 sbit dsstbit = myflag1^2;
50 sbit dsfubit = myflag1^3;
51 sbit newwdbit = myflag1^4;
52 sbit newjrbit = myflag1^5;
53 sbit setjrbit = myflag1^6;
54 void main(void)
55 {
C51 COMPILER V8.06 18B20 05/10/2008 10:01:53 PAGE 2
56 1 TH0=0xf8;
57 1 TL0=0xce;
58 1 TMOD=0x01;
59 1 TR0=1;
60 1 keyscan=50;
61 1 InitLcd();
62 1 ramini();
63 1 SendCommandByte(0x80); //设置DDRAM地址
64 1 SendDataByte('T');
65 1 SendDataByte('e');
66 1 SendDataByte('m');
67 1 SendDataByte('p');
68 1 SendDataByte(':');
69 1
70 1 SendCommandByte(0xC0); //设置DDRAM地址
71 1 SendDataByte('S');
72 1 SendDataByte('e');
73 1 SendDataByte('t');
74 1 SendDataByte(' ');
75 1 SendDataByte(':');
76 1 IE=0x82;
77 1 newjrbit=1;
78 1 while(1){}
79 1 }
80
81 void time0(void) interrupt 1
82 {
83 1 unsigned char k,p;
84 1 TH0=0xf8; //2ms
85 1 TL0=0xce;
86 1 if(keyscan--==0)
87 1 {
88 2 keyscan=50;
89 2 k=P1;k=k&0x03;
90 2 if(k!=0x03)
91 2 {
92 3 switch(k)
93 3 {
94 4 case 0x02:
95 4 if(keybit==0){keybit=1;highwd++;setjrbit=1;svtime=30;newjrbit=1;}break;
96 4 case 0x01:
97 4 if(keybit==0){keybit=1;highwd--;setjrbit=1;svtime=30;newjrbit=1;}break;
98 4 }
99 3
100 3 }
101 2 else{keybit=0;}
102 2 if(setjrbit==1)
103 2 {
104 3 if(svtime--==0)
105 3 {
106 4 TMP.iInt=highwd;
107 4 X24_Write(0x10,TMP.cChar[0]);
108 4 X24_Write(0x11,TMP.cChar[1]);
109 4 setjrbit=0;
110 4 }
111 3 }
112 2 if(dsstbit==0) //采集温度值
113 2 {
114 3 Ds18b20_rst();
115 3 if(dsokbit==1)
116 3 {
117 4 WriteByte(0xCC); //忽略ROM匹配
C51 COMPILER V8.06 18B20 05/10/2008 10:01:53 PAGE 3
118 4 WriteByte(0x44); //发送温度转化命令
119 4 dsstbit=1;dssttime=0x07;
120 4 }
121 3 }
122 2 else
123 2 {
124 3 if(dssttime--==0)
125 3 {
126 4 Ds18b20_rst();
127 4 if(dsokbit==1)
128 4 {
129 5 WriteByte(0xCC);
130 5 WriteByte(0xBE);
131 5 teml=ReadByte();
132 5 temh=ReadByte();
133 5 k=temh&0xfc;
134 5 if(k!=0xfc)
135 5 {
136 6 k=(temh<<4)&0xf0;p=(teml>>4)&0x0f;
137 6 k=k|p;
138 6
139 6 nowwd=k*10;
140 6 k=teml&0x0f;k=k*10;p=k/16;
141 6 if((k%16)>5){p=p+1;}
142 6 nowwd=nowwd+p;
143 6 dsstbit=0;dsfubit=0;
144 6 }
145 5 else
146 5 {
147 6 k=(temh<<4)&0xf0;p=(teml>>4)&0x0f;
148 6 k=k|p;
149 6 k=(~k);
150 6 nowwd=k*10;
151 6 k=(teml&0x0f)|0xf0;k=~k;k=k*10;p=k/16;
152 6 if((k%16)>5){p=p+1;}
153 6 nowwd=nowwd+p;
154 6 dsstbit=0;dsfubit=1;
155 6 }
156 5 newwdbit=1;
157 5 }
158 4 }
159 3 }
160 2 }
161 1
162 1 if(newwdbit==1)
163 1 {
164 2 newwdbit=0;
165 2 if(nowwd<highwd){JDQ=1;}else{JDQ=0;}
166 2 SendCommandByte(0x87); //设置DDRAM地址
167 2
168 2 k=(Uchar)(nowwd/1000);
169 2 k=k+0x30;
170 2 SendDataByte(k);
171 2 k=(Uchar)((nowwd%1000)/100);
172 2 k=k+0x30;
173 2 SendDataByte(k);
174 2 k=(Uchar)((nowwd%100)/10);
175 2 k=k+0x30;
176 2 SendDataByte(k);
177 2 SendDataByte('.');
178 2 k=(Uchar)(nowwd%10);
179 2 k=k+0x30;
C51 COMPILER V8.06 18B20 05/10/2008 10:01:53 PAGE 4
180 2 SendDataByte(k);
181 2 }
182 1
183 1 if(newjrbit==1)
184 1 {
185 2 newjrbit=0;
186 2 SendCommandByte(0xc7); //设置DDRAM地址
187 2
188 2 k=(Uchar)(highwd/1000);
189 2 k=k+0x30;
190 2 SendDataByte(k);
191 2 k=(Uchar)((highwd%1000)/100);
192 2 k=k+0x30;
193 2 SendDataByte(k);
194 2 k=(Uchar)((highwd%100)/10);
195 2 k=k+0x30;
196 2 SendDataByte(k);
197 2 SendDataByte('.');
198 2 k=(Uchar)(highwd%10);
199 2 k=k+0x30;
200 2 SendDataByte(k);
201 2 }
202 1 }
203
204 //18B20要用到的一些函数
205 void TempDelay(unsigned char us) //延时
206 {
207 1 while(us--);
208 1 }
209 void Ds18b20_rst(void) //18B20复位
210 {
211 1 DQ=1;
212 1 _nop_();
213 1 DQ=0;
214 1 TempDelay(86);
215 1 _nop_();
216 1 DQ=1;
217 1 TempDelay(14);
218 1 _nop_();
219 1 _nop_();
220 1 _nop_();
221 1 if(DQ==0){dsokbit=1;}
222 1 else{dsokbit=0;}
223 1 TempDelay(20);
224 1 _nop_();
225 1 _nop_();
226 1 DQ=1;
227 1 }
228 void WriteByte(unsigned char wrdat) //向18B20写入一字节
229 {
230 1 unsigned char i;
231 1 for(i=0;i<8;i++)
232 1 {
233 2 DQ=0;
234 2 _nop_();
235 2 DQ=wrdat&0x01;
236 2 TempDelay(5);
237 2 _nop_();
238 2 _nop_();
239 2 DQ=1;
240 2 wrdat>>=1;
241 2 }
C51 COMPILER V8.06 18B20 05/10/2008 10:01:53 PAGE 5
242 1 }
243
244 unsigned char ReadByte(void) //读18B20的一个字节
245 {
246 1 unsigned char i,u=0;
247 1 for(i=0;i<8;i++)
248 1 {
249 2 DQ=0;
250 2 u>>=1;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -