1、控制字节最高有效位(位7)必须是逻辑1,如果它为0,则不能把数据写入到DS1302中。位6如果为0,则表示存取日历时钏娄据,为1表示存取RAM数据;位5至位1指示操作单元的地址;最低有效位(位0)如为0表示要进行写操作,为1表示进行读操作,控制字节总是从最低位开始输出。DS1302的复位引脚:通过把RST输入驱动置高电平来启动所有的数据传送。RST输入有两种功能:首先,RST接通控制逻辑,允许地址/命令序列送入移位寄存器;其次,RST提供了终止单字节或多字节数据的传送手段。当RST为高电平时,所有的数据传送被初始化,允许对DS1302进行操作。如果在传送过程中置RST为低电平,则会终止此次数据
2、传送,并且I/O引脚变为高阴态。上电运行时,在Vcc2.5V之前,RST必须保持低电平。只有在SCLK为低电平时,才能将RST置为高电平。DS1302的数据输入与输出:在控制指令字输入后的下一个SCLK时钟的上升沿时数据被写入DS1302,数据输入从低位即位0开始。同样,在紧跟8位的控制指令字后的下一个SCLK脉冲的下降沿读出DS1302的数据,读出数据时从低位0至高位7,数据读写时序如下图:DS1302寄存器:DS1302共有12个寄存器,其中有7个寄存器与日历、时钟相关,存放的数据为BCD码形式。此外,DS1302还有年份寄存器、控制寄存器、充电寄存器、时钟突发寄存器及与RAM相关的寄存器
3、等。2.2 LCD1602接口信号说明:基本操作时序:读状态:输入:RS=L,RW=H,E=H 输出:D0D7=状态字写指令:RS=L,RW=L,D0D7=指令码,E=高脉冲 输出:无读数据:输入:RS=H,RW=H,E=H 输出:D0D7=数据写数据:RS=H,RW=L,D0D7=数据,E=高脉冲 输出:读操作时序:写操作时序:2.3 AT89C52功能特性概述:AT89C52提供以下标准功能:8k字节Flash闪速 存储器,256字节内部RAM,32个I/O口线,3个16位定时/计数器,一个6向量两级中断结构,一个全双工串行通信口,片内振荡器及时钟电路。同时,AT89C52可降至0Hz的静
4、态逻辑操作,并支持两种软件可选的节电工作模式。空闲方式停止CPU的工作,但通话RAM,定时/计数器,串行通信口及中断系统继续工作。掉电方式保存RAM中的内容,但振荡器停止工作并禁止其它所有部件工作直到下一个硬件复位。引脚功能说明:Vcc:电源电压 GND:地P0口:P0口是一组8位漏极开中型双向I/O口,也即地址/数据总线复用口。作为输出口用时,每位能吸收电流的方式驱动8个TTL逻辑门电路,对端口P0写“1”时,可作为高阻抗输入端用。P1口、P2口、P3口:是一组带内部上拉电阻的8位双向I/O口,其输出缓冲级可驱动(吸收或输出电流)4个TTL逻辑门电路。对端口写“1”,通过内部的上拉电阻把端口
5、拉到高电平, 此时可作输入口。作输入口使用时,因为内部存在上拉电阻某个引脚被外部信号拉低时会输出一个电流。2.4 设计方案以AT89C52为主控芯片,串行时钟芯片DS1302为核心计时芯片,LCD1602为主要显示器件,组成数字时钟电路。将AT89C52的P0口分别与LCD1602的D0D7相连,P2.0接DS1302的SCKL引脚,P2.1接DS1302的RST引脚,P2.2接DS1302的I/O引脚,P2.4接LCD1602的使能端E,P2.5接LCD1602的RS引脚,P2.6接LCD1602的RW引脚。此方案中,由于仿真看不出效果,未在DS1302的备用电源VCC2端接入备用电源。3.
6、 电路4. 程序#includesbit mode = P10; /功能键sbit add = P11; /加键sbit sub = P12; /减键sbit SCLK = P20; sbit DAT = P22;sbit RST = P21;sbit lcden = P24;sbit rs = P25;sbit rw = P26;#define ds1302_second_write 0x80 #define ds1302_second_read 0x81#define ds1302_minute_write 0x82#define ds1302_minute_read 0x83#defin
7、e ds1302_hour_write 0x84#define ds1302_hour_read 0x85#define ds1302_date_write 0x86#define ds1302_date_read 0x87#define ds1302_month_write 0x88#define ds1302_month_read 0x89#define ds1302_week_write 0x8a#define ds1302_week_read 0x8b#define ds1302_year_write 0x8c#define ds1302_year_read 0x8d#define l
8、cd1602_year 3#define lcd1602_month 6#define lcd1602_date 9#define lcd1602_week 12#define lcd1602_hour 0x40+4#define lcd1602_minute 0x40+7#define lcd1602_second 0x40+10unsigned int nian;unsigned char tt,nummode,flag=0;char hour,minute,second,year,month,date,week; unsigned char code table1= 20 - - ;un
9、signed char code table2= :unsigned char code table_week3=MON,TUEWEDTHUFRISATSUN;unsigned char days=31,29,31,30,31,30,31,31,30,31,30,31; /每月天数void ds1302_init(); /函数声明void delayus(unsigned char temp);void delayms(unsigned char temp);void ds1302_write_byte(unsigned char dat);unsigned char ds1302_read_
10、byte( );void ds1302_write(unsigned char address,unsigned char dat);unsigned char ds1302_read(unsigned char address);unsigned char ds1302_read_data(unsigned char address);void lcd1602_write_data(unsigned char date);void lcd1602_write_com(unsigned char com);void lcd1602_init();void lcd1602_write(unsig
11、ned char address,char date);void lcd1602_display();void init();void keyscan();void runnian();void main() /主函数 init(); while(1) runnian(); keyscan(); void init() /整体初始化 TMOD=0x01; TL0=(65536-20000)%256; TH0=(65536-20000)/256; EA=1; ET0=1; TR0=1; ds1302_init(); lcd1602_init();void ds1302_init() /初始化DS
12、1302 ds1302_write(0x8e,0x00); /关闭写保护 ds1302_write(ds1302_second_write,0x00); /初始化时间 ds1302_write(ds1302_minute_write,0x23); ds1302_write(ds1302_hour_write,0x21); ds1302_write(ds1302_date_write,0x04); ds1302_write(ds1302_month_write,0x06); ds1302_write(ds1302_week_write,0x01); ds1302_write(ds1302_yea
13、r_write,0x12);void lcd1602_init() /初始化lcd1602 unsigned char n=0; lcden=0; lcd1602_write_com(0x38); lcd1602_write_com(0x0c); lcd1602_write_com(0x06); lcd1602_write_com(0x01); /清屏 lcd1602_write_com(0x80); delayms(10); for(n=0;n0;temp-);void delayms(unsigned char temp) /延时毫秒 unsigned char i,j; for(i=0;
14、itemp;i+) for(j=0;j=1; unsigned char ds1302_read_byte( ) /从ds1302读一个字节 unsigned char n,dat=0; SCLK=1; /从低位开始 /产生下降沿 if(DAT=1)dat|=0x80; return dat;void ds1302_write(unsigned char address,unsigned char dat) /向ds1302指定地址寄存器写入数据 RST=0; SCLK=0; RST=1; ds1302_write_byte(address); ds1302_write_byte(dat);u
15、nsigned char ds1302_read(unsigned char address) /从ds1302指定地址寄存器读出数据 unsigned char dat; dat=ds1302_read_byte( );unsigned char ds1302_read_data(unsigned char address) /将二进制BCD码转成十进制 unsigned char dat,x; dat=ds1302_read(address); x=(dat&0xf0)4)*10+(dat&0x0f); return x;void lcd1602_write_data(unsigned c
16、har date) /向lcd1602写数据 rs=1; rw=0; P0=date; lcden=1; delayus(5);void lcd1602_write_com(unsigned char com) /向lcd1602写指令 rs=0; P0=com;void lcd1602_write(unsigned char address,char date) /在lcd1602指定位置写数据 char shiwei,gewei; lcd1602_write_com(0x80+address); shiwei=date/10; gewei=date%10; lcd1602_write_da
17、ta(0x30+shiwei); lcd1602_write_data(0x30+gewei);void lcd1602_write_week(char week) /lcd1602显示星期 lcd1602_write_com(0x80+lcd1602_week);3;n+) lcd1602_write_data(table_weekweek-1n);void lcd1602_display() /lcd1602刷新数据 hour=ds1302_read_data(ds1302_hour_read); minute=ds1302_read_data(ds1302_minute_read); s
18、econd=ds1302_read_data(ds1302_second_read); week=ds1302_read_data(ds1302_week_read); year=ds1302_read_data(ds1302_year_read); date=ds1302_read_data(ds1302_date_read); month=ds1302_read_data(ds1302_month_read); lcd1602_write(lcd1602_year,year); lcd1602_write(lcd1602_month,month); lcd1602_write(lcd160
19、2_date,date); lcd1602_write_week(week); lcd1602_write(lcd1602_hour,hour); lcd1602_write(lcd1602_minute,minute); lcd1602_write(lcd1602_second,second);void runnian() /处理闰年二月天数 nian=2000+year;if(nian%4=0)&(nian%100!=0)|(nian%100=0)&(nian/100%4=0)days1=29;else days1=28;void timer0() interrupt 1 /定时器0中断函
20、数 if(nummode=0) lcd1602_display();void keyscan() /按键扫描 if(mode=0) delayms(10); /消抖 if(mode=0) while(mode=0); /等待按键松开 nummode+; if(nummode=8) ds1302_write(ds1302_second_write,(second/10)4)|(second%10); /取消DS1302暂停,进入正常工作 nummode=0; switch(nummode) case 0: break; /不显示光标 case 1: ds1302_write(ds1302_sec
21、ond_write,(second/10)4)|(second%10)|0x80); lcd1602_write_com(0x80+lcd1602_year-2); /定位到年 lcd1602_write_com(0x0f); case 2: lcd1602_write_com(0x80+lcd1602_month); /定位到月 case 3: lcd1602_write_com(0x80+lcd1602_date); /定位到日 case 4: lcd1602_write_com(0x80+lcd1602_week); /定位到星期 case 5: lcd1602_write_com(0x80+lcd1602_hour); /定位到时 case 6: lcd1602_write_com(0x80+lcd1602_minute); /定位到分 case 7: lcd1602_write_com(0x80+lcd1602_second); /定位到秒 if(nummode&add=0) if(add=0) while(add=0); switch(nummode) case 1:year+; if(year=99)year=0; lcd1602_write(lcd1602_year,year); ds1302_write(ds1302_year_write,(year/10)
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1