在51开发板上面实现,晶振为:11.0592Mhz

电路如下:

LCD1602

蜂鸣器部分:

显示时间界面:

更改时间页面:

设置触发闹钟时间页面:

设置闹钟响铃时长页面:(O泡时间长度  为3秒)

k1按键

按下第1次,可以对小时进行校准
按下第2次,可以对分钟进行校准
按下第3次,可以对秒数进行校准
按下第4次,时间开始走动

k2按键

k3按键

k4按键

按下第一次,可以设置触发闹铃的小时
按下第二次,可以更改触发闹铃的分钟
按下第三次,可以设置闹铃的响铃时长,单位为秒
按下第四次,返回显示时间页面

实现代码:

#include <REGX52.H>
typedef unsigned char uchar;
sbit LCD_RS=P2^6;
sbit LCD_RW=P2^5;
sbit LCD_E=P2^7;
char hour=23,minute=59,second=58;//时钟变量
char S=3,M=0,H=0;//闹钟初值,S代表闹钟要打铃 的秒数(时长)
uchar mode=0,T0_flag=0;void Delay(unsigned int xms)
{//延时函数uchar i, j;while(xms--){i = 2;j = 239;do{while (--j);} while (--i);}
}
void LCD_WriteCmd(uchar Command)
{//写命令函数LCD_RS=0;LCD_RW=0;P0=Command;LCD_E=1;Delay(1);LCD_E=0;Delay(1);
}
void LCD_WriteData(uchar Data)
{//写数据函数LCD_RS=1;LCD_RW=0;P0=Data;LCD_E=1;Delay(1);LCD_E=0;Delay(1);
}void LCD_Init(void)
{//初始化lcd1602LCD_WriteCmd(0x38);LCD_WriteCmd(0x0C);LCD_WriteCmd(0x06);LCD_WriteCmd(0x01);
}
void LCD_SetCursor(uchar Line,uchar Column)
{//选择显示的行和列,参数1:行,参数2:列LCD_WriteCmd(Column-1|(Line==1?0x80:0xC0));
}void LCD_ShowString(uchar Line,uchar Column,char *String)
{//选择要显示的字字符串,参数1:行,参数2:列参数3:字符串unsigned char i;LCD_SetCursor(Line,Column);for(i=0;String[i]!='\0';i++)LCD_WriteData(String[i]);
}
void LCD_ShowTime(char h,char m,char s)
{ //在LCD1602上面 显示时间界面LCD_SetCursor(2,5);   LCD_WriteData(h/10+0x30);LCD_WriteData(h%10+0x30);LCD_WriteData(':');LCD_WriteData(m/10+0x30);LCD_WriteData(m%10+0x30);LCD_WriteData(':');LCD_WriteData(s/10+0x30);LCD_WriteData(s%10+0x30);
}void LCD_ShowSetSlarm()
{//显示 设置闹铃时间界面    LCD_ShowString(2,1,"hour:");                 LCD_WriteData(H/10+0x30);LCD_WriteData(H%10+0x30);LCD_ShowString(2,10,"min:");        LCD_WriteData(M/10+0x30);LCD_WriteData(M%10+0x30);
}
void LCD_ShowSetDuration()
{//显示 设置闹铃时长界面LCD_ShowString(2,1,"duration:");LCD_WriteData(S/10+0x30);LCD_WriteData(S%10+0x30); LCD_ShowString(2,12,"s");
}
void key_scan()
{//按键扫描,进行模式和档位的更改 static uchar flag=0;if(P3_1==0){   //档位选择Delay(20);while(P3_1==0);Delay(20);TR0=0;//关闭T0中断请求flag++;if(flag==4){flag=0;LCD_WriteCmd(0x01);//清屏TR0=1;}}if(P3_3==0){//模式切换按键Delay(20);while(P3_3==0);Delay(20);LCD_WriteCmd(0x01);mode++; if(mode==4)//模式切换成时钟模式 mode=0;       }if(mode==0){    //时钟模式  if(flag!=0){LCD_ShowString(1,2,"Change Time");switch(flag){case 1:if(P3_0==0){ Delay(20);while(P3_0==0);Delay(20);hour++; if(hour>23) hour=0;}break;case 2:if(P3_0==0){ Delay(20);while(P3_0==0);Delay(20);minute++; if(minute>59) minute=0;}break;case 3:if(P3_0==0){ Delay(20);while(P3_0==0);Delay(20);second++; if(second>59) second=0;}break;default:break;}switch(flag){case 1:if(P3_2==0){ Delay(20);while(P3_2==0);Delay(20);hour--; if(hour<0) hour=23;}break;case 2:if(P3_2==0){ Delay(20);while(P3_2==0);Delay(20);minute--; if(minute<0) minute=59;}break;case 3:if(P3_2==0){ Delay (20);while(P3_2==0);Delay(20);second--; if(second<0) second=59;}break;default:break;}}else{LCD_ShowString(1,7,"Time");}}else if(mode==1){//闹钟时 设置LCD_ShowString(1,4,"Set alarm");if(P3_0==0){ Delay(20);while(P3_0==0);Delay(20);H++;if(H>23) H=0;}if(P3_2==0){ Delay(20);while(P3_2==0);Delay(20);H--;if(H<0) H=23;}        }else if(mode==2){//闹钟分 设置LCD_ShowString(1,4,"Set alarm");if(P3_0==0){ Delay(20);while(P3_0==0);Delay(20);M++;if(M>59) M=0;}if(P3_2==0){ Delay(20);while(P3_2==0);Delay(20);M--;if(M<0)  M=59;}        }else if(mode==3){//设置响铃时长,单位为秒LCD_ShowString(1,4,"O pao Time");       //O泡时间到if(P3_0==0){ Delay(20);while(P3_0==0);Delay(20);S++;if(S>59) S=0;}if(P3_2==0){ Delay(20);while(P3_2==0);Delay(20);S--;if(S<0)  S=59;}        }
}
void Timer0Init()
{//定时器0初始化函数,定时:50毫秒  晶振为:11.0592MHzTMOD &= 0xF0;     //设置定时器模式TMOD |= 0x01;     //设置定时器模式TL0 = 0x00;           //设置定时初值TH0 = 0x4C;            //设置定时初值TF0 = 0;           //清除TF0标志TR0 = 1;          //定时器0开始计时ET0=1;              //打开定时器T0中断小开关EA=1;               //打开总开关
}void main()
{Timer0Init();   LCD_Init();                        while(1){key_scan();if(hour==H&&minute==M&&second<S)P1_5=~P1_5;           switch(mode){case 0:LCD_ShowTime(hour,minute,second);break; case 1:case 2:LCD_ShowSetSlarm();break;case 3: LCD_ShowSetDuration();                 }  }
}void interrupt_T0()interrupt 1
{//定时器0中断函数TL0 = 0x00;         //重新设置定时初值TH0 = 0x4C;          //重新设置定时初值T0_flag++;if(T0_flag==20){T0_flag=0;     second++;if(second==60){second=0;minute++;if(minute==60){minute=0;hour++;if(hour==24)hour=0;               }}}
}

