基于DS1302数字钟_第1页
基于DS1302数字钟_第2页
基于DS1302数字钟_第3页
基于DS1302数字钟_第4页
基于DS1302数字钟_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、单片机原理实验考试报告题 目:基于DS1302数字钟姓 名:学 号:班 级:专 业:电子信息工程指导老师:提交时间:基于DS1302数字钟摘要:本设计选取串行接口时钟芯片 DS1302 与单片机同步通信构成数字时钟电 路。其简单的三线接口能为单片机节省大量资源,DS1302 的后背电源及对后背 电源进行涓细电流充电的能力保证电路断电后仍能保存时间和数据信息等。 这些 优点解决了目前常用的实时时钟所无法解决的问题。 该时钟电路强大的功能和优 越的性能,在很多领域的应用中,尤其是某些自动化控制、长时间无人看守的测 控系统等对时钟精确性和可靠性有较高要求的场合,具有很高的使用价值。关键词: AT89

2、C52 LCD1602 DS1302数字钟1. 引言从古代的滴漏更鼓到近代的机械钟,从电子表到目前的数字时钟,为了准确的测量和记录时间,人们一直在努力改进着计时工具。钟表的数字化,大力推动了计时的精确性和可靠性。在单片机构成的装置中,实时时钟是必不可少的部件。目前常用的实时时钟,很 多采用单片机的中断服务来实现,这种方式一方面需要采用计数器,占用硬件资源,另一方面需要设置中断、查询等,同样耗费单片机的资源,而且某些测控系统可能不允许;有的则使用并行接口的时钟芯片,如 MC146818、DS12887 等,它们虽然能满足单片机系统 对实时时钟的要求,但是这些芯片与单片机接口复杂,占用地址、数据总

3、线多,芯片体积大,占用空间多,给其它设计带来诸多不便。本设计选取串行接口时钟芯片DS1302与单片机同步通信构成数字时钟电路。其简单的三线接口能为单片机节省大量资源,DS1302 的 后背电源及对后背电源进行涓细电流充电的能力保证电路断电后仍能保存时间和数据信息等。这些优点解决了目前常用的实时时钟所无法解决的问题。该时钟电路强大的功能和优越的性能,在很多领域的应用中,尤其是某些自动化控制、长时间无人看守的测控系统等对时钟精确性和可靠性有较高要求的场合,具有很高的使用价值。2. 原理2.1 DS1302DS1302的引脚功能如图所示:DS1302控制字:控制字节最高有效位(位7)必须是逻辑1,如

4、果它为0,则不能把数据写入到DS1302中。位6如果为0,则表示存取日历时钏娄据,为1表示存取RAM数据;位5至位1指示操作单元的地址;最低有效位(位0)如为0表示要进行写操作,为1表示进行读操作,控制字节总是从最低位开始输出。DS1302的复位引脚:通过把RST输入驱动置高电平来启动所有的数据传送。RST输入有两种功能:首先,RST接通控制逻辑,允许地址/命令序列送入移位寄存器;其次,RST提供了终止单字节或多字节数据的传送手段。当RST为高电平时,所有的数据传送被初始化,允许对DS1302进行操作。如果在传送过程中置RST为低电平,则会终止此次数据传送,并且I/O引脚变为高阴态。上电运行时

5、,在Vcc2.5V之前,RST必须保持低电平。只有在SCLK为低电平时,才能将RST置为高电平。DS1302的数据输入与输出:在控制指令字输入后的下一个SCLK时钟的上升沿时数据被写入DS1302,数据输入从低位即位0开始。同样,在紧跟8位的控制指令字后的下一个SCLK脉冲的下降沿读出DS1302的数据,读出数据时从低位0至高位7,数据读写时序如下图:DS1302寄存器:DS1302共有12个寄存器,其中有7个寄存器与日历、时钟相关,存放的数据为BCD码形式。此外,DS1302还有年份寄存器、控制寄存器、充电寄存器、时钟突发寄存器及与RAM相关的寄存器等。2.2 LCD1602接口信号说明:基

