DS1302+LCD1602时钟.docx

上传人:b****4 文档编号:5502372 上传时间:2022-12-17 格式:DOCX 页数:19 大小:474.89KB
下载 相关 举报
DS1302+LCD1602时钟.docx_第1页
第1页 / 共19页
DS1302+LCD1602时钟.docx_第2页
第2页 / 共19页
DS1302+LCD1602时钟.docx_第3页
第3页 / 共19页
DS1302+LCD1602时钟.docx_第4页
第4页 / 共19页
DS1302+LCD1602时钟.docx_第5页
第5页 / 共19页
点击查看更多>>
下载资源
资源描述

DS1302+LCD1602时钟.docx

《DS1302+LCD1602时钟.docx》由会员分享,可在线阅读,更多相关《DS1302+LCD1602时钟.docx(19页珍藏版)》请在冰豆网上搜索。

DS1302+LCD1602时钟.docx

DS1302+LCD1602时钟

DS1302+LCD1602时钟

1.实验目的效果:

做一个不怕掉电的LCD显示时钟。

学习DS1302时钟芯片的读写,加强字符型液晶LCD1602的应用。

在LCD屏上显示格式:

2

0

0

7

-

0

4

-

0

2

W

e

e

k

1

T

i

m

e

:

2

0

:

2

5

:

2

3

 

1)按一下SW1进入时间调整,关标会闪烁

2)按一下SW2光标会在年份上闪烁,表明可以对年份进行调整,接着按SW3年份将加一,按SW4年份将减一;

2)再按一下SW2,光标闪烁移到月份上,同样按SW3月份加一,按SW4月份减一;

3)再按一下SW2,光标有下移到星期上,同样按SW3星期加一,按SW4星期减一;

4)同样的道理可以调整时,分,秒。

5)调整完毕按一下SW1,光标闪烁退出,时间调整结束。

DS1302:

1)读写时序:

 

2)DS1302相关寄存器:

(详细DS1302资料请查看ds1302.pdf文档)

2.原理图:

DS1302连接原理图

LCD1602连接原理图

3.实验板上操作:

1)用三个短路冒将SCLK-P3.5,I/O-P3.6,CE-P3.7短接起来。

2)将板上的相应拨码开关拨到拨到ON上。

(建议把原来做过数码管显示的那个拨码开关全部拨到OFF那边)

3)把LCD1602液晶插到实验板上的LCD1602液晶插槽上。

(提示:

程序烧进单片机后,液晶上没有显示,请调节板子上左上角那个电位器)

4)按一下SW1进入时间调整,关标会闪烁

按一下SW2光标会在年份上闪烁,表明可以对年份进行调整,接着按SW3年份将加一,按SW4年份将减一;

再按一下SW2,光标闪烁移到月份上,同样按SW3月份加一,按SW4月份减一;

再按一下SW2,光标有下移到星期上,同样按SW3星期加一,按SW4星期减一;

同样的道理可以调整时,分,秒。

调整完毕按一下SW1,光标闪烁退出,时间调整结束。

 

4.实物连接图如下:

5.C语言程序:

#include"AT89X51.h"

#include"intrins.h"

#defineHIGH1

#defineLOW0

#defineTRUE1

#defineZERO0

#defineMSB0x80

#defineLSB0x01

//ds1302PreDefinition

#defineDS1302_WP0x8E

#defineDS1302_RESETRST=LOW;SCL=LOW;RST=HIGH

#defineDS1302_WP_ENABLEWrite_Ds1302(DS1302_WP,0X00)

#defineDS1302_WP_DISENABLEWrite_Ds1302(DS1302_WP,0x00)

#defineLCDPORTP0

sbitSCL=P3^5;//DS1302Serial-ClockInputpin5

sbitSDA=P3^6;//DS1302Serial-DataInputpin6

sbitRST=P3^7;//DS1302Chip-SecletInputpin7

sbitRS=P1^0;

sbitRW=P1^1;

sbitEN=P1^2;

codeunsignedcharset_rtc_code[7]={0x07,0x03,0x29,0x02,0x21,0x07,0x40};

codeunsignedcharwrite_rtc_address[7]={0x8c,0x88,0x86,0x8a,0x84,0x82,0x80};

codeunsignedcharread_rtc_address[7]={0x8d,0x89,0x87,0x8b,0x85,0x83,0x81};

unsignedcharread_rtc_code[7];//DS1302读出信息(年份,星期,时间)暂存数组,

 

/********1ms延时子程序***********/

delay_nms(unsignedintn)

{

unsignedinti;

unsignedcharj;

for(i=0;i

for(j=0;j<120;j++)

;//空操作

}

//*************LCD1602驱动程序***************************//

voidlcd_delay(unsignedchardelaytime)

{

while(delaytime)delaytime--;

}

voidwrite_lcd_command(unsignedcharwrite_command)

{

lcd_delay(40);

RS=0;

RW=0;

LCDPORT=write_command;

EN=1;

EN=0;

}

voidwrite_lcd_data(unsignedcharwrite_data)

{

lcd_delay(40);

RS=1;

RW=0;

LCDPORT=write_data;

EN=1;

EN=0;

}

voidLCD_write_char(unsignedx,unsignedchary,unsignedchardat)//x表示行,y表示该行的位置(也就是列)

{

//LCD_set_xy(x,y);

switch(x)

{

case0:

write_lcd_command(0x80+y);

break;

case1:

write_lcd_command(0xc0+y);

break;

}

//LCD_en_dat(dat);

write_lcd_data(dat|0x30);//dat或上0x30,就时把数字0123456789转换成ASIIC码

}

voidlcd_displaystr(unsignedcharx,unsignedchary,unsignedcharcode*str)

{

switch(x)

{

case0:

write_lcd_command(0x80+y);

break;

case1:

write_lcd_command(0xc0+y);

break;

}

while(*str)

{

write_lcd_data(*str);

str++;

}

}

voidinitial_lcd1602(void)//初始化LCD1602

{

unsignedchari;

EN=0;

for(i=200;i>0;i--)

lcd_delay(248);

write_lcd_command(0x38);

for(i=4;i>0;i--)

lcd_delay(248);

write_lcd_command(0x38);

for(i=4;i>0;i--)

lcd_delay(248);

write_lcd_command(0x0f);

for(i=4;i>0;i--)

lcd_delay(248);

write_lcd_command(0x06);

for(i=4;i>0;i--)

lcd_delay(248);

write_lcd_command(0x01);

for(i=4;i>0;i--)

lcd_delay(248);

}

//********************lcd1602驱动程序到此完********************//

/////////////////////////////////////////////////////////////////////

//**************ds1302读写程序*************************//

voidWrite_Ds1302_Byte(unsignedchartemp)//写一个字节

{

unsignedchari;

for(i=0;i<8;i++)

{

SCL=LOW;

SDA=temp&LSB;

temp>>=1;

SCL=HIGH;

}

}

/****************************************************************************/

voidWrite_Ds1302(unsignedcharaddress,unsignedchardat)//写ds1302

{

DS1302_RESET;

Write_Ds1302_Byte(address);

Write_Ds1302_Byte(dat);

RST=LOW;

}

/****************************************************************************/

unsignedcharRead_Ds1302(unsignedcharaddress)//读ds1302

{

unsignedchari,temp=0x00,temp_temp;

DS1302_RESET;

Write_Ds1302_Byte(address);

for(i=0;i<8;i++)

{

if(SDA)

temp|=0x80;

SCL=LOW;

temp>>=1;

SCL=HIGH;

}

RST=LOW;

temp_temp=temp/16;

temp=temp%16;

temp=temp+temp_temp*10;

return(temp);

}

/****************************************************************************/

voidRead_RTC(void)//读出DS1302里的相关信息,存放在read_rtd_code[]数组中

{

unsignedchari,*p;

p=read_rtc_address;

for(i=0;i<7;i++)

{

read_rtc_code[i]=Read_Ds1302(*p);

p++;

}

}

/***********************************************************************/

voidSet_RTC(void)//初始化设置DS1302

{

unsignedchari,*p;

p=write_rtc_address;

for(i=0;i<7;i++)

{

Write_Ds1302(*p,set_rtc_code[i]);

p++;

}

}

/******************************************************/

voidinitial_ds1302(void)//初始化ds1302

{

DS1302_WP_ENABLE;

Set_RTC();

}

/**************ds1302读写程序到此完************************/

///////////////////////////////////////////////////

//系统初始化

voidsystem_initial(void)

{

initial_ds1302();

initial_lcd1602();

}

/****************************************************************************/

 

voidmain(void)

{

unsignedcharcount,staus;

system_initial();

//输出显示

lcd_displaystr(0,0x00,"20");

delay_nms(10);

lcd_displaystr(0,0x04,"-");

delay_nms(10);

lcd_displaystr(0,0x07,"-");

lcd_displaystr(0,0x0b,"Week:

");

lcd_displaystr(1,0x00,"Time:

");

lcd_displaystr(1,0x07,":

");

lcd_displaystr(1,0x0a,":

");

while

(1)

{

//按键扫描,实现对时间的调整,对应实验板的独立按钮

//开始时间设置,staus=1

if(P2_0==0)

{

delay_nms(10);

if(P2_0==0)

{

staus^=1;

count=0;

while(P2_0==0);

}

}

if(P2_1==0)

{

delay_nms(10);

if(P2_1==0)

{

count++;//光标移位

if(count==8)

count=1;

while(P2_1==0);

}

}

if(P2_2==0)//加按钮

{

delay_nms(10);

if(P2_2==0)

{

switch(count)

{

case0x01:

read_rtc_code[0]++;

DS1302_WP_ENABLE;

Write_Ds1302(write_rtc_address[0],(read_rtc_code[0]+(read_rtc_code[0]/10)*6));

LCD_write_char(0,0x02,(read_rtc_code[0]/10));//年十位

LCD_write_char(0,0x03,(read_rtc_code[0]%10));//年个位

break;

case0x02:

read_rtc_code[1]++;

if(read_rtc_code[1]==13)

read_rtc_code[1]=1;

DS1302_WP_ENABLE;

Write_Ds1302(write_rtc_address[1],(read_rtc_code[1]+(read_rtc_code[1]/10)*6));

LCD_write_char(0,0x05,(read_rtc_code[1]/10));//月十位

LCD_write_char(0,0x06,(read_rtc_code[1]%10));//月个位

break;

case0x03:

read_rtc_code[2]++;

if(read_rtc_code[2]==31)

read_rtc_code[2]=1;

DS1302_WP_ENABLE;

Write_Ds1302(write_rtc_address[2],(read_rtc_code[2]+(read_rtc_code[2]/10)*6));

LCD_write_char(0,0x08,(read_rtc_code[2]/10));//日十位

LCD_write_char(0,0x09,(read_rtc_code[2]%10));//日个位

break;

case0x04:

read_rtc_code[3]++;

if(read_rtc_code[3]==8)

read_rtc_code[3]=1;

DS1302_WP_ENABLE;

Write_Ds1302(write_rtc_address[3],(read_rtc_code[3]+(read_rtc_code[3]/10)*6));

LCD_write_char(0,0x0f,(read_rtc_code[3]%10));//星期

break;

case0x05:

read_rtc_code[4]++;

if(read_rtc_code[4]==25)

read_rtc_code[4]=0;

DS1302_WP_ENABLE;

Write_Ds1302(write_rtc_address[4],(read_rtc_code[4]+(read_rtc_code[4]/10)*6));

LCD_write_char(1,0x05,(read_rtc_code[4]/10));//时十位

LCD_write_char(1,0x06,(read_rtc_code[4]%10));//时个位

break;

case0x06:

read_rtc_code[5]++;

if(read_rtc_code[5]==60)

read_rtc_code[5]=0;

DS1302_WP_ENABLE;

Write_Ds1302(write_rtc_address[5],(read_rtc_code[5]+(read_rtc_code[5]/10)*6));

LCD_write_char(1,0x08,(read_rtc_code[5]/10));//分十位

LCD_write_char(1,0x09,(read_rtc_code[5]%10));//分个位

break;

case0x07:

read_rtc_code[6]++;

if(read_rtc_code[6]==60)

read_rtc_code[6]=0;

DS1302_WP_ENABLE;

Write_Ds1302(write_rtc_address[6],(read_rtc_code[6]+(read_rtc_code[6]/10)*6));

LCD_write_char(1,0x0b,(read_rtc_code[6]/10));//秒十位

LCD_write_char(1,0x0c,(read_rtc_code[6]%10));//秒个位

break;

 

default:

break;

}

while(P2_2==0);

}

}

if(P2_3==0)//减按钮

{

delay_nms(10);

if(P2_3==0)

{

switch(count)

{

case0x01:

if(read_rtc_code[0]==0)

{

lcd_displaystr(0,0x00,"19");

read_rtc_code[0]=99;

}

else

read_rtc_code[0]--;

DS1302_WP_ENABLE;

Write_Ds1302(write_rtc_address[0],(read_rtc_code[0]+(read_rtc_code[0]/10)*6));

LCD_write_char(0,0x02,(read_rtc_code[0]/10));//年十位

LCD_write_char(0,0x03,(read_rtc_code[0]%10));//年个位

break;

case0x02:

if(read_rtc_code[1]==1)

read_rtc_code[1]=12;

else

read_rtc_code[1]--;

DS1302_WP_ENABLE;

Write_Ds1302(write_rtc_address[1],(read_rtc_code[1]+(read_rtc_code[1]/10)*6));

LCD_write_char(0,0x05,(read_rtc_code[1]/10));//月十位

LCD_write_char(0,0x06,(read_rtc_code[1]%10));//月个位

break;

case0x03:

if(read_rtc_code[2]==1)

read_rtc_code[2]=30;

else

read_rtc_code[2]--;

DS1302_WP_ENABLE;

Write_Ds1302(write_rtc_address[2],(read_rtc_code[2]+(read_rtc_code[2]/10)*6));

LCD_write_char(0,0x08,(read_rtc_code[2]/10));//日十位

LCD_write_char(0,0x09,(read_rtc_code[2]%10));//日个位

break;

case0x04:

if(read_rtc_code[3]==1)

read_rtc_code[3]=7;

else

read_rtc_code[3]--;

DS1302_WP_ENABLE;

Write_Ds1302(write_rtc_address[3],(read_rtc_code[3]+(read_rtc_code[3]/10)*6));

LCD_write_char(0,0x0f,(read_rtc_code[3]%10));//星期

break;

case0x05:

if(read_rtc_code[4]==0)

read_rtc_code[4]=24;

else

read_rtc_code[4]--;

DS1302_WP_ENABLE;

Write_Ds1302(write_rtc_address[4],(read_rtc_code[4]+(read_rtc_code[4]/10)*6));

LCD_write_char(1,0x05,(read_rtc_code[4]/10));//时十位

LCD_write_char(1,0x06,(read_rtc_code[4]%10));//时个位

break;

case0x06:

if(read_rtc_code[5]==00)

read_rtc_code[5]=59;

else

read_rtc_code[5]--;

DS1302_WP_ENABLE;

Write_Ds

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

当前位置:首页 > 医药卫生

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1