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

📄 settime.c

📁 DS1302 ds18b20时间温度led显示系统源代码
💻 C
字号:
#include<reg51.h>

#define uchar unsigned char

sbit SCLK = P2^6;
sbit IO = P2^7;
sbit RST = P2^5;

sbit ACC0 = ACC^0;
sbit ACC7 = ACC^7;

sbit DQ = P1^0;

sbit select = P3^2;
sbit add = P3^3;
sbit dec = P3^4;
sbit esc = P3^5;

bit flag2;

uchar flag,flag1;
uchar sec,min,hour,date,month;
uchar Num[10];

 /* {0,1,2,3,4,5,6,7,8,9, °,C} */
uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xc6,0x9c,0xbf,0xff}; 
uchar code SW[]={0x01,0x02,0x04,0x08};

void delay_2us(uchar t)
{
  while(--t);
}

void delay_50us(uchar t)
{
  uchar i;
  for(;t>0;t--)
  for(i=23;i>0;i--);
}

void Reset(void)
{
 DQ = 0;
 delay_50us(12);
 DQ = 1;
 delay_50us(2);
}

void WriteByte(uchar byte)
{
  uchar i,j;
  bit dat;
  for(i=8;i>0;i--)
  {
    DQ = 0;
    dat = byte & 0x01;
    byte = byte>>1;
    if(dat)
    {
      DQ = 1;
     }
    else
    {
      DQ = 0;
     }
     delay_2us(30);
     DQ = 1;
     j++;
     j++;
    }
}

uchar ReadBit(void)
{
  uchar dat;
  uchar i;
  DQ = 0;
  i++;
  i++;
  DQ = 1;
  i++;
  i++;
  dat = P1^0;
  delay_2us(30);
  DQ = 1;
  return (dat);
}

uchar ReadByte(void)
{
  uchar i,j,val;
  val = 0x00;
  for(i=8;i>0;i--)
  {
    val = val >> 1;
    j = ReadBit();
    val = (j << 7) | val;
   }
   return (val);
}

void Start_ds18b20(void)
{
  Reset();
  delay_2us(10);
  WriteByte(0xcc);
  WriteByte(0x44);
}

uchar ReadTemp(void)
{
  uchar tempL,tempH,temp;
  Reset();
  delay_2us(50);
  WriteByte(0xcc);
  WriteByte(0xbe);
  tempL = ReadByte();
  tempH = ReadByte();
  flag = tempH & 0x80;
  if(flag != 0)
  {
    tempL = ~tempL + 1;
	tempH = ~tempH + 1;
	}
  tempL = tempL & 0xf0;
  tempH = tempH & 0x0f;
  temp = (tempL >> 4) | (tempH << 4);
  return (temp);
}

/*********写一字节**********/
void writebyte1302(uchar data0)
{
  uchar i;
  ACC = data0;
  for(i=8;i>0;i--)
  {
    IO = ACC0;
    SCLK = 1;
    SCLK = 0;
    ACC = ACC >> 1;
   }
}

/*******读一字节******************/
uchar readbyte1302()
{
  uchar i;
  for(i=8;i>0;i--)
  {
    ACC = ACC >> 1;
    ACC7 = IO;
    SCLK = 1;
    SCLK = 0;
  }
  return(ACC);
}

/*********向DS1302写一字节内容********/
void Write1302(uchar Addr,uchar data1)
{
  RST = 0;
  SCLK = 0;
  RST = 1;
  writebyte1302(Addr);
  writebyte1302(data1);
  SCLK = 1;
  RST = 0;
}

/*************读DS1302一字节的内容*********/
uchar Read1302(uchar Addr)
{
  uchar temp;
  RST = 0;
  SCLK = 0;
  RST = 1;
  writebyte1302(Addr);
  temp = readbyte1302();
  SCLK = 1;
  RST = 0;
  return(temp);
 }

void settime()
{
  uchar temp1,temp2;
  uchar premin,prehour,predate,premonth;
  temp1 = min / 10;
  temp2 = min % 10;
  premin = (temp1<<4) | temp2;
  temp1 = hour / 10;
  temp2 = hour % 10;
  prehour = (temp1<<4) | temp2;
  prehour = prehour | 0x80;
  temp1 = date / 10;
  temp2 = date % 10;
  predate = (temp1<<4) | temp2;
  temp1 = month / 10;
  temp2 = month % 10;
  premonth = (temp1<<4) | temp2;
  Write1302(0x8e,0x00);  	  //关闭写保护,准备向DS1302写入初始值
  Write1302(0x80,0x80);
  Write1302(0x82,premin);
  Write1302(0x84,prehour);
  Write1302(0x86,predate);
  Write1302(0x88,premonth);
  Write1302(0x80,0x00);
  Write1302(0x8e,0x80); //打开写保护,禁止向DS1302写入
  }	


