基于AT89C51单片机的电子闹钟设计

1.设计任务

利用AT89C51单片机为核心控制元件,设计一个电子闹钟,设计的系统实用性强、操作简单,实现了智能化、数字化。

(1)按开始键自动进入时间显示,开始为0,按K1键进入更改时间,闪烁位为可更改位,按K1键调整更改位,K2键为自增键,K3键为关闭响铃键,修改成功之后按K1键确定修改成功;

(2)按K1键进入秒表功能,再次按K2键秒表开始计时,K3键为秒表暂停键,继续则按K2键,K3键为清零键;

(3)按K1键进入闹钟功能,进去之后闪烁位为可更改位,按K1键调整更改位,K2键为自增键,K3键为关闭键。

2. 设计要求

2.1系统方案论证

根据设计任务,分析设计系统的组成,给出实现设计任务的几种方案,分析比较几种设计方案的优略,本着尽量以软件代替硬件,同时力求电路简单,工作可靠的原则,确定总体设计方案。

2.2系统硬件电路设计

根据系统设计方案进行软、硬件的分配,软、硬件设计分别进行。硬件设计包括单片机最小系统和扩展接口及配置,硬件结构在设计时要选择合适的元器件,硬件电路要简洁、工作可靠,需用Proteus绘制整个系统的电路仿真原理图。

2.3软件设计

根据该系统要求的功能进行软件设计,简述软件的功能,并根据每个模块的功能绘制软件流程图,根据流程图编写程序并汇编调试通过;列出软件清单,软件清单要求加以注释。

2.4 软硬件系统仿真

将编译后的程序软件加载到Proteus软件仿真的单片机ROM中,运行系统,实现软件程序对单片机系统的硬件电路的控制,并调试仿真结果,直至与设计任务相符。

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

uint num,A_num,x=0;
uint h,m,s;
uint h1=0,m1=0,s1=0,sign=1; 

uchar code Zifu[]="0123456789";
 
sbit beep = P2^3;

sbit LCD_EN = P3^4;
sbit LCD_RS = P3^5;

sbit duan = P2^6;
sbit wei = P2^7;

sbit key_A = P3^6;
sbit key_B = P3^7;

void delay_1ms(uchar x){
 uchar i,j;
 for(j=0;j<x;j++)
  for(i=0;i<110;i++);
}

void write_command(uchar command){
 LCD_RS = 0;
 LCD_EN = 0;
 P0 = command;
 delay_1ms(2);
 LCD_EN = 1;    //EN 由1 -- 0 完成 有效数据 的 锁存
 delay_1ms(2);
 LCD_EN = 0;
}
 
void write_data(uchar yes){
 LCD_RS = 1;
 LCD_EN = 0;
 P0 = yes;
 delay_1ms(2);
 LCD_EN = 1;
 delay_1ms(2);
 LCD_EN = 0;
}
 
void lcd_post(int X,int Y){   //0,1表征 第一行 和 第二行
 write_command(0x80+X*(0x40)+Y);
}
 
void init(){
 h=m=s=0;
 num=A_num=0;
 
 LCD_EN=0;
 write_command(0x38);
 write_command(0x0c);
 //write_command(0x06); //写字符后地址指针加一
 write_command(0x01);
 
 TMOD = 0x02;
 TH0 = 6;
 TL0 = 6;
 EA = 1;
 ET0 = 1;
 TR0 = 1;
 
/*时分秒*/ 
 lcd_post(0,0); write_data(Zifu[h/10]);
 lcd_post(0,1); write_data(Zifu[h%10]);
 
 lcd_post(0,2); write_data(':');
 
 lcd_post(0,3); write_data(Zifu[m/10]);
 lcd_post(0,4); write_data(Zifu[m%10]);
 
 lcd_post(0,5); write_data(':');
 
 lcd_post(0,6); write_data(Zifu[s/10]);
 lcd_post(0,7); write_data(Zifu[s%10]);
 

 lcd_post(1,5); write_data('a');
 lcd_post(1,6); write_data('l');
 lcd_post(1,7); write_data('a');
 lcd_post(1,8); write_data('r');
 lcd_post(1,9); write_data('m');
 
 lcd_post(1,10); write_data(' ');
 lcd_post(1,11); write_data('c');
 
 lcd_post(1,12); write_data('l');
 
 lcd_post(1,13); write_data('o');
 lcd_post(1,14); write_data('c');
 lcd_post(1,15); write_data('k');
}
 


