C51实现一个电子日历(比较难)

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


一、实验要求

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,数据指针清0
	DelayMs(1);
	IE=0x82;//使用T0
	TMOD=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)
					{	//如果是闰年,二月份的天数应该为29
						day++;
						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运用熟练之后,我也会学习功能更加丰富的单片机液晶显示模块。
最后,建议大家在进行学习单片机的时候,可以自己买一块开发版。

  • 2
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
洛 阳 理 工 学 院 课 程 设 计 报 告 课程名称 单片机原理与应用   设计题目 基于STC89C51万年历的设计与实现 专 业 物联网工程       班 级 学 号 姓 名 完成日期 大约在冬季 "课 程 设 计 任 务 书 " "设计题目: 基于STC89C51万年历的设计与实现  " "设计内容与要求: " "设计内容 " "利用STC89C51单片机、专用时钟芯片DS1302、DS18B20数字温度采集器及1602 " "显示器件设计一个万年历要求实现:(1)正确显示年月日,时分秒,星期 " "等信息;(2)显示环境温度;(3)具有闹钟功能,可以整点报时;(4)能 " "够通过按键调整时间和设置闹钟。 " "二、设计要求 " "1.分析系统功能,确定系统设计方案,掌握总体设计的方法与思路。 " "2.系统硬件设计,确定外设与单片机的硬件接口。掌握单片机系统外部接口的" "扩展设计方法。 " "3.系统软件设计,结合硬件设计,编写相应控制程序,并进行Protuse仿真执 " "行。 " "4.熟练掌握程序烧录及调试过程。 " "5.按照要求撰写课程设计论文。 " "指导教师: " "2019年 11 月 26 日 " "课 程 设 计 评 语 " " " " " " " "成绩: 指导教师:_______________ " "年 月 日 " 目录 摘 要 2 一、设计目标与内容 3 1.1设计目标 3 1.2 设计内容 3 1.3设计要求 3 1.4 本章小结 3 二、系统设计 3 2.1 电路设计框图 3 2.2 系统硬件概述 4 2.3 主要单元电路的设计 4 2.3.1 时钟电路模块的设计 4 2.3.2温度传感器电路设计 6 2.3.3显示模块的设计 8 2.4本章小结 8 三、系统的软件设计 9 3.1程序流程图 9 3.1.1 系统总流程图 9 3.1.2 温度程序流程图 9 3.1.3 DS1302时钟程序流程图 10 3.1.4 LCD显示程序流程图 11 3.2程序的设计 11 3.2.1 DS18B20测温程序 11 3.2.2 DS1302读写程序 13 3.2.3液晶显示程序 14 3.3本章小结 15 四、仿真与调试 15 4.1 Keil软件调试流程 15 4.2 Proteus软件运行流程 17 4.3本章小结 18 总结 18 基于STC89C51万年历的设计与实现 摘 要 古人依靠日冕、漏刻记录时间,而随着科技的发展,电子万年历已经成为日渐流行的 日常计时工具。 本文研究的万年历系统拟用STC89C52单片机控制,以DS1302时钟芯片计时、DS18B20 采集温度、1602液晶屏显示。系统主要由温度传感器电路,单片机控制电路,显示电路 以及校正电路四个模块组成。本文阐述了系统的硬件工作原理,所应用的各个接口模块 的功能以及其工作过程,论证了设计方案理论的可行性。系统程序采用C语言编写,经Ke il软件进行调试后在Proteus软件中进行仿真,可以显示年、月、日、星期、时、分、秒 和温度并具有校准功能和与即时时间同步的功能。 实验结果表明此万年历实现后具有读取方便、显示直观、功能多样、电路简洁等诸多 优点,符合电子仪器仪表的发展趋势,具有广阔的市场前景。 关键词:万年历 单片机 仿真 一、设计目标与内容 1.1设计目标 制作出可以检测温度并报警的的电子万年历。 1.2 设计内容 用keilC51编译程序。 用proteus仿真电路图。 将电路图使用万用板或其他电路板焊接实物图。 1.3设计要求 具备在液晶上显示年、月、日、星期、时、分、秒的功能。 具备年、月、日、星期、时、分、秒校准功能。 具有与即时时间同步的功能。 1.4 本章小结 通过设计程序,制作仿真,焊接实物三个步骤,以小组合作的方式来设计满足设计要 求的万年历并简单描述可以实现的功能,制作结束后,进行课程设计答辩并编写一份课 程设计报告。 二、系统设计 1. 2. 2.1 电路设计框图 根据上章确定的方案给出了系统整体的设计框图: 图1.1系统结构框图 为使时钟走时与标准时间一致,校时电路是必不可少的,键盘模块用来校正液晶上显 示的时间;温度传感器则用来检测当前的环境温度;STC89C52单片机通过输出各种电脉 冲信号来驱动控制各部分正常工作;而系统的时间、温度等数据则最终通过液晶模块显 示出来。 2.2 系统硬件概述 本电路是以STC89C52单片机为控制核心,该芯片具有在线编程功能,功耗低,能在3 .3V的超低压下工作;时钟芯片采用DS1302,它是一款高性能、低功耗、自带RAM的实时 时钟芯片,具有使用寿命长,精度高和功耗低等特点,同时具有掉电自动保存功能,可以 对年、月、日、星期、时、分、秒进行计时,具有

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值