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

📄 ds1302.bak

📁 一个电子时钟 是呀
💻 BAK
📖 第 1 页 / 共 2 页
字号:
{
	min_temp[0]='1';  //十位
	min_temp[1]='0';  //个位
	min_temp[2]='.';
	min_temp[3]='0';
}
//**********************************************
//延时子程序模块
//**********************************************
void mdelay(uint delay)
{	uint i;
 	for(;delay>0;delay--)
   		{for(i=0;i<80;i++) //1ms延时.
       		{;}
   		}
}
void show_time()   //液晶显示程序
{
	DS1302_GetTime(&CurrentTime);  //获取时钟芯片的时间数据
	TimeToStr(&CurrentTime);       //时间数据转换液晶字符
	DateToStr(&CurrentTime);       //日期数据转换液晶字符
	ReadTemp();                    //开启温度采集程序
	temp_to_str();                 //温度数据转换成液晶字符
	GotoXY(10,1);                  //液晶字符显示位置
	Print(TempBuffer);             //显示温度
	GotoXY(0,1);
	Print(CurrentTime.TimeString); //显示时间
	GotoXY(0,0);
	Print(CurrentTime.DateString); //显示日期
	GotoXY(15,0);
	Print(week_value);             //显示星期
	GotoXY(11,0);
	Print("Week");	//在液晶上显示 字母 week
	mdelay(400);                 //扫描延时
}
void show_time_mode()   //调整模式,液晶显示程序
{
	TimeToStr(&ad_CurrentTime);       //时间数据转换液晶字符
	DateToStr(&ad_CurrentTime);       //日期数据转换液晶字符
	GotoXY(10,1);                  //液晶字符显示位置
	Print("adtime");             //显示模式
	GotoXY(0,1);
	Print(ad_CurrentTime.TimeString); //显示时间
	GotoXY(0,0);
	Print(ad_CurrentTime.DateString); //显示日期
	GotoXY(15,0);
	Print(week_value);             //显示星期
	GotoXY(11,0);
	Print("Week");	//在液晶上显示 字母 week
	mdelay(400);                 //扫描延时
}
//***********键盘识别程序********************

 uchar key(void)
{
	uchar i,j;
	K1=0;
	i=P1;
	delay_key(500);
	j=P1;
	K1=1;
	if(i==j)
	{
		switch(j)
		{
			case 0xee: return(j);break;
			case 0xed: return(j);break;
			case 0xeb: return(j);break;
			case 0xe7: return(j);break;	  
		}
	}
	K2=0;
	i=P1;
	delay_key(500);
	j=P1;
	K2=1;
	if(i==j)
	{
		switch(j)
		{
			case 0xde: return(j);break;
			case 0xdd: return(j);break;
			case 0xdb: return(j);break;
			case 0xd7: return(j);break;	  
		}
	}     
}
//==================模式的判断==================
uchar key_only(void)	   //此程序延时较长
{
	uchar i,j;
	K1=0;
	i=P1;
	delay_key(500);
	j=P1;
	K1=1;
	if(i==j)
	{
		if(j==0xee)
		{
			while(j==0xee)			//直到放手
			{
				delay_key(50000);
				j=P1;
			}
			delay_key(10000);
			return(0xee);
		}
		else
		return(0);
	}
	else
	return(0);
}

//==================指针移动==================
void cursor_shift_right()
{
	if(addr==0x80+0x0f)
	addr=0x80+0x3f;
	else
	if(addr==0x80+0x4f)
	addr=0x7f;
	LCD_Write(LCD_COMMAND, ++addr);//right
}
void cursor_shift_left() 
{
	if(addr==0x80)
	addr=0x80+0x50;
	else
	if(addr==0x80+0x40)
	addr=0x80+0x10;
	LCD_Write(LCD_COMMAND, --addr);//left
}