6、本操作时序:读状态:输入: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的静态逻辑操作,并支持两种软件可

7、选的节电工作模式。空闲方式停止CPU的工作,但通话RAM,定时/计数器,串行通信口及中断系统继续工作。掉电方式保存RAM中的内容,但振荡器停止工作并禁止其它所有部件工作直到下一个硬件复位。引脚功能说明:Vcc:电源电压GND:地P0口:P0口是一组8位漏极开中型双向I/O口,也即地址/数据总线复用口。作为输出口用时,每位能吸收电流的方式驱动8个TTL逻辑门电路,对端口P0写“1”时,可作为高阻抗输入端用。P1口、P2口、P3口:是一组带内部上拉电阻的8位双向I/O口,其输出缓冲级可驱动(吸收或输出电流)4个TTL逻辑门电路。对端口写“1”,通过内部的上拉电阻把端口拉到高电平,此时可作输入口。作

8、输入口使用时,因为内部存在上拉电阻某个引脚被外部信号拉低时会输出一个电流。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. 电路4. 程序#include

9、<reg52.h>sbit 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#define ds

10、1302_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 lcd16

11、02_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 - - &

12、quot;unsigned char code table2=" : :"unsigned charcodetable_week3="MON","TUE","WED","THU","FRI","SAT","SUN"unsigned char days=31,29,31,30,31,30,31,31,30,31,30,31;/每月天数void ds1302_init();/函数声明void delayus(unsigned char te

13、mp);void delayms(unsigned char temp);void ds1302_write_byte(unsigned char dat);unsigned char ds1302_read_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(u

14、nsigned char date);void lcd1602_write_com(unsigned char com);void lcd1602_init();void lcd1602_write(unsigned 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;

15、TH0=(65536-20000)/256;EA=1;ET0=1;TR0=1;ds1302_init();lcd1602_init();void ds1302_init() /初始化DS1302ds1302_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(d

16、s1302_month_write,0x06);ds1302_write(ds1302_week_write,0x01);ds1302_write(ds1302_year_write,0x12);void lcd1602_init()/初始化lcd1602unsigned 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;n&l

17、t;10;n+) /初始化显示格式lcd1602_write_data(table1n);delayus(5);lcd1602_write_com(0xc0);for(n=0;n<10;n+)lcd1602_write_data(table2n);delayus(5);void delayus(unsigned char temp) /延时微秒for( ;temp>0;temp-);void delayms(unsigned char temp) /延时毫秒unsigned char i,j;for(i=0;i<temp;i+)for(j=0;j<120;j+);voi

18、d ds1302_write_byte(unsigned char dat) /向ds1302写一个字节unsigned char n;delayus(2);for(n=0;n<8;n+)SCLK=0;DAT=dat&0x01;/从低位开始写入delayus(2);SCLK=1;/产生上升延delayus(2);dat>>=1;unsigned char ds1302_read_byte( ) /从ds1302读一个字节unsigned char n,dat=0;SCLK=1;delayus(2);for(n=0;n<8;n+)dat>>=1; /从

19、低位开始SCLK=0;/产生下降沿delayus(2);if(DAT=1)dat|=0x80;SCLK=1;delayus(2);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);RST=0;unsigned char ds1302_read(unsigned char address)/从ds1302指定地址寄存器读出数据unsi

20、gned char dat;RST=0;SCLK=0;RST=1;ds1302_write_byte(address);dat=ds1302_read_byte( );RST=0;return dat;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(unsigne

21、d char date) /向lcd1602写数据rs=1;rw=0;P0=date;lcden=1;delayus(5);lcden=0;void lcd1602_write_com(unsigned char com) /向lcd1602写指令rs=0;rw=0;P0=com;lcden=1;delayus(5);lcden=0;void lcd1602_write(unsigned char address,char date) /在lcd1602指定位置写数据char shiwei,gewei;lcd1602_write_com(0x80+address);shiwei=date/10

