基于51单片机的1602LCD时钟、可以设置闹钟(带仿真)

基于51单片机的1602LCD时钟、可以设置闹钟

最近做了个51单片机的时钟、具有设置时间、闹钟等功能
程序分为3个模块。程序比较简单、由于用于学习交流用没有做掉电运行功能。
供大家学习。

isis仿真图

在这里插入图片描述
这是设置时间时的效果
这是设置时间时的效果
这是设置闹钟时
在这里插入图片描述

  1. 第一行的显示程序

  2. mode_flag是一个标志位

  3. unsigned char Current_Time[]={“Current Time “}; //正常运行模式
    unsigned char Set_time[]={“Set New Time…”}; //设置时间模式
    unsigned char Set_nao[]={“Set nao Time…”}; //设置闹钟模式
    unsigned char show_time[]={”>00:00:00”};

  4. (1)正在运行的显示Current_Time[]字符串

  5. (2)设置时间的显示Set_time[]字符串

  6. (3)设置闹钟的显示Set_nao[]字符串

void display_mode()//第一行模式的显示,有三种模式:(1)正在运行的显示Current_Time[]字符串(2)设置时间的显示Set_time[]字符串	(3)设置闹钟的显示Set_nao[]字符串
{
	 
	unsigned char i;
	lcd_w_cmd(0x82);	   //设置显示地址(第一行)
	if(mode_flag==0)		  //状态标志位mode_flag=0表示正处于时间正常运行
	{
		for(i=0;Current_Time[i]!='\0';i++)		//此处显示Current_Time[]字符串,字符串结束符为‘0’
		{
			lcd_w_dat(Current_Time[i]);
			
		}	
	}
	else if(mode_flag==1)
	{	
		for(i=0;Set_time[i]!='\0';i++)		//此处显示Set_time[]字符串,字符串结束符为‘0’
		{
			lcd_w_dat(Set_time[i]);
		
		}
	}
	else if(mode_flag==2)
	{
		 for(i=0;Set_nao[i]!='\0';i++)		//此处显示Set_nao[]字符串,字符串结束符为‘0’
		{
			lcd_w_dat(Set_nao[i]);		
		}
	}
}
  1. 时间的显示程序

在上面我定义了一个字符串数组、
unsigned char show_time[]={">00:00:00"};
通过改变下面这个函数的参数达到显示不同时间的效果

void display_time(unsigned char shi,unsigned char fen,unsigned char miao)//第二行的数字显示
{
	unsigned char i;
	if(mode_flag==0)show_time[0]=' ';	 //如果mode_flag=0,第二行第0位显示' '
	else  show_time[0]='>';				 //否则第二行第0位显示'>'

	show_time[1]=shi/10+0x30;			 //第一位显示时的十位数
	show_time[2]=shi%10+0x30;			//第二位显示时的个位数

	show_time[4]=fen/10+'0';			 //第四位显示分的十位数
	show_time[5]=fen%10+'0';			 //第五位显示分的个位数

	show_time[7]=miao/10+'0';			  //第七位显示秒的十位数
	show_time[8]=miao%10+'0';			  //第八位显示秒的个位数

	lcd_w_cmd(0xC3);  //更改显示位置用
	for(i=0;show_time[i]!='\0';i++)		//此处显示show_time[]字符串,字符串结束符为‘0’
	{
		lcd_w_dat(show_time[i]);
	
	}
}
  1. 按键扫描函数,这是程序的核心了。

temp_shi是设置时间用的临时用的变量
now_shi是目前运行时的变量
nao_shi是闹钟的变量

