基于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就又回到最高位24temp_shi--;}else {                         //调分钟状态if(temp_fen==0)temp_fen=60;          //如果减分钟减到最低到0就又回到最高位60temp_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 ();       //初始化lcdmode_flag=0;//运行display_mode();   //调用显示模式函数TMOD=0x01;     //初始化定时器EA=1;           //打开总中断TH0=(65536-50000)/256;         //赋初值TL0=(65536-50000)%256;ET0=1;                        //打开定时器T0中断标志位TR0=1;                            //启动T0while(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的链接。
谢谢大家的阅读、希望大家支持。下载链接

基于51单片机的1602LCD时钟、可以设置闹钟(带仿真)相关推荐

  1. c51单片机时钟c语言程序设计,基于51单片机的电子时钟设计..doc

    -- I -- - - I -- 设计题目: 基于 51 单片机的电子时钟设计 摘要 单片机,是集 CPU ,RAM ,ROM ,定时器,计数器和多种接口于一体的微控制器.自 20 世纪 70 年代问 ...

  2. 基于51单片机的数字时钟(万年历)

    具体实现功能 系统由STC89C52单片机+DS1302时钟芯片+按键模块+LCD1602显示+电源构成. 具体功能: 1.可以显示年.月.日.时.分.秒.星期.农历: 2.按键可以设置闹钟及报警: ...

  3. 基于51单片机的电子时钟设计

    基于51单片机的电子时钟设计 0 功能介绍 1.从DS1302中读取时间显示 2.一共4个按键,按键1按下进入修改时间模式,再按下切换修改的时间变量,这个时候第2和3个按键就是修改时间变量的按键,修改 ...

  4. 基于51单片机、DS1302时钟模块的电子闹钟设计

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 一.设计原理 1.DS1302介绍 2.闹钟音乐播放原理 二.程序设计 1.DS1302.h 2.ds1302.c 3.mu ...

  5. 基于微型计算机系统的实时时钟设计,基于51单片机的实时时钟设计报告.doc

    基于51单片机的实时时钟设计报告 PAGE PAGE 24 课程设计(论文)任务书 信息工程 学 院 信息工程 专 业 (2) 班 一.课程设计(论文)题目 嵌入式课程设计 二.课程设计(论文)工作自 ...

  6. 基于51单片机LCD1602电子时钟实物制作

    之前写了51单片机的LCD1602的程序,现在画了电路图,焊接了电路板,做出了基于51单片机LCD1602电子时钟的实物. 注意事项: 焊接过程中,注意提前布局电路. 对应好端口(避免接线错误),我由 ...

  7. 基于51单片机的自动浇花系统设计/基于51单片机的智能抽奖系统控制设计/基于51单片机的数字时钟与日历显示控制设计 毕业设计

    1147基于51单片机的自动浇花系统设计 设计思路:通湿度传感器实时监测湿度,通过LCD显示出实时的湿度采集值,可以通过按键设定目标界限,当达到这个界限值时,浇花系统的电机装置运行. 电路包含:LCD ...

  8. 【036】基于51单片机的电子时钟与秒表Proteus仿真设计

    一.压缩包资料内容 (1).基于51单片机的电子时钟与秒表proteus仿真设计一份: (2).基于51单片机的电子时钟与秒表proteus仿真设计keli源代码一份: (3).基于51单片机的电子时 ...

  9. 51单片机8255扩展c语言,参阅:基于51单片机的实时时钟的设计与开发8255扩展io口1V0.1...

    <基于51单片机的实时时钟的设计与开发(8255扩展io口) (1).doc>由会员分享,可免费在线阅读全文,更多与<基于51单片机的实时时钟的设计与开发(8255扩展io口) (1 ...

最新文章

  1. linux 内核申请内存大小,linux内核常用的内存申请函数
  2. jwt token 附加用户信息_SpringBoot+JWT实现token验证并将用户信息存储到@注解内
  3. lollipods耳机蓝牙连接方法
  4. 数组分成两组差值最小 python_数组中的数分为两组,让给出一个算法,使得两个组的和的差的绝对值最小,数组中的数的取值范围是0x100,元素个数也是大于0, 小于100 。...
  5. 【Android】SlidingMenu属性详解(转)
  6. IOS 文件读取4种方法 转字符串 和data
  7. 软件工程——快速掌握面向对象开发方法
  8. Ubuntu安装指定版本clang-format
  9. (转)ATOM介绍和使用
  10. 【Leetcode】143. Reorder List
  11. ASP.NET对HTML元素进行权限控制(二)
  12. Python:matplotlib绘制条形图
  13. LINUX下载编译libssh2
  14. 信赖铃音的PS2游戏目录2017.6
  15. 操作系统-3.假设某多道程序设计系统中有供用户使用的内存100KB,打印机1台。系统采用可变分区方式管理内存:对打印机采用静态分配,并假设输入输出操作的时间忽略不计;采用最短剩余时间优先的进程调度算法
  16. 【HAVENT原创】Spring Boot + Spring-Kafka 异步配置
  17. 【算法刷题】排序:CodeForces 984A,CodeForces 1132B,CodeForces 1015C
  18. 【转载】关于小程序的100个常见问题(基础知识扫盲)
  19. 黄教头第六周作业 一个基础的反射型xss
  20. DataGrip连接Mysql报08S01解决方案

热门文章

  1. 51 rtos系统 : MCUsystem 介绍 -- 基于消息队列
  2. 黄金价格走势之二:舍子线的运用
  3. 阿里linux运维笔试,2020阿里巴巴笔试真题(含答案)
  4. CSS——CSS 背景应用
  5. 练习2-12 输出华氏-摄氏温度转换表(15 分)
  6. 不同系列的 ESP 芯片的 GPIO 默认初始状态
  7. OpenGL的Context(Profile)
  8. 3367. 咸鱼翻身
  9. StrutsPrepareAndExecuteFilter与FilterDispatcher的区别
  10. matlab 等高线数值显示_「matlab等高线」matlab中contour 函数的用法(绘制等高线) - seo实验室...