基于51单片机电子钟闹钟12/24小时制LCD显示( proteus仿真+程序+设计报告+讲解视频)

avatar
作者
猴君
阅读量:0

基于51单片机电子钟闹钟12/24小时制LCD显示


基于51单片机电子钟闹钟12/24小时制LCD显示( proteus仿真+程序+设计报告+讲解视频)

仿真图proteus7.8及以上

程序编译器:keil 4/keil 5

编程语言:C语言

设计编号:S0082

1. 主要功能:

基于51单片机的电子钟12/24小时制万年历设计

1.电子钟设计能设定起始时间,按下复位键恢复初始化时间;

2.具有闹钟功能,可以通过按键设定闹钟闹铃时间;

3.有12 小时/24 小时两种制式可选;

4.能显示年月日星期;

5.使用DS1302计时,LCD1602液晶显示;

需注意仿真中51单片机芯片是兼容的,AT89C51,AT89C52是51单片机的具体型号,内核是一样的。相同的原理图里,无论stc还是at都一样,引脚功能都是一样的,程序是兼容的,芯片可以替换为STC89C52/STC89C51/AT89C52/AT89C51等51单片机芯片。

img

以下为本设计资料展示图:

2. 讲解视频:

讲解视频包含仿真运行讲解和代码讲解

https://www.bilibili.com/video/BV17p421978t/

3. 仿真设计

打开仿真工程,双击proteus中的单片机,选择hex文件路径,然后开始仿真。

img

显示时间的情况下,按下切换键进入设置模式,设置的变量闪烁,默认先设置年份,通过按键加和按键减调整,通过下一个按键切换设置月份,设置月份时同样通过加减键调整。如此类推设置日期,星期,时分秒。

img

设置好时钟后按下切换按键设置闹钟。同样通过按键加减调整闹钟时间,通过下一个按键切换设置时钟/分钟。

img

按下12/24小时制切换可以切换时制。上午显示AM,下午显示PM,方便区分时间。

img

img

4. 程序代码

使用keil4或者keil5编译,代码有注释,可以结合视频理解代码含义。