//***********模式判断*****************
  void mode(void)
{
	if(key_only()==0xee)
	{	++done;
		if(done==4)
			done=0;				
	}
}
 //==================警报声,分长短音================
  void  alarm_voice(uchar i)
  {	
    uchar n;
    if(i==0)
	{
		n=8;
		for(;n>0;n--)
		{
			DS1302_GetTime(&CurrentTime);  //获取时钟芯片的时间数据
			TimeToStr(&CurrentTime);       //时间数据转换液晶字符
			DateToStr(&CurrentTime);       //日期数据转换液晶字符
			ReadTemp();                    //开启温度采集程序
			temp_to_str();                 //温度数据转换成液晶字符
			GotoXY(10,1);                  //液晶字符显示位置
			Print(TempBuffer);             //显示温度
			GotoXY(0,1);
			Print(CurrentTime.TimeString); //显示时间
			GotoXY(0,0);
			Print(CurrentTime.DateString); //显示日期
			GotoXY(15,0);
			Print(week_value);             //显示星期             
			voice=~voice;
		}
	}
	else	if(i==1)
	{
		n=10;
		for(;n>0;n--)
		{	
			show_time();
			voice=~voice;//闹钟到时
		}
	}
	else    if(i==2)
	{
		n=20;
		for(;n>0;n--)
		{
			DS1302_GetTime(&CurrentTime);  //获取时钟芯片的时间数据
			TimeToStr(&CurrentTime);       //时间数据转换液晶字符
			ReadTemp();                    //开启温度采集程序
			temp_to_str();                 //温度数据转换成液晶字符
			GotoXY(10,1);                  //液晶字符显示位置
			Print(TempBuffer);             //显示温度
			GotoXY(0,1);
			Print(CurrentTime.TimeString); //显示时间
			voice=~voice;
		}
	}
	else    if	(i==3)
	{
		n=16;
		for(;n>0;n--)
		{
			delay_key(10000);
			voice=~voice;
		}
	}
}
//===========非接触止闹中断初始化===========
void Initial_Int0()
{
	//EA=1;//中断总允许开
	IT0=1;//触发方式下降沿
	EX0=1;//外部中断0允许
}
//============外部中断0服务程序=============
void NoTouch_Int0() interrupt 0
{
	voice=0;
}
///////////////////////////////////////////////////
/*****************主函数**************************/
///////////////////////////////////////////////////
main()
{	
    uchar i,j,num,alarm_count=0;
	uchar code table[]="1602+18B20+1302 ";//上电欢迎画面
    uchar code table1[]="Real Time Clock" ;
    uchar team=0xC0;
	float Current_temp,max_temp_count,min_temp_count;
	LCD_Initial();    //液晶初始化
	Init_DS18B20( ) ;      //DS18B20初始化
	Initial_DS1302(); //时钟芯片初始化
	max_temp_value();   //上限
	 min_temp_value();   //下限
	done=2;           //进入默认液晶显示

//========================================
	LCD_Write(LCD_COMMAND,0x80+0x10);
	for(num=0;num<16;num++)
	{
     	LCD_Write(LCD_DATA,table[num]);
		delay_key(50);
	}
	LCD_Write(LCD_COMMAND,0x80+0x51);
	for(num=0;num<15;num++)
	{
		LCD_Write(LCD_DATA,table1[num]);
		delay_key(50);
	}
	for(num=0;num<16;num++)
	{
		LCD_Write(LCD_COMMAND,0x18);
		delay_key(300000);
	}
	delay_key(50000000);
	Initial_Int0();//初始化中断控制
//==================================
	while(1)
	{ 
		alarm_count=0; 
		mode();
		delay_key(20000);
	

//****************调整闹钟*************************
		if(done==0)
		{
			LCD_Write(LCD_COMMAND, 0x01);
			GotoXY(0,0);
			LCD_Write(LCD_COMMAND,0x80);
			Print("  Alarm");  //这个问题一直想不通,清屏后,为什么不会在指定的地方写,我只好在前面加空格了 
			GotoXY(0,1);
			Print(alarm_TimeString); //显示时间
			while(done==0)
			{
				mode();	
				LCD_SetDisplay(LCD_SHOW|LCD_FLASH);
				if(key()==0xde)
				{	
					cursor_shift_left();
					delay_key(20000);
				}
				else
				if(key()==0xd7)
				{	
					cursor_shift_right();
					delay_key(20000);
				}
				else
				if(key()==0xdd)
				{ 
					alarm_add_time();
					LCD_SetDisplay(LCD_SHOW|LCD_NO_CURSOR);    //开启显示, 无光标
					GotoXY(0,1);
					Print(alarm_TimeString); //显示时间
					LCD_Write(LCD_COMMAND,addr);
					LCD_SetDisplay(LCD_SHOW|LCD_FLASH);
					delay_key(10000);
				}
				else
				if(key()==0xdb)
				{ 
					alarm_sub_time();
					LCD_SetDisplay(LCD_SHOW|LCD_NO_CURSOR);    //开启显示, 无光标
					GotoXY(0,1);
					Print(alarm_TimeString); //显示时间
					LCD_Write(LCD_COMMAND,addr);
					LCD_SetDisplay(LCD_SHOW|LCD_FLASH);
					delay_key(10000);
				}
				else
				if(key()==0xe7)
				{	
					alarm_save(team);
					LCD_Write(LCD_COMMAND, 0x01);
					GotoXY(0,0);
					LCD_Write(LCD_COMMAND,0x80);
					Print("  Saveing...");  //这个问题一直想不通,清屏后,为什么不会在指定的地方写,我只好在前面加空格了 
					delay_key(60000);
					LCD_Write(LCD_COMMAND, 0x01);
					GotoXY(0,0);
					LCD_Write(LCD_COMMAND,0x80);
					Print("  Alarm");
					GotoXY(0,1);
					Print(alarm_TimeString);
					delay_key(10000);
				}
				else
				if(key()==0xed)
				{
					team+=0x0C;
					if(team==0xE4)
					{
						team=0xC0;
					}
					alarm_read(team);
					LCD_Write(LCD_COMMAND, 0x01);
					GotoXY(0,0);
					LCD_Write(LCD_COMMAND,0x80);
					Print("  Change AlarmTeam");  //这个问题一直想不通,清屏后,为什么不会在指定的地方写,我只好在前面加空格了 
					delay_key(60000);
					LCD_Write(LCD_COMMAND, 0x01);
					GotoXY(0,0);
					LCD_Write(LCD_COMMAND,0x80);
					Print("  Alarm");
					GotoXY(0,1);
					Print(alarm_TimeString);
					delay_key(10000);
				}
			} 		
		}
		mode();	
//*****************调整时间************************
		if(done==1)
		{					   //进入调整模式
			DS1302_GetTime(&ad_CurrentTime);		
			show_time_mode();
			addr=0x80+0x0f;
			LCD_SetDisplay(LCD_SHOW|LCD_FLASH);
			while(done==1)
			{
				mode();	
				if(key()==0xde)
				{
					cursor_shift_left();
					delay_key(20000);
				}
				else
				if(key()==0xd7)
				{	
					cursor_shift_right();
					delay_key(20000);
				}
				else
				if(key()==0xdd)
				{ 
					add_time(&ad_CurrentTime);
					LCD_SetDisplay(LCD_SHOW|LCD_NO_CURSOR);    //开启显示, 无光标
					show_time_mode();
					LCD_Write(LCD_COMMAND,addr);
					LCD_SetDisplay(LCD_SHOW|LCD_FLASH);
					delay_key(1000);
				}
				else
				if(key()==0xdb)
				{ 
					sub_time(&ad_CurrentTime);
					LCD_SetDisplay(LCD_SHOW|LCD_NO_CURSOR);    //开启显示, 无光标
					show_time_mode();
					LCD_Write(LCD_COMMAND,addr);
					LCD_SetDisplay(LCD_SHOW|LCD_FLASH);
					delay_key(1000);
				}	
				if(key()==0xeb)	
					ad_DS1302();	
			} 	
			LCD_SetDisplay(LCD_SHOW|LCD_NO_CURSOR);
			show_time();
			addr=0x80+0x0f;						
		}
		mode();
//******************正常时间温度显示***************************
	
		while(done==2)
		{   
			mode();
			LCD_Write(LCD_COMMAND, 0x01);
			LCD_SetDisplay(LCD_SHOW|LCD_NO_CURSOR);
			show_time();                //液晶显示数据
			EA=1;//中断总允许开
			addr=0x80+0x0f;
			team=0xC0;
			for(j=0;j<=2;j++)
			{
				alarm_read(team);//读取闹钟
				alarm_count=0;
				for(i=0;i<=4;i++)//判断是否到时
				{
					if(alarm_TimeString[i]==CurrentTime.TimeString[i])
					alarm_count++;
				}
				if(alarm_count==5)				
				{
					alarm_voice(1);				
					alarm_count=0;
					break;
				}
				team+=0x0C;
				if(team==0xE4)team=0xC0;
			}
			Current_temp=TempBuffer[0]*10+TempBuffer[1]+TempBuffer[3]/10;
			max_temp_count=max_temp[0]*10+max_temp[1]+max_temp[3]/10;
			min_temp_count=min_temp[0]*10+min_temp[1]+min_temp[3]/10;
			if(Current_temp>=max_temp_count)
			alarm_voice(2);	 
			else
			if(Current_temp<=min_temp_count)
			alarm_voice(0);
			EA=0;//中断总允许关
		}
		mode();
//========================上下限温度设置=============================
		if(done==3)
		{
			LCD_Write(LCD_COMMAND, 0x01);    
			LCD_SetDisplay(LCD_SHOW|LCD_FLASH);
			GotoXY(0,0);
			LCD_Write(LCD_COMMAND,0x80);
			Print(" max_temp"); 			//这个问题一直想不通,清屏后,为什么不会在指定的地方写,我只好在前面加空格了
			GotoXY(12,0);
			Print(max_temp); 
			GotoXY(0,1);
			Print("min_temp"); 
			GotoXY(12,1);                  //液晶字符显示位置
			Print(min_temp);
			addr=0x80+0x4f;  
			while(done==3)
			{
				mode();	
				LCD_SetDisplay(LCD_SHOW|LCD_FLASH);
				if(key()==0xde)
				{	
					cursor_shift_left();
					delay_key(20000);
				}
				else
				if(key()==0xd7)
				{	
					cursor_shift_right();
					delay_key(20000);
				}
				else
				if(key()==0xdd)
				{
					if(addr==0x80+0x0f||addr==0x80+0x0c||addr==0x80+0x0d)
					{
						max_temp[addr-0x80-12]++;
					}
					else
					if(addr==0x80+0x4f||addr==0x80+0x4c||addr==0x80+0x4d)
					{
						min_temp[addr-0x80-0x40-12]++;
					}
					delay_key(30000);
				}
				else
				if(key()==0xdb)
				{ 
					if(addr==0x80+0x4f||addr==0x80+0x4c||addr==0x80+0x4d)
					{
					min_temp[addr-0x80-0x40-12]--;
					}
					else
					if(addr==0x80+0x0f||addr==0x80+0x0c||addr==0x80+0x0d)
					{
						max_temp[addr-0x80-12]--;
					}
					delay_key(30000);		 
				}
				LCD_SetDisplay(LCD_SHOW|LCD_NO_CURSOR);    //开启显示, 无光标
				GotoXY(12,0);
				Print(max_temp); 
				LCD_Write(LCD_COMMAND,addr);
				GotoXY(12,1);                  //液晶字符显示位置
				Print(min_temp); 
				LCD_Write(LCD_COMMAND,addr);
				LCD_SetDisplay(LCD_SHOW|LCD_FLASH);
				delay_key(1000);			 		
			} 
			max_temp_count=max_temp[0]*10+max_temp[1]+max_temp[3]/10;
			min_temp_count=min_temp[0]*10+min_temp[1]+min_temp[3]/10;
			if(max_temp_count<min_temp_count)
			{
				LCD_Write(LCD_COMMAND, 0x01);
				LCD_Write(LCD_COMMAND,0x80);
				Print("   error!  readjust"); //这个问题一直想不通,清屏后,为什么不会在指定的地方写,我只好在前面加空格了
				alarm_voice(3); 
				done=3;
			}
		}		
	}
}




⌨️ 快捷键说明

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