一、资料内容(私信获取)
- (1)、基于51单片机的电子万年历proteus仿真设计一份;
- (2)、基于51单片机的电子万年历proteus仿真设计keli源代码一份;
- (3)、基于51单片机的电子万年历Altium designer 的原理图一份;
- (4)、基于51单片机的电子万年历proteus仿真设计的课程报告一份;
- (5)、基于51单片机的电子万年历proteus仿真设计视频讲解一份;
二、设计要求
- 要求以51系列单片机为核心,设计一款电子万年历;
- 系统需要采用LCD1602屏幕显示相关数据;
- 系统要求可以显示公历日期(年、月、日)、时间(时、分、秒)、星期,并且以上数据可以通过按键更改设置;
- 系统可以通过LCD1602显示平年和润年;
- 系统需要含有闹钟功能,并且闹钟时间可以通过用户设定;
三、相关资料截图
四、视频讲解
私信获取全部内容
部分源代码
#include <reg52.h>
#include <intrins.h>#define uchar unsigned char // 以后unsigned char就可以用uchar代替
#define uint unsigned int // 以后unsigned int 就可以用uint 代替sfr ISP_DATA = 0xe2; // 数据寄存器
sfr ISP_ADDRH = 0xe3; // 地址寄存器高八位
sfr ISP_ADDRL = 0xe4; // 地址寄存器低八位
sfr ISP_CMD = 0xe5; // 命令寄存器
sfr ISP_TRIG = 0xe6; // 命令触发寄存器
sfr ISP_CONTR = 0xe7; // 命令寄存器sbit LcdRs_P = P2^7; // 1602液晶的RS管脚
sbit LcdRw_P = P2^6; // 1602液晶的RW管脚
sbit LcdEn_P = P2^5; // 1602液晶的EN管脚
sbit RST_P = P1^3; // 时钟芯片DS1302的RST管脚
sbit SDA_P = P1^2; // 时钟芯片DS1302的SDA管脚
sbit SCK_P = P1^1; // 时钟芯片DS1302的SCK管脚
sbit KeySet_P = P3^2; // 设置时间按键
sbit KeyClock_P = P3^3; // 设置闹钟按键
sbit KeyDown_P = P3^4; // 减按键
sbit KeyUp_P = P3^5; // 加按键
sbit Buzzer_P = P2^0; // 蜂鸣器uchar TimeBuff[7]={16,8,5,6,18,30,50}; // 时间数组,默认2016年8月5日,星期五,16:30:50
// TimeBuff[0] 代表年份,范围00-99
// TimeBuff[1] 代表月份,范围1-12
// TimeBuff[2] 代表日期,范围1-31
// TimeBuff[3] 代表星期,范围1-7,1是星期天,2是星期一... ...
// TimeBuff[4] 代表小时,范围00-23
// TimeBuff[5] 代表分钟,范围00-59
// TimeBuff[6] 代表秒钟,范围00-59uchar Clock_Hour; // 闹钟的小时
uchar Clock_Minute; // 闹钟的分钟
uchar Clock_Swt; // 闹钟的开关
uchar Buzzer_Flag=0; // 蜂鸣器工作标志
uchar nian_type; // 年份类型/*********************************************************/
// 单片机内部EEPROM不使能
/*********************************************************/
void ISP_Disable()
{ISP_CONTR = 0;ISP_ADDRH = 0;ISP_ADDRL = 0;
}/*********************************************************/
// 从单片机内部EEPROM读一个字节,从0x2000地址开始
/*********************************************************/
unsigned char EEPROM_Read(unsigned int add)
{ISP_DATA = 0x00;ISP_CONTR = 0x83;ISP_CMD = 0x01;ISP_ADDRH = (unsigned char)(add>>8);ISP_ADDRL = (unsigned char)(add&0xff);// 对STC89C51系列来说,每次要写入0x46,再写入0xB9,ISP/IAP才会生效ISP_TRIG = 0x46; ISP_TRIG = 0xB9;_nop_();ISP_Disable();return (ISP_DATA);
}/*********************************************************/
// 往单片机内部EEPROM写一个字节,从0x2000地址开始
/*********************************************************/
void EEPROM_Write(unsigned int add,unsigned char ch)
{ISP_CONTR = 0x83;ISP_CMD = 0x02;ISP_ADDRH = (unsigned char)(add>>8);ISP_ADDRL = (unsigned char)(add&0xff);ISP_DATA = ch;ISP_TRIG = 0x46;ISP_TRIG = 0xB9;_nop_();ISP_Disable();
}/*********************************************************/
// 擦除单片机内部EEPROM的一个扇区
// 写8个扇区中随便一个的地址,便擦除该扇区,写入前要先擦除
/*********************************************************/
void Sector_Erase(unsigned int add)
{ISP_CONTR = 0x83;ISP_CMD = 0x03;ISP_ADDRH = (unsigned char)(add>>8);ISP_ADDRL = (unsigned char)(add&0xff);ISP_TRIG = 0x46;ISP_TRIG = 0xB9;_nop_();ISP_Disable();
}/*********************************************************/
// 毫秒级的延时函数,time是要延时的毫秒数
/*********************************************************/
void DelayMs(uint time)
{uint i,j;for(i=time;i>0;i--)for(j=112;j>0;j--);
}/*********************************************************/
// 1602液晶写命令函数,cmd就是要写入的命令
/*********************************************************/
void LcdWriteCmd(uchar cmd)
{ LcdRs_P = 0;LcdRw_P = 0;LcdEn_P = 0;P0=cmd;DelayMs(2);LcdEn_P = 1; DelayMs(2);LcdEn_P = 0;
}/*********************************************************/
// 1602液晶写数据函数,dat就是要写入的命令
/*********************************************************/
void LcdWriteData(uchar dat)
{LcdRs_P = 1; LcdRw_P = 0;LcdEn_P = 0;P0=dat;DelayMs(2);LcdEn_P = 1; DelayMs(2);LcdEn_P = 0;
}/*********************************************************/
// 1602液晶初始化函数
/*********************************************************/
void LcdInit()
{LcdWriteCmd(0x38); // 16*2显示,5*7点阵,8位数据口LcdWriteCmd(0x0C); // 开显示,不显示光标LcdWriteCmd(0x06); // 地址加1,当写入数据后光标右移LcdWriteCmd(0x01); // 清屏
}/*********************************************************/
// 液晶光标定位函数
/*********************************************************/
void LcdGotoXY(uchar line,uchar column)
{// 第一行if(line==0) LcdWriteCmd(0x80+column); // 第二行if(line==1) LcdWriteCmd(0x80+0x40+column);
}