基於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的鏈接。
謝謝大家的閱讀、希望大家支持。下載鏈接

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章