51单片机数字电子钟设计(数电课设,含时间显示、校准、整点报时、闹钟功能)

首先展示硬件设计部分,此处采用proteus仿真演示。其中液晶屏上面一行显示的是实际时间,下面一行显示的是设定闹钟时间。通过调节单刀双掷开关来改变正在调整的时间是实际时间还是闹钟时间。下面的三个按键依次用来调节模式(模式即正在调节的量是时、分或秒,通过最上面的三个LED灯来表达出来),下面的两个按键分别用来进行加减一的操作。
在这里插入图片描述
以上是硬件设计部分,下面展示软件部分代码。
1、变量及函数定义

#include <reg51.h> 
#define uint unsigned int 
#define uchar unsigned char

uchar data Set[4]={'S','e','t',':'};//初始显示
uchar data Rel[4]={'R','e','l',':'};//初始显示
uchar data rel_time[8]={'0','0','-','0','0','-','0','0'};//初始显示
uchar data set_time[8]={'0','3','-','0','5','-','0','0'};//初始显示
/*液晶的使能、读写端定义*/
sbit lcden=P2^2;
sbit lcdrs=P2^1;	
sbit lcdrw=P2^0;
/*按键定义*/
sbit keymode=P2^7;
sbit keyadd=P2^6;
sbit keysub=P2^5;
sbit cho=P2^3;//开关定义
/*LED定义*/
sbit ledsec=P3^7;
sbit ledmin=P3^6;
sbit ledhour=P3^5;
sbit bee=P2^4;//蜂鸣器定义

uchar i=20;
uchar j;
uchar mode;
uchar choose;
uchar rel_sec=0,rel_min=0,rel_hour=0;
uchar set_sec=0,set_min=5,set_hour=3;

/*函数清单*/
void delay(uint x);		  //该延时大约100us
void baoshi();          //报时函数
void comp();            //闹钟函数,对实际值和设定闹钟值进行比较
void dis();             //显示函数
void Key();          //按键函数

/*液晶显示有关函数*/
void LCDdelay(uint x);//LCD延时函数
void write_com(uchar lcdcom);//写命令
void write_data(uchar lcddate);//写数据
void Init1602();//

2、与液晶显示有关的各种函数

void LCDdelay(uint x)		  //该延时大约100us(不精确,液晶操作的延时不要求很精确)
{
  uchar j;
	while(x--)
		for(j=0;j<120;j++);
}

//写命令
void write_com(uchar lcdcom)
{
  lcdrs=0;
  lcdrw=0;	
  P1=lcdcom;
  LCDdelay(5);
  lcden=1;
  LCDdelay(5);
  lcden=0;
}

//写数据
void write_data(uchar lcddate)
{
  lcdrs=1;
	lcdrw=0;
	P1=lcddate;
	LCDdelay(5);
	lcden=1;
	LCDdelay(5);
	lcden=0;
	
}

//1602初始化
void Init1602()
{
	lcden=0; 
  write_com(0x38);//屏幕初始化
  write_com(0x0c);//打开显示 无光标 无光标闪烁
  write_com(0x06);//当读或写一个字符是指针后一一位
  write_com(0x01);//清屏
	write_com(0x80+2);
	for(j=0;j<4;j++){
		write_data(Rel[j]);
		LCDdelay(5);
	}
	write_com(0x80+0x40+2);
	for(j=0;j<4;j++){
		write_data(Set[j]);
		LCDdelay(5);
} 
	write_com(0x80+6);
  for(j=0;j<8;j++){
		write_data(rel_time[j]);
		LCDdelay(5);
	}
	write_com(0x80+0x40+6);
  for(j=0;j<8;j++){
		write_data(set_time[j]);
		LCDdelay(5);
	}

}

3、其他各定时、调节等函数(电子钟功能实现)

/*定时1s*/

void timer0()interrupt 1
{
	TH0=15536/256;
	TL0=15536%256;
	i--;
	if(i==0){
		i=20;
		rel_sec++;
		if(rel_sec==60){
			rel_sec=0;
			rel_min++;
			if(rel_min==60)
			{
				rel_min=0;
				rel_hour++;
				if(rel_hour==24){
					rel_hour=0;
				}
			}
		}	
	Key();
  comp();		
  baoshi();
	dis();	
	}
	
}	
	
