⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ds18b20.c

📁 通过单片机实现电子钟功能
💻 C
字号:
#include  <reg52.h> 
#include  <LCD1602.h> 
#include  <DS18B20.h> 
#include  <DS1308.h>

sbit P1_4=P1^4;
sbit P1_5=P1^5;
sbit P1_6=P1^6;
sbit P1_7=P1^7;
uchar tem_data   []= {""};
uchar time_data[21]= {""};
uchar x;


uchar code week1[]= {"Monday"};
uchar code week2[]= {"Tuesday"};
uchar code week3[]= {"Wednesday"};
uchar code week4[]= {"Thursday"};
uchar code week5[]= {"Friday"};
uchar code week6[]= {"Saturday"};
uchar code week7[]= {"Sunday"};


void  Temdata_pro(uchar t)
{
  if(Tflag==1)
    tem_data[0]='+';
  else
   tem_data[0]='-';
   tem_data[1]=t/10+'0';
   tem_data[2]=t%10+'0';
   tem_data[3]='.';
   tem_data[4]='0';
   tem_data[5]='\0';
}

void  data_pro()
{
   time_data[0]='2';
   time_data[1]='0';
   time_data[2]=((ys>>4)&0x0f)+'0';
   time_data[3]=( ys&0x0f)+'0';
   time_data[4]='-';
   time_data[5]=((mn>>4)&0x01)+'0';
   time_data[6]=( mn&0x0f)+'0';
   time_data[7]='-';
   time_data[8]=((day>>4)&0x03)+'0';
   time_data[9]=( day&0x0f)+'0';
   time_data[10]=' ';
   time_data[11]=' ';
   time_data[12]=((hr>>4)&0x09)+'0';
   time_data[13]=( hr&0x0f)+'0';
   time_data[14]=':';
   time_data[15]=((min>>4)&0x0f)+'0';
   time_data[16]=( min&0x0f)+'0';
   time_data[17]=':';
   time_data[18]=((sec>>4)&0x0f)+'0';
   time_data[19]=( sec&0x0f)+'0';
   time_data[20]='\0';
   x=we&0x07;
}



uchar key_san()
{
   P1=0xfe;
   if(!P1_4)return  (10);
   if(!P1_5)return  (0);
   if(!P1_6)return  (11);
   if(!P1_7)return  (12);
   P1=0xfd;
   if(!P1_4)return  (1);
   if(!P1_5)return  (2);
   if(!P1_6)return  (3);
   if(!P1_7)return  (13);
   P1=0xfb;
   if(!P1_4)return  (4);
   if(!P1_5)return  (5);
   if(!P1_6)return  (6);
   if(!P1_7)return  (14);
   P1=0xf7;
   if(!P1_4)return  (7);
   if(!P1_5)return  (8);
   if(!P1_6)return  (9);
   if(!P1_7)return  (15);

}

uchar CaculateWeekDay(uchar y,uchar m, uchar d)
 { uchar weekday;
   uchar c=21; 	  //世纪数
   if(m==1) {m=13; y--;}
   if(m==2) {m=14; y--;}
   weekday=y+y/4+c/4-2*c+26*(m+1)/10+d-1; //蔡勒(Zeller)公式
   return  weekday;
}

void set_time()
{
  uchar key_code,kk=0;
  uchar comH,comL;
  uchar y,m,d,week;
  uchar initime[]= {"2009-01-01 00:00:00"};
  WriteCommand(0x01);		  //清屏
  WriteCommand(0x0f);		  //开光标
  display_string(0,0,initime);
  WriteCommand(0x02);		  //光标复位
  do
  {
   	P1=0xf0;
    if(P1!=0xf0)
      {
		delayms(5);
		if(P1!=0xf0)
	    key_code=key_san();
		initime[kk]=key_code+'0';	//键值转换
		P1=0xf0;
	    while(P1!=0xf0);		   //等待按键释放
		display_onechar(0,kk,initime[kk]);	//显示更改后的时间
		kk++;
		if(kk==4)  { kk++; display_onechar(0,kk-1,initime[kk-1]);}	  //跳过分隔符
		if(kk==7)  { kk++; display_onechar(0,kk-1,initime[kk-1]);}
		if(kk==10) { kk++; display_onechar(0,kk-1,initime[kk-1]);}
		if(kk==13) { kk++; display_onechar(0,kk-1,initime[kk-1]);}
		if(kk==16) { kk++; display_onechar(0,kk-1,initime[kk-1]);}
	  } 
  
  }
  while( key_code!=11) ;   //设置完毕,退出
  kk=0;
  WriteCommand(0x0c);		  //关光标

  comH=initime[2]-'0';		  //向DS1308写入新数据
  comL=initime[3]-'0';
  y=(comH<<4)|comL;
  WriteYs(y);
  comH=initime[5]-'0';
  comL=initime[6]-'0';
  m=(comH<<4)|comL;
  WriteMn(m);
  comH=initime[8]-'0';
  comL=initime[9]-'0';
  d=(comH<<4)|comL;
  WriteDay(d);
  comH=initime[11]-'0';
  comL=initime[12]-'0';
  WriteHr(((comH<<4)|comL));
  comH=initime[14]-'0';
  comL=initime[15]-'0';
  WriteMin(((comH<<4)|comL));
  comH=initime[17]-'0';
  comL=initime[18]-'0';
  WriteSec(((comH<<4)|comL));
  week=CaculateWeekDay(y,m,d);
  WriteWe(week);
  
 
}
/***************************************************************************/
void main (void)
 {
    uchar i;
    uchar T;
	uchar  key_code;
	lcd_init();
	DS1308_init();							
	Write_CGRAM(LcdBuf);		 	 //向CGRAM写入自定义的摄氏度符号
	for(i=0;i<2;i++)
     display_onechar(1,i+17,i);	   //显示自定义的摄氏度符号
    while(1)
	{	
	   	read_DS1308();			 //读取时间和日期
		data_pro();				//时间和日期数据处理
		switch (x)				//显示星期
         {
   	      case 1: display_string(1,0,week1); break;
		  case 2: display_string(1,0,week2); break;
		  case 3: display_string(1,0,week3); break;
		  case 4: display_string(1,0,week4); break;
		  case 5: display_string(1,0,week5); break;
		  case 6: display_string(1,0,week6); break;
		  case 7: display_string(1,0,week7); break;
          } 
		display_string(0,0,time_data);
			
		tmstart();			// ds1820开始转换
		dmsec(2);    
		T=tmrtemp();    	// 读取温度	
		Temdata_pro(T);	   //温度数据处理
		display_string(1,12,tem_data);

    	P1=0xf0;
        while(P1!=0xf0)
         {
		   delayms(5);
		   if(P1!=0xf0)
	          key_code=key_san();
	       P1=0xf0;
	       while(P1!=0xf0);
		   if(key_code==10)
		    set_time();
         }


	} 
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -