1.功能设计
本次设计的系统,可以显示年月日,时分秒。使用DS1302芯片。 还自带闹钟功能.
(要源工程的,移步至最后! (代码和仿真文件都有))
2.仿真图
3.背景意义
51单片机(8051单片机)是一种广泛应用于嵌入式系统开发的微控制器,而“万年历”指的是一种同时显示年、月、日的日历工具。结合起来,51单片机万年历是指利用51单片机实现的一个具有万年历功能的电子设备。
背景意义上来说,51单片机万年历有以下几个方面的意义:
1. 实用性:万年历是人们经常使用的一种时间工具,能够显示当前的年、月、日等日期信息,对于人们日常生活和工作中的时间管理非常重要。利用51单片机实现万年历功能,使得这个功能可以精确、可靠地实现在嵌入式系统中,为用户提供方便。
2. 教育性:利用51单片机实现万年历功能可以作为学习和教育的工具。通过学习如何设计和编程实现一个万年历,可以帮助学习者深入理解51单片机的工作原理和编程思想,培养计算机嵌入式系统设计和开发的能力。
3. 开发应用:51单片机万年历可以作为更复杂嵌入式系统的子功能模块或基础,被集成到其他应用中。比如,可以将其作为智能家居系统中的时间管理模块,或者作为工控系统中的时间同步模块,为其他应用提供准确的时间服务。
总的来说,51单片机万年历背景意义在于提供人们一个实用的时间工具,并具有教育和开发应用的价值。
4.国内外现状
51单片机万年历在国内外均有相关的研究和开发。以下是简要介绍:
国内:
在国内,由于单片机应用技术的不断发展和普及,越来越多的学校和企业开始进行51单片机万年历的研究和开发。目前,已经有很多大学实验室和企业研发部门开发了各种基于51单片机的万年历系统,并且已经应用到实际生产中,发挥了重要的作用。
国外:
在国外,由于51单片机的使用不如国内普及,因此51单片机万年历的研究相对较少,但在欧美等发达国家,其在嵌入式领域的应用比较广泛。一些企业和个人也基于51单片机开发了不同类型的万年历,这些万年历不仅具有显示时间的功能,还有提醒、闹钟等实用功能。
总体来说,国内外对于51单片机万年历的研究和开发并没有停滞,在技术、应用等方面都有不断探索和创新,同时也在推动单片机技术的发展和应用。
5.部分代码
#include<reg52.h>
//#include"DS18B20_3.H"
#include <string.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
#define wd 1 //定义是否有温度功能 =0时无温度,=1时有温度
#include "eeprom52.h"
#define yh 0x80 //LCD第一行的初始位置,因为LCD1602字符地址首位D7恒定为1(100000000=80)
#define er 0x80+0x40 //LCD第二行初始位置(因为第二行第一个字符位置地址是0x40)
//液晶屏的与C51之间的引脚连接定义(显示数据线接C51的P0口)
sbit en=P2^7;
sbit rw=P2^6; //如果硬件上rw接地,就不用写这句和后面的rw=0了
sbit rs=P2^5;
//校时按键与C51的引脚连接定义
sbit set=P3^0; //设置键
sbit add=P3^1; //加键
sbit dec=P3^2; //减键
sbit seeNL_NZ=P3^3; //查看农历/闹钟
sbit DQ=P3^7; //
sbit buzzer=P2^0; //蜂鸣器,通过三极管8550驱动,端口低电平响
sbit led=P2^4; //LCD背光开关
bit led1=1;
bit NZ_sdgb=1;
unsigned char temp_miao;
unsigned char bltime; //背光亮的时间
//DS1302时钟芯片与C51之间的引脚连接定义
sbit DSIO=P1^1;
sbit SCLK=P1^0;
sbit RST=P1^2;
char a,miao,shi,fen,ri,yue,week,setn,nian;
int temp;
uint flag;
//flag用于读取头文件中的温度值,和显示温度值
bit c_moon;
char nz_shi,nz_fen,setNZn; //定义闹钟变量
uchar shangyimiao,bsn,temp_hour; //记录上一秒时间
uchar T_NL_NZ; //计数器
bit timerOn=0; //闹钟启用标志位
bit baoshi=0; //整点报时标志位
bit p_r=0; //平年/润年 =0表示平年,=1表示润年
data uchar year_moon,month_moon,day_moon;
sbit ACC0=ACC^0;
sbit ACC7=ACC^7;
/************************************************************
ACC累加器=A
ACC.0=E0H
ACC.0就是ACC的第0位。Acc可以位寻址。
累加器ACC是一个8位的存储单元,是用来放数据的。但是,这个存储单元有其特殊的地位,
是单片机中一个非常关键的单元,很多运算都要通过ACC来进行。以后在学习指令时,
常用A来表示累加器。但有一些地方例外,比如在PUSH指令中,就必须用ACC这样的名字。
一般的说法,A代表了累加器中的内容、而ACC代表的是累加器的地址。
***************************************************************/
/******************把数据保存到单片机内部eeprom中******************/
void write_eeprom()
{
SectorErase(0x2000);
byte_write(0x2000, nz_shi);
byte_write(0x2001, nz_fen);
byte_write(0x2002, timerOn);
byte_write(0x2060, a_a);
}
/******************把数据从单片机内部eeprom中读出来*****************/
void read_eeprom()
{
nz_shi = byte_read(0x2000);
nz_fen = byte_read(0x2001);
timerOn = byte_read(0x2002);
a_a = byte_read(0x2060);
}
/**************开机自检eeprom初始化*****************/
void init_eeprom()
{
read_eeprom(); //先读
if(a_a != 1) //新的单片机初始单片机内问eeprom
{
nz_shi = 12;
nz_fen = 30;
timerOn=0;
a_a = 1;
write_eeprom(); //保存数据
}
}