void Init1302()
{
  Write1302(0x8e,0x00);	//关闭写保护,准备向DS1302写入初始值
  Write1302(0x80,0x00); //启动DS1302
  Write1302(0x8e,0x80); //打开写保护,禁止向DS1302写入
  }

/*********读取当前时间**********/ 
void Gettime()
{ 
  sec = Read1302(0x81);
  min = Read1302(0x83);
  hour = Read1302(0x85);
  date = Read1302(0x87);
  month = Read1302(0x89);
  min = (min / 16) * 10 + min % 16;
  hour = hour & 0x1f;
  hour = (hour / 16)*10 + hour % 16;
  date = (date / 16) * 10 + date % 16;
  month = (month / 16) * 10 + month % 16;
 }

void showtemp(uchar x)
{
  uchar n,w;
  if(flag != 0)
  {
    Num[3] = 12;
   }
  else 
  Num[3] = 13;
  Num[0] = 11;
  Num[1] = x%10;
  Num[2] = x/10;
  for(n=50;n>0;n--)
  { 
    for(w=0;w<4;w++)
    { 
	  P0 = 0xff;
	  P2=SW[w];
      P0=table[Num[w]];
	  delay_50us(5);
	  }
   }
}

void scankey()
{
  if(select == 0)
  delay_50us(100);
  if(select == 0)
  {
    while(!select);
	flag1++;
	}
  
  if(flag1 == 1)	//设置小时状态时
  {
    if(add == 0)
	delay_50us(100);
	if(add == 0)
	{
	  while(!add);
	  if(hour == 12)
	    hour = 1;
	  else
	    hour++;
	  }
    if(dec == 0)
    delay_50us(100);
    if(dec == 0)
	{
	  while(!dec);
	  if(hour == 1)
	    hour = 12;
	  else
	    hour--;
	  }
	 }
  
  if(flag1 == 2)      //设置分钟状态时
  {
    if(add == 0)
	delay_50us(100);
	if(add == 0)
	{
	  while(!add);
	  if(min == 59)
	    min = 0;
	  else
	    min++;
	  }
    if(dec == 0)
	delay_50us(100);
	if(dec == 0)
	{
	  while(!dec);
	  if(min == 0)
	    min = 59;
	  else
	    min--;
	  }
	}

  if(flag1 == 3)	//设置月状态时
  {
    if(add == 0)
	delay_50us(100);
	if(add == 0)
	{
	  while(!add);
	  if(month == 12)
	    month = 1;
	  else
	    month++;
	  }
    if(dec == 0)
    delay_50us(100);
    if(dec == 0)
    {
      while(!dec);
	  if(month == 1)
	    month = 12;
	  else
	    month--;
	  }
	 }
	 
  if(flag1 == 4)	//设置日期状态时
  {
    if(add == 0)
    delay_50us(100);
    if(add == 0)
	{
	  while(!add);
	  if((month == 1) || (month == 3) || (month == 5) || (month == 7) || (month == 8) || (month == 10) || (month == 12))
	  {
	    if(date == 31)
	      date = 1;
	    else
	      date++;
	    }
	  if((month == 4) || (month == 6) || (month == 9) || (month == 11))
	  {
	    if(date == 30)
	      date = 1;
	    else
	      date++;
	    }
      else
	  {
        if(date == 29)
		  date = 1;
		else
		  date++;
		}
	   }
    if(dec == 0)
    delay_50us(100);
    if(dec == 0)
	{
	   while(!dec);
	   if((month == 1) || (month == 3) || (month == 5) || (month == 7) || (month == 8) || (month == 10) || (month == 12))
	   {
	     if(date == 1)
	       date = 31;
	     else
	       date--;
	     }
	   if((month == 4) || (month == 6) || (month == 9) || (month == 11))
	   {
	     if(date == 1)
	       date = 30;
	     else
	       date--;
	     }
	   else
	   {
	     if(date == 1)
		   date = 29;
		 else
		   date--;
		}
	   }
	 }
	//在正常时间显示状态时按下dec键,可以在时间显示和温度显示状态之间切换
  if(dec == 0)
  delay_50us(100);
  if(dec == 0)
  {
    while(!dec);
	flag2 = !flag2;
	}
	//esc键按下,推出设置及温度显示状态,返回到时间显示
  if(esc == 0)
  delay_50us(100);
  if(esc == 0)
  {
    while(!esc);
	flag1 = 0;
	flag2 = 0;
	}
   //else 
    // settime();
 }							 

