📄 ds1302.lst
字号:
218 1 ReadValue = Read1302(DS1302_WEEK);
219 1 Time->Week = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
220 1 ReadValue = Read1302(DS1302_MONTH);
221 1 Time->Month = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
222 1 ReadValue = Read1302(DS1302_YEAR);
223 1 Time->Year = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
224 1 }
225
226 void DateToStr(SYSTEMTIME *Time) //将时间年,月,日,星期数据转换成液晶显示字符串,放到数组里DateString[]
227 { if(hide_year<2) //这里的if,else语句都是判断位闪烁,<2显示数据,>2就不显示,输出字符串为 2
-007/07/22
228 1 {
229 2 Time->DateString[0] = '2';
230 2 Time->DateString[1] = '0';
231 2 Time->DateString[2] = Time->Year/10 + '0';
232 2 Time->DateString[3] = Time->Year%10 + '0';
233 2 }
234 1 else
235 1 {
236 2 Time->DateString[0] = ' ';
237 2 Time->DateString[1] = ' ';
238 2 Time->DateString[2] = ' ';
239 2 Time->DateString[3] = ' ';
C51 COMPILER V7.06 DS1302 05/03/2008 20:11:44 PAGE 5
240 2 }
241 1 Time->DateString[4] = '/';
242 1 if(hide_month<2)
243 1 {
244 2 Time->DateString[5] = Time->Month/10 + '0';
245 2 Time->DateString[6] = Time->Month%10 + '0';
246 2 }
247 1 else
248 1 {
249 2 Time->DateString[5] = ' ';
250 2 Time->DateString[6] = ' ';
251 2 }
252 1 Time->DateString[7] = '/';
253 1 if(hide_day<2)
254 1 {
255 2 Time->DateString[8] = Time->Day/10 + '0';
256 2 Time->DateString[9] = Time->Day%10 + '0';
257 2 }
258 1 else
259 1 {
260 2 Time->DateString[8] = ' ';
261 2 Time->DateString[9] = ' ';
262 2 }
263 1 if(hide_week<2)
264 1 {
265 2 week_value[0] = Time->Week%10 + '0'; //星期的数据另外放到 week_value[]数组里,跟年,月,日的分开存放,因为
-等一下要在最后显示
266 2 }
267 1 else
268 1 {
269 2 week_value[0] = ' ';
270 2 }
271 1 week_value[1] = '\0';
272 1
273 1 Time->DateString[10] = '\0'; //字符串末尾加 '\0' ,判断结束字符
274 1 }
275
276 void TimeToStr(SYSTEMTIME *Time) //将时,分,秒数据转换成液晶显示字符放到数组 TimeString[];
277 { if(hide_hour<2)
278 1 {
279 2 Time->TimeString[0] = Time->Hour/10 + '0';
280 2 Time->TimeString[1] = Time->Hour%10 + '0';
281 2 }
282 1 else
283 1 {
284 2 Time->TimeString[0] = ' ';
285 2 Time->TimeString[1] = ' ';
286 2 }
287 1 Time->TimeString[2] = ':';
288 1 if(hide_min<2)
289 1 {
290 2 Time->TimeString[3] = Time->Minute/10 + '0';
291 2 Time->TimeString[4] = Time->Minute%10 + '0';
292 2 }
293 1 else
294 1 {
295 2 Time->TimeString[3] = ' ';
296 2 Time->TimeString[4] = ' ';
297 2 }
298 1 Time->TimeString[5] = ':';
299 1 if(hide_sec<2)
300 1 {
C51 COMPILER V7.06 DS1302 05/03/2008 20:11:44 PAGE 6
301 2 Time->TimeString[6] = Time->Second/10 + '0';
302 2 Time->TimeString[7] = Time->Second%10 + '0';
303 2 }
304 1 else
305 1 {
306 2 Time->TimeString[6] = ' ';
307 2 Time->TimeString[7] = ' ';
308 2 }
309 1 Time->DateString[8] = '\0';
310 1 }
311
312
313 void Initial_DS1302(void) //时钟芯片初始化
314 {
315 1 unsigned char Second=Read1302(DS1302_SECOND);
316 1 if(Second&0x80) //判断时钟芯片是否关闭
317 1 {
318 2 Write1302(0x8e,0x00); //写入允许
319 2 Write1302(0x8c,0x07); //以下写入初始化时间 日期:07/07/25.星期: 3. 时间: 23:59:55
320 2 Write1302(0x88,0x07);
321 2 Write1302(0x86,0x25);
322 2 Write1302(0x8a,0x07);
323 2 Write1302(0x84,0x23);
324 2 Write1302(0x82,0x59);
325 2 Write1302(0x80,0x55);
326 2 Write1302(0x8e,0x80); //禁止写入
327 2 }
328 1
329 1 }
330
331 /***********ds18b20子程序*************************/
332
333 /***********ds18b20延迟子函数(晶振12MHz )*******/
334
335 void delay_18B20(unsigned int i)
336 {
337 1 while(i--);
338 1 }
339
340 /**********ds18b20初始化函数**********************/
341
342 void Init_DS18B20(void)
343 {
344 1 unsigned char x=0;
345 1 DQ = 1; //DQ复位
346 1 delay_18B20(8); //稍做延时
347 1 DQ = 0; //单片机将DQ拉低
348 1 delay_18B20(80); //精确延时 大于 480us
349 1 DQ = 1; //拉高总线
350 1 delay_18B20(14);
351 1 x=DQ; //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
352 1 delay_18B20(20);
353 1 }
354
355 /***********ds18b20读一个字节**************/
356
357 unsigned char ReadOneChar(void)
358 {
359 1 uchar i=0;
360 1 uchar dat = 0;
361 1 for (i=8;i>0;i--)
362 1 {
C51 COMPILER V7.06 DS1302 05/03/2008 20:11:44 PAGE 7
363 2 DQ = 0; // 给脉冲信号
364 2 dat>>=1;
365 2 DQ = 1; // 给脉冲信号
366 2 if(DQ)
367 2 dat|=0x80;
368 2 delay_18B20(4);
369 2 }
370 1 return(dat);
371 1 }
372
373 /*************ds18b20写一个字节****************/
374
375 void WriteOneChar(uchar dat)
376 {
377 1 unsigned char i=0;
378 1 for (i=8; i>0; i--)
379 1 {
380 2 DQ = 0;
381 2 DQ = dat&0x01;
382 2 delay_18B20(5);
383 2 DQ = 1;
384 2 dat>>=1;
385 2 }
386 1 }
387
388 /**************读取ds18b20当前温度************/
389
390 void ReadTemp(void)
391 {
392 1 unsigned char a=0;
393 1 unsigned char b=0;
394 1 unsigned char t=0;
395 1
396 1 Init_DS18B20();
397 1 WriteOneChar(0xCC); // 跳过读序号列号的操作
398 1 WriteOneChar(0x44); // 启动温度转换
399 1
400 1 delay_18B20(100); // this message is wery important
401 1
402 1 Init_DS18B20();
403 1 WriteOneChar(0xCC); //跳过读序号列号的操作
404 1 WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度
405 1
406 1 delay_18B20(100);
407 1
408 1 a=ReadOneChar(); //读取温度值低位
409 1 b=ReadOneChar(); //读取温度值高位
410 1 temp_value=b<<4;
411 1 temp_value+=(a&0xf0)>>4;
412 1 }
413 void temp_to_str() //温度数据转换成液晶字符显示
414 {
415 1 TempBuffer[0]=temp_value/10+'0'; //十位
416 1 TempBuffer[1]=temp_value%10+'0'; //个位
417 1 TempBuffer[2]=0xdf; //温度符号
418 1 TempBuffer[3]='C';
419 1 TempBuffer[4]='\0';
420 1 }
421 void settemp_to_str()
422 {
423 1 if(hide_settemp<2)
424 1 {
C51 COMPILER V7.06 DS1302 05/03/2008 20:11:44 PAGE 8
425 2 set_temp1[0]=settemp1/10+48;/////////////////////////////////////////////////////////////////////////////
-///////////////////
426 2 set_temp1[1]=settemp1%10+48;
427 2 }
428 1 else
429 1 {
430 2 set_temp1[0]=' ';
431 2 set_temp1[1]=' ';
432 2
433 2 }
434 1
435 1 }
436 void Delay1ms(unsigned int count)
437 {
438 1 unsigned int i,j;
439 1 for(i=0;i<count;i++)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -