基于51单片机的实时时间显示程序.docx

上传人:b****6 文档编号:12376370 上传时间:2023-06-05 格式:DOCX 页数:46 大小:19.13KB
下载 相关 举报
基于51单片机的实时时间显示程序.docx_第1页
第1页 / 共46页
基于51单片机的实时时间显示程序.docx_第2页
第2页 / 共46页
基于51单片机的实时时间显示程序.docx_第3页
第3页 / 共46页
基于51单片机的实时时间显示程序.docx_第4页
第4页 / 共46页
基于51单片机的实时时间显示程序.docx_第5页
第5页 / 共46页
基于51单片机的实时时间显示程序.docx_第6页
第6页 / 共46页
基于51单片机的实时时间显示程序.docx_第7页
第7页 / 共46页
基于51单片机的实时时间显示程序.docx_第8页
第8页 / 共46页
基于51单片机的实时时间显示程序.docx_第9页
第9页 / 共46页
基于51单片机的实时时间显示程序.docx_第10页
第10页 / 共46页
基于51单片机的实时时间显示程序.docx_第11页
第11页 / 共46页
基于51单片机的实时时间显示程序.docx_第12页
第12页 / 共46页
基于51单片机的实时时间显示程序.docx_第13页
第13页 / 共46页
基于51单片机的实时时间显示程序.docx_第14页
第14页 / 共46页
基于51单片机的实时时间显示程序.docx_第15页
第15页 / 共46页
基于51单片机的实时时间显示程序.docx_第16页
第16页 / 共46页
基于51单片机的实时时间显示程序.docx_第17页
第17页 / 共46页
基于51单片机的实时时间显示程序.docx_第18页
第18页 / 共46页
基于51单片机的实时时间显示程序.docx_第19页
第19页 / 共46页
基于51单片机的实时时间显示程序.docx_第20页
第20页 / 共46页
亲,该文档总共46页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

基于51单片机的实时时间显示程序.docx

《基于51单片机的实时时间显示程序.docx》由会员分享,可在线阅读,更多相关《基于51单片机的实时时间显示程序.docx(46页珍藏版)》请在冰点文库上搜索。

基于51单片机的实时时间显示程序.docx

基于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

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 自然科学 > 物理

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2