【002】基于51单片机的电子万年历proteus仿真设计

一、资料内容(私信获取

  • (1)、基于51单片机的电子万年历proteus仿真设计一份;
  • (2)、基于51单片机的电子万年历proteus仿真设计keli源代码一份;
  • (3)、基于51单片机的电子万年历Altium designer 的原理图一份;
  • (4)、基于51单片机的电子万年历proteus仿真设计的课程报告一份;
  • (5)、基于51单片机的电子万年历proteus仿真设计视频讲解一份;

二、设计要求

  1. 要求以51系列单片机为核心,设计一款电子万年历;
  2. 系统需要采用LCD1602屏幕显示相关数据;
  3. 系统要求可以显示公历日期(年、月、日)、时间(时、分、秒)、星期,并且以上数据可以通过按键更改设置;
  4. 系统可以通过LCD1602显示平年和润年;
  5. 系统需要含有闹钟功能,并且闹钟时间可以通过用户设定;

三、相关资料截图

 

 

 

四、视频讲解

私信获取全部内容 

部分源代码

#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-59


uchar 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); 
}

  • 6
    点赞
  • 48
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 10
    评论
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

B站小邓子分享官

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值