基于51单片机的实时时间显示程序.docx
《基于51单片机的实时时间显示程序.docx》由会员分享,可在线阅读,更多相关《基于51单片机的实时时间显示程序.docx(46页珍藏版)》请在冰点文库上搜索。
![基于51单片机的实时时间显示程序.docx](https://file1.bingdoc.com/fileroot1/2023-6/5/4e50c14a-d2ad-437b-a72d-9d9a593d356d/4e50c14a-d2ad-437b-a72d-9d9a593d356d1.gif)
基于51单片机的实时时间显示程序
#include
#include
#defineLCD1602_4PINS
#defineucharunsignedchar
#defineuintunsignedint
#defineLCD1602_DATAPINSP0
voidLcd1602_Delay1ms(uintc);//误差0us
/*LCD1602写入8位命令子函数*/
voidLcdWriteCom(ucharcom);
/*LCD1602写入8位数据子函数*/
voidLcdWriteData(uchardat);
/*LCD1602初始化子程序*/
voidLcdInit();
voidLcdDisplay();
voidDs1302Write(ucharaddr,uchardat);
ucharDs1302Read(ucharaddr);
voidDs1302Init();
voidDs1302Readtime();
voidkeydown();
voidadress_up();
voidadress_down();
voiddate_up();
voiddate_down();
voidtime_up();
voidtime_down();
//---加入全局变量--//
externuchartime[7];//加入全局变量
sbitLCD1602_E=P2^7;
sbitLCD1602_RW=P2^5;
sbitLCD1602_RS=P2^6;
sbitDSIO=P3^4;
sbitRST=P3^5;
sbitSCLK=P3^6;
sbitkey0=P2^0;
sbitkey1=P2^1;
sbitkey2=P2^2;
sbitkey3=P2^3;
sbitkey4=P2^4;
ucharcodeREAD_RTC_ADDR[7]={0x81,0x83,0x85,0x87,0x89,0x8b,0x8d};
ucharcodeWRITE_RTC_ADDR[7]={0x80,0x82,0x84,0x86,0x88,0x8a,0x8c};
uchartime[7]={0,0x30,0x20,0x18,0x12,0x04,0x14},num,num1;
unsignedintadress;
/*******************************************************************************
*函数名:
main
*函数功能:
主函数
*输入:
无
*输出:
无
*******************************************************************************/
voidLcd1602_Delay1ms(uintc)//误差0us
{
uchara,b;
for(;c>0;c--)
{
for(b=199;b>0;b--)
{
for(a=1;a>0;a--);
}
}
}
voidDs1302Write(ucharaddr,uchardat)
{
ucharn;
RST=0;
_nop_();
SCLK=0;//先将SCLK置低电平。
_nop_();
RST=1;//然后将RST(CE)置高电平。
_nop_();
for(n=0;n<8;n++)//开始传送八位地址命令
{
DSIO=addr&0x01;//数据从低位开始传送
addr>>=1;
SCLK=1;//数据在上升沿时,DS1302读取数据
_nop_();
SCLK=0;
_nop_();
}
for(n=0;n<8;n++)//写入8位数据
{
DSIO=dat&0x01;
dat>>=1;
SCLK=1;//数据在上升沿时,DS1302读取数据
_nop_();
SCLK=0;
_nop_();
}
RST=0;//传送数据结束
_nop_();
}
/*******************************************************************************
*函数名:
Ds1302Read
*函数功能:
读取一个地址的数据
*输入:
addr
*输出:
dat
*******************************************************************************/
ucharDs1302Read(ucharaddr)
{
ucharn,dat,dat1;
RST=0;
_nop_();
SCLK=0;//先将SCLK置低电平。
_nop_();
RST=1;//然后将RST(CE)置高电平。
_nop_();
for(n=0;n<8;n++)//开始传送八位地址命令
{
DSIO=addr&0x01;//数据从低位开始传送
addr>>=1;
SCLK=1;//数据在上升沿时,DS1302读取数据
_nop_();
SCLK=0;//DS1302下降沿时,放置数据
_nop_();
}
_nop_();
for(n=0;n<8;n++)//读取8位数据
{
dat1=DSIO;//从最低位开始接收
dat=(dat>>1)|(dat1<<7);
SCLK=1;
_nop_();
SCLK=0;//DS1302下降沿时,放置数据
_nop_();
}
RST=0;
_nop_();//以下为DS1302复位的稳定时间,必须的。
SCLK=1;
_nop_();
DSIO=0;
_nop_();
DSIO=1;
_nop_();
returndat;
}
/*******************************************************************************
*函数名:
Ds1302Init
*函数功能:
初始化DS1302.
*输入:
无
*输出:
无
*******************************************************************************/
voidDs1302Init()
{
ucharn;
Ds1302Write(0x8E,0X00);//禁止写保护,就是关闭写保护功能
for(n=0;n<7;n++)//写入7个字节的时钟信号:
分秒时日月周年
{
Ds1302Write(WRITE_RTC_ADDR[n],time[n]);
}
Ds1302Write(0x8E,0x80);//打开写保护功能
}
/*******************************************************************************
*函数名:
Ds1302Readtime
*函数功能:
读取时钟信息
*输入:
无
*输出:
无
*******************************************************************************/
voidDs1302Readtime()
{
ucharn;
for(n=0;n<7;n++)//读取7个字节的时钟信号:
分秒时日月周年
{
time[n]=Ds1302Read(READ_RTC_ADDR[n]);
}
}
voidLcdWriteCom(ucharcom)//写入命令
{
LCD1602_E=0;//使能
LCD1602_RS=0;//选择发送命令
LCD1602_RW=0;//选择写入
LCD1602_DATAPINS=com;//放入命令
Lcd1602_Delay1ms
(1);//等待数据稳定
LCD1602_E=1;//写入时序
Lcd1602_Delay1ms(5);//保持时间
LCD1602_E=0;
}
voidLcdWriteData(uchardat)//写入数据
{
LCD1602_E=0;//使能清零
LCD1602_RS=1;//选择输入数据
LCD1602_RW=0;//选择写入
LCD1602_DATAPINS=dat;//写入数据
Lcd1602_Delay1ms
(1);
LCD1602_E=1;//写入时序
Lcd1602_Delay1ms(5);//保持时间
LCD1602_E=0;
}
voidLcdInit()//LCD初始化子程序
{
LcdWriteCom(0x38);//开显示
LcdWriteCom(0x0c);//开显示不显示光标
LcdWriteCom(0x06);//写一个指针加1
LcdWriteCom(0x01);//清屏
LcdWriteCom(0x80);//设置数据指针起点
num1=0;
}
voidmain()
{
LcdInit();
Ds1302Init();
while
(1)
{
keydown();
if(num1==0)
{
Ds1302Readtime();
LcdDisplay();
}
}
}
/*******************************************************************************
*函数名:
LcdDisplay()
*函数功能:
显示函数
*输入:
无
*输出:
无
*******************************************************************************/
voidLcdDisplay()
{
LcdWriteCom(0x80+0X40);
LcdWriteData('0'+time[2]/16);//时
LcdWriteData('0'+(time[2]&0x0f));
LcdWriteData(':
');
LcdWriteData('0'+time[1]/16);//分
LcdWriteData('0'+(time[1]&0x0f));
LcdWriteData(':
');
LcdWriteData('0'+time[0]/16);//秒
LcdWriteData('0'+(time[0]&0x0f));
LcdWriteCom(0x80);
LcdWriteData('2');
LcdWriteData('0');
LcdWriteData('0'+time[6]/16);//年
LcdWriteData('0'+(time[6]&0x0f));
LcdWriteData('-');
LcdWriteData('0'+time[4]/16);//月
LcdWriteData('0'+(time[4]&0x0f));
LcdWriteData('-');
LcdWriteData('0'+time[3]/16);//日
LcdWriteData('0'+(time[3]&0x0f));
LcdWriteCom(0x8D);
switch(time[5]&0x0f)
{
case
(1):
LcdWriteData('M');LcdWriteData('o');LcdWriteData('n');break;
case
(2):
LcdWriteData('T');LcdWriteData('u');LcdWriteData('e');break;
case(3):
LcdWriteData('W');LcdWriteData('e');LcdWriteData('d');break;
case(4):
LcdWriteData('T');LcdWriteData('h');LcdWriteData('u');break;
case(5):
LcdWriteData('F');LcdWriteData('r');LcdWriteData('i');break;
case(6):
LcdWriteData('S');LcdWriteData('a');LcdWriteData('t');break;
case(7):
LcdWriteData('S');LcdWriteData('u');LcdWriteData('n');break;
}
LcdWriteCom(0x0c);
}
voidkeydown()
{
if(key0==0)
{
Lcd1602_Delay1ms(10);
if(key0==0)
{
adress=0x80+0x48;
if(num1==0)
{Ds1302Write(0x8e,0x00);
Ds1302Write(0x80,0x80);
LcdWriteCom(adress);
LcdWriteCom(0x0f);
num1++;
}
else
{
Ds1302Init();
LcdWriteCom(adress);
LcdWriteCom(0x0C);
num1--;
}
while(!
key0);
}
}
if(key1==0)
{
Lcd1602_Delay1ms(10);
if(key1==0)
{
adress_down();
while(key1==0);
}
}
if(key2==0)
{
Lcd1602_Delay1ms(10);
if(key2==0)
{
adress_up();
while(key2==0);
}
}
if(key3==0)
{
Lcd1602_Delay1ms(10);
if(key3==0)
{
date_down();
time_down();
while(key3==0);
}
}
if(key4==0)
{
Lcd1602_Delay1ms(10);
if(key4==0)
{
date_up();
time_up();
while(key4==0);
}
}
}
voidadress_up()
{
if(adress==0x80+0x48)
{
adress=0x80+0x48;
}
elseif(adress==0x8d)
{
adress=0x80+0x48;
}
else
{
adress=adress+1;
}
LcdWriteCom(adress);
}
voidadress_down()
{
if(adress==0x80+0x40)
{
adress=0x80;
}
elseif(adress==0x80)
{
adress=0x80;
}
elseif(adress==0x89)
{
adress=0x8d;
}
else
{
adress=adress-1;
}
LcdWriteCom(adress);
}
voiddate_up()
{
unsignedcharnian,yue,n;
switch(adress)
{
case(0x82):
n=time[6]/16;
if(n!
=9)
{
time[6]=time[6]+0x10;
n=n+1;
LcdWriteData('0'+n);
LcdWriteCom(0x82);
}
else
{
time[6]=time[6]&0x0f;
n=0;
LcdWriteData('0');
LcdWriteCom(0x82);
}
break;
case(0x83):
n=time[6]&0x0f;
if(n!
=9)
{
n=n+1;
time[6]=time[6]+1;
LcdWriteData('0'+n);
LcdWriteCom(0x83);
}
else
{
time[6]=time[6]&0xf0;
n=0;
LcdWriteData('0');
LcdWriteCom(0x83);
}
break;
case(0x84):
break;
case(0x85):
n=time[4]/16;
if(n==0)
{
n=n+1;
time[4]=time[4]+0x10;
LcdWriteData('0'+n);
LcdWriteCom(0x85);
}
else
{
n=0;
time[4]=time[4]&0x0f;
LcdWriteData('0');
LcdWriteCom(0x85);
}
break;
case(0x86):
n=time[4]&0x0f;
if((time[4]/16)==0)
{
if(n!
=9)
{
n=n+1;
time[4]=time[4]+1;
LcdWriteData('0'+n);
LcdWriteCom(0x86);
}
else
{
n=1;
time[4]=(time[4]&0xf0)+1;
LcdWriteData('1');
LcdWriteCom(0x86);
}
}
else
{
if(n>2)
{
n=0;
time[4]=time[4]&0xf0;
LcdWriteData('0');
LcdWriteCom(0x86);
}
else
{
if(n!
=2)
{
n=n+1;
time[4]=time[4]+1;
LcdWriteData('0'+n);
LcdWriteCom(0x86);
}
else
{
n=0;
time[4]=time[4]&0xf0;
LcdWriteData('0');
LcdWriteCom(0x86);
}
}
}
break;
case(0x87):
break;
case(0x88):
n=time[3]/16;
if(time[4]==0x02)
{
if(n!
=2)
{
n=n+1;
time[3]=time[3]+0x10;
LcdWriteData('0'+n);
LcdWriteCom(0x88);
}
else
{
n=0;
time[3]=time[3]&0x0f;
LcdWriteData('0');
LcdWriteCom(0x88);
}
}
else
{
if(n!
=3)
{
n=n+1;
time[3]=time[3]+0x10;
LcdWriteData('0'+n);
LcdWriteCom(0x88);
}
else
{
n=0;
time[3]=time[3]&0x0f;
LcdWriteData('0');
LcdWriteCom(0x88);
}
}
break;
case(0x89):
n=time[3]&0x0f;
if(time[3]/16==0||time[3]/16==1)
{
if(time[3]/16==0)
{
if(n!
=9)
{
n=n+1;
time[3]=time[3]+1;
LcdWriteData('0'+n);
LcdWriteCom(0x89);
}
else
{
n=1;
time[3]=time[3]&0xf0+1;
LcdWriteData('1');
LcdWriteCom(0x89);
}
}
else
{
if(n!
=9)
{
n=n+1;
time[3]=time[3]+1;
LcdWriteData('0'+n);
LcdWriteCom(0x89);
}
else
{
n=0;
time[3]=time[3]&0xf0;
LcdWriteData('0');
LcdWriteCom(0x89);
}
}
}
elseif(time[3]/16==2)
{
nian=2000+time[6]/16*10+(time[6]&0x0f);
if(time[4]==0x02)
{
if(((nian%4==0&&nian%100!
=0)||nian%400==0))
{
if(n!
=9)
{
n=n+1;
time[3]=time[3]+1;
LcdWriteData('0'+n);
LcdWriteCom(0x89);
}
else
{
n=0;
time[3]=time[3]&0xf0;
LcdWriteData('0');
LcdWriteCom(0x89);
}
}
else
{
if(n>8)
{
n=0;
time[3]=time[3]&0xf0;
LcdWriteData('0');
LcdWriteCom(0x89);
}
elseif(n!
=8)
{
n=n+1;
time[3]=time[3]+1;
LcdWriteData('0'+n);
LcdWriteCom(0x89);
}
else
{
n=0;
time[3]=time[3]&0xf0;
LcdWriteData('0');
LcdWri