1、DS1302+LCD1602时钟DS1302LCD1602时钟1. 实验目的效果:做一个不怕掉电的LCD显示时钟。学习DS1302时钟芯片的读写,加强字符型液晶LCD1602的应用。在LCD屏上显示格式:2007-04-02Week1Time:20:25:23 1)按一下SW1进入时间调整,关标会闪烁2)按一下SW2光标会在年份上闪烁,表明可以对年份进行调整,接着按SW3年份将加一,按SW4年份将减一;2)再按一下SW2,光标闪烁移到月份上,同样按SW3月份加一,按SW4月份减一;3)再按一下SW2,光标有下移到星期上,同样按SW3星期加一,按SW4星期减一;4)同样的道理可以调整时,分,秒。
2、5)调整完毕按一下SW1,光标闪烁退出,时间调整结束。 DS1302: 1)读写时序: 2)DS1302相关寄存器:(详细DS1302资料请查看ds1302.pdf文档)2原理图:DS1302连接原理图LCD1602连接原理图3实验板上操作:1)用三个短路冒将SCLKP3.5, I/OP3.6, CEP3.7短接起来。2)将板上的相应拨码开关拨到拨到ON上。(建议把原来做过数码管显示的那个拨码开关全部拨到OFF那边) 3)把LCD1602液晶插到实验板上的LCD1602液晶插槽上。 (提示:程序烧进单片机后,液晶上没有显示,请调节板子上左上角那个电位器) 4)按一下SW1进入时间调整,关标会闪
3、烁按一下SW2光标会在年份上闪烁,表明可以对年份进行调整,接着按SW3年份将加一,按SW4年份将减一;再按一下SW2,光标闪烁移到月份上,同样按SW3月份加一,按SW4月份减一;再按一下SW2,光标有下移到星期上,同样按SW3星期加一,按SW4星期减一;同样的道理可以调整时,分,秒。调整完毕按一下SW1,光标闪烁退出,时间调整结束。4实物连接图如下:5. C语言程序:#include AT89X51.h#include intrins.h #define HIGH 1#define LOW 0#define TRUE 1#define ZERO 0 #define MSB 0x80#defin
4、e LSB 0x01/ ds1302 PreDefinition#define DS1302_WP 0x8E#define DS1302_RESET RST=LOW;SCL=LOW;RST=HIGH#define DS1302_WP_ENABLE Write_Ds1302(DS1302_WP,0X00)#define DS1302_WP_DISENABLE Write_Ds1302(DS1302_WP,0x00)#define LCDPORT P0sbit SCL = P35;/ DS1302 Serial-Clock Input pin 5sbit SDA = P36;/ DS1302 Se
5、rial-Data Input pin 6sbit RST = P37;/ DS1302 Chip-Seclet Input pin 7sbit RS=P10;sbit RW=P11;sbit EN=P12;code unsigned char set_rtc_code7=0x07,0x03,0x29,0x02,0x21,0x07,0x40;code unsigned char write_rtc_address7=0x8c,0x88,0x86,0x8a,0x84,0x82,0x80; code unsigned char read_rtc_address7=0x8d,0x89,0x87,0x
6、8b,0x85,0x83,0x81;unsigned char read_rtc_code7; /DS1302读出信息(年份,星期,时间)暂存数组,/*1ms延时子程序*/delay_nms(unsigned int n) unsigned int i; unsigned char j; for(i=0;in;i+) for(j=0;j0;i-) lcd_delay(248); write_lcd_command(0x38); for(i=4;i0;i-) lcd_delay(248); write_lcd_command(0x38); for(i=4;i0;i-) lcd_delay(248
7、); write_lcd_command(0x0f); for(i=4;i0;i-) lcd_delay(248); write_lcd_command(0x06); for(i=4;i0;i-) lcd_delay(248);write_lcd_command(0x01); for(i=4;i0;i-) lcd_delay(248);/*lcd1602驱动程序到此完*/*ds1302读写程序*/void Write_Ds1302_Byte(unsigned char temp) /写一个字节 unsigned char i; for (i=0;i=1; SCL=HIGH; /*/void W
8、rite_Ds1302( unsigned char address,unsigned char dat ) /写ds1302 DS1302_RESET; Write_Ds1302_Byte(address); Write_Ds1302_Byte(dat); RST=LOW; /*/unsigned char Read_Ds1302 ( unsigned char address ) /读ds1302 unsigned char i,temp=0x00,temp_temp; DS1302_RESET; Write_Ds1302_Byte(address); for (i=0;i=1; SCL=
9、HIGH; RST=LOW; temp_temp=temp/16; temp=temp%16; temp=temp+temp_temp*10; return (temp);/*/void Read_RTC(void) /读出DS1302里的相关信息,存放在read_rtd_code数组中 unsigned char i,*p; p=read_rtc_address; for(i=0;i7;i+) read_rtc_codei=Read_Ds1302(*p); p+; /*/void Set_RTC(void) /初始化设置DS1302 unsigned char i,*p; p=write_r
10、tc_address; for(i=0;i7;i+) Write_Ds1302(*p,set_rtc_codei); p+; /*/void initial_ds1302(void) /初始化ds1302 DS1302_WP_ENABLE; Set_RTC(); /*ds1302读写程序到此完*/系统初始化void system_initial(void) initial_ds1302(); initial_lcd1602();/*/void main(void) unsigned char count,staus; system_initial(); /输出显示 lcd_displaystr
11、(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) /按键扫描,实现对时间的调整,对应实验板的独立按钮 /开始时间设置,staus1 if(P2_0=0) delay_nms(10); if(P2_0=0) staus=
12、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) case 0x01: read_rtc_code0+; DS1302_WP_ENABLE; Write_Ds1302(write_rtc_address0,(read_rtc_code0+(read_rtc_code0/10)*6); LCD_write_ch
13、ar(0,0x02,(read_rtc_code0/10); /年十位 LCD_write_char(0,0x03,(read_rtc_code0%10); /年个位 break; case 0x02: read_rtc_code1+; if(read_rtc_code1=13) read_rtc_code1=1; DS1302_WP_ENABLE; Write_Ds1302(write_rtc_address1,(read_rtc_code1+(read_rtc_code1/10)*6); LCD_write_char(0,0x05,(read_rtc_code1/10); /月十位 LCD
14、_write_char(0,0x06,(read_rtc_code1%10); /月个位 break; case 0x03: read_rtc_code2+; if(read_rtc_code2=31) read_rtc_code2=1; DS1302_WP_ENABLE; Write_Ds1302(write_rtc_address2,(read_rtc_code2+(read_rtc_code2/10)*6); LCD_write_char(0,0x08,(read_rtc_code2/10); /日十位 LCD_write_char(0,0x09,(read_rtc_code2%10);
15、 /日个位 break; case 0x04: read_rtc_code3+; if(read_rtc_code3=8) read_rtc_code3=1; DS1302_WP_ENABLE; Write_Ds1302(write_rtc_address3,(read_rtc_code3+(read_rtc_code3/10)*6); LCD_write_char(0,0x0f,(read_rtc_code3%10); /星期 break; case 0x05: read_rtc_code4+; if(read_rtc_code4=25) read_rtc_code4=0; DS1302_W
16、P_ENABLE; Write_Ds1302(write_rtc_address4,(read_rtc_code4+(read_rtc_code4/10)*6); LCD_write_char(1,0x05,(read_rtc_code4/10); /时十位 LCD_write_char(1,0x06,(read_rtc_code4%10); /时个位 break; case 0x06: read_rtc_code5+; if(read_rtc_code5=60) read_rtc_code5=0; DS1302_WP_ENABLE; Write_Ds1302(write_rtc_addres
17、s5,(read_rtc_code5+(read_rtc_code5/10)*6); LCD_write_char(1,0x08,(read_rtc_code5/10); /分十位 LCD_write_char(1,0x09,(read_rtc_code5%10); /分个位 break; case 0x07: read_rtc_code6+; if(read_rtc_code6=60) read_rtc_code6=0; DS1302_WP_ENABLE; Write_Ds1302(write_rtc_address6,(read_rtc_code6+(read_rtc_code6/10)*
18、6); LCD_write_char(1,0x0b,(read_rtc_code6/10); /秒十位 LCD_write_char(1,0x0c,(read_rtc_code6%10); /秒个位 break; default:break; while(P2_2=0); if(P2_3=0) /减按钮 delay_nms(10); if(P2_3=0) switch(count) case 0x01: if(read_rtc_code0=0) lcd_displaystr(0,0x00,19); read_rtc_code0=99; else read_rtc_code0-; DS1302_
19、WP_ENABLE; Write_Ds1302(write_rtc_address0,(read_rtc_code0+(read_rtc_code0/10)*6); LCD_write_char(0,0x02,(read_rtc_code0/10); /年十位 LCD_write_char(0,0x03,(read_rtc_code0%10); /年个位 break; case 0x02: if(read_rtc_code1=1) read_rtc_code1=12; else read_rtc_code1-; DS1302_WP_ENABLE; Write_Ds1302(write_rtc_
20、address1,(read_rtc_code1+(read_rtc_code1/10)*6); LCD_write_char(0,0x05,(read_rtc_code1/10); /月十位 LCD_write_char(0,0x06,(read_rtc_code1%10); /月个位 break; case 0x03: if(read_rtc_code2=1) read_rtc_code2=30; else read_rtc_code2-; DS1302_WP_ENABLE; Write_Ds1302(write_rtc_address2,(read_rtc_code2+(read_rtc
21、_code2/10)*6); LCD_write_char(0,0x08,(read_rtc_code2/10); /日十位 LCD_write_char(0,0x09,(read_rtc_code2%10); /日个位 break; case 0x04: if(read_rtc_code3=1) read_rtc_code3=7; else read_rtc_code3-; DS1302_WP_ENABLE; Write_Ds1302(write_rtc_address3,(read_rtc_code3+(read_rtc_code3/10)*6); LCD_write_char(0,0x0
22、f,(read_rtc_code3%10); /星期 break; case 0x05: if(read_rtc_code4=0) read_rtc_code4=24; else read_rtc_code4-; DS1302_WP_ENABLE; Write_Ds1302(write_rtc_address4,(read_rtc_code4+(read_rtc_code4/10)*6); LCD_write_char(1,0x05,(read_rtc_code4/10); /时十位 LCD_write_char(1,0x06,(read_rtc_code4%10); /时个位 break; case 0x06: if(read_rtc_code5=00) read_rtc_code5=59; else read_rtc_code5-; DS1302_WP_ENABLE; Write_Ds
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1