51单片机LCD1602 定时器时钟 实现年月日时分秒显示

您所在的位置:网站首页 时间计时器怎么调时间显示的时间准确 51单片机LCD1602 定时器时钟 实现年月日时分秒显示

51单片机LCD1602 定时器时钟 实现年月日时分秒显示

2024-07-11 12:42:58| 来源: 网络整理| 查看: 265

实现功能:利用51单片机的定时器原理制作时钟,显示使用LCD1602,可以显示时分秒年月日和星期 ,识别平年闰年,按键可调整时间日期,整点报时。

1、定时器中断实现时钟基本原理   

   若系统晶振为12MHZ,定时器工作在mode1模式时,每次最多可计数至65536,花费时间约为65ms。若只计数至50000,需要时间50ms,实现1s的定时需要重复上述过程20次。如此就利用

定时器实现了一秒钟的产生。我们仅需对定时器赋初值TH0=(65536-50000)/256;TL0=(65536-50000)%256;代码段如下

TH0 = 0x4c; //高八位赋初值 晶振位11.0592,赋初值位0x4c00 TL0 = 0x00; //低八位赋初值 i++; if(i == 20){ i = 0; //满一秒清零 miao++; //i = 100 为一,秒标志位加 1 if(miao == 60){ miao = 0; //满一分清零 fen++; if(fen == 60){ fen = 0; //满一时清零 shi++; mybeeplongplus(); //整点报时 if(shi == 24){ shi = 0; //24小时制 fen = 0; miao = 0;

2、LCD1602基本原理介绍

关于lcd1602的介绍网上资源实在太多可以参考这位博主的文章LCD1602介绍。他讲解的挺详细的,其中有关于LCD1602自定义字符的介绍与使用,我在这里推荐一款字符取模软件zimo221,百度直接可以搜索下载。

 

3、C语言如何利用数组存储“变量”

c语言的数组时不能够直接储存变量的,但是却可以储存变量的地址,再利用指针来间接储存变量。此处引用c语言指针数组的使用介绍。

4、protues仿真图

此处未添加蜂鸣器,需要的可以直接接在P1^5口。

5、完整程序代码

main.c文件 