void keyscan()					  //按键控制,k1调时或分,k2加时或分,k3减时或分,k4确定调好的时间,k5调闹钟
{
	if(K1==0)
	{
		delay1(1000);
		if(K1==0)
		{
			if(mode_flag==0)			 //正在运行的时间要进入调时间的状态
			{
				been(300);
			   	temp_shi=now_shi;		
				temp_fen=now_fen;
				temp_miao=now_miao;
				mode_flag=1;
			}
			else{ 
					been(300);
				 	flag_sf=~flag_sf; //切换状态,flag_sf=0调时钟 flag_sf=1调分钟
				 }
				display_mode();
			while(!K1);	//松手检测
		}
	}
	if(K2==0)						  //加时或分
	{
		delay1(1000);
		if(K2==0)
		{
			if(mode_flag!=0)			
			{ 
				 been(300);
			   if(flag_sf==0)			//调时钟状态
			   {
			   	  temp_shi++;
				  if(temp_shi==24)temp_shi=0;		 //如果加时钟到24就清零
			   }
			   else {							   //调分钟状态
			   	  temp_fen++;
				  if(temp_fen==60)temp_fen=0;		  //如果加分钟到60就清零
			   }			  	
			}
			while(!K2);	//松手检测
		}	
	}	
	if(K3==0)						   //减时或分
	{
		delay1(1000);
		if(K3==0)
		{
			if(mode_flag!=0)
			{
				been(300);
			   if(flag_sf==0)			   //调时钟状态
			   {
			   	
				if(temp_shi==0)temp_shi=24;		//如果减时钟减到最低到0就又回到最高位24
			   	  temp_shi--;
				  
			   }
			   else {						 //调分钟状态

			   	if(temp_fen==0)temp_fen=60;			//如果减分钟减到最低到0就又回到最高位60
			   	  temp_fen--; 
			   }
			  	
			}
		  
			while(!K3);	//松手检测
		}
	
	}
										 //确定设置的时间和调好闹钟的时间
	if(K4==0)
	{
		delay1(1000);
		if(K4==0)
		{
			if(mode_flag==1)				  //设置时间  设置好的时间确定后正常运行
			{
				been(300);
				now_shi=temp_shi;			   
				now_fen=temp_fen;
				now_miao=temp_miao;
				mode_flag=0;
			}
			if(mode_flag==2)					 //设置闹钟	设置好的时间确定好之后定为闹钟
			{									 
				been(300);
				nao_shi=temp_shi;
				nao_fen=temp_fen;
				nao_miao=temp_miao;
				mode_flag=0;
			}
			while(!K4);	//松手检测
		}
		display_mode();			   //调用显示模式函数
	
	}

	if(K5==0)					   //设置闹钟
	{
		delay1(1000);
		if(K5==0)
		{
			if(mode_flag==0)
			{
			   been(300);
			   mode_flag=2;
			   temp_shi=nao_shi;
			   temp_fen=nao_fen;
			   temp_miao=nao_miao;
			}		  
			display_mode();
			while(!K5);	//松手检测
		}
	
	}
}
  1. 主函数
void main()
{			 
	lcd_int ();	   //初始化lcd
	mode_flag=0;//运行
	display_mode();	  //调用显示模式函数
	TMOD=0x01;		//初始化定时器
	EA=1;			 //打开总中断
	TH0=(65536-50000)/256;			//赋初值
	TL0=(65536-50000)%256;
	ET0=1;						   //打开定时器T0中断标志位
	TR0=1;							//启动T0
	while(1){			
			if(mode_flag==0)display_time(now_shi,now_fen,now_miao);		  //状态标志位mode_flag=0表示正处于时间正常运行
			else display_time(temp_shi,temp_fen,temp_miao);			  //否则mode_flag为1时设置时间,为2时设置闹钟
			keyscan();			   //调用按键开关控制函数
			if(now_shi==nao_shi&&now_fen==nao_fen&&now_miao==nao_miao) PlayMusic();	  //如果正在运行的时间为闹钟的时间,则闹铃响(此为音乐)
	}	
}

中断服务函数

void time0() interrupt 1		 
{
	TH0=(65536-50000)/256;
	TL0=(65536-50000)%256;

	cishu++;
	if(cishu==20)			   //一秒时间到后,次数清零,秒数加一
	{
		cishu=0;
		now_miao++;
	}
	if(now_miao==60)			//60秒时间到后,秒数清零,分钟加一
	{
	 	now_miao=0;
		now_fen++;
	}

	if(now_fen==60)				//60分钟时间到后,分钟清零,时钟加一
	{
		
	  now_fen=0;
	  now_shi++;
	}

	if(now_shi==24)				 //24小时到后,时钟清零
	{
	   now_shi=0;
	}
}

获得资料可以关注公众号回复001即可,里面有大量软硬件资料哦。
在这里插入图片描述
最后贴上下载Github的链接。
谢谢大家的阅读、希望大家支持。下载链接

原创文章 19 获赞 4 访问量 5136

猜你喜欢

转载自blog.csdn.net/dwh1314/article/details/103930464
今日推荐