基于51单片机电子钟闹钟设计

news2025/1/16 6:34:11

基于51单片机电子钟闹钟设计

(仿真+程序+原理图)

功能介绍

具体功能:

1.LCD1602实时显示时间和闹钟时间;

2.可整点报时。

3.按键设置时间、闹钟。

4.使用蜂鸣器报时和响闹钟;

​演示视频:

基于51单片机电子钟闹钟—LCD1602显示 

#include <reg51.h>
#include <lcd1602.h>

/***********************引脚定义************************/
sbit K1=P2^3;					//切换。=1调整时间、=2调整闹钟、=0正常运行
sbit K2=P2^4;					//下一个
sbit K3=P2^5;					//加一
sbit K4=P2^6;					//减一
sbit beep=P2^7;					//蜂鸣器
/***********************变量定义************************/
unsigned char moshi=0;					//用来指示当前处在哪个功能状态
unsigned int  timer=0;					//系统定时变量
unsigned char miao=0,fen=10,shi=6;		//初始时间
unsigned char buzzr_fen=12,buzzr_shi=6;	//闹钟时间
unsigned char two=0;					//指示每个功能下对应的时间
unsigned char time[]={"06:10:10"};		//当前时间显示空间
unsigned char buzzr[]={"06:12"};		//闹钟缓存
/*********************************************************
函数名称:delay
函数作用:延时函数
输入变量:unsigned int i延时时间
返回值:  无
***********************************************************/
void delay(unsigned int i)				//延时单位为10us
{
	while(i--);
}
/*********************************************************
函数名称:main
函数作用:主函数
输入变量:无
返回值:  无
***********************************************************/
void main()
{
	TMOD|=0X01;							//T0工作方式1
	TH0=0XfC;							//设置初值1ms
	TL0=0X18;	
	ET0=1;								//打开定时器0中断允许
	EA=1;								//打开总中断
	TR0=1;								//打开定时器
	init_1602();						//LCD1602初始化
	write_string(1,0,"TIME:");
	write_string(2,0,"CLOCK:");
	write_string(1,5,time);				//显示初始时间
	write_string(2,6,buzzr);			//显示闹钟时间
	write_com(0x0c);					//关闭光标
while(1)								//主循环
{
	 if(!K1)							//按钮1功能切换
	 {
	 delay(10000);						//延时防抖
		  if(!K1)
		  {
				two=0;					//功能时间指示变量清零
		  	  	if(moshi<2)				//模式切换
			  		moshi++;
				else
					moshi=0;
				switch(moshi)			//设置光标位置
				{
				case 0:	write_com(0x0c);//正常模式,关闭光标
						break;
				case 1:	write_com(0x0e);//模式1,打开光标
						write_sfm(1,6);	//设置光标位置
						break;
				case 2:	write_com(0x0e);//模式2,打开光标
						write_sfm(2,6);	//设置光标位置
				}
		  }
		  while(!K1);				   	//等待按钮松开
	 }
	 if(moshi==1)						//模式1,调整时间
	 {
			if(!K2)						//下一个
			{
			   delay(10000);			//延时防抖
			   	if(!K2)
				{
					if(two<2)
						two++;
					else
						two=0;
				}
				if(two==0)				//光标设置在小时位置
					{
					write_com(0x0e);
					write_sfm(1,6);
					}
				if(two==1)					//光标设置在分钟位置
					{
					write_com(0x0e);
					write_sfm(1,9);
					}
				if(two==2)					//光标设置在秒位置
					{
					write_com(0x0e);
					write_sfm(1,12);
					}
				while(!K2);				//等待按钮松开
			}
			if(two==0)
				{
				if(!K3) 				//小时加一
					{
					delay(10000);		//延时防抖
						if(!K3)
						{
							if(shi<23)	//限制小时最大值为23
							   shi++;	//小时加一
							else
								shi=0;
						}
					time[0]=shi/10+0x30;//计算
					time[1]=shi%10+0x30;
					write_string(1,5,time);//显示
					write_sfm(1,6);		//保持光标位置
					while(!K3);
					}
				 if(!K4) 				//小时减一
					{
					delay(10000);		//延时防抖
						if(!K4)
						{
							if(shi>0)
							   shi--;
							else
								shi=23;
						}
					time[0]=shi/10+0x30;//计算
					time[1]=shi%10+0x30;
					write_string(1,5,time);//显示
					write_sfm(1,6);
					while(!K4);
					}
				}
			if(two==1)
				{
				if(!K3) 				//分钟加一
					{
					delay(10000);		//延时防抖
						if(!K3)
						{
							if(fen<59)	//限制分钟最大值为59
							   	fen++;
							else
								fen=0;
						}
					time[3]=fen/10+0x30;//计算
					time[4]=fen%10+0x30;
					write_string(1,5,time);//显示
					write_sfm(1,9);
					while(!K3);
					}
				 if(!K4) 				//分钟减一
					{
					delay(10000);		//延时防抖
						if(!K4)
						{
							if(fen>0)
							   fen--;
							else
								fen=59;
						}
					time[3]=fen/10+0x30;//计算
					time[4]=fen%10+0x30;
					write_string(1,5,time);//显示
					write_sfm(1,9);
					while(!K4);
					}
				}
			if(two==2)
				{
				if(!K3) 				//秒加一
					{
					delay(10000);		//延时防抖
						if(!K3)
						{
							if(miao<59)	//限制分钟最大值为59
							   	miao++;
							else
								miao=0;
						}
					time[3]=miao/10+0x30;//计算
					time[4]=miao%10+0x30;
					write_string(1,5,time);//显示
					write_sfm(1,9);
					while(!K3);
					}
				 if(!K4) 				//秒减一
					{
					delay(10000);		//延时防抖
						if(!K4)
						{
							if(miao>0)
							   miao--;
							else
								miao=59;
						}
					time[3]=miao/10+0x30;//计算
					time[4]=miao%10+0x30;
					write_string(1,5,time);//显示
					write_sfm(1,9);
					while(!K4);
					}
				}
		}
		if(moshi==2)					//模式2,调整闹钟
		{
			if(!K2)						//下一个
			{
			   delay(10000);			//延时防抖
			   	if(!K2)
				{
					two=!two;			//切换次序
				}
				if(two==0)				//光标设置在小时
					{
					write_com(0x0e);	//开启光标
					write_sfm(2,6);
					}
				else					//光标设置在分钟
					{
					write_com(0x0e);	//开启光标
					write_sfm(2,9);
					}
				while(!K2);
			}
			if(two==0)
				{
				if(!K3) 				//小时加一
					{
					delay(10000);		//延时防抖
						if(!K3)
						{
							if(buzzr_shi<23)//限制小时最大值为23
							   	buzzr_shi++;
							else
								buzzr_shi=0;
						}
					buzzr[0]=buzzr_shi/10+0x30;//计算
					buzzr[1]=buzzr_shi%10+0x30;
					write_string(2,6,buzzr);//显示
					write_sfm(2,6);
					while(!K3);
					}
				 if(!K4) 				//小时减一
					{
					delay(10000);		//延时防抖
						if(!K4)
						{
							if(buzzr_shi>0)
							   buzzr_shi--;
							else
								buzzr_shi=23;
						}
					buzzr[0]=buzzr_shi/10+0x30;//计算
					buzzr[1]=buzzr_shi%10+0x30;
					write_string(2,6,buzzr);  //显示
					write_sfm(2,6);
					while(!K4);
					}
				}
			else
				{
				if(!K3) 				//分钟加一
					{
					delay(10000);		//延时防抖
						if(!K3)
						{
							if(buzzr_fen<59)//限制分钟最大值为59
							   	buzzr_fen++;
							else
								buzzr_fen=0;
						}
					buzzr[3]=buzzr_fen/10+0x30;//计算
					buzzr[4]=buzzr_fen%10+0x30;
					write_string(2,6,buzzr);//显示
					write_sfm(2,9);			//保持光标位置
					while(!K3);
					}
				 if(!K4) 					//分钟减一
					{
					delay(10000);			//延时防抖
						if(!K4)
						{
							if(buzzr_fen>0)
							   buzzr_fen--;
							else
								buzzr_fen=59;
						}
					buzzr[3]=buzzr_fen/10+0x30;//计算
					buzzr[4]=buzzr_fen%10+0x30;
					write_string(2,6,buzzr);//显示
					write_sfm(2,9);
					while(!K4);
					}
				}
		}
}

硬件设计

使用元器件:

单片机:AT89C51;

(注意:单片机是通用的,无论51还是52、无论stc还是at都一样,引脚功能都一样。程序也是一样的。)

电容:10uf;电容:30pf;

晶振:12MHZ;按键 ;

电阻:10k;电阻:1k;

三极管:PNP;蜂鸣器:有源;

显示器:LCD1602;排阻:10k;

导线若干;

流程图

设计资料

01 仿真图

本设计使用proteus7.8和proteus8.9两个版本设计,向下兼容,无需担心!具体如图!

02 原理图

本系统原理图采用Altium Designer19设计,具体如图!

03 程序

本设计使用软件keil4和keil5两个版本编程设计,无需担心!具体如图!

04 设计资料

        资料获取请关注同名公众号,全部资料包括仿真源文件 、程序(含注释)、AD原理图、元件清单、仿真视频等。具体内容如下,全网最全! !

资料获取请观看前面演示视频!

点赞分享一起学习成长。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1572702.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CCIE-14-MPLS_and_BGP

目录 实验条件网络拓朴 环境配置开始配置配置MPLSR1访问R6检测结果R6访问R1检测结果 实验条件 网络拓朴 环境配置 在我的资源里可以下载&#xff08;就在这篇文章的开头也可以下载&#xff09; 开始配置 R1<->R2&#xff1a;EBGP R2<->R5&#xff1a;IBGP&…

Azkaban集群模式部署详细教程

序言 Azkaban是一个用于工作流程调度和任务调度的开源工具&#xff0c;它可以帮助用户轻松地管理和监控复杂的工作流程。Azkaban的架构设计旨在提供高度可扩展性和可靠性&#xff0c;同时保持易用性和灵活性。 Azkaban的架构可以分为三个主要组件:Executor、Web Server和db数据…

FebHost:什么是土耳其.TR域名?

当前互联网高速发展,一个国家的顶级域名已成为其网络形象的重要标识。近期,土耳其国家顶级域名”.TR”引起了广泛关注,成为业界热议的话题。 作为代表土耳其共和国的国家顶级域名(ccTLD),.TR域名于1991年首次引入,由土耳其科技和信息技术部负责管理。除了常见的”.com.tr”、”…

JavaEE 初阶篇-生产者与消费者模型(线程通信)

&#x1f525;博客主页&#xff1a; 【小扳_-CSDN博客】 ❤感谢大家点赞&#x1f44d;收藏⭐评论✍ 文章目录 1.0 生产者与消费者模型概述 2.0 在生产者与消费者模型中涉及的关键概念 2.1 缓冲区 2.2 生产者 2.3 消费者 2.4 同步机制 2.5 线程间通信 3.0 实现生产者与消费者模…

【大数据存储】spark-编程

实验8-spark编程 实验&#xff1a;编写Spark应用程序&#xff08;掌握Spark应用程序的编写、编译打包和运行方法&#xff09; 1、对于两个输入文件A和B&#xff0c;编写Spark独立应用程序&#xff0c;对两个文件进行合并&#xff0c;并剔除其中重复的内容&#xff0c;得到一个…

IMU参数辨识及标定

IMU参数辨识及标定 一、标定参数分析 标定的本质是参数辨识。首先明确哪些参数可辨识&#xff0c;其次弄清怎样辨识。 参数包括陀螺仪和加速度计各自的零偏、标度因数、安装误差。 IMU需要标定的参数主要是确定性误差和随机误差&#xff0c;确定性误差主要标定bias&#xff0…

多线程学习-线程池

目录 1.线程池的作用 2.线程池的实现 3.自定义创建线程池 1.线程池的作用 当我们使用Thread的实现类来创建线程并调用start运行线程时&#xff0c;这个线程只会使用一次并且执行的任务是固定的&#xff0c;等run方法中的代码执行完之后这个线程就会变成垃圾等待被回收掉。如…

AcWing2069.网格分析

【题目链接】2069. 网络分析 - AcWing题库 输入样例1&#xff1a; 4 8 1 1 2 2 1 10 2 3 5 1 4 1 2 2 2 1 1 2 1 2 4 2 2 1输出样例1&#xff1a; 13 13 5 3 【代码及详细注释】 #include<bits/stdc.h> using namespace std; const int N1e510; int n,m,p[N],d[N]; /…

数据结构初阶:顺序表和链表

线性表 线性表 ( linear list ) 是 n 个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使 用的数据结构,常见的线性表:顺序表、链表、栈、队列、字符串 ... 线性表在逻辑上是线性结构,也就说是连续的一条直线。但是在物理结构上并不一定是连续的, 线性…

阿里巴巴蔡崇信:中国AI追赶神速,制造业霸主地位无可撼动!

快科技4月5日讯&#xff0c;阿里巴巴集团创始人兼董事长蔡崇信近日就AI技术领域及全球制造业形势发表看法。他认为&#xff0c;尽管中国在AI技术方面与美国有一定差距&#xff0c;但中国的追赶速度非常快。 AI-321 | 专注于AI工具分享的网站 AI工具集 | 人工智能工具箱 | 全球…

xss.pwnfunction-Jefff

在eval中可以直接执行命令所以直接把"直接闭合在结尾再加上一个"因为后面的"没闭和会报错 ?jeffa";alert(1);" 或 ?jeffa"-alert(1)-" -是分隔符

C++从入门到精通——类的定义及类的访问限定符和封装

类的定义及类的访问限定符和封装 前言一、类的定义类的两种定义方式成员变量命名规则的建议示例 二、类的访问限定符和封装访问限定符访问限定符说明C为什么要出现访问限定符例题 封装例题 前言 类的定义是面向对象编程中的基本概念&#xff0c;它描述了一类具有相同属性和方法…

【精品教程】护网HVV实战教程资料合集(持续更新,共20节)

以下是资料目录&#xff0c;如需下载&#xff0c;请前往星球获取&#xff1a; 01-HW介绍.zip 02-HTTP&Burp课程资料.zip 03-信息收集_3.zip 04-SQL注入漏洞_2.zip 05-命令执行漏洞.zip 06-XSS漏洞.zip 07-CSRF.zip 08-中间件漏洞.zip 09-SSRF.zip 10-XXE.zip 11-Java反序列…

Seata(分布式事务集成测试和总结)

文章目录 1.集成测试1.集成测试正常下单1.步骤2.浏览器访问 http://localhost:10008/order/save?userId666&productId1&nums1&money1003.注意事项和细节 2.集成测试模拟异常1.步骤1.com/sun/springcloud/controller/StorageController.java 休眠12s&#xff0c;模…

【项目新功能开发篇】需求分析和开发设计

作者介绍&#xff1a;本人笔名姑苏老陈&#xff0c;从事JAVA开发工作十多年了&#xff0c;带过大学刚毕业的实习生&#xff0c;也带过技术团队。最近有个朋友的表弟&#xff0c;马上要大学毕业了&#xff0c;想从事JAVA开发工作&#xff0c;但不知道从何处入手。于是&#xff0…

揭秘rmallox病毒:防范、清除、恢复一步到位!

引言&#xff1a; 随着信息技术的快速发展&#xff0c;计算机病毒已成为网络安全领域的一大难题。其中&#xff0c;rmallox病毒是近年来备受关注的一种恶意软件。本文将深入探讨rmallox病毒的特性、传播途径、防范措施、清除方法以及数据恢复技巧&#xff0c;帮助读者全面了解这…

Mac苹果电脑air/pro包含m1~m3打开app显示弹框“xxx”已损坏,无法打开。您应该将它移到废纸篓

应该是保姆级教程了&#xff1a; Mac苹果电脑air/pro包含m1~m3打开app显示弹框“xxx”已损坏&#xff0c;无法打开。您应该将它移到废纸篓。 我下载的是 Sublime Text 3 for Mac中文直装版&#xff0c;https://www.32r.com/soft/38404.html 安装后打开就gg了&#xff1a; 表现…

【图论】【分类讨论】LeetCode3017按距离统计房屋对数目

本文涉及的知识点 图论 分类讨论 本题同解 【差分数组】【图论】【分类讨论】【整除以2】3017按距离统计房屋对数目 LeetCode3017按距离统计房屋对数目 给你三个 正整数 n 、x 和 y 。 在城市中&#xff0c;存在编号从 1 到 n 的房屋&#xff0c;由 n 条街道相连。对所有 …

2024最新Notepad++下载安装教程图文步骤演示

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 文章目录 &#x1f42f;2024最新Notepad下载安装教程图文步骤演示&#x1f4dd;摘要引言正文&#x1f4d8;Notepad简介&#x1f4e5;下载Notepad&#x1f4e6;安装教程1. 获取安装…

2024HW-->Wireshark攻击流量分析

在HW中&#xff0c;最离不开的&#xff0c;肯定是看监控了&#xff0c;那么就要去了解一些wireshark的基础用法以及攻击的流量&#xff01;&#xff01;&#xff01;&#xff01; 1.Wireshark的基本用法 比如人家面试官给你一段流量包&#xff0c;你要会用 1.分组详情 对于我…