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

📄 1302.c

📁 1302实现时钟定时报警
💻 C
📖 第 1 页 / 共 2 页
字号:
{	
	uchar	i,dat;
	DATA = 1;
	for(i=0;i<7;i++)
	{
		CLK = 0;
		if(DATA == 1)
			dat |=0x80;
		else 
			dat &=0x7F;
		CLK = 1;
		dat=dat>>1;
	}
	return (dat);
}
/**************************************************************************
函数描述:往ds1302的某个地址写入数据 
入口参数:addr:要写入的寄存器地址
出口参数:dat:要写入的数据
*****************************************************************************/
void write_1302(uchar addr,uchar dat)
{	
	CLK = 0;
	RESET = 1;
	write_dat(addr);
	write_dat(dat);	
	CLK = 0;
	RESET = 0;
}
/****************************************************************************
函数描述:从ds1302的某个地址读出一字节数据
入口参数:addr:所读的寄存器的地址
出口参数:无
*****************************************************************************/
uchar read_1302(uchar addr)
{	
	uchar dat;
	CLK = 0;
	RESET = 1;
	write_dat(addr);
	dat = read_dat();	
	CLK = 0;
	RESET = 0;
	return (dat);
}
/****************************************************************************
函数描述:从ds1302寄存器中读出时间值或数据
入口参数:addr:所读寄存器起始地址
 		  str:存放数据的起始地址
		  num:要读数据的个数
出口参数:无
*****************************************************************************/
void read_time(uchar addr,uchar *str,uchar num)
{	
	for(;num>0;num--)
	{
		*str++ = read_1302(addr);
		addr = addr+2;
	}
} 
/****************************************************************************
函数描述:设置ds1302寄存器的值
入口参数:addr:要设置的寄存器起始地址
 		  str:存放所设数据的起始地址
		  num:要设置寄存器的个数
出口参数:无
*****************************************************************************/
void set_1302(uchar addr,uchar *str,uchar num)
{	
	write_1302(0x8e,0x00);
	for(;num>0;num--)
	{
		write_1302(addr,*str++);
		addr = addr+2;
	}
	write_1302(0x8e,0x80);
} 
void init_1302()
{
	RESET = 0;
	CLK = 0;
	write_1302(0x80,0x00);
	write_1302(0x90,0xa6);				//一个二极管+4K电阻充电
	set_1302(0x80,init,7);				//写入初始值
	write_1302(0x8e,0x80);				//写保护控制字,禁止写
}
/************************************************************************************
函数描述:把从ds1302读出的数据转换为ascii码
入口参数:instr: 指向要转换数据的指针
出口参数: outstr: 指向转换后的数据的指针
**************************************************************************************/	  	
void change_time(uchar *instr,uchar *outstr)
{	uchar i;
	uchar j;
	j = 0;
	for(i=0;i<8;i++)
	{	outstr[j] = '0'+((instr[i]&0xf0)>>4);
		j++;
		outstr[j] = '0'+(instr[i]&0x0f);
		j++;
	}
}
/*************************************************************************************
函数描述:在lcd上显示日期,时间值
入口参数:str:指向要显示值的指针
出口参数:无
***************************************************************************************/
void lcd_time(uchar *str)
{	write_str3(1,1,str[12])	;//年	
	write_str3(1,2,str[13])	;
	write_str3(1,4,str[8])	;//月
	write_str3(1,5,str[9])	;
	write_str3(1,7,str[6])	;//日
	write_str3(1,8,str[7])	;
	write_str3(1,16,str[11]);//星期
	write_str3(2,7,str[4])	;//时
	write_str3(2,8,str[5])	;
	write_str3(2,10,str[2])	;//分
	write_str3(2,11,str[3])	;
	write_str3(2,13,str[0])	;//秒
	write_str3(2,14,str[1])	;
}
/*********************************************************************************************
函数描述:在lcd的第2行地9,12列的位置交替显示':'和' ' ,以形成闪动效果
入口参数:无
出口参数:无
***********************************************************************************************/
void flash()
{	if(flag)
	{	write_str3(2,9,':');
		write_str3(2,12,':');
	}
	else
	{	write_str3(2,9,0x20);
		write_str3(2,12,0x20);
	}
}
/*************************************************************************************************
函数描述:中断处理
入口参数:无
出口参数:无
全局变量:flag
***************************************************************************************************/
void	time0(void) interrupt 1 using 0
{	TH0 = 0x4C;
	TL0 = 0x00;
	inter++;
	if(inter>10)
	{	flag = ~flag;
		inter=0;
	}
	if(inter1>4)
	{	flag1 = ~flag1;
		inter1 = 0 ;
	 }
}	
void main()
{	
	
	uchar str2[8] = {0x01,0x1b,0x1d,0x19,0x1d,0x1b,0x01,0x00};//
	uchar str3[8] = {0x01,0x1b,0x00,0x19,0x1d,0x1b,0x01,0x00};
	uchar str4[8] = {0x31,0x31,0x35,0x34,0x35,0x37,0x39,0x37};
	uchar nian,yue,ri,xingqi,shi,fen,miao,cont;

	TMOD = 0x11;
	TH0 = 0x4C;
	TL0 = 0x00;
	EA  = 1;
	ET0 =1;
	TR0 = 1;
	ET1 =1;
	TR1 = 1;
	init_lcd();
	writetab(1,tab);
	init_1302();
	write_str1(1,1,str,16);
	write_str1(2,1,str1,16);
	
	while(1)
	{	read_time(0x81,init1,8);
		change_time(init1,init2);
		lcd_time(init2);
		flash();
		ok = 0;
		if(!K3)								//按下K3键进行时间设置
		{	delay1(20);
			
			write_1302(0x8e,0x00);	
			write_1302(0x80,0x80);
			nian = 1;
			time[0] = init2[12]-0x30;
			time[1] = init2[13]-0x30;
			write_str3(2,9,':');
			write_str3(2,12,':');
			while(nian)						//设置年		
			{ 	key_set(1,1,99);
				if(ok)
				{	
					nian = 0;
					yue = 1;
					ok = 0;
					cont = (time[0]<<4)+time[1];
					write_1302(0x8c,cont);
				}
				//delay1(10);
			}
			time[0] = init2[8]-0x30;
			time[1] = init2[9]-0x30;
			while(yue)						//设置月							
			{ 	key_set(1,4,12);
				if(ok)
				{	
					yue = 0;
					ri = 1;
					ok = 0;
					cont = (time[0]<<4)+time[1];
					write_1302(0x88,cont);
				}
				//delay1(10);
			}
			time[0] = init2[6]-0x30;
			time[1] = init2[7]-0x30;
			while(ri)						//设置日					
			{ 	key_set(1,7,31);
				if(ok)
				{	
					ri = 0;
					xingqi = 1;
					ok = 0;
					cont = (time[0]<<4)+time[1];
					write_1302(0x86,cont);
				}
				//delay1(10);
			}
			week = init2[11]-0x30;
			while(xingqi)					//设置星期
			{ 	key_set_xq(1,16);
				if(ok)
				{	
					xingqi = 0;
					shi = 1;
					ok = 0;
					write_1302(0x8a,week);
				}
			//	delay1(10);
			}
			time[0] = init2[4]-0x30;
			time[1] = init2[5]-0x30;
			while(shi)					//设置时
			{ 	key_set(2,7,23);
				if(ok)
				{	
					shi = 0;
					fen = 1;
					ok = 0;
					cont = (time[0]<<4)+time[1];
					write_1302(0x84,cont);
				}
				//delay1(10);
			}
			time[0] = init2[2]-0x30;
			time[1] = init2[3]-0x30;
			while(fen)					//设置分
			{ 	key_set(2,10,59);
				if(ok)
				{	
					fen = 0;
					miao = 1;
					ok = 0;
					cont = (time[0]<<4)+time[1];
					write_1302(0x82,cont);
				}
				//delay1(10);
			}
			time[0] = init2[0]-0x30;
			time[1] = init2[1]-0x30;
			while(miao)					//设置秒
			{ 	key_set(2,13,59);
				if(ok)
				{	
					miao = 0;
					ok = 0;
					cont = (time[0]<<4)+time[1];
					write_1302(0x80,cont);
				}
			//	delay1(20);
			}
			write_1302(0x8e,0x80);
			
		}
	if(!K2)								//按下K2键使能或取消报警功能		
	{	delay1(20);
		alarm_flag = ~alarm_flag;
		if(alarm_flag)
		{	xianshitab(2,16,1);
		}
		else
			write_str3(2,16,0x20);
 	}
	if(!K1)					
	{	delay1(10);
		if(!K4)							//按下K1与K4键,设置报警时间
		{	delay1(10);
			set_alarm_time();
		}
		if(!K2)
		{	see_alarm_time();			//按下K1与K2键,查看报警时间		
		}
	}
	
	time_campare();
	}
}
/***************************************************************************************
函数描述:在设置数据过程中显示所设置的数据
出口参数:row:显示的行
 		  col:显示的列
出口参数:无
全局变量:time[0],time[1]	
调用模块:key_set(),key_set_xq
*******************************************************************************************/
void set_flash(uchar row,uchar col)
{	if(flag)
	{	write_str3(row,col,'0'+time[0]);
		write_str3(row,col+1,'0'+time[1]);
	}
	else
	{	write_str3(row,col,0x20);
		write_str3(row,col+1,0x20);
	}
}
/*********************************************************************************************
函数描述:对所设数据加一,减一
入口参数:row:所设数据显示位置的行
 		  col:所设数据显示位置的列	
		  max:所设数据的最大值
出口参数:无
全局变量:time[0],time[1]
调用模块:main(),set_alarm_time()
***********************************************************************************************/
void  key_set(uchar row,uchar col,uchar max)
{		uchar temp,max0,max1 ;
		max0 = max/10;
		max1 = max%10;
		temp = time[0]*10+time[1];
		 delay1(20);
		if(!K1)
		{	if(temp <= 0)
			{	time[1] = max1;
				time[0] = max0;
			}
			else
			{	if(time[1]==0)
				{	time[0] = time[0]-1;
			    	time[1] = 9;
				}
				else
					time[1] = time[1]-1;
			}
		}
		if(!K2)
		{
			if(temp>=max)
			{ 	time[0] = 0;
				time[1] =1;
			}
			else
			{	if(time[1]==9)
				{	time[0] = time[0]+1;
					time[1] = 0;

				}
				else
					time[1] = time[1]+1;
			
	   		}
	 	}
		set_flash(row,col);
		if(!K3)
		{	ok = 1;
			delay1(10);
			write_str3(row,col,'0'+time[0]);
			write_str3(row,col+1,'0'+time[1]);
		}
		
			
}
/*********************************************************************************************
函数描述:设置星期的值
入口参数:row:星期显示位置的行
 		  col:星期显示位置的列	
出口参数:无
全局变量

⌨️ 快捷键说明

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