//设计思路 1、利用定时器中断0二十次产生1s时间变量miao增加到60变量分+1并把miao清零,shi同理 // 2、采用4个按键 长按key4进入设置模式后, key1选择调整对象 key2k3加减 // #include"LCD1602.h" #include void LCD_display(void); void keykan(void); int num[10]={0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39}; // lcd1602 0~9字码 uchar miao=0, fen=0, shi=0 , zhou=1 , yue=7 , nian=21 ; //进位标志位 秒 分 时 周 月 年 uchar ri=9; //进位标志位 日 不知道为啥放在上面会报错,单独定义就可以 uint i=0; //定时器计时标志位 uchar *time[]={&miao , &fen , &shi, &zhou ,&ri ,&yue , &nian}; //指针变量time存放进位标志位的地址,由于数组不能存放标量,但是却可以存放标量的地址,采用指针的方式来间接修改变量的值 // uchar SetPlace=0; //功能选择标志 bit mod =0; //设置模式标志位 sbit key1=P3^1; //定义四个按键 key1选择需要调整的位 sbit key2=P3^0; //key2加 sbit key3=P3^2; //key3减 sbit key4=P3^3; //长按两秒钟进入或退出设置模式,前面三个按键需要进入设置模式才能使用 void main(void) { T0_init(); //定时器初始化 LCD_init(); //lcd1602初始化 IT1=1; //外部中断1初始化 下降沿触发 EX1=1; //启用外部中断1 LCD_disp_char(2,5,0x00); //显示自定义字符“周” delay(50); while(1) //死循环 { keykan(); LCD_display(); //lcd1602显示时分秒年月日周 } } void keykan(void) { if (mod==0) //如果没有进入设置模式 调整提示区域显示字符串time { LCD_row(2); LCD_DispString("TIME"); delay(50); } LCD_disp_char(1,14,' '); //清空第一行第15位的显示内容 delay(50); if (mod==1) //如果进入设置模式显示一个1602字符库的一个特定字符 { LCD_disp_char(1,14,0xef); delay(50); if(key1==0) //检测按键key1是否按下 { delay(10); //消除抖动 if(key1==0) { //按一下功能选择位就+1,加到7就清零 SetPlace++; if(SetPlace>=7) SetPlace=0; } if (SetPlace==0) //功能选择位为0就显示“miao” 为1就显示“fen” 以此类推,shi zhou ri yue nian { LCD_row(2); LCD_DispString("miao"); delay(50); } if (SetPlace==1) { LCD_row(2); LCD_DispString(" fen"); delay(50); } if (SetPlace==2) { LCD_row(2); LCD_DispString(" shi"); delay(50); } if (SetPlace==3) { LCD_row(2); LCD_DispString("zhou"); delay(50); } if (SetPlace==4) { LCD_row(2); LCD_DispString(" ri"); delay(50); } if (SetPlace==5) { LCD_row(2); LCD_DispString(" yue"); delay(50); } if (SetPlace==6) { LCD_row(2); LCD_DispString("nian"); delay(50); } mybeep(); //蜂鸣器发声 while(key1==0) //检测按键是否松开 { delay(10); } } if(key2==0) //检测按键key2是否按下 { delay(10); //消除抖动 if(key2==0) { (*time[SetPlace])++; //按键按一次 指针数组*time[SetPlace]里对应的地址的数据值就+1,也就是说进位标志位年月日时分秒的值就会+1 if ((((*time[SetPlace]))>=60) && (SetPlace==0)) { (*time[SetPlace])=0; //秒只能加dao59 } if ((((*time[SetPlace]))>=60) && (SetPlace==1)) { (*time[SetPlace])=0; //分只能加到59 } if ((((*time[SetPlace]))>=24) && (SetPlace==2)) { (*time[SetPlace])=0; //时只能加到23 } if ((((*time[SetPlace]))>=8) && (SetPlace==3)) //周只能加到7 { (*time[SetPlace])=1; } if ((((*time[SetPlace]))>=29) && (SetPlace==4) && (yue==2) && ((nian%4)!=0)) { //平年的2月只能加到28 (*time[SetPlace])=1; } if ((((*time[SetPlace]))>=30) && (SetPlace==4) && (yue==2) && ((nian%4)==0)) //闰年的2月29天 { (*time[SetPlace])=1; } if ((((*time[SetPlace]))>=31) && (SetPlace==4) && ((yue==4)||(yue==6)||(yue==9)||(yue==11))) //4 6 9 11 月只有30天 { (*time[SetPlace])=1; } if ((((*time[SetPlace]))>=32) && (SetPlace==4) && ((yue==1)||(yue==3)||(yue==5)||(yue==7)||(yue==8)||(yue==10)||(yue==12))) { (*time[SetPlace])=1; //1 3 5 7 8 10 12月有31天 } if ((((*time[SetPlace]))>=13) && (SetPlace==5)) //月份只能加到12 { (*time[SetPlace])=1; } mybeep(); //蜂鸣器响 while(key2==0) //检测按键是否松开 { delay(10); } } } if(key3==0) //检测按键key3是否按下 { //key3与key2按钮基本原理相同,key3表示对应值减1 delay(10); //消除抖动 if(key3==0) { if ((((*time[SetPlace]))


【本文地址】

公司简介

联系我们

今日新闻


点击排行

实验室常用的仪器、试剂和
说到实验室常用到的东西,主要就分为仪器、试剂和耗
不用再找了,全球10大实验
01、赛默飞世尔科技(热电)Thermo Fisher Scientif
三代水柜的量产巅峰T-72坦
作者:寞寒最近,西边闹腾挺大,本来小寞以为忙完这
通风柜跟实验室通风系统有
说到通风柜跟实验室通风,不少人都纠结二者到底是不
集消毒杀菌、烘干收纳为一
厨房是家里细菌较多的地方,潮湿的环境、没有完全密
实验室设备之全钢实验台如
全钢实验台是实验室家具中较为重要的家具之一,很多

推荐新闻


图片新闻

实验室药品柜的特性有哪些
实验室药品柜是实验室家具的重要组成部分之一,主要
小学科学实验中有哪些教学
计算机 计算器 一般 打孔器 打气筒 仪器车 显微镜
实验室各种仪器原理动图讲
1.紫外分光光谱UV分析原理:吸收紫外光能量,引起分
高中化学常见仪器及实验装
1、可加热仪器:2、计量仪器:(1)仪器A的名称:量
微生物操作主要设备和器具
今天盘点一下微生物操作主要设备和器具,别嫌我啰嗦
浅谈通风柜使用基本常识
 众所周知,通风柜功能中最主要的就是排气功能。在

专题文章

    CopyRight 2018-2019 实验室设备网 版权所有 win10的实时保护怎么永久关闭