22、;gewei=date%10;lcd1602_write_data(0x30+shiwei);lcd1602_write_data(0x30+gewei);lcd1602_write_com(0x80+address);void lcd1602_write_week(char week) /lcd1602显示星期unsigned char n;lcd1602_write_com(0x80+lcd1602_week);for(n=0;n<3;n+) lcd1602_write_data(table_weekweek-1n);void lcd1602_display() /lcd1602刷新

23、数据hour=ds1302_read_data(ds1302_hour_read);minute=ds1302_read_data(ds1302_minute_read);second=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_

24、write(lcd1602_year,year);lcd1602_write(lcd1602_month,month);lcd1602_write(lcd1602_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)|

25、(nian%100=0)&&(nian/100%4=0)days1=29;else days1=28;void timer0() interrupt 1 /定时器0中断函数TL0=(65536-20000)%256;TH0=(65536-20000)/256;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_wri

26、te,(second/10)<<4)|(second%10); /取消DS1302暂停,进入正常工作nummode=0;switch(nummode)case 0: lcd1602_write_com(0x0c); break;/不显示光标case 1: ds1302_write(ds1302_second_write,(second/10)<<4)|(second%10)|0x80); lcd1602_write_com(0x80+lcd1602_year-2); /定位到年 lcd1602_write_com(0x0f); break;case 2: ds1302_

27、write(ds1302_second_write,(second/10)<<4)|(second%10)|0x80); lcd1602_write_com(0x80+lcd1602_month); /定位到月 lcd1602_write_com(0x0f); break; case 3: ds1302_write(ds1302_second_write,(second/10)<<4)|(second%10)|0x80); lcd1602_write_com(0x80+lcd1602_date); /定位到日 lcd1602_write_com(0x0f); break

28、; case 4: ds1302_write(ds1302_second_write,(second/10)<<4)|(second%10)|0x80); lcd1602_write_com(0x80+lcd1602_week); /定位到星期 lcd1602_write_com(0x0f); break; case 5: ds1302_write(ds1302_second_write,(second/10)<<4)|(second%10)|0x80); lcd1602_write_com(0x80+lcd1602_hour); /定位到时 lcd1602_write

29、_com(0x0f); break; case 6: ds1302_write(ds1302_second_write,(second/10)<<4)|(second%10)|0x80); lcd1602_write_com(0x80+lcd1602_minute); /定位到分 lcd1602_write_com(0x0f); break; case 7: ds1302_write(ds1302_second_write,(second/10)<<4)|(second%10)|0x80); lcd1602_write_com(0x80+lcd1602_second);

30、 /定位到秒 lcd1602_write_com(0x0f); break;if(nummode&&add=0)delayms(10);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)<<4)|(year%10); break;case 2:month+; if(month=13)month=1; lcd1602_write(lc

31、d1602_month,month); ds1302_write(ds1302_month_write,(month/10)<<4)|(month%10); break;case 3:date+; if(date>daysmonth-1)date=1; lcd1602_write(lcd1602_date,date); ds1302_write(ds1302_date_write,(date/10)<<4)|(date%10); break;case 4:week+; if(week=8)week=1; lcd1602_write_week(week); ds13

32、02_write(ds1302_week_write,week); break;case 5:hour+; if(hour=24)hour=0; lcd1602_write(lcd1602_hour,hour); ds1302_write(ds1302_hour_write,(hour/10)<<4)|(hour%10); break;case 6:minute+; if(minute=60)minute=0; lcd1602_write(lcd1602_minute,minute); ds1302_write(ds1302_minute_write,(minute/10)<

33、<4)|(minute%10); break;case 7:second+; if(second=60)second=0; lcd1602_write(lcd1602_second,second); ds1302_write(ds1302_second_write,(second/10)<<4)|(second%10)|0x80); break;if(nummode&&sub=0)delayms(10);if(sub=0)while(sub=0);switch(nummode)case 1:year-; if(year=0)year=99; lcd1602_write(lcd1602_year,year); ds1302_write(ds1302_year_write,(year/10)<<4)|(year%10); break;case 2:month-; if(month=0)month=12; lcd1602_write(lcd1602_month,month); ds1302_wr

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论