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

📄 1302.c

📁 自制的 DS1820+51+1602 测量温度的程序 同样适合初学者 了解和掌握51单片机学西
💻 C
字号:
#include <reg51.h>
#include "1302.h"
#include "1602.h"

//#define     uchar        unsigned char
//#define     uint         unsigned int

uchar clk_time[]={0x30,0x56,0x19,0x16,0x08,0x04,0x07};  //秒,分,时,天,月,星期,年寄存器初始值	
uchar sec0,sec1,min0,min1,hr0,hr1,date0,date1,mon0,mon1,week,year0,year1;

/******************DS1302:写入操作(上升沿)*********************/ 
void write_byte(unsigned char da)
{
   unsigned char i;
   ACC=da;
   for(i=8;i>0;i--)
   { 
      T_IO=ACC0;
      T_CLK=0;     
      T_CLK=1;
      ACC=ACC>>1;
   }
}

/*******************DS1302:读取操作(下降沿)******************/
unsigned char read_byte(void)
{
   unsigned char i;
   for(i=0;i<8;i++)
   {
      ACC=ACC>>1;
	  T_CLK = 1;
	  T_CLK = 0;
      ACC7 = T_IO;
   }
   return(ACC);
}

/******************DS1302:写入数据(先送地址,再写数据)***************************/ 
void write_1302(unsigned char addr,unsigned char da)
{
   T_RST=0;    //停止工作
   T_CLK=0;                                 
   T_RST=1;   //重新工作
   write_byte(addr);    //写入地址
   
   write_byte(da);
   T_RST=0;
   T_CLK=1;
}

/******************DS1302:读取数据(先送地址,再读数据)**************************/
unsigned char read_1302(unsigned char addr)
{
   unsigned char temp;
   T_RST=0;                                   //停止工作
   T_CLK=0;  
   T_RST=1;                         //重新工作
   write_byte(addr);   //写入地址
   temp=read_byte();
   T_RST=0;
   T_CLK=1;     //停止工作
   return(temp);
}

/******************************DS1302写时间子程序*************************/
void  WriteTime()
{	
	uchar i;
	uchar  temp=0x80;	            //DS1302秒的写寄存器地址 0x80
	for(i=0;i<7;i++)
   {
   	  write_1302(temp,clk_time[i]);
      temp+=2;						 
   }

}


/*********************************DS1302读时间子程序*********************/
void  ReadTime()
{	
	uchar i;
	uchar  temp=0x81; 	           //DS1302秒的写寄存器地址 0x81  
	for(i=0;i<7;i++) 
	{                  
	    clk_time[i]=read_1302(temp);
		temp+=2;
	}

}

/******************************初始化显示时间****************************************/
void  DisplayInit() 
{
 Show(1,1,2+48);
	Show(2,1,48);
	
	year1=(clk_time[6]&0xF0)>>4;	//读 年 的高位
	Show(3,1,year1+48);     	   // 显示
	year0=clk_time[6]&0x0F;		   // 读年的低位
	Show(4,1,year0+48);			   //显示	
	
	
	Show(5,1,'-');				   //显示‘-’
	
	week=clk_time[5]&0x07;	       //显示星期
	
	mon1=(clk_time[4]&0x10)>>4;		 //月
	Show(6,1,mon1+48);
	mon0=clk_time[4]&0x0F;
	Show(7,1,mon0+48);
	   
	Show(8,1,'-');				  
	
	date1=(clk_time[3]&0x30)>>4;	 //天
	Show(9,1,date1+48);
	date0=clk_time[3]&0x0F;
	Show(10,1,date0+48); 
	
	Show(11,1,'-');
	
	Display(12,1,"Thu");		    
	
	hr1=(clk_time[2]&0x30)>>4;		  //时
	Show(1,2,hr1+48); 
	hr0=clk_time[2]&0x0F;		
	Show(2,2,hr0+48);
	
	Show(3,2,':');
	
	min1=(clk_time[1]&0x70)>>4;		   //分
	Show(4,2,min1+48);
	min0=clk_time[1]&0x0F;
	Show(5,2,min0+48);
	
	Show(6,2,':');
	
	sec1=(clk_time[0]&0x70)>>4;		   //秒
	Show(7,2,sec1+48);
	sec0=clk_time[0]&0x0F;
	Show(8,2,sec0+48);    
}

/*******************************时间判断自加函数**********************************/
void Judgetime()
{
    if(sec0==0&&sec1==0)		 //判断如果秒都为0则分加一显示
		{
			min1=(clk_time[1]&0x70)>>4;
			Show(4,2,min1+48);
			min0=clk_time[1]&0x0F;
			Show(5,2,min0+48);
		//	P21=0;

		}
		if(min0==0&&min1==0)	   //判断如果分都为0则时加一显示
		{
			min1=1;	 //让min1为别的值 
			hr1=(clk_time[2]&0x30)>>4;
			Show(1,2,hr1+48); 
			hr0=clk_time[2]&0x0F;		
			Show(2,2,hr0+48);
		} 
		if(hr0==0&&hr1==0)		         //判断如果时都为0则天加一显示
		{
			hr0=1;	 //date让为别的值
			date1=(clk_time[3]&0x30)>>4;	
			Show(9,1,date1+48);
			date0=clk_time[3]&0x0F;
			Show(10,1,date0+48);
		switch (clk_time[5])	      //同时显示星期
		{
			case 1: Display(12,1,"Mon"); break;
			case 2: Display(12,1,"Tue"); break;
			case 3: Display(12,1,"Wen"); break;
			case 4: Display(12,1,"Thu"); break;
			case 5: Display(12,1,"Fri"); break;
			case 6: Display(12,1,"Sat"); break;
			case 7: Display(12,1,"Sun"); break;
			default:break;
		
		}
		
		}
	if(date1==0&&date0==1)             //判断如果天都为01则月加一显示
		{
			date0=0;	 //date让为别的值
			mon1=(clk_time[4]&0x10)>>4;	
			Show(6,1,mon1+48);
			mon0=clk_time[4]&0x0F;
			Show(7,1,mon0+48);
		}	  	  
	   
	   if(mon1==0&&mon0==1)             //判断如果月为01则年加一显示
		{
			mon0=0;	 //让为别的值
			year1=(clk_time[6]&0xF0)>>4;	
			Show(3,1,year1+48);
			year0=clk_time[6]&0x0F;
			Show(4,1,year0+48);
		}	  	  
}  	  



void sec()
{ 
        sec1=(clk_time[0]&0x70)>>4;
		Show(7,2,sec1+48);
		sec0=clk_time[0]&0x0F;
		Show(8,2,sec0+48); 	
}

⌨️ 快捷键说明

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