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

📄 ds1302时分.c

📁 能用串口修改时间的时钟程序
💻 C
字号:
/************************************/
/*杭州电子&计算机工作室				*/
/*http://www.hificat.com			*/
/*DS1302测试程序					*/
/*目标器件:AT89S51					*/
/*晶振:11.0592MHZ					*/
/*编译环境:Keil 7.50A				*/
/************************************/

/*********************************包含头文件********************************/
#include "reg51.h"
#include <intrins.h>

/*********************************端口定义**********************************/
sbit DS1302_CLK = P1^0;
sbit DS1302_IO  = P1^1;
sbit DS1302_RST = P1^2;

/*******************************共阳LED段码表*******************************/
unsigned char code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};

/******************************定义全局变量*********************************/
unsigned char second,minute,hour,week,day,month,year;		//秒、分、时、星期、日、月、年
unsigned char minute1,hour1;

unsigned char t1,t2,i;
unsigned char time[]={0x08,0x06,0x19,0x04,0x09,0x30,0x00};	//初始时间数组



unsigned  char secondchar,minutechar,hourchar,weekchar,daychar,monthchar,yearchar;

unsigned char keysum ;

sbit	K1 = P3^2;
sbit	K2 = P3^3;

unsigned char key_s, key_v, tmp;
unsigned char key_s1, key_v1;
//int kk;





/****************************************************************************
函数功能:数码管扫描延时子程序
入口参数:
出口参数:
****************************************************************************/
void delay1(void)
{
	int k;
	for(k=0;k<400;k++);
}

void delayms(unsigned char ms)	
// 延时子程序
{						
	unsigned char i;
	while(ms--)
	{
		for(i = 0; i < 120; i++);
	}
}


void delayms1(unsigned char ms)	
// 延时子程序
{						
	unsigned char i;
	while(ms--)
	{
		for(i = 0; i < 120; i++);
	}
}


void displayhour(void)
{
	P2=0xfe;			
	P0=tab[hour1/10];
	delayms1(1);

	P2=0xfd;
	P0=tab[hour1%10];
	delayms1(1);
}

void displayminuite(void)
{


	P2=0xf7;
	P0=tab[minute1/10];
	delayms1(1);

	P2=0xef;
	P0=tab[minute1%10];
	delayms1(1);

}

void displaysecond(void)
{

	P2=0xbf;
	P0=tab[second/10];
	delayms1();

	P2=0x7f;
	P0=tab[second%10];
	delayms1();

}
/****************************************************************************
函数功能:数码管显示子程序
入口参数:k
出口参数:
****************************************************************************/
void display(void)
{
	P2=0xfe;			
	P0=tab[hour/16];
	delay1();

	P2=0xfd;
	P0=tab[hour%16];
	delay1();

	P2=0xfb;
	P0=0xbf;			//显示"-"
	delay1();

	P2=0xf7;
	P0=tab[minute/16];
	delay1();

	P2=0xef;
	P0=tab[minute%16];
	delay1();

	P2=0xdf;
	P0=0xbf;			//显示"-"
	delay1();

	P2=0xbf;
	P0=tab[second/16];
	delay1();

	P2=0x7f;
	P0=tab[second%16];
	delay1();
}

/*****************************************************************************
函数功能:向DS1302送一字节数据子程序
入口参数:
出口参数:
*****************************************************************************/
void InputByte(unsigned char byte1)
{
	char i;
	for(i=8;i>0;i--)
	{
		DS1302_IO=(bit)(byte1&0x01);
		DS1302_CLK=1;
		_nop_();
		DS1302_CLK=0;
		byte1>>=1;
	}
	return;
}

/*****************************************************************************
函数功能:读DS1302一个字节子程序
入口参数:
出口参数:
*****************************************************************************/
unsigned char outputbyte(void)  
{
	unsigned char i;
	unsigned ucdat=0;
	for(i=8;i>0;i--)
	{
		DS1302_IO=1;
		ucdat>>=1;
		if(DS1302_IO)ucdat|=0x80;
		DS1302_CLK=1;
		_nop_();
		DS1302_CLK=0;
	 }
	 return(ucdat);
}

/*****************************************************************************
函数功能:向DS1302某地址写一字节数据子程序
入口参数:addr,TDat
出口参数:
*****************************************************************************/
void write_ds1302(unsigned char addr,unsigned char TDat)
{
	DS1302_RST=0;
	_nop_();
	DS1302_CLK=0;
	_nop_();
	DS1302_RST=1;
 	InputByte(addr);
	_nop_();
	InputByte(TDat);
	DS1302_CLK=1;
	_nop_();
	DS1302_RST=0;
}