void dis(){
	  rel_time[0]=rel_hour/10;
		rel_time[1]=rel_hour%10;
		rel_time[2]='-'-0x30;
		rel_time[3]=rel_min/10;
		rel_time[4]=rel_min%10;
		rel_time[5]='-'-0x30;
		rel_time[6]=rel_sec/10;
		rel_time[7]=rel_sec%10;
	
	  set_time[0]=set_hour/10;
		set_time[1]=set_hour%10;
		set_time[2]='-'-0x30;
		set_time[3]=set_min/10;
		set_time[4]=set_min%10;
		set_time[5]='-'-0x30;
		set_time[6]=set_sec/10;
		set_time[7]=set_sec%10;
	  write_com(0x80+6);
	  for(j=0;j<8;j++){
	    write_data(rel_time[j]+0x30);
		  LCDdelay(5);
	  }
	  write_com(0x80+0x40+6);
	  for(j=0;j<8;j++){
	    write_data(set_time[j]+0x30);
		  LCDdelay(5);
	  }
}	

void Key(){
		if(keymode==0){
		  mode++;
		  if(mode==4)
			mode=1;
		}
		if(mode==1){
			ledsec=1;
			ledmin=0;
			ledhour=0;
		}
		if(mode==2){
			ledsec=0;
			ledmin=1;
			ledhour=0;
		}
		if(mode==3){
			ledsec=0;
			ledmin=0;
			ledhour=1;
		}
			
		if(cho==0){
		choose=0;
	  }
	  else{
		choose=1;
	  }
	
	if(keyadd==0){
		if(mode==1){
			if(choose==0){
				rel_sec++;
			if(rel_sec==60){
			rel_sec=0;
		  }
			}
			else{
				set_sec++;
			if(set_sec==60){
			set_sec=0;
		  }
			}
		}
		else if(mode==2){
			if(choose==0){
				rel_min++;
			if(rel_min==60){
			rel_min=0;
		  }
			}
			else{
				set_min++;
			if(set_min==60){
			set_min=0;
		  }
			}
			
	  }
		if(mode==3){
			if(choose==0){
				rel_hour++;
			if(rel_hour==24){
			rel_hour=0;
		  }
			}
			else{
				set_hour++;
			if(set_hour==24){
			set_hour=0;
		  }
			}
			
	  }
  }
  if(keysub==0){
		if(mode==1){
			if(choose==0){
				if(rel_sec==0){
			rel_sec=59;
		  }
			else
			rel_sec--;
			}
			else{
				if(set_sec==0){
			set_sec=59;
		  }
			else
			set_sec--;
			}
			
		}
		else if(mode==2){
			if(choose==0){
				if(rel_min==0){
			rel_min=59;
		  }
			else
			rel_min--;
		  }
			else{
				if(set_min==0){
			set_min=59;
		  }
			else
			set_min--;
			}
			
			
	  }
		if(mode==3){
			if(choose==0){
			  if(rel_hour==0){
			rel_hour=23;
		  }
			else
			rel_hour--;
			
			}
			else{
				if(set_hour==0){
			set_hour=23;
		  }
			else
			set_hour--;
			
			}
	  }
  }
}


void delay(uint x)		  //该延时大约100us 
{
  uchar j;
	while(x--)
		for(j=0;j<120;j++);
}

void baoshi(){
	if(rel_min==0&&rel_sec==1){
		bee=1;
		delay(500);
		bee=0;
	}
}

void comp(){
	if(rel_hour==set_hour&&rel_min==set_min&&rel_sec==set_sec+1)
	{bee=1;
	delay(1000);
	bee=0;}
}

4、主函数

void main() { 
	cho=0;
	bee=0;
  ledsec=0;
	ledmin=0;
	ledhour=0;
	mode=1;
	keymode=1;
	keyadd=1;
	Init1602();
	TMOD=0X01;
	TH0=15536/256;
	TL0=15536%256;
	EA=1;
	ET0=1;
	TR0=1;
	while(1);

}

基于以上,即可实现51单片机数字电子钟的设计,全部代码及仿真文件下载链接:https://download.csdn.net/download/creampang/85674151?spm=1001.2014.3001.5503

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