【51单片机】在LCD1602上显示时间:包含按键进行校准时间+闹钟功能:按键设置闹钟响铃时间,以及响铃的时间长度
在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上显示时间:包含按键进行校准时间+闹钟功能:按键设置闹钟响铃时间,以及响铃的时间长度相关推荐
- 51单片机 DHT11+LCD1602温湿度显示 + Proteus仿真
51单片机 DHT11+LCD1602温湿度显示+ Proteus仿真 主程序代码 #include <reg52.h> #include <LCD1602.h> #inclu ...
- 51单片机用c语言在液晶1602上显示汉字,lcd1602与单片机连接图,基于51单片机的lcd1602液晶显示屏连接电路图...
描述 LCD1602是一种工业字符型液晶,能够同时显示16x02即32个字符.LCD1602液晶显示原理 LCD1602液晶显示的原理是利用液晶的物理特性,通过电压对其显示区域进行控制,有电就有显示, ...
- 基于51单片机的LCD1602显示温湿度
51单片机基础难点知识理解后,直接通过下面3个小项目可以更好理解51单片机.中断 定时器 串口甚至是基础的IO输入输出都有结合,再加上一些外设模块的学习(如1602显示屏,L298N电机驱动等) 项目 ...
- 【Proteus仿真】51单片机+DS1302+lcd1602显示
[Proteus仿真]51单片机+DS1302+lcd1602显示 Proteus仿真 工程架构 项目工程 文件结构 主程序代码 #include <reg52.h> #include & ...
- 51单片机控制LCD1602模块
51单片机控制LCD1602模块 视频播放:LCD1602视频 (1)LCD1602概述 先来看看LCD1602什么意思?Liquid Crystal Display(LCD)表示液晶显示,1602 ...
- 51单片机驱动——LCD1602
51单片机驱动--LCD1602 1.描述 51单片机控制LCD1602屏幕显示测量数据.固定字符串等,大家复制过去可以直接使用,相关注释我已标明. 2.子文件 LCD1602.c #include ...
- 51单片机开发实例 基于51单片机的矩阵键盘+显示
一.系统设计 通过在矩阵键盘内输入数字并在LCD1602上进行显示,可以输入的数字有16个,分别是0-15.按下矩阵键盘就会上LCD1602上显示对应的数字,整个系统使用STC89C52单片机进行主控 ...
- 基于51单片机的lcd1602万年历设计_温度+闹钟心得
基于51单片机的lcd1602万年历设计_温度+闹钟心得 下载地址 https://download.csdn.net/download/weixin_44017446/10908985 当看到这个学 ...
- 基于51单片机的LCD1602电子钟闹钟proteus仿真设计
本设计是基于51单片机的LCD1602电子钟闹钟proteus仿真设计 源码+仿真+原理图+器件清单 仿真软件版本:proteus 7.8 程序编译器:keil 4/keil 5 编程语言:C语言 编 ...
- 安卓app+esp8266+51单片机+光敏电阻+lcd1602实现智能照明系统
本文是本人51单片机和物联网的期末课程设计,没学过打板焊接,只用面包板和公母线实现. 安卓和esp8266控灯主要参考Android Studio设计APP实现与51单片机通过WIFI模块(ESP82 ...
最新文章
- 10道海量数据处理的面试题
- 线程阻塞的概念 (Java 中的睡眠状态sleep 等待状态wait 礼让状态yield 自闭状态join suspend() 和 resume() )
- CentOS中输入yum报错:sudo: unable to execute /bin/yum: No such file or directory
- 常用c语言小程序,c语言经典小程序汇总大全
- vue2实践揭秘pdf_《Vue2实践揭秘》源码
- 获取页面所有属性并生成html6,JavaScript基础练习题(三)
- mysql_unbuffered_query的_用mysql_unbuffered_query函数取大数据
- mysql4函数_MySQL-4.常见函数
- flex 实现图片播放 方案二 把临时3张图片预加载放入内存
- 基于linux嵌入式课程设计报告,嵌入式linux课程设计报告.doc
- instsrv+srvany 程序以服务方式自启 bat脚本快速配置
- HealthKit框架简介
- jvm执行java大致采用过程_java练习题
- Chrome 出现内存 不足
- 如何解决 RecursionError: maximum recursion depth exceeded
- Steaming SQL for Apache Kafka 学习
- python递归函数例题_递归案例python
- Commands that may modify the data set are disabled, because this instance is configured to report er
- 数据结构(C语言)Learning Way
- 18650锂电池和常规锂电池有什么区别
热门文章
- 微信扫描二维码实现自动跳转
- XILINX 7系列GTP通信之HDMI视频传输
- Android10.0(Q) 实现通话中播放音乐/通话背景音(答录机/魔音功能)
- oracle计算连续登陆/上班天数
- Cairngorm框架
- wordexp函数学习
- 利用TCPDF将html页面转换为PDF格式
- 设备联网及PLC数据采集管理解决方案
- Android实现换发型功能,换发型照相机下载安装-换发型照相机appv4.5 安卓版-腾牛安卓网...
- IoT黑板报0118:特斯拉汽车立功了!重大车祸司机大难不死