📄 便携式温度计.lst
字号:
164
165 /***********************读18B20ID**********************/
166 void ReadID ()//读取器件 id
167 {
168 1 p = id_buff;
169 1 Init18b20();
170 1 WriteByte(0x33); //read rom
171 1 reads(8);
172 1 }
173
174 /********************温度转换全处理********************/
175 void Temperature_change()
176 {
177 1 Init18b20 ();//初始化18B20
178 1 WriteByte(0xcc); //跳过ROM
179 1 WriteByte(0x44); //启动温度转换
C51 COMPILER V8.08 便衉式蝊度计 02/14/2009 14:33:38 PAGE 4
180 1 mDelay(50);//重要延时
181 1 Init18b20 ();
182 1 WriteByte(0xcc); //跳过ROM
183 1 WriteByte(0xbe); //读取温度
184 1 p = temp_buff;
185 1 reads (9);
186 1 if (CRC(9)==0) //校验正确
187 1 {
188 2 if(temp_buff[1]<0xF0)//温度大于0度
189 2 {
190 3 DispLED[3]=(temp_buff[0]&0x0F)*625/1000%10;//小数
191 3 Temperature=(temp_buff[0]>>4)+(temp_buff[1]<<4);
192 3 DispLED[2]=Temperature%10;//个位
193 3 DispLED[1]=Temperature/10;//十位
194 3 DispLED[0]=Temperature/100;//
195 3 }
196 2 else//温度小于0度
197 2 {
198 3 temp_buff[0]=~temp_buff[0]+1;
199 3 temp_buff[1]=~temp_buff[1];
200 3 DispLED[3]=(temp_buff[0]&0x0F)*625/1000%10;//小数
201 3 Temperature=(temp_buff[0]>>4)+(temp_buff[1]<<4);
202 3 DispLED[2]=Temperature%10;//个位
203 3 DispLED[1]=Temperature/10;//十位
204 3 DispLED[0]=Temperature/100+10;//百位+负号
205 3 }
206 2 }
207 1 }
208
209 /********************中断初始化函数********************/
210 void Init_TIME0(void)
211 {
212 1 TH0=0x3C;//定时器付初值,100ms
213 1 TL0=0xB0;
214 1 TMOD|=0x01;//定时器0工作于定时状态,工作方式1
215 1 ET0=1;//定时器0中断允许开
216 1 }
217
218 /**********************中断服务函数***************************/
219 void LED_timer0() interrupt 1
220 {
221 1 static uchar flag_interrupt;//中断次数标志
222 1 static uchar stop_num;//系统停止计数器
223 1 stop_num++;
224 1 flag_interrupt++;
225 1 if(stop_num>=50)
226 1 {
227 2 P3&=0xFF;//关闭所有显示
228 2 PCON=STOP_;//5秒停机
229 2 }
230 1 if(flag_interrupt==4)//每0.5s转换一次温度
231 1 {
232 2 TR0=0;
233 2 P3=0xFF;//关闭所有显示
234 2 Temperature_change();
235 2 flag_interrupt=0;
236 2 TR0=1;
237 2 }
238 1 TH0=0x3C;//定时器付初值
239 1 TL0=0xB0;
240 1 }
241
C51 COMPILER V8.08 便衉式蝊度计 02/14/2009 14:33:38 PAGE 5
242 /**********************主函数******************************/
243 void main()
244 {
245 1 uchar flag_LED;//数码管显示段位标志
246 1 uint i;
247 1
248 1 Init18b20 ();//初始化18B20
249 1 if(flag==0)//效验错误
250 1 {
251 2 DispLED[0]=12;//字母F
252 2 DispLED[1]=13;//字母A
253 2 DispLED[2]=14;//字母L
254 2 DispLED[3]=14;//字母L
255 2 for(i=1250;i>0;i--)
256 2 {
257 3 P1=DispDB[DispLED[flag_LED]];
258 3 P3=DispCon[flag_LED];
259 3 flag_LED+=1;
260 3 if(flag_LED==4)
261 3 {
262 4 flag_LED=0;//flag_LED到4归零
263 4 }
264 3 mDelay(2);
265 3 }
266 2 P3=0xff;
267 2 PCON=STOP_;//主机进入掉电模式
268 2 }
269 1 else
270 1 {
271 2 ReadID();
272 2 Temperature_change();
273 2 }
274 1
275 1 Init_TIME0();
276 1 EA=1;//中断总允许开
277 1 TR0=1;
278 1 while (1)
279 1 {
280 2 P3|=0x3C;//关闭显示
281 2 P1=DispDB[DispLED[flag_LED]];
282 2 switch(flag_LED)
283 2 {
284 3 case 0:
285 3 if(DispLED[0]==0)//首位0消隐
286 3 {
287 4 P3&=0xFF;//关闭显示
288 4 }
289 3 else
290 3 {
291 4 P3&=0xFB;
292 4 }
293 3 flag_LED+=1;
294 3 break;
295 3 case 1:
296 3 if((DispLED[0]==0) && (DispLED[1]==0))//次位0消隐
297 3 {
298 4 P3&=0xFF;//关闭显示
299 4 }
300 3 else
301 3 {
302 4 P3&=0xF7;
303 4 }
C51 COMPILER V8.08 便衉式蝊度计 02/14/2009 14:33:38 PAGE 6
304 3 flag_LED+=1;
305 3 break;
306 3 case 2:
307 3 P3&=0xEF;
308 3 flag_LED+=1;
309 3 break;
310 3 case 3:
311 3 P3&=0xDF;
312 3 flag_LED=0;
313 3 break;
314 3 }
315 2 mDelay(1);
316 2 }
317 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 711 ----
CONSTANT SIZE = 296 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 28 3
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -