C51实现一个电子日历(比较难)
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
- 一、实验要求
- 二、使用步骤
- 1.引入库
- 三、实验原理图
- 总结
一、实验要求
1.以单片机为硬件基础,以C51语言为设计语言编程实现电子日历功能。具体如下:
(1)显示年、月、日
(2)显示时、分、秒
2.:通过单片机上提供的按键,实现电子日历的“调时”及“调日期”和“调秒”功能
二、使用步骤
1.引入库
代码如下(示例):
/*** @brief 使用LCD1602实现电子万年历* @author不留名* @date 2022-06-07 22:30:00* @version 2.0 * */
#include"REG51.H"
#define uint unsigned int
typedef unsigned char uchar;
sbit RS=P2^0;
sbit RW=P2^1;
sbit E=P2^2;
sbit P2_3=P2^3;
sbit P2_4=P2^4;
sbit P2_5=P2^5;
uint Flag=0;//Flag用来判断按键按了几下
//闰年只影响2月份。因此只要用if进行判断就可以得到闰年的2月份
uint Pmonthnum[]={00,31,28,31,30,31,30,31,31,30,31,30,31};//平年数
uchar SegCode[]={0x3f,0x06,0x5b,0x4f};//用于显示按键按了几下
uint year=2020,month=2,day=28;
uint hour=23,minute=59,second=41;
uchar num=0,xq=4,count=0;
uchar code week[][3]={"MON","TUE","WED","THR","FRI","SAT","SUN"};
uchar Table1[]={" 2020-02-28 FRI"};
uchar Table2[]={"23:59:11"};
void DelayMs(uint ms);
void write_com(uchar command)//写指令
{RS=0;RW=0;E=0;P1=command;E=1;DelayMs(1);E=0;
}void write_data(uchar date)//写数据
{RS=1;RW=0;E=0;P1=date;E=1;DelayMs(1);E=0;
}void disp1(uchar add,uchar content)
{uchar shi,ge;shi=content/10;ge=content%10;write_com(add);DelayMs(2);write_data(shi+0x30);DelayMs(2);write_data(ge+0x30);DelayMs(2);}void disp2(uchar add,uchar content)
{uchar qian,bai,shi,ge;qian=content/1000;bai=(content/100)%10;shi=content%100/10;ge=content%10;write_com(add);DelayMs(2);write_data(qian+0x30);DelayMs(2);write_data(bai+0x30);DelayMs(2); write_data(shi+0x30);DelayMs(2);write_data(ge+0x30);DelayMs(2);}
void Init()
{write_com(0x38);//设置16*2显示,5*7点阵,8位数据接口write_com(0x0c);//设置开显示,不显示光标write_com(0x06);//写一个字符后地址++write_com(0x01);//显示清0,数据指针清0DelayMs(1);IE=0x82;//使用T0TMOD=0x01;//方式一TH0=15536/256;TL0=15536%256;TR0=1;write_com(0x80);//第一行for(num=0;num<15;num++){write_data(Table1[num]);DelayMs(2);}write_com(0xc4);//第二行for(num=0;num<8;num++){write_data(Table2[num]);DelayMs(2);} write_com(0x8c);//显示星期for(num=0;num<3;num++){write_com(week[xq][num]);DelayMs(1);}
}void main(void)
{Init(); P3=0x00;while(1){ if(P2_3==0){DelayMs(20);//延时消抖if(P2_3==0){ while(P2_3==0);//松手检测 Flag++;if(Flag==4)Flag=0;}}switch(Flag){case 0:break;case 1:P3=SegCode[1];EA=0;if(P2_4==0){DelayMs(20);if(P2_4==0){while(P2_4==0);second++;}}if(P2_5==0){DelayMs(20);if(P2_5==0){while(P2_5==0);second--;}}EA=1;break;case 2:P3=SegCode[2];EA=0;if(P2_4==0){DelayMs(20);if(P2_4==0){while(P2_4==0);minute++;}}if(P2_5==0){DelayMs(20);if(P2_5==0){while(P2_5==0);minute--;}}EA=1;break;case 3:P3=SegCode[3];if(P2_4==0){DelayMs(20);if(P2_4==0){while(P2_4==0);hour++;}}if(P2_5==0){DelayMs(20);if(P2_5==0){while(P2_5==0);hour--;}}EA=1;break;default:break;} disp1(0xc4,hour);disp1(0xc7,minute);disp1(0xca,second);}//防止跑飞
}void Timer0(void)interrupt 1
{TH0=15536/256;TL0=15536%256;count++;if(count==20){count=0;second++;if(second>=60){second=0;minute++;if(minute>=60){minute=0;hour++;if(hour>=24){hour=0;xq++;if(xq==7)xq=0;if(((year%4==0&&year%100!=0)||year%400==0)&&month==2){ //如果是闰年,二月份的天数应该为29day++;if(day>29){day=1;month++;if(month>12){year++;month=1;if(year>9999)year=0;disp2(0x81,year);}disp1(0x86,month);} disp1(0x89,day);write_com(0x8c);for(num=0;num<3;num++)write_data(week[xq][num]);}else//不是闰年{day++;if(day>Pmonthnum[month]){day=1;month++;if(month>12){year++;month=1;if(year>9999)year=0;disp2(0x81,year);}disp1(0x86,month);}disp1(0x89,day);write_com(0x8c);for(num=0;num<3;num++)write_data(week[xq][num]);}}}}}
}void DelayMs(uint ms)
{uint i=0;do{for(;i<113;i++);}while(--ms);
}
三、实验原理图
总结
实验中遇到的最大的困难就是对于LCD1602的不熟悉。因此,我花了2小时来进行学习LCD1602基础知识的学习。因为上次实验,让我发现了proteus上仿真可能存在定时不准确的情况。因此本次实验proteus只是起到辅助的作用,单片机起到了主要作用。本次实验也只是对于LCD1602最基本的运用。当我LCD1602运用熟练之后,我也会学习功能更加丰富的单片机液晶显示模块。
最后,建议大家在进行学习单片机的时候,可以自己买一块开发版。
C51实现一个电子日历(比较难)相关推荐
- 基于WEB的电子日历
经常在项目中有填写日期的工作,如果手动的输入当然可以,但是填写的日期往往和期望的不符.解决的方法有很多,这里主要阐述在Web项目中填写日历,自己动手开发一个电子日历,供用户选择合适的日期. 基于Web ...
- 定义电子日历类-C++/class
牛客网编程题 class的引用 描述 KiKi学习了面向对象技术,学会了通过封装属性(变量)和行为(函数)定义类,现在他要设计一个电子日历类TDate. 它有3个私有数据成员:Month,Day,Ye ...
- C51数字电子日历/时钟设计
题目要求: 数字电子日历/时钟设计 设计一个基于MCS51的电子日历和时钟. 基本要求 (1) 可通过按键在日历和时间之间切换显示: (2) 可由按键调整日期和时间 (3) 可整点报时("嘟 ...
- 可调式电子日历的设计
1.概述 1.1 课题背景 单片机运用在各种智能设备当中,比如平衡车.扫地机器人等.设备智能化是一个必然的趋势,而要实现设备智能化离不开单片机的支持,所以学习单片机是每一位自动化学子的必修之路.之前虽 ...
- 电子日历插件(阳历转阴历工具...)
现在网络上大部分农历算法的都很少,都是百年农历算法(截止到2020年).为此从某云上找到开源大佬[Jea杨(JJonline@JJonline.Cn)]的农历算法.实际上计算阳历转农历没有直接的转换算 ...
- C51单片机的电子时钟(数码管显示)
C51单片机的电子时钟 硬件环境: 相关开发板原理图解析 正式代码: 效果预览图 硬件环境: 普中科技51单片机开发板STC89C52 相关开发板原理图解析 查看这两个原理图,我们可以发现控制这8个数 ...
- 嵌入式是什么?(一个电子产品的从0到1)-杂谈
这篇博客,我想聊聊嵌入式.在IT行业,存在着很多不同的领域与不同的职位,由此也延伸出了各式各样的工程师.但其中嵌入式工程师算是比较迷糊的一个职位了,即便同是IT的同事也有不少问过我"嵌入式是 ...
- c语言课程设计 日历显示,c语言课程设计_电子日历.doc
c语言课程设计_电子日历 第 PAGE \* Arabic \* MERGEFORMAT 14 页第 PAGE \* Arabic \* MERGEFORMAT 14 页 课 程 设 计( 论 文 ) ...
- 如何用java写一个年日历
如何用java写一个年日历 没啥难的,话不多说上代码
最新文章
- VS2015配置并运行汇编(一步一步照图做)【vs2017的链接在最后】
- 考前自学系列·计算机组成原理·中央处理器知识点
- VQEG(视频质量专家组)
- Redis-RDB持久化设置
- Layout布局(补充)
- 《数据结构》c语言版学习笔记——单链表结构(线性表的链式存储结构Part1)
- Markdown中如何输入上标、下标?
- 我的世界java版记分板_我的世界计分板指令 如何使用计分板教程
- Ubuntu将python2.7默认更改为python3.X版本
- 游戏大厅 从基础开始(7)--绕回来细说聊天室(中间偏下)之女仆编年史2
- 金蝶kis云+sqlserver报表分析
- matlab动力学仿真_机械系统动力学MATLAB仿真(上)
- js基础-9-正则表达式
- 【金猿投融展】Techsun天正聚合——联接品牌与人
- CentOS之命令方式安装向日葵与内网穿透
- 独立董事、内部董事、执行董事、外部董事、非执行董事概念
- STM32F407--芯片解读
- Java千百问_07JVM架构(015)_XmnXmsXmxXss有什么区别
- css设置背景图片随滚动缓慢滚动_h5页面背景图很长要有滚动条滑动效果的实现...
- 写面经攒人品,分享我的贝壳客户端面经,附带个人总结的答案。
热门文章
- Python基础教程(学习笔记整理DAY3)
- 在vscode中配置C++编程环境
- C语言结构体的声明和定义
- 记录本----unity3D小人发射子弹
- 小程序源码:万圣节头像框生成工具
- NOKIA、MOTOROLA、SIMENS及ERICCSON铃声和图片格式分析(转)
- 惊呆:女老师教室内竟在众目睽睽之下撒尿(图)
- C# Modbus TCP协议客户端设计工程源码带注释,开源 dll文件,支持访问多个服务器,多线程实现,西门子C# Simens PPI Master
- 【视频泄露检测】非屏蔽环境下通过VGA接口检测是否存在视频信息泄露
- StarCitizen星际公民添加好友一起玩教程