用 LCD1602 显示的时钟
有这样一个题目:求一个为 51 单片机编写的 LCD 电子时钟的设计,简单就好 !
希望说一下怎么设计这个时钟,都需要些什么东西,最重要的——把这个设计需要的程序写出来。
设计的任务:
以单片机控制的时钟,在 LCD 显示器上显示当前的时间。
设计的基本要求:
1.使用文字型 LCD 显示器显示当前时间。
2.显示格式为“时时:分分:秒秒”。
3.用4个功能键操作来设置当前时间。各个功能键的功能如下:
K1:进入设置现在的时间。
K2:设置小时。
K3:设置分钟。
K4:确认完成设置。
4. 程序执行后工作指示灯 LED 闪烁,表示程序开始执行,LCD 显示“00:00:00”,然后开始计时。
题目链接:http://zhidao.baidu.com/question/416705477.html
//==================================================
提到设计时钟,很多人都想到了时钟芯片 DS1302,都说它简单、准确。其实,这是个误区。
仅仅使用一般的单片机,简单的编程,达到相同 DS1302 的准确度,并不是难事。
如果不要求计算平闰年、不要求分清大小月、不要求计算星期几,只是要求一个简单的时钟(及日历),用 DS1302,就是自寻烦恼。
大家可以打开题目链接,看看其中的一些答案,就可以看出使用 DS1302 是多么的繁琐了,简直就是一场噩梦。
做而论道以前就使用普通的单片机和 LCD1602 设计过《时钟与日历》,程序设计的非常合理,时间精度就完全取决于晶振的精度。设计出来的时钟,几个月都差不上一秒。
针对这个题目,做而论道翻出了以前的设计,删节了一些不需要的功能,设计出了符合题目要求的时钟,用 PROTEUS 仿真截图如下:
图片链接:http://xiangce.baidu.com/picture/detail/7235024812c232e78811f4e34e5b9dd3d1ed5882
程序用 C 语言编写,全部代码如下:
//---------------------------------------------------
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
#define KEY_IO P3
#define LCD_IO P0
sbit LCD_RS = P2^0;
sbit LCD_RW = P2^1;
sbit LCD_EN = P2^2;
sbit SPK = P1^2;
sbit LED = P2^4;
bit new_s, modify = 0;
char t0, sec = 50, min = 59, hour = 23;
char code LCD_line1[] = "Designed by ZELD";
char code LCD_line2[] = "Timer: 00:00:00 ";
char Timer_buf[] = "23:59:50";
//---------------------------------------------------
void delay(uint z)
{
uint x, y;
for(x = z; x > 0; x--) for(y = 100; y > 0; y--);
}
//---------------------------------------------------
void W_LCD_Com(uchar com) //写指令
{
LCD_RS = 0; LCD_IO = com; // LCD_RS和R/W都为低电平时,写入指令
LCD_EN = 1; delay(5); LCD_EN = 0; //用EN输入一个高脉冲
}
//---------------------------------------------------
void W_LCD_Dat(uchar dat) //写数据
{
LCD_RS = 1; LCD_IO = dat; // LCD_RS为高、R/W为低时,写入数据
LCD_EN = 1; delay(5); LCD_EN = 0; //用EN输入一个高脉冲
}
//---------------------------------------------------
void W_LCD_STR(uchar *s) //写字符串
{
while(*s) W_LCD_Dat(*s++);
}
//---------------------------------------------------
void W_BUFF(void) //填写显示缓冲区
{
Timer_buf[7] = sec % 10 + 48; Timer_buf[6] = sec / 10 + 48;
Timer_buf[4] = min % 10 + 48; Timer_buf[3] = min / 10 + 48;
Timer_buf[1] = hour % 10 + 48;Timer_buf[0] = hour / 10 + 48;
W_LCD_Com(0xc0 + 7); W_LCD_STR(Timer_buf);
}
//---------------------------------------------------
uchar read_key(void)
{
uchar x1, x2;
KEY_IO = 255;
x1 = KEY_IO;
if (x1 != 255) {
delay(100);
x2 = KEY_IO;
if (x1 != x2) return 255;
while(x2 != 255) x2 = KEY_IO;
if (x1 == 0x7f) return 0;
else if (x1 == 0xbf) return 1;
else if (x1 == 0xdf) return 2;
else if (x1 == 0xef) return 3;
else if (x1 == 0xf7) return 4;
}
return 255;
}
//---------------------------------------------------
void Init()
{
LCD_RW = 0;
W_LCD_Com(0x38); delay(50);
W_LCD_Com(0x0c);
W_LCD_Com(0x06);
W_LCD_Com(0x01);
W_LCD_Com(0x80); W_LCD_STR(LCD_line1);
W_LCD_Com(0xC0); W_LCD_STR(LCD_line2);
TMOD = 0x01; //T0定时方式1
TH0 = 0x4c;
TR0 = 1; //启动T0
PT0 = 1; //高优先级, 以保证定时精度
ET0 = 1;
EA = 1;
}
//---------------------------------------------------
void main()
{
uint i, j;
uchar Key;
Init();
while(1) {
//-------------------------------
if (new_s) { //如果出现了新的一秒, 修改时间
new_s = 0; sec++; sec %= 60;
if(!sec) { min++; min %= 60;
if(!min) { hour++; hour %= 24;}
}
W_BUFF(); //写显示
//-------------------------------
if (!sec && !min) { //整点报时
for (i = 0; i < 200; i++) {
SPK = 0; for (j = 0; j < 100; j++);
SPK = 1; for (j = 0; j < 100; j++);
} }
}
//-------------------------------
Key = read_key(); //读出按键
switch(Key) { //分别处理四个按键
case 0: modify = 1; break;
case 1: if(modify) {min++; min %= 60; W_BUFF(); break;}
case 2: if(modify) {hour++; hour %= 24; W_BUFF(); break;}
case 3: modify = 0; break;
} }
}
//---------------------------------------------------
void timer0(void) interrupt 1 //T0中断函数, 50ms执行一次
{
TH0 = 0x4c;
t0++; t0 %= 20; //20, 一秒钟
if(t0 == 0) {new_s = 1; LED = ~LED;}
if(modify) LED = 0;
}
//===================================================
呵呵,全部程序,也不过 120 行左右。不知道还能不能找到更简明的程序。
用 LCD1602 显示的时钟相关推荐
- 51单片机LCD1602显示电子时钟 带按键设置和星期显示
当时看书看到lcd那章,就想利用定时器做一个电子时钟,当时也不知道有时钟模块的,以为都是定时器定时产生的时间,也是一个main文件从头到尾的版本,注释倒不少,不要说什么模块化编程和代码优化,想到什么就 ...
- C语言 | 基于MPU605(六轴传感器)的I2C实现LCD1602显示(代码类)
博主github:https://github.com/MichaelBeechan 博主CSDN:https://blog.csdn.net/u011344545 基于MPU605(六轴传感器)的I ...
- 基于51单片机的电子钟万年历LCD1602显示
本设计是51单片机的电子钟万年历LCD1602显示(proteus仿真+程序+报告+器件清单) 仿真图proteus 7.8 程序编译器:keil 4/keil 5 编程语言:C语言 编号C0002 ...
- 基于C51单片机的万年历设计(LCD1602显示)
C51单片机万年历设计 注:该程序基于普中科技C51 V2.2开发板设计,库函数和硬件资料均来自普中科技,侵删.main.c大部分为原创,如有雷同,纯属巧合. 名称:C51万年历. 硬件:以C51芯片 ...
- 基于AT89S52芯片+LCD1602液晶显示+DS12C887时钟模块的数字时钟
文章目录 1. 前提 2. 目标 3. 代码 1. 前提 51单片机,通过实验箱实现实时数字时钟,这里选用DS12C887时钟模块进行实验内容. 2. 目标 使用更为精准的DS12C887时钟模块进行 ...
- 单片机 LCD1602显示实验
电路图如下: 1.请描述液晶显示器的显示原理,及其与数码管相比的技术特点. 显示原理: 液晶显示器是利用偏光板这个特性来完成的,利用上下两片栏栅之间相互垂直的偏光板之间充满了液晶, 再利用电场控制液晶 ...
- 单片机+DHT11的温湿度采集监测系统,LCD1602显示,带报警功能,C代码、原理图和Proteus仿真
设计要求 1.设计一个基于51单片机和DHT11传感器的温湿度监测系统: 2.传感器DHT11实现对环境温湿度参数的准确测量,单片机对数据进行分析和处理: 3.用户可根据需要,通过按键自主调节温湿度上 ...
- 基于51单片机驱动ADXL346 (LCD1602显示)
基于51单片机驱动ADXL346 (LCD1602显示) 一.ADXL346传感器介绍 1.实物图 2.产品说明 3.电气参数 4.通信协议 二.驱动代码 1.引脚定义 2.初始化函数 3.主函数 三 ...
- MSP430F5529与LCD1602显示模块(上)
一点小总结~ 源代码下载 源代码正在整理中,等MSP430F5529与LCD1602显示模块(下)发布后再一起上传至Github,敬请期待. LCD1602介绍 外观 主要技术参数 显示容量: 16X ...
最新文章
- XDU 翼讯账号算法
- 微型计算机的内存主要包括rom,信息安全技术题库:路由器硬件组件主要包括( )、闪存、ROM、RAM。 - 作业在线问答...
- Android查看挂载的分区(如oem)
- Py之Pyinstaller:Python库之Pyinstaller简介、使用方法、安装详细攻略
- 【Android】Uri、UriMatcher、ContentUris详解
- .NET6之MiniAPI(三十):结束篇(附链接)
- linux7配网卡,CentOS 7 配置网卡
- faster-RCNN台标检测
- python采用函数式编程模式-浅谈Python 函数式编程
- vb.net 模拟鼠标 失去焦点_孢子:EA最成功的神作,虽能“模拟万物”但却落得昙花一现...
- php3.2 之文件上传,多文件上传
- webstorm 主题 配色
- Qt下的综合练习—汽车信息管理系统(一)主界面设计
- JAVA把一个流赋给新的一个流_2020重新出发,JAVA基础,输入/输出(I/O)流
- 计算机科学研究的第一手段,实验研究类论文的研究方法(11种研究方法解析)...
- macOS 安装postman 中文语言包
- 机器学习之十大经典算法(九)EM算法
- linux查看附近可用wifi并进行通过命令行连接
- nacos的feign报错Error creating bean with name ‘configurationPropertiesBeans‘ defined in class path reso
- 创业项目转化落地资源帮助,“汇新杯”大赛助你圆梦
热门文章
- Mybatis狂神说完整笔记
- python获取文件夹下指定后缀名文件列表(可手工设定是否遍历子文件夹)cmd复制文件命令使用
- 广东省职称计算机职称考试试题及答案,职称计算机考试基础知识章节试题及答案一...
- 【微信小程序】微信小程序--倒放音频的实现
- scala中 sorted,sortBy,sortWith语法使用
- 哪吒GT:200万以内最好的纯电跑车,售价17.88万元起
- STM32F407的时钟
- 3D游戏之投影矩阵算法技术实现
- 百度飞桨和文心大模型助力,中康科技重构医疗科研大数据治理
- 什么是JAVA?JAVA能用来干什么?