基于51单片机的电子钟万年历LCD1602显示
本设计是51单片机的电子钟万年历LCD1602显示(proteus仿真+程序+报告+器件清单)
仿真图proteus 7.8
程序编译器:keil 4/keil 5
编程语言:C语言
编号C0002
资料文件下载链接:
//https://docs.qq.com/doc/DS1NveWlLc0VXbGlI
主要功能:
1、采用LCD1602液晶屏显示,DS1302记录日历和时间。
2、按键设置日期、时间、闹钟。
3、当实际的时间达到设定的闹钟时,蜂鸣器报警。
仿真图(提供源文件):
程序(提供源文件源码):
#include <reg52.h> //调用单片机头文件
#define uchar unsigned char //无符号字符型 宏定义 变量范围0~255
#define uint unsigned int //无符号整型 宏定义 变量范围0~65535
bit flag_200ms ;
bit flag_100ms ;
sbit beep = P3^7; //蜂鸣器定义
bit flag_beep_en;
uint clock_value; //用作闹钟用的
uchar menu_1,menu_2;
uchar key_time,flag_value;
bit key_500ms ;
#include "ds1302.h"
#include "lcd1602.h"
/******************1ms 延时函数*******************/
void delay_1ms(uint q)
{uint i,j;for(i=0;i<q;i++)for(j=0;j<120;j++);
}
/******************写星期函数*******************/
void write_week(uchar hang,uchar add,uchar week)//写星期函数
{if(hang==1) write_com(0x80+add);elsewrite_com(0x80+0x40+add); switch(week){case 1:write_data('S');//星期数为7时,显示write_data('U');write_data('N');break;case 2:write_data('M');//星期数据为1时显示write_data('O');write_data('N');break;case 3:write_data('T');//星期数据为2时显示write_data('U');write_data('E');break;case 4:write_data('W');//星期数据为3是显示write_data('E');write_data('D');break;case 5:write_data('T');//星期数据为4时显示write_data('H');write_data('U');break;case 6:write_data('F');//星期数据为5时显示write_data('R');write_data('I');break;case 7:write_data('S');//星期数据为6时显示write_data('T');write_data('A');break;}
}/*************时钟显示***************/
void init_1602_ds1302()
{write_sfm2_ds1302(1,1,shi); //显示时write_sfm2_ds1302(1,4,fen); //显示分write_sfm2_ds1302(1,7,miao); //显示秒write_week(2,12,week);write_sfm2_ds1302(2,2,nian); //显示年write_sfm2_ds1302(2,5,yue); //显示月 write_sfm2_ds1302(2,8,ri); //显示日
}
/*************定时器0初始化程序***************/
void init_time0()
{EA = 1; //开总中断TMOD = 0X01; //定时器0、工作方式1TH0 = 0X3C;TL0 = 0XB0; //50msET0 = 1; //开定时器0中断 TR0 = 1; //允许定时器0定时
}
/*************闹钟报警函数***************/
void menu_dis()
{static uchar mm,value;if(flag_100ms == 1) //100ms执行一次{flag_100ms = 0;if(open1 == 1) //如果闹钟打开{if((miao == 0) && (fen == fen1) && (shi == shi1)) { flag_beep_en = 1; //有报警 打开蜂鸣器响的标志位 } if(flag_beep_en == 1) //闹钟以被打开{clock_value++;if(clock_value <= 30) beep = ~beep; //蜂鸣器叫3秒else if(clock_value > 30){beep = 1; //蜂鸣器停1秒if(clock_value > 40){clock_value = 0;}}// 1 分钟后自动关闭闹钟value ++;if(value >= 10){value = 0;mm++;if(mm >= 60){mm = 0;flag_beep_en = 0;beep = 1; }} }} }
}/********************独立按键程序*****************/
uchar key_can; //按键值void key() //独立按键程序
{static uchar key_new;key_can = 20; //按键值还原P3 |= 0x78; //对应的按键IO口输出为1if((P3 & 0x78) != 0x78) //按键按下{delay_1ms(1); //按键消抖动if(((P3 & 0x78) != 0x78) && (key_new == 1)){ //确认是按键按下key_new = 0;switch(P3 & 0x78){case 0x70: key_can = 4; break; //得到按键值case 0x68: key_can = 3; break; //得到按键值case 0x58: key_can = 2; break; //得到按键值case 0x38: key_can = 1; break; //得到按键值}} }else key_new = 1;
}/**********************设置函数************************/
void key_with()
{if(key_can == 1) //设置键{menu_1++;if(menu_1 == 1) //设置时间{menu_2 = 1;write_string(1,0," : : W: "); write_string(2,0," 20 - - "); }if(menu_1 == 2) //设置闹钟{menu_2 = 1;write_string(1,0," set clock "); write_string(2,0," Y 00:00 "); }if(menu_1 > 2) //回到正常显示{menu_1 = 0;write_guanbiao(1,2,0); //关闭光标init_1602_dis_csf(); //初始化液晶显示 }}if(key_can == 2) //选择键{flag_200ms = 1;if(menu_1 == 1) //设置时间{menu_2 ++;if(menu_2 > 7)menu_2 = 1;}if(menu_1 == 2) //设置闹钟{menu_2 ++;if(menu_2 > 3)menu_2 = 1; }}if(menu_1 == 1){if(menu_2 == 1) //设置时{if(key_can == 3) //加{shi+=0x01;if((shi & 0x0f) >= 0x0a)shi = (shi & 0xf0) + 0x10;if(shi >= 0x24)shi = 0;} if(key_can == 4) //减{if(shi == 0x00)shi = 0x24;if((shi & 0x0f) == 0x00)shi = (shi | 0x0a) - 0x10;shi -- ; } }if(menu_2 == 2) //设置分{if(key_can == 3) //加{fen+=0x01;if((fen & 0x0f) >= 0x0a)fen = (fen & 0xf0) + 0x10;if(fen >= 0x60)fen = 0;} if(key_can == 4) //减 {if(fen == 0x00)fen = 0x5a;if((fen & 0x0f) == 0x00)fen = (fen | 0x0a) - 0x10;fen -- ;} }if(menu_2 == 3) //设置秒{if(key_can == 3) //加{miao+=0x01;if((miao & 0x0f) >= 0x0a)miao = (miao & 0xf0) + 0x10;if(miao >= 0x60)miao = 0;} if(key_can == 4) //减 {if(miao == 0x00)miao = 0x5a;if((miao & 0x0f) == 0x00)miao = (miao | 0x0a) - 0x10;miao -- ; }}if(menu_2 == 4) //设置星期{if(key_can == 3) //加{week+=0x01;if((week & 0x0f) >= 0x0a)week = (week & 0xf0) + 0x10;if(week >= 0x08)week = 1;} if(key_can == 4) //减 {if(week == 0x01)week = 0x08;if((week & 0x0f) == 0x00)week = (week | 0x0a) - 0x10;week -- ;} }if(menu_2 == 5) //设置年{if(key_can == 3) //加{nian+=0x01;if((nian & 0x0f) >= 0x0a)nian = (nian & 0xf0) + 0x10;if(nian >= 0x9a)nian = 1;} if(key_can == 4) //减 {if(nian == 0x01)nian = 0x9a;if((nian & 0x0f) == 0x00)nian = (nian | 0x0a) - 0x10;nian -- ; } }if(menu_2 == 6) //设置月{if(key_can == 3) //加{yue+=0x01;if((yue & 0x0f) >= 0x0a)yue = (yue & 0xf0) + 0x10;if(yue >= 0x13)yue = 1;} if(key_can == 4) //减 {if(yue == 0x01)yue = 0x13;if((yue & 0x0f) == 0x00)yue = (yue | 0x0a) - 0x10;yue -- ; } }if(menu_2 == 7) //设置日{if(key_can == 3) //加{ri+=0x01;if((ri & 0x0f) >= 0x0a)ri = (ri & 0xf0) + 0x10;if(ri >= 0x32)ri = 0; } if(key_can == 4) //减 {if(ri == 0x01)ri = 0x32;if((ri & 0x0f) == 0x00)ri = (ri | 0x0a) - 0x10;ri -- ; } }write_sfm2_ds1302(1,2,shi); //显示时write_sfm2_ds1302(1,5,fen); //显示分write_sfm2_ds1302(1,8,miao); //显示秒write_sfm1(1,14,week); //显示星期 write_sfm2_ds1302(2,3,nian); //显示年write_sfm2_ds1302(2,6,yue); //显示月write_sfm2_ds1302(2,9,ri); //显示日switch(menu_2) // 光标显示{case 1: write_guanbiao(1,2,1); break;case 2: write_guanbiao(1,5,1); break;case 3: write_guanbiao(1,8,1); break;case 4: write_guanbiao(1,14,1); break;case 5: write_guanbiao(2,3,1); break;case 6: write_guanbiao(2,6,1); break;case 7: write_guanbiao(2,9,1); break;}write_time(); //把时间写进去}
/***************设置闹钟*********************/if(menu_1 == 2){if(menu_2 == 1) //设置闹钟开关{if(key_can == 3) {open1 = 1; //闹钟开} if(key_can == 4) {open1 = 0; //闹钟关} }if(menu_2 == 2) //设置闹钟时{if(key_can == 3) //加{shi1+=0x01;if((shi1 & 0x0f) >= 0x0a)shi1 = (shi1 & 0xf0) + 0x10;if(shi1 >= 0x24)shi1 = 0;} if(key_can == 4) //减 {if(shi1 == 0x00)shi1 = 0x5a;if((shi1 & 0x0f) == 0x00)shi1 = (shi1 | 0x0a) - 0x10;shi1 -- ;} }if(menu_2 == 3) //设置秒{if(key_can == 3) //加{fen1+=0x01;if((fen1 & 0x0f) >= 0x0a)fen1 = (fen1 & 0xf0) + 0x10;if(fen1 >= 0x60)fen1 = 0;} if(key_can == 4) //减 {if(fen1 == 0x00)fen1 = 0x5a;if((fen1 & 0x0f) == 0x00)fen1 = (fen1 | 0x0a) - 0x10;fen1 -- ; }}if(open1 == 1)write_string(2,4,"Y"); else write_string(2,4,"N"); write_sfm2_ds1302(2,7,shi1); //显示闹钟时write_sfm2_ds1302(2,10,fen1); //显示闹钟分switch(menu_2) // 光标显示{case 1: write_guanbiao(2,4,1); break;case 2: write_guanbiao(2,7,1); break;case 3: write_guanbiao(2,10,1); break;} }
}/*****************主函数********************/
void main()
{ beep = 0; //开机叫一声 delay_1ms(150);P0 = P1 = P2 = P3 = 0xff; //单片机IO口初始化为1init_time0(); //初始化定时器//init_ds1302(); //ds1302初始化init_1602(); //lcd1602初始化init_1602_dis_csf(); //lcd1602初始化显示while(1){key(); //按键程序if(key_can < 10){if(flag_beep_en == 0) //只有闹钟关了的时候才能进入设置key_with(); else {flag_beep_en = 0; //按下任意键可关闭闹钟beep = 1;clock_value = 0;read_time();}}if(flag_200ms == 1){ flag_200ms = 0;if(menu_1 == 0){read_time(); //读时间init_1602_ds1302(); //显示时钟}}menu_dis(); //闹钟报警函数delay_1ms(1);}
}/**************定时器0中断程序*****************/
void time0() interrupt 1
{ static uchar value;TH0 = 0X3C;TL0 = 0XB0; //50msvalue ++; if((value % 2) == 0) //100ms flag_100ms = 1; if(value >= 6) //200ms{value = 0;flag_200ms = 1;}
}
设计说明书
1课题设计制作要求
本文介绍了基于STC89C52单片机的多功能电子万年历的硬件结构和软硬件设计方法。本设计由数据显示模块、时间处理模块和调整设置模块四个模块组成。系统以STC89C52单片机为控制器,以串行时钟日历芯片DS1302记录日历和时间,它可以对年、月、日、时、分、秒进行计时等多种功能。万年历采用直观的数字显示,数据显示采用1602A液晶显示模块,可以在LCD上同时显示年、月、日、周、时、分、秒,还具有时间校准等功能。此万年历具有读取方便、显示直观、功能多样、电路简洁、成本低廉等诸多优点,具有广阔的市场前景。
2 系统方案设计
2.1系统设计框图
图2.1 系统框图
2.2 电子时钟工作流程
1、采用DS1302记录日历和时间。
2、按键设置时间、闹钟。
3、当实际的时间达到设定的闹钟时,蜂鸣器报警。
2.3 电源模块
单片机外围电路,包括单片机最小系统、液晶显示、按键电路、蜂鸣器控制电路以及DS1302采集时间日历都需要进行供电,本系统设计采用USB供电。
2.4 显示部分
1602液晶也叫1602字符型液晶,它是一种专门用来显示字母、数字、符号等的点阵型液晶模块。显示字母和数字比较方便,控制简单,成本较低。我们设计的系统需要显示更多的信息,所以考虑显示功能更好的液晶显示,要求能显示更多的数据,增强显示信息的可读性,看起来方便。本设计采用1602液晶显示器来显示数据。
2.5 DS1302电路
方案一:直接采用单片机定时计数器提供秒信号,使用程序实现年、月、日、星期、时、分、秒计数。采用此种方案虽然减少芯片的使用,节约成本,但是,实现的时间误差较大。
方案二:采用DS1302时钟芯片实现时钟,DS1302芯片是一种高性能的时钟芯片,可自动对秒、分、时、日、周、月、年以及闰年补偿的年进行计数,而且精度高,位的RAM作为数据暂存区,工作电压2.5V~5.5V范围内,2.5V时耗电小于300nA.
由于DS1302时钟芯片计数时间精度高,而且具有闰年补偿功能等优点,故采用方案二。
2.6 报警输出控制
方案一:采用有源蜂鸣器。有源蜂鸣器工作的理想信号是直流电,通常标示为VDC、VDD等。因为蜂鸣器内部有一简单的振荡电路,能将恒定的直流电转化成一定频率的脉冲信号,从面实出磁场交变,带动钼片振动发音。但是在某些有源蜂鸣器在特定的交流信号下也可以工作,只是对交流信号的电压和频率要求很高,此种工作方式一般不采用。
方案二:采用无源蜂鸣器。无源蜂鸣器没有内部驱动电路,有些公司和工厂称为讯响器,国标中称为声响器。无源蜂鸣器工作的理想信号方波。如果给预直流信号蜂鸣器是不响应的,因为磁路恒定,钼片不能振动发音。
本系统最后选取的是操作方便,信号输入固定的有源蜂鸣器。
基于51单片机的电子钟万年历LCD1602显示相关推荐
- 基于51单片机驱动ADXL346 (LCD1602显示)
基于51单片机驱动ADXL346 (LCD1602显示) 一.ADXL346传感器介绍 1.实物图 2.产品说明 3.电气参数 4.通信协议 二.驱动代码 1.引脚定义 2.初始化函数 3.主函数 三 ...
- 基于51单片机驱动MPU6050模块(LCD1602显示)
@TOC 一.简介 MPU-6050集成了3轴MEMS陀螺仪,3轴MEMS加速度计,以及一个可扩展的数字运动处理器DMP,可用IIC接口连接一个第三方的数字传感器.MPU-6050对陀螺仪和加速度计分 ...
- 基于51单片机+红外遥控解码+LCD1602显示
红外遥控解码(NEC) 基本介绍 什么是红外线? 红外线系统的组成 发射管和接收管 红外遥控发射(载波频率) 重要介绍 NEC协议 数据格式(必看) 位定义(必看) 编写程序思路(2种) 方式一 方式 ...
- 基于51单片机的电子万年历的设计-源代码
电子万年历的设计目录 电子万年历的设计 电子万年历的系统整体设计框图 所需要的元件 DS18B20模块 DS18B20的特点 DS18B20内部结构 DS18B20管脚排列 DS1302模块 SPI时 ...
- 基于51单片机的电子万年历设计
基于51单片机的电子万年历 1)LCD1602显示时间.日期.星期.温度 2)按键可调整时间日期星期 3)整点报时 4)DS1302时钟芯片 5)DS18B20温度传感器 6)闹钟功能 7)判断闰年 ...
- 【002】基于51单片机的电子万年历proteus仿真设计
一.资料内容(私信获取) (1).基于51单片机的电子万年历proteus仿真设计一份: (2).基于51单片机的电子万年历proteus仿真设计keli源代码一份: (3).基于51单片机的电子万年 ...
- 简易电子钟c语言程序,(最新整理)基于51单片机的电子钟C语言程序
<(最新整理)基于51单片机的电子钟C语言程序>由会员分享,可在线阅读,更多相关<(最新整理)基于51单片机的电子钟C语言程序(9页珍藏版)>请在人人文库网上搜索. 1.完整) ...
- 【Proteus仿真】51单片机汇编实现DS18B20+LCD1602显示
[Proteus仿真]51单片机汇编实现DS18B20+LCD1602显示 Proteus仿真 汇编代码(.asm) ;**************************************** ...
- 万年历设计单片机c语言,基于51单片机的电子万年历的设计
基于51单片机的电子万年历的设计(论文9400字) 功能要求 1. 万年历能用数码管显示阳历年.月.日.星期.[小]时.分.秒并设置指定时间的闹铃. 2. 数字式温度计要求测温范围-50~100°C, ...
最新文章
- 接口测试工具postman安装及使用
- java at发短信_发送短信(1)
- tomcat的缺少tcnative-1.dll的解决
- java outlook 发送邮件_基于java使用JavaMail发送邮件
- 【hihocoder 1312】搜索三·启发式搜索(启发式搜索写法)
- Canvas-drawImage 绘制图片模糊问题
- 军事卫星行业调研报告 - 市场现状分析与发展前景预测
- Dubbo zookeeper 初探【转】
- SpringBoot 修改仓库
- 学习汇编对编程有什么帮助?如何学习
- 公网部署freeswitch1.8.6后,终端注册成功后,在fs_cli控制台执行originate user/1000 echo,呼通1000的SIP终端后,终端讲话没有收到fs的回声解决方法
- 为什么特斯拉Q2业绩能超预期?
- HTML5期末大作业:动漫网站设计——福五鼠动漫(6页)带轮播特效 高质量代码 HTML+CSS+JavaScript 毕设网页设计HTML
- 【045】国家标准全文公开系统-GB和GB/T国家标准库
- php文件怎么打开?怎么打开PHP文件?
- 区块链中的“链上”和“链下”
- 跆拳道培训机构如何用抖音快手做推广
- MFC绘制双有理Bezier曲面
- linux中安装redis报错
- WCF 绑定(Binding)
热门文章
- 棋盘(Checkerboard)算法
- SQL Server 2005无日志文件附加数据库
- tadb.exe、sjk_daemon.exe导致 adb.exe启动失败
- BG2RHE - 树莓派3B+外置wifi解决金属外壳屏蔽问题
- android 设置文本加粗,如何在Android中将文本更改为粗体?
- 基础算法题:723. PUM
- IntelliJ IDEA pycharm webstorm 激活
- Hbuilder 历次版本更新记录
- Consul 踩坑日记,节点id冲突
- emmx文件用什么软件打开电脑_我告诉你emmx文件怎么打开