#include <reg51.h> #include "lcd1602.h" #include"ds1302.h"   #define uchar unsigned char #define uint unsigned int //功能设计:调整时间、调整闹钟、正常  sbit key1=P3^6;//功能切换 sbit key2=P3^5;//下一个设置点 sbit key3=P3^4;//加 sbit key4=P3^3;//减 sbit key5=P3^2;//12,24小时制切换  sbit beep=P3^7;//蜂鸣器 //=============================================================== uchar mode=0;//模式	  设置,工作 uchar t=0; uchar fen=1,shi=12;//闹钟分钟和闹钟时间设置 uchar cixu=0,flag=0;//小模式 uchar moshi=0;//12,24控制  uchar hang1[]="2000/00/00  0";//日期 + 星期 uchar hang2[]="00:00:00     ";//时间 uchar hang3[]="00:00        ";	  //闹钟  时+分  void suan()//计算 {	 	uchar i=0; 	hang1[2]=(TIME[6]>>4)+0x30; 	hang1[3]=(TIME[6]&0x0f)+0x30; 	hang1[5]=(TIME[4]>>4)+0x30; 	hang1[6]=(TIME[4]&0x0f)+0x30; 	hang1[8]=(TIME[3]>>4)+0x30; 	hang1[9]=(TIME[3]&0x0f)+0x30; 	hang1[12]=TIME[5]+0x30; 	if(moshi==0)//小时 	{ 		hang2[0]=(TIME[2]>>4)+0x30; 		hang2[1]=(TIME[2]&0x0f)+0x30; 		hang2[11]=' '; 		hang2[12]=' '; 	} 	else 	{ 		i=(TIME[2]>>4)*10+(TIME[2]&0x0f); 		if(TIME[2]<=0x12) 		{ 			hang2[0]=i/10+0x30; 			hang2[1]=i%10+0x30; 			hang2[11]='A'; 			hang2[12]='M'; 		} 		else 		{ 			hang2[0]=(i-12)/10+0x30; 			hang2[1]=(i-12)%10+0x30; 			hang2[11]='P'; 			hang2[12]='M'; 		} 	} 	hang2[3]=(TIME[1]>>4)+0x30;//分钟 	hang2[4]=(TIME[1]&0x0f)+0x30; 	hang2[6]=(TIME[0]>>4)+0x30; 	hang2[7]=(TIME[0]&0x0f)+0x30; 	hang3[0]=shi/10+0x30; 	hang3[1]=shi%10+0x30; 	hang3[3]=fen/10+0x30; 	hang3[4]=fen%10+0x30; }  void xian()//显示 { 	suan();//计算 	if(mode==0)//正常 	{		 		write_string(1,0,hang1); 		write_string(2,0,hang2); 	} 	else 	{ 		switch(cixu) 		{ 			case 0:		 //年 				if(flag) 				{ 					hang1[2]=(TIME[6]>>4)+0x30; 					hang1[3]=(TIME[6]&0x0f)+0x30; 				} 				else 				{ 					hang1[2]=' '; 					hang1[3]=' '; 				} 				break; 			case 1:		 //月 				if(flag) 				{ 					hang1[5]=(TIME[4]>>4)+0x30; 					hang1[6]=(TIME[4]&0x0f)+0x30; 				} 				else 				{ 					hang1[5]=' '; 					hang1[6]=' '; 				} 				break; 			case 2:		 //日 				if(flag) 				{ 					hang1[8]=(TIME[3]>>4)+0x30; 					hang1[9]=(TIME[3]&0x0f)+0x30; 				} 				else 				{ 					hang1[8]=' '; 					hang1[9]=' '; 				} 				break; 			case 3:		 //星期 				if(flag) 				{ 					hang1[12]=TIME[5]+0x30; 				} 				else 				{ 					hang1[12]=' '; 				} 				break; 			case 4:		 //时 				if(flag) 				{ 					hang2[0]=(TIME[2]>>4)+0x30; 					hang2[1]=(TIME[2]&0x0f)+0x30; 				} 				else 				{ 					hang2[0]=' '; 					hang2[1]=' '; 				} 				break; 			case 5:		 //分 				if(flag) 				{ 					hang2[3]=(TIME[1]>>4)+0x30; 					hang2[4]=(TIME[1]&0x0f)+0x30; 				} 				else 				{ 					hang2[3]=' '; 					hang2[4]=' '; 				} 				break; 			case 6:		 //秒 				if(flag) 				{ 					hang2[6]=(TIME[0]>>4)+0x30; 					hang2[7]=(TIME[0]&0x0f)+0x30; 				} 				else 				{ 					hang2[6]=' '; 					hang2[7]=' '; 				} 				break; 			case 7:		 //时,闹钟 				if(flag) 				{ 					hang3[0]=shi/10+0x30; 					hang3[1]=shi%10+0x30; 				} 				else 				{ 					hang3[0]=' '; 					hang3[1]=' '; 				} 				break; 			case 8:		 //分,闹钟 				if(flag) 				{ 					hang3[3]=fen/10+0x30; 					hang3[4]=fen%10+0x30; 				} 				else 				{ 					hang3[3]=' '; 					hang3[4]=' '; 				}				 		} 		if(cixu<7)	//显示结果 		{ 			write_string(1,0,hang1); 			write_string(2,0,hang2); 		} 		else 		{ 			write_string(1,0,"CLOCK:          "); 			write_string(2,0,hang3); 		} 	}  }   //主函数 void main() { 	uchar i,j,k; 	TMOD|=0X01;//选择为定时器0模式,工作方式1,仅用TR0打开启动。 	TH0=0X3C;	//定时50ms 	TL0=0Xb0;	 	ET0=1;//打开定时器0中断允许 	EA=1;//打开总中断 	TR0=1;//打开定时器 	init_1602();//LCD初始化 	write_string(1,0,hang1); 	write_string(2,0,hang2); //	Ds1302ReadTime();//启动DS1302 	TIME[0]=0; 	Ds1302Init();  	while(1) 	{ 	 	if(!key5)//12,24切换 		{ 			moshi=!moshi; 			while(!key5); 		} 		//判断 		k=0; 		i=(shi/10<<4)+shi%10; 		j=(fen/10<<4)+fen%10; 		if((TIME[2]==i)&&(TIME[1]==j))//闹钟 		{ 			beep=0; 		} 		else 		{ 			beep=1; 		} 			 		//按键检测 		if(!key1)//功能 		{ 			cixu=0; 			mode=!mode; 			while(!key1); 		} 		if(!key2)//next 		{ 			if(cixu<8) 				cixu++; 			else 				cixu=0; 			while(!key2); 		} 		if(!key3)//加 		{ 			switch(cixu) 			{ 				case 0:	//年 					i=(TIME[6]>>4)*10+(TIME[6]&0X0F); 					if(i<99) 						i++; 					TIME[6]=(i/10<<4)+i%10; 					Ds1302Init(); 					break; 				case 1:	//月 					i=(TIME[4]>>4)*10+(TIME[4]&0X0F); 					if(i<12) 						i++; 					TIME[4]=(i/10<<4)+i%10; 					Ds1302Init(); 					break; 				case 2:	//日 					i=(TIME[3]>>4)*10+(TIME[3]&0X0F); 					if(i<30) 						i++; 					TIME[3]=(i/10<<4)+i%10; 					Ds1302Init(); 					break; 				case 3:	//星期 					i=(TIME[5]>>4)*10+(TIME[5]&0X0F); 					if(i<7) 						i++; 					TIME[5]=(i/10<<4)+i%10; 					Ds1302Init(); 					break; 				case 4:	//时 					i=(TIME[2]>>4)*10+(TIME[2]&0X0F); 					if(i<23) 						i++; 					TIME[2]=(i/10<<4)+i%10; 					Ds1302Init(); 					break; 				case 5:	//分 					i=(TIME[1]>>4)*10+(TIME[1]&0X0F); 					if(i<59) 						i++; 					TIME[1]=(i/10<<4)+i%10; 					Ds1302Init(); 					break; 				case 6:	//秒 					i=(TIME[0]>>4)*10+(TIME[0]&0X0F); 					if(i<59) 						i++; 					TIME[0]=(i/10<<4)+i%10; 					Ds1302Init(); 					break; 				case 7:	//闹钟,时 					if(shi<23) 						shi++; 					break; 				case 8:	//闹钟,分 					if(fen<59) 						fen++; 			} 			while(!key3); 		} 		if(!key4)//减 		{ 			switch(cixu) 			{ 				case 0:	//年 					i=(TIME[6]>>4)*10+(TIME[6]&0X0F); 					if(i>0) 						i--; 					TIME[6]=(i/10<<4)+i%10; 					Ds1302Init(); 					break; 				case 1:	//月 					i=(TIME[4]>>4)*10+(TIME[4]&0X0F); 					if(i>1) 						i--; 					TIME[4]=(i/10<<4)+i%10; 					Ds1302Init(); 					break; 				case 2:	//日 					i=(TIME[3]>>4)*10+(TIME[3]&0X0F); 					if(i>1) 						i--; 					TIME[3]=(i/10<<4)+i%10; 					Ds1302Init(); 					break; 				case 3:	//星期 					i=(TIME[5]>>4)*10+(TIME[5]&0X0F); 					if(i>1) 						i--; 					TIME[5]=(i/10<<4)+i%10; 					Ds1302Init(); 					break; 				case 4:	//时 					i=(TIME[2]>>4)*10+(TIME[2]&0X0F); 					if(i>0) 						i--; 					TIME[2]=(i/10<<4)+i%10; 					Ds1302Init(); 					break; 				case 5:	//分 					i=(TIME[1]>>4)*10+(TIME[1]&0X0F); 					if(i>0) 						i--; 					TIME[1]=(i/10<<4)+i%10; 					Ds1302Init(); 					break; 				case 6:	//秒 					i=(TIME[0]>>4)*10+(TIME[0]&0X0F); 					if(i>0) 						i--; 					TIME[0]=(i/10<<4)+i%10; 					Ds1302Init(); 					break; 				case 7:	//闹钟,时 					if(shi>0) 						shi--; 					break; 				case 8:	//闹钟,分 					if(fen>0) 						fen--; 			} 			while(!key4); 		} 	} }  void Timer0() interrupt 1 //定时器0中断 { 	 	if(t<10) 		t++; 	else 	{ 		t=0; 		flag=!flag; 		Ds1302ReadTime();//读取时间 		xian();  	} 	TH0=0X3C;	//定时50ms 	TL0=0Xb0; }  