void ling()
{
 unsigned char a;
 for(a=0;a<500;a++)
 {
  
 if((P1&0x80)==0)
 {
  break;
 }
 
 lcd_post(1,5); write_data('l');
 lcd_post(1,6); write_data('i');
 lcd_post(1,7); write_data('n');
 lcd_post(1,8); write_data('g');
 lcd_post(1,9); write_data('!');
 lcd_post(1,10); write_data(' ');
 lcd_post(1,11); write_data('l');
 lcd_post(1,12); write_data('i');
 lcd_post(1,13); write_data('n');
 lcd_post(1,14); write_data('g');
 lcd_post(1,15); write_data('!');
 beep=0;  
 
 delay_1ms(500);
 lcd_post(1,5); write_data(' ');
 lcd_post(1,6); write_data(' ');
 lcd_post(1,7); write_data(' ');
 lcd_post(1,8); write_data(' ');
 lcd_post(1,9); write_data(' ');
 lcd_post(1,10); write_data(' ');
 lcd_post(1,11); write_data(' ');
 lcd_post(1,12); write_data(' ');
 lcd_post(1,13); write_data(' ');
 lcd_post(1,14); write_data(' ');
 lcd_post(1,15); write_data(' ');
 beep=1;
 
 delay_1ms(500);
 }
 
 
 lcd_post(1,5); write_data('a');
 lcd_post(1,6); write_data('l');
 lcd_post(1,7); write_data('a');
 lcd_post(1,8); write_data('r');
 lcd_post(1,9); write_data('m');
 lcd_post(1,10); write_data(' ');
 lcd_post(1,11); write_data('c');
 lcd_post(1,12); write_data('l');
 lcd_post(1,13); write_data('o');
 lcd_post(1,14); write_data('c');
 lcd_post(1,15); write_data('k');

}

void keyscan(){
 if(key_A==0){
  delay_1ms(3);
  if(key_A==0){
   A_num++; 
   switch(A_num){
    case 1:         //时
     TR0=0;        
     lcd_post(0,1);
     write_command(0x0f);
     break;
    case 2:lcd_post(0,4);break;    //分
    case 3:lcd_post(0,7);break;    //秒
    
    case 4:
     A_num=0;
     write_command(0x0c);
     TR0=1;
      sign = 0;
     break;
   }  
  }
  while(!key_A);
 }
 if(A_num!=0){
  if(key_B==0){
   delay_1ms(3);
   if(key_B==0){ 
    
    switch(A_num){
    case 1:
     h1=(++h1)%24;
     lcd_post(0,0); write_data(Zifu[h1/10]);
     lcd_post(0,1); write_data(Zifu[h1%10]);
     break;    //时
    case 2:
     m1=(++m1)%60;
     lcd_post(0,3); write_data(Zifu[m1/10]);
     lcd_post(0,4); write_data(Zifu[m1%10]);
     break;    //分
    case 3:
     s1=(++s1)%60;
     lcd_post(0,6); write_data(Zifu[s1/10]);
     lcd_post(0,7); write_data(Zifu[s1%10]);
     break;    //秒
    case 4:sign = 0;break;
    }write_command(0x10);  
   }
   while(!key_B);
  }
 }
}
 
void main()
{ 
 
  int clk1 =0;
 int clk2 =0;
  there:
 beep=0;
 init();
 //there:
 
 
  h1=m1=s1=0;
 while(sign)
 {
  keyscan();
 }
 
 clk1 = 0;
 clk2 = h1*3600+m1*60+s1;
 init();
 while(1){
    
  if(num==3686){
   num=0;
     s++;
      clk1++;
    if(clk1 > clk2)
    {
      ling();
     sign = 1;
     goto there;
     
    }
   if(s==60){
    s=0;
    m++;
    
    if(m==60){
     m=0;
     h++;
     if(h==24)h=0;
     lcd_post(0,0); write_data(Zifu[h/10]);
     lcd_post(0,1); write_data(Zifu[h%10]);
    }
      lcd_post(0,3); write_data(Zifu[m/10]);
       lcd_post(0,4); write_data(Zifu[m%10]);
     }
       lcd_post(0,6); write_data(Zifu[s/10]);
       lcd_post(0,7); write_data(Zifu[s%10]);
      }
  
       }
}
 

