标题:
单片机实时时钟 仿真电路原理图程序 ds1302+lcd1602
[打印本页]
作者:
gaoweijie
时间:
2019-4-23 15:38
标题:
单片机实时时钟 仿真电路原理图程序 ds1302+lcd1602
实时时钟 仿真电路原理图程序
可以直接拿去用
0.png
(13.01 KB, 下载次数: 16)
下载附件
2019-4-23 17:53 上传
单片机源程序如下:
/*******************************************************************************
* 实验名: 用单片机实现的实时时钟系统研究
* 使用的IO:
* 实验效果 :1602显示时钟
* 注意 :
*******************************************************************************/
#include<reg51.h>
#include"lcd.h"
#include"ds1302.h"
sbit SET_KEY=P3^7;
sbit ADD_KEY=P3^6;
sbit SUB_KEY=P3^5;
sbit DETERMINE_KEY=P3^4;
unsigned char Set_Step = 0;
#define NormalRun 0
#define SetYear 1
#define SetMon 2
#define SetDay 3
#define SetHour 4
#define SetMin 5
#define SetSec 6
#define SetWeek 7
void LcdDisplay();
extern unsigned char TIME[7]; //加入全局变量
void Key_Scan();
/*******************************************************************************
* 函数名 : main
* 函数功能 : 主函数
* 输入 : 无
* 输出 : 无
*******************************************************************************/
void main()
{
Set_Step = NormalRun;
LcdInit();
//Ds1302Init();
while(1)
{
Key_Scan();
if(Set_Step == NormalRun)
{
Ds1302ReadTime();
LcdDisplay();
}
}
}
/*******************************************************************************
* 函数名 : LcdDisplay()
* 函数功能 : 显示函数
* 输入 : 无
* 输出 : 无
*******************************************************************************/
void LcdDisplay()
{
LcdWriteCom(0x80+0X40);
LcdWriteData('0'+TIME[2]/16); //时
LcdWriteData('0'+((TIME[2]%16)&0x0f));
LcdWriteData(':');
LcdWriteData('0'+TIME[1]/16); //分
LcdWriteData('0'+((TIME[1]%16)&0x0f));
LcdWriteData(':');
LcdWriteData('0'+TIME[0]/16); //秒
LcdWriteData('0'+((TIME[0]%16)&0x0f));
LcdWriteCom(0x80);
LcdWriteData('2');
LcdWriteData('0');
LcdWriteData('0'+TIME[6]/16); //年
LcdWriteData('0'+((TIME[6]%16)&0x0f));
LcdWriteData('-');
LcdWriteData('0'+TIME[4]/16); //月
LcdWriteData('0'+((TIME[4]%16)&0x0f));
LcdWriteData('-');
LcdWriteData('0'+TIME[3]/16); //日
LcdWriteData('0'+((TIME[3]%16)&0x0f));
LcdWriteCom(0x8D);
LcdWriteData('W'); //星期
if(TIME[5]==1)
LcdWriteData('7');
else
LcdWriteData('0'+((TIME[5]-1)&0x07)); //星期
}
void Key_Scan()
{
if(SET_KEY == 0)
{
Delay10us(5000);
if(SET_KEY == 0)
{
LcdWriteCom(0x0f);//显示光标
switch(Set_Step)
{
case NormalRun:
LcdWriteCom(0x83); //设置光标
Set_Step = SetYear;
break;
case SetYear:
LcdWriteCom(0x86); //设置光标
Set_Step = SetMon;
break;
case SetMon:
LcdWriteCom(0x89); //设置光标
Set_Step = SetDay;
break;
case SetDay:
LcdWriteCom(0xc1); //设置光标
Set_Step = SetHour;
break;
case SetHour:
LcdWriteCom(0xc4); //设置光标
Set_Step = SetMin;
break;
case SetMin:
LcdWriteCom(0xc7); //设置光标
Set_Step = SetSec;
break;
case SetSec:
LcdWriteCom(0x8E); //设置光标
Set_Step = SetWeek;
break;
case SetWeek:
LcdWriteCom(0x83); //设置光标
Set_Step = SetYear;
break;
}
}
}
if(Set_Step == NormalRun)
return ;
if(ADD_KEY == 0)
{
Delay10us(5000);
if(ADD_KEY == 0)
{
if(Set_Step == SetYear)
{
if(TIME[6] == 0x99)
TIME[6] = 0x0;
else
{
TIME[6]=(TIME[6]/16)*10+(TIME[6]%16);
TIME[6]=TIME[6]+1;
TIME[6]=(TIME[6]/10)*16+(TIME[6]%10);
}
LcdDisplay();
LcdWriteCom(0x83); //设置光标
}
else if(Set_Step == SetMon)
{
if(TIME[4] == 0x12)
TIME[4] = 0x1;
else
{
TIME[4]=(TIME[4]/16)*10+(TIME[4]%16);
TIME[4]=TIME[4]+1;
TIME[4]=(TIME[4]/10)*16+(TIME[4]%10);
}
LcdDisplay();
LcdWriteCom(0x86); //设置光标
}
else if(Set_Step == SetDay)
{
TIME[3]=(TIME[3]/16)*10+(TIME[3]%16);
TIME[3]=TIME[3]+1;
TIME[3]=(TIME[3]/10)*16+(TIME[3]%10);
LcdDisplay();
LcdWriteCom(0x89); //设置光标
}
else if(Set_Step == SetHour)
{
if(TIME[2] == 0x23)
TIME[2] = 0x0;
else
{
TIME[2]=(TIME[2]/16)*10+(TIME[2]%16);
TIME[2]=TIME[2]+1;
TIME[2]=(TIME[2]/10)*16+(TIME[2]%10);
}
LcdDisplay();
LcdWriteCom(0xc1); //设置光标
}
else if(Set_Step == SetMin)
{
if(TIME[1] == 0x59)
TIME[1] = 0x0;
else
{
TIME[1]=(TIME[1]/16)*10+(TIME[1]%16);
TIME[1]=TIME[1]+1;
TIME[1]=(TIME[1]/10)*16+(TIME[1]%10);
}
LcdDisplay();
LcdWriteCom(0xc4); //设置光标
}
else if(Set_Step == SetSec)
{
if(TIME[0] == 0x59)
TIME[0] = 0x0;
else
{
TIME[0]=(TIME[0]/16)*10+(TIME[0]%16);
TIME[0]=TIME[0]+1;
TIME[0]=(TIME[0]/10)*16+(TIME[0]%10);
}
LcdDisplay();
LcdWriteCom(0xc7); //设置光标
}
else if(Set_Step == SetWeek)
{
if(TIME[5] == 7)
TIME[5] = 1;
else
TIME[5] = TIME[5]+1;
LcdDisplay();
LcdWriteCom(0x8E); //设置光标
}
}
}
if(SUB_KEY == 0)
{
Delay10us(5000);
if(SUB_KEY == 0)
{
if(Set_Step == SetYear)
{
if(TIME[6] == 0x00)
TIME[6] = 0x99;
else
{
TIME[6]=(TIME[6]/16)*10+(TIME[6]%16);
TIME[6]=TIME[6]-1;
TIME[6]=(TIME[6]/10)*16+(TIME[6]%10);
}
LcdDisplay();
LcdWriteCom(0x83); //设置光标
}
else if(Set_Step == SetMon)
{
if(TIME[4] == 0x01)
TIME[4] = 0x12;
else
{
TIME[4]=(TIME[4]/16)*10+(TIME[4]%16);
TIME[4]=TIME[4]-1;
TIME[4]=(TIME[4]/10)*16+(TIME[4]%10);
}
LcdDisplay();
LcdWriteCom(0x86); //设置光标
}
else if(Set_Step == SetDay)
{
TIME[3]=(TIME[3]/16)*10+(TIME[3]%16);
TIME[3]=TIME[3]-1;
TIME[3]=(TIME[3]/10)*16+(TIME[3]%10);
LcdDisplay();
LcdWriteCom(0x89); //设置光标
}
else if(Set_Step == SetHour)
{
if(TIME[2] == 0x00)
TIME[2] = 0x23;
else
{
TIME[2]=(TIME[2]/16)*10+(TIME[2]%16);
TIME[2]=TIME[2]-1;
TIME[2]=(TIME[2]/10)*16+(TIME[2]%10);
}
LcdDisplay();
LcdWriteCom(0xc1); //设置光标
}
else if(Set_Step == SetMin)
{
if(TIME[1] == 0x00)
TIME[1] = 0x59;
else
{
TIME[1]=(TIME[1]/16)*10+(TIME[1]%16);
TIME[1]=TIME[1]-1;
TIME[1]=(TIME[1]/10)*16+(TIME[1]%10);
}
……………………
…………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
实时时钟.rar
(318.13 KB, 下载次数: 23)
2019-4-23 15:37 上传
点击文件名下载附件
仿真电路原理图
下载积分: 黑币 -5
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1