void showmin()
{
  uchar n,w;
  Num[0]=min % 10;
  Num[1]=min / 10;
  Num[2]=hour % 10;
  Num[3]=hour / 10;
  for(n=80;n>0;n--)
  { 
    for(w=0;w<4;w++)
    { 
	  P0 = 0xff;
	  P2=SW[w];
      P0=table[Num[w]];
	  delay_50us(10);
	  }
   }
  for(n=200;n>0;n--)
  { 
    for(w=2;w<4;w++)
    { 
	  P0 = 0xff;
	  P2=SW[w];
      P0=table[Num[w]];
	  delay_50us(10);
	  }
   }
 }

void showhour()
{
  uchar n,w;
  Num[0]=min % 10;
  Num[1]=min / 10;
  Num[2]=hour % 10;
  Num[3]=hour / 10;
  for(n=80;n>0;n--)
  { 
    for(w=0;w<4;w++)
    { 
	  P0 = 0xff;
	  P2=SW[w];
      P0=table[Num[w]];
	  delay_50us(10);
	  }
	}
  for(n=200;n>0;n--)
  { 
    for(w=0;w<2;w++)
    { 
	  P0 = 0xff;
	  P2=SW[w];
      P0=table[Num[w]];
	  delay_50us(10);
	  }
	}
 }	 

void showdate()
{
  uchar n,w;
  Num[0]=date % 10;
  Num[1]=date / 10;
  Num[2]=month % 10;
  Num[3]=month / 10;
  for(n=80;n>0;n--)
  { 
    for(w=0;w<4;w++)
    { 
	  P0 = 0xff;
	  P2=SW[w];
      P0=table[Num[w]];
	  delay_50us(10);
	  }
	}
  for(n=200;n>0;n--)
  { 
    for(w=2;w<4;w++)
    { 
	  P0 = 0xff;
	  P2=SW[w];
      P0=table[Num[w]];
	  delay_50us(10);
	  }
	}
 }	 

void showmonth()
{
  uchar n,w;
  Num[0]=date % 10;
  Num[1]=date / 10;
  Num[2]=month % 10;
  Num[3]=month / 10;
  for(n=80;n>0;n--)
  { 
    for(w=0;w<4;w++)
    { 
	  P0 = 0xff;
	  P2=SW[w];
      P0=table[Num[w]];
	  delay_50us(10);
	  }
	}
  for(n=200;n>0;n--)
  { 
    for(w=0;w<2;w++)
    { 
	  P0 = 0xff;
	  P2=SW[w];
      P0=table[Num[w]];
	  delay_50us(10);
	  }
	}
 }	 
  
void showtime()
{
  uchar n,w;
  Num[0]=min % 10;
  Num[1]=min / 10;
  Num[2]=hour % 10;
  Num[3]=hour / 10;
  for(n=10;n>0;n--)
  { 
    for(w=0;w<4;w++)
    { 
	  P0 = 0xff;
	  P2=SW[w];
      P0=table[Num[w]];
	  delay_50us(10);
	  }
   }
}
 
void main()
{
  uchar temp;
  flag1 = 0;
  Start_ds18b20();
  delay_50us(10);
  temp = ReadTemp();
  Init1302();
  while(1)
  {
    Gettime();
	//Start_ds18b20();
	//if((sec%16) > 4)
	//for(i=5;i>0;i--)
	//{
	  showtime();
	//  }
	/*else
	{
	  temp = ReadTemp();
	  for(i=10;i>0;i--)
	  {
	      showtemp(temp);
	  }
	 }*/
   scankey();
   while(flag2)
   {
     flag1 = 0;
	 scankey();
	 Start_ds18b20();
	 delay_50us(10);
	 temp = ReadTemp();
	 showtemp(temp);
	 }
   while(flag1)
   {
     scankey();
	 flag2 = 0;
	/* if(flag1 == 1)
	 {
		Start_ds18b20();
		delay_50us(10);
		temp = ReadTemp();
		showtemp(temp);
		}*/
	 if(flag1 == 1)
     showhour();
	 if(flag1 == 2)
	 showmin();
	 if(flag1 == 3)
	 showmonth();
	 if(flag1 == 4)
	 showdate();
	 if(flag1 == 5)
	 {
	  	settime();
		flag1 = 0;
		}
	  } 
  }
}


⌨️ 快捷键说明

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