【51单片机】在LCD1602上显示时间:包含按键进行校准时间+闹钟功能:按键设置闹钟响铃时间,以及响铃的时间长度相关推荐

  1. 51单片机 DHT11+LCD1602温湿度显示 + Proteus仿真

    51单片机 DHT11+LCD1602温湿度显示+ Proteus仿真 主程序代码 #include <reg52.h> #include <LCD1602.h> #inclu ...

  2. 51单片机用c语言在液晶1602上显示汉字,lcd1602与单片机连接图,基于51单片机的lcd1602液晶显示屏连接电路图...

    描述 LCD1602是一种工业字符型液晶,能够同时显示16x02即32个字符.LCD1602液晶显示原理 LCD1602液晶显示的原理是利用液晶的物理特性,通过电压对其显示区域进行控制,有电就有显示, ...

  3. 基于51单片机的LCD1602显示温湿度

    51单片机基础难点知识理解后,直接通过下面3个小项目可以更好理解51单片机.中断 定时器 串口甚至是基础的IO输入输出都有结合,再加上一些外设模块的学习(如1602显示屏,L298N电机驱动等) 项目 ...

  4. 【Proteus仿真】51单片机+DS1302+lcd1602显示

    [Proteus仿真]51单片机+DS1302+lcd1602显示 Proteus仿真 工程架构 项目工程 文件结构 主程序代码 #include <reg52.h> #include & ...

  5. 51单片机控制LCD1602模块

    51单片机控制LCD1602模块 视频播放:LCD1602视频 (1)LCD1602概述 先来看看LCD1602什么意思?Liquid Crystal Display(LCD)表示液晶显示,1602 ...

  6. 51单片机驱动——LCD1602

    51单片机驱动--LCD1602 1.描述 51单片机控制LCD1602屏幕显示测量数据.固定字符串等,大家复制过去可以直接使用,相关注释我已标明. 2.子文件 LCD1602.c #include ...

  7. 51单片机开发实例 基于51单片机的矩阵键盘+显示

    一.系统设计 通过在矩阵键盘内输入数字并在LCD1602上进行显示,可以输入的数字有16个,分别是0-15.按下矩阵键盘就会上LCD1602上显示对应的数字,整个系统使用STC89C52单片机进行主控 ...

  8. 基于51单片机的lcd1602万年历设计_温度+闹钟心得

    基于51单片机的lcd1602万年历设计_温度+闹钟心得 下载地址 https://download.csdn.net/download/weixin_44017446/10908985 当看到这个学 ...

  9. 基于51单片机的LCD1602电子钟闹钟proteus仿真设计

    本设计是基于51单片机的LCD1602电子钟闹钟proteus仿真设计 源码+仿真+原理图+器件清单 仿真软件版本:proteus 7.8 程序编译器:keil 4/keil 5 编程语言:C语言 编 ...

  10. 安卓app+esp8266+51单片机+光敏电阻+lcd1602实现智能照明系统

    本文是本人51单片机和物联网的期末课程设计,没学过打板焊接,只用面包板和公母线实现. 安卓和esp8266控灯主要参考Android Studio设计APP实现与51单片机通过WIFI模块(ESP82 ...

最新文章

  1. 10道海量数据处理的面试题
  2. 线程阻塞的概念 (Java 中的睡眠状态sleep 等待状态wait 礼让状态yield 自闭状态join suspend() 和 resume() )
  3. CentOS中输入yum报错:sudo: unable to execute /bin/yum: No such file or directory
  4. 常用c语言小程序,c语言经典小程序汇总大全
  5. vue2实践揭秘pdf_《Vue2实践揭秘》源码
  6. 获取页面所有属性并生成html6,JavaScript基础练习题(三)
  7. mysql_unbuffered_query的_用mysql_unbuffered_query函数取大数据
  8. mysql4函数_MySQL-4.常见函数
  9. flex 实现图片播放 方案二 把临时3张图片预加载放入内存
  10. 基于linux嵌入式课程设计报告,嵌入式linux课程设计报告.doc
  11. instsrv+srvany 程序以服务方式自启 bat脚本快速配置
  12. HealthKit框架简介
  13. jvm执行java大致采用过程_java练习题
  14. Chrome 出现内存 不足
  15. 如何解决 RecursionError: maximum recursion depth exceeded
  16. Steaming SQL for Apache Kafka 学习
  17. python递归函数例题_递归案例python
  18. Commands that may modify the data set are disabled, because this instance is configured to report er
  19. 数据结构(C语言)Learning Way
  20. 18650锂电池和常规锂电池有什么区别

热门文章

  1. 微信扫描二维码实现自动跳转
  2. XILINX 7系列GTP通信之HDMI视频传输
  3. Android10.0(Q) 实现通话中播放音乐/通话背景音(答录机/魔音功能)
  4. oracle计算连续登陆/上班天数
  5. Cairngorm框架
  6. wordexp函数学习
  7. 利用TCPDF将html页面转换为PDF格式
  8. 设备联网及PLC数据采集管理解决方案
  9. Android实现换发型功能,换发型照相机下载安装-换发型照相机appv4.5 安卓版-腾牛安卓网...
  10. IoT黑板报0118:特斯拉汽车立功了!重大车祸司机大难不死