完整代码点开链接私信  免费  获取。

【iBot机器人工作室的个人空间-哔哩哔哩】 https://b23.tv/ryUWVKa

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

代码随想录算法训练营 ---第五十一天

1.第一题&#xff1a; 简介&#xff1a; 本题相较于前几题状态复杂了起来&#xff0c;因为多了一个冷冻期。本题讲解可去代码随想录看&#xff0c;这里差不多只是加了些自己的理解。 动规五部曲&#xff0c;分析如下&#xff1a; 确定dp数组以及下标的含义 dp[i][j]&#x…

数据库应用:MongoDB 文档与索引管理

目录 一、理论 1.MongoDB文档管理 2.MongoDB索引管理 二、实验 1.MongoDB文档管理 2.MongoDB索引管理&#xff08;索引添加与删除&#xff09; 3.MongoDB索引管理&#xff08;全文索引&#xff09; 4.MongoDB索引管理&#xff08;多列索引&#xff09; 5.MongoDB索引管…

【办公软件】Outlook启动一直显示“正在启动”的解决方法

早上打开电脑Outlook2016以后&#xff0c;半个多小时了&#xff0c;一直显示这个界面&#xff1a; 解决办法 按WIN R键打开“运行”&#xff0c;输入如下命令&#xff1a; outlook.exe /safe 然后点击“确定” 这样就进入了Outlook的安全模式。 点击“文件”->“选项”-…

【智能家居】三、添加语音识别模块的串口读取功能点

语音识别模块SU-03T 串口通信线程控制代码 inputCommand.h&#xff08;输入控制指令&#xff09;voiceControl.c&#xff08;语音控制模块指令&#xff09;main.c&#xff08;主函数&#xff09;编译运行结果 语音识别模块SU-03T AI智能语音识别模块离线语音控制模块语音识别…

Oracle 单表插入/多表插入(Single Table Insert/Multi-table Insert)

数据库应用中&#xff0c;我们经常需要向表中插入数据&#xff0c;insert语句是最常用的数据插入方式&#xff0c;根据目标表的数量&#xff0c;可以分为单表插入和多表插入。 目录 一、 单表插入&#xff08;Single Table Insert&#xff09; 二、 多表插入&#xff08;Multi-…

Set集合的特点

Set系列集合特点&#xff1a; 无序&#xff1a;添加数据的顺序和获取出的数据顺序不一致&#xff1b;不重复&#xff1b;无索引&#xff1b; HashSet&#xff1a;无序&#xff0c;不重复&#xff0c;无索引 LinkedHashSet&#xff1a;有序&#xff0c;不重复&#xff0c;无索引…

DS八大排序之直接选择排序和堆排序

前言 上一期我们已经介绍了&#xff0c;排序、为什么要有排序以及排序在实际生活中的应用。并且介绍并实现了直接插入排序和它的优化即希尔排序~&#xff01;本期我们再来学习一组排序 ---- "选择排序"即直接选择排序和堆排序~&#xff01; 本期内容介绍 直接选择排…

【linux防火墙】设置开启路由转发,SNAT和DNAT转换原理及应用实操,添加自定义链归类iptables规则

目录 一、关于iptables规则的保存 1.1持久保存规则 1.2加载规则 1.3开机自动加载规则 1.4使用iptables-service软件来进行规则的保存和加载&#xff08;不建议使用&#xff09; 二、SNAT和DNAT的原理和应用 SNAT的原理与应用&#xff1a; DNAT的原理和应用&#xff1a; …

透彻理解二叉树中序遍历的应用

关卡名 二分搜索树 我会了✔️ 内容 1.有序数组转为二叉搜索树 ✔️ 2.寻找两个正序数组的中位数 ✔️ 1 有序数组转为二叉搜索树 LeetCode108 给你一个整数数组 nums &#xff0c;其中元素已经按 升序 排列&#xff0c;请你将其转换为一棵 高度平衡 二叉搜索树。 高度…

深入理解Zookeeper系列-2.Zookeeper基本使用和分布式锁原理

&#x1f44f;作者简介&#xff1a;大家好&#xff0c;我是爱吃芝士的土豆倪&#xff0c;24届校招生Java选手&#xff0c;很高兴认识大家&#x1f4d5;系列专栏&#xff1a;Spring源码、JUC源码、Kafka原理、分布式技术原理&#x1f525;如果感觉博主的文章还不错的话&#xff…