5. 设计报告

6377字设计报告,内容包括硬件设计、软件设计、软硬件框图、调试等

img

随着嵌入式技术的迅速发展和广泛应用,单片机作为其核心组成部分,在日常生活的诸多领域展现出了无可比拟的优势。尤其在智能化、微型化和功能集成化的趋势下,51系列单片机因其结构简单、成本低廉且易于学习的特点,在教育与工业应用中扮演了至关重要的角色。其中,基于51单片机制作的电子钟和万年历产品由于其高度实用的功能特性以及便捷友好的用户操作界面,受到了广大用户和工程技术人员的广泛认可和青睐。

本课程设计项目正立足于这一时代背景和技术潮流,旨在通过理论联系实践的教学方式,借助Proteus这一强大的电子电路仿真软件平台,引领学生亲自动手设计并实现一款融合了多种实用功能于一体的电子钟万年历系统。该系统不仅包含了基本的时间显示及设置功能,还具备了闹钟设定、时间制式切换(12小时/24小时)、精确日期和星期显示等功能模块,充分体现了嵌入式系统的灵活性和智能性。

6. 设计资料内容清单&&下载链接

资料设计资料包括仿真,程序代码、讲解视频、功能要求、设计报告、软硬件设计框图等。

0、常见使用问题及解决方法–必读!!!!

1、程序

2、proteus仿真

3、功能要求

4、软硬件流程图

5、开题报告

6、设计报告

7、讲解视频

Altium Designer 安装破解

KEIL+proteus 单片机仿真设计教程

KEIL安装破解

Proteus元器件查找

Proteus安装

Proteus简易使用教程

单片机学习资料

相关数据手册

答辩技巧

设计报告常用描述

鼠标双击打开查找嘉盛单片机51 STM32单片机课程毕业设计.url

img

资料下载链接:

https://docs.qq.com/doc/DS3BobENMR1hLZHVm

广告一刻

为您即时展示最新活动产品广告消息,让您随时掌握产品活动新动态!