/*****************************************************************************
函数功能:读DS1302地址子程序
入口参数:add
出口参数:timedata
*****************************************************************************/
unsigned char read_ds1302(unsigned char addr)
{
	unsigned char timedata;
	DS1302_RST=0;
	_nop_();
	DS1302_CLK=0;
	_nop_();
	DS1302_RST=1;
	InputByte(addr);
	timedata=OutputByte();
	DS1302_CLK=1;
	_nop_();
	DS1302_RST=0;
	return(timedata);
}

/*****************************************************************************
函数功能:初始化DS1302子程序
入口参数:time[](全局变量)
出口参数:
*****************************************************************************/
void initial_ds1302()
{
	write_ds1302(0x8e,0x00);		//写保护寄存器,在对时钟或RAM写前WP一定要为0
	write_ds1302(0x8c,time[0]);		//年
	write_ds1302(0x88,time[1]);		//月
	write_ds1302(0x86,time[2]);		//日
	write_ds1302(0x8A,time[3]);		//星期
	write_ds1302(0x84,time[4]);		//时
	write_ds1302(0x82,time[5]);		//分
	write_ds1302(0x80,time[6]);		//秒
	write_ds1302(0x8e,0x80);		//写保护寄存器
}

void initial_ds13021()
{
	write_ds1302(0x8e,0x00);		//写保护寄存器,在对时钟或RAM写前WP一定要为0
	write_ds1302(0x8c,year);		//年
	write_ds1302(0x88,month);		//月
	write_ds1302(0x86,day);		//日
	write_ds1302(0x8A,week);		//星期
	write_ds1302(0x84,hour);		//时
	write_ds1302(0x82,minute);		//分
	write_ds1302(0x80,second);		//秒
	write_ds1302(0x8e,0x80);		//写保护寄存器
}

/*****************************************************************************
函数功能:读DS1302时间子程序
入口参数:
出口参数:全局变量(second,minute,hour,week,day,month,year)
*****************************************************************************/
void read_time()
{
	second=read_ds1302(0x81);		//秒寄存器
	minute=read_ds1302(0x83);		//分
	hour=read_ds1302(0x85);			//时
	week=read_ds1302(0x8B);			//星期
	day=read_ds1302(0x87);			//日
	month=read_ds1302(0x89);		//月
	year=read_ds1302(0x8d);			//年
}

/*****************************************************************************
函数功能:主程序
入口参数:
出口参数:
*****************************************************************************/






bit scan_key1()	
// 扫描按键
{
	key_s1 = 0x00;
	key_s1 |= K2;  /////////////////////////////////////////////////
	
	return(key_s1 ^ key_v1);	
}



void proc_key1()
// 键处理
{ //  hour=12;
   // displayhour();
	if((key_v1 & 0x01) == 0  )
	{			// K2按下
	    	  
          	if (keysum==1) hour1=hour1+1;	
		//	if(hour==0x10) hour=hour+6;
		//	if(hour==0x20) hour=32;
            if (keysum==2) minute1=minute1+1;
		    if (minute1>59)  minute1=0;
			if (hour1>23) hour1=0;
     

	}

}


bit scan_key()	
// 扫描按键
{
	key_s = 0x00;
	key_s |= K1;  /////////////////////////////////////////////////

	return(key_s ^ key_v);	
}

void proc_key()
// 键处理
{
	if((key_v & 0x01) == 0)
	{			// K1按下
	//	send_str();		
        keysum++;

          if (keysum==1) 
		     {
		      hour1=((int)hour)/16;
			  hour1=hour1*10+((int)hour)%16;
			     //hour1=hour
			  }

          if (keysum==2)
		      {
			    	
		      minute1=((int)minute)/16;
			  minute1=minute1*10+((int)minute)%16;
			   //  minute1=minute;
			  }

			 
	if (keysum>2) 
	   {  	      
     	   keysum=0;
		  hour=(hour1/10)*16+(hour1%10);
		  minute=(minute1/10)*16+(minute1%10);
          initial_ds13021();           
	   }
     
	}

}

void main(void)
{   
    
    keysum=0;
	initial_ds1302();				//初始化DS1302
	while(1)
	{    
	  
        if(scan_key())		// 扫描按键
		{
			delayms(10);			// 延时去抖动
		
			if(scan_key())			// 再次扫描
			{
				key_v = key_s;		// 保存键值
				proc_key();			// 键处理
			}
		}
      

		if(scan_key1())		// 扫描按键
		{
			delayms(10);			// 延时去抖动
			if(scan_key1())			// 再次扫描
			{
				key_v1 = key_s1;		// 保存键值
				proc_key1();			// 键处理
			}
		}


      if (keysum==1)displayhour();		 
	     
      if (keysum==2)displayminuite();  
      if (keysum==0  )
	    {
		read_time();				//读取时间
		display();					//显示时间
		}
	}
}




⌨️ 快捷键说明

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