全志XR806基于FreeRTOS下部署竞技机器人先进模糊控制器

前言 很荣幸参与到由“极术社区和全志在线联合组织”举办的XR806开发板试用活动。本人热衷于各种的开发板的开发&#xff0c;同时更愿意将其实现到具体项目中。秉承以上原则&#xff0c;发现大家的重心都放在开发中的环境构建过程&#xff0c;缺少了不少实际应用场景的运用&am…

【小布_ORACLE笔记】Part11-5 RMAN Backups

【小布_ORACLE笔记】Part11-5 RMAN Backups 文章目录 【小布_ORACLE笔记】Part11-5 RMAN Backups1. 增量备份&#xff08;Incremental Backups)1.1差异增量备份&#xff08;Differential Incremental Backup&#xff09;1.2累积增量备份&#xff08;Cumulative Incremental Bac…

记RocketMQ本地开发环境搭建始末

前言 最近工作中涉及到了RocketMQ的应用&#xff0c;为方便开发决定本地搭建一套RocketMQ的使用环境。 果然实践是个好东西... VMware虚拟环境搭建 这个网上有很多教程&#xff0c;只会比我写的详细有条理&#xff0c;这里就不在赘述了。 虚拟机搭建好之后每次重启电脑都无…

【投稿优惠、可EI检索】2024年机器人学习与自动化算法国际学术会议(IACRLAA 2024)

2024年机器人学习与自动化算法国际学术会议(IACRLAA 2024) 2024 International Academic Conference on Intelligent Control Systems and Robot Learning 一、【会议简介】 本届机器人学习与自动化算法国际学术会议(IACRLAA 2024)将于2024年1月23日在北京盛大开幕。这次会议将…

Vue3 Router跳转传参

最近遇到这个问题router跳转传参&#xff0c;真是要了老命了。 根据网上各位大神给出的方法&#xff0c;试了 import { useRouter } from vue-routerconst router useRouter()//1. 无法跳转 router.push(name:,params:{})//2. 可以跳转, 但需要在定义router同时定义占位符&a…

(五)基于高尔夫优化算法GOA求解无人机三维路径规划研究(MATLAB代码)

一、无人机模型简介&#xff1a; 单个无人机三维路径规划问题及其建模_IT猿手的博客-CSDN博客 参考文献&#xff1a; [1]胡观凯,钟建华,李永正,黎万洪.基于IPSO-GA算法的无人机三维路径规划[J].现代电子技术,2023,46(07):115-120 二、高尔夫优化算法GOA简介 高尔夫优化算法…

react-flip-move结合array-move实现前端列表置顶效果

你有没有遇到这样的需求&#xff1f;点击左侧列表项&#xff0c;则像聊天会话窗口一样将被点击的列表项置顶。 如果只是单纯的置顶的话&#xff0c;直接使用array-move就可以实现了&#xff0c;但置顶效果多少有点突兀~ 先上代码&#xff0c;直接使用array-move的情况&#xf…

用于缓存一些固定名称的小组件

项目中&#xff0c;用于缓存姓名、地名、单位名称等一些较固定名称的id-name小组件。用于减少一些表的关连操作和冗余字段。优化代码结构。扩展也方便&#xff0c;写不同的枚举就行了。 具体用法&#xff1a; {NameCacheUser.USER.getName(userId);NameCacheUser.ACCOUNT.getN…

文心一言 VS 讯飞星火 VS chatgpt (146)-- 算法导论12.2 1题

一、用go语言&#xff0c;假设一棵二叉搜索树中的结点在1到 1000 之间&#xff0c;现在想要查找数值为 363 的结点。下面序列中哪个不是查找过的序列? a.2&#xff0c;252&#xff0c;401&#xff0c;398&#xff0c;330&#xff0c;344&#xff0c;397&#xff0c;363。 b.9…

vtk中二次曲面的显示

官方示例地址&#xff1a; https://examples.vtk.org/site/Cxx/Visualization/DisplayQuadricSurfaces/ 显示效果&#xff1a; 源码&#xff1a; import vtk import vtkmodules.vtkInteractionStyle import vtkmodules.vtkRenderingOpenGL2 from vtkmodules.vtkCommonColor i…