提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 一、实验要求
  • 二、使用步骤
    • 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实现一个电子日历(比较难)相关推荐

  1. 基于WEB的电子日历

    经常在项目中有填写日期的工作,如果手动的输入当然可以,但是填写的日期往往和期望的不符.解决的方法有很多,这里主要阐述在Web项目中填写日历,自己动手开发一个电子日历,供用户选择合适的日期. 基于Web ...

  2. 定义电子日历类-C++/class

    牛客网编程题 class的引用 描述 KiKi学习了面向对象技术,学会了通过封装属性(变量)和行为(函数)定义类,现在他要设计一个电子日历类TDate. 它有3个私有数据成员:Month,Day,Ye ...

  3. C51数字电子日历/时钟设计

    题目要求: 数字电子日历/时钟设计 设计一个基于MCS51的电子日历和时钟. 基本要求 (1) 可通过按键在日历和时间之间切换显示: (2) 可由按键调整日期和时间 (3) 可整点报时("嘟 ...

  4. 可调式电子日历的设计

    1.概述 1.1 课题背景 单片机运用在各种智能设备当中,比如平衡车.扫地机器人等.设备智能化是一个必然的趋势,而要实现设备智能化离不开单片机的支持,所以学习单片机是每一位自动化学子的必修之路.之前虽 ...

  5. 电子日历插件(阳历转阴历工具...)

    现在网络上大部分农历算法的都很少,都是百年农历算法(截止到2020年).为此从某云上找到开源大佬[Jea杨(JJonline@JJonline.Cn)]的农历算法.实际上计算阳历转农历没有直接的转换算 ...

  6. C51单片机的电子时钟(数码管显示)

    C51单片机的电子时钟 硬件环境: 相关开发板原理图解析 正式代码: 效果预览图 硬件环境: 普中科技51单片机开发板STC89C52 相关开发板原理图解析 查看这两个原理图,我们可以发现控制这8个数 ...

  7. 嵌入式是什么?(一个电子产品的从0到1)-杂谈

    这篇博客,我想聊聊嵌入式.在IT行业,存在着很多不同的领域与不同的职位,由此也延伸出了各式各样的工程师.但其中嵌入式工程师算是比较迷糊的一个职位了,即便同是IT的同事也有不少问过我"嵌入式是 ...

  8. c语言课程设计 日历显示,c语言课程设计_电子日历.doc

    c语言课程设计_电子日历 第 PAGE \* Arabic \* MERGEFORMAT 14 页第 PAGE \* Arabic \* MERGEFORMAT 14 页 课 程 设 计( 论 文 ) ...

  9. 如何用java写一个年日历

    如何用java写一个年日历 没啥难的,话不多说上代码

最新文章

  1. VS2015配置并运行汇编(一步一步照图做)【vs2017的链接在最后】
  2. 考前自学系列·计算机组成原理·中央处理器知识点
  3. VQEG(视频质量专家组)
  4. Redis-RDB持久化设置
  5. Layout布局(补充)
  6. 《数据结构》c语言版学习笔记——单链表结构(线性表的链式存储结构Part1)
  7. Markdown中如何输入上标、下标?
  8. 我的世界java版记分板_我的世界计分板指令 如何使用计分板教程
  9. Ubuntu将python2.7默认更改为python3.X版本
  10. 游戏大厅 从基础开始(7)--绕回来细说聊天室(中间偏下)之女仆编年史2
  11. 金蝶kis云+sqlserver报表分析
  12. matlab动力学仿真_机械系统动力学MATLAB仿真(上)
  13. js基础-9-正则表达式
  14. 【金猿投融展】Techsun天正聚合——联接品牌与人
  15. CentOS之命令方式安装向日葵与内网穿透
  16. 独立董事、内部董事、执行董事、外部董事、非执行董事概念
  17. STM32F407--芯片解读
  18. Java千百问_07JVM架构(015)_XmnXmsXmxXss有什么区别
  19. css设置背景图片随滚动缓慢滚动_h5页面背景图很长要有滚动条滑动效果的实现...
  20. 写面经攒人品,分享我的贝壳客户端面经,附带个人总结的答案。

热门文章

  1. Python基础教程(学习笔记整理DAY3)
  2. 在vscode中配置C++编程环境
  3. C语言结构体的声明和定义
  4. 记录本----unity3D小人发射子弹
  5. 小程序源码:万圣节头像框生成工具
  6. NOKIA、MOTOROLA、SIMENS及ERICCSON铃声和图片格式分析(转)
  7. 惊呆:女老师教室内竟在众目睽睽之下撒尿(图)
  8. C# Modbus TCP协议客户端设计工程源码带注释,开源 dll文件,支持访问多个服务器,多线程实现,西门子C# Simens PPI Master
  9. 【视频泄露检测】非屏蔽环境下通过VGA接口检测是否存在视频信息泄露
  10. StarCitizen星际公民添加好友一起玩教程