哈理工荣 单片机课设基于DS1302的实时时钟显示_第1页
哈理工荣 单片机课设基于DS1302的实时时钟显示_第2页
哈理工荣 单片机课设基于DS1302的实时时钟显示_第3页
哈理工荣 单片机课设基于DS1302的实时时钟显示_第4页
哈理工荣 单片机课设基于DS1302的实时时钟显示_第5页
已阅读5页,还剩19页未读 继续免费阅读

下载本文档

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

文档简介

1、哈 尔 滨 理 工 大 学 荣 成 学 院单片机原理课程设计题目:基于DS1302的实时时钟显示班级: 姓名: 学号: 年 月 号目录一、 题目简介二、 实现方案三、 电路SCH图四、 软件流程图五、 软件设计源程序六、 心得体会七、 参考文献一、题目简介本文采用单片机控制系统的基础上综合应用时钟芯片DSI302和Proteus软件。单片机是一个基本微型计算机,由AT89C52单片机一个芯片通过简单的电路连接,便可组成最小的应用系统,利用集成在单片机内部的接口,实现并行,串行数据传输,定时计数控制,中断等功能,从而完成一定检测控制功能。希望通过研究与设计了解DS1302芯片的内部结构,工作方式

2、,各引脚功能及I/O接口的使用,用LCD显示器代替显示器代替指针显示进而显示时间,减小了计时误差,这种表有时、分、秒显示时间的功能,还可以进行时和分的校时,片选的灵活性好。二、实现方案基于DS1302的电子万年历设计一、 系统硬件电路图的设计按照系统设计功能的要求,初步确定设计系统由主控模块,时钟模块,存储模块,键盘接口模块,显示模块和闹铃模块共6个模块组成。主控芯片使用52系列STC89S52单片机,时钟芯片使用美国DALLAS公司推出的一种高性能,地功耗,带RAM的时钟芯片DS1302作为主要计时芯片,可以做到计时准确。更重要的是,DS1302可以在很小电流的后备下继续计时,并可编程选择多

3、种充电电流来对后备电源进行慢速充电,可以保证后备电源基本不耗电。二、 系统核心部分-闪电存储器件STC89C511、 STC89C51具有下列主要性能:8KB可编程序Flash存储器全静态工作:0HZ24MHZ三级程序存储器保密128 X 8 字节内部RAM32条可编程序I/O线2个16位定时器/计数器6个中断源可编程序串行口片内时钟振荡器2、 AT89C51的引脚及其功能AT89C51的管脚(1)主要电源引脚 (a)VCC电源端 (b)GND接地线(2)外接晶体引脚XTAL1和XTAL2(a)XTAL1:在单片机内部,它是构成片内振荡器的反相放大器的输入端。当采用外部振荡器时,该引脚接收振荡

4、器的信号,即把此信号直接接到内部时钟发生器的输入端。(b)XTAL2:它是上诉振荡器的反相放大器的输出端。采用外部振荡器时,此引脚悬浮不连接。(3)控制或与其它电源复用引脚RST、ALE/PROG/PSEN/EA/VPP(a)RST:复位输入端(b)ALE/PROG:当访问外部存储器时,ALE(地址锁存允许)的输出用于锁存地址的低位字节。(c)PSEN:程序存储允许输出是外部程序存储器的读选通信号。(d)EA/VPP:外部访问允许端。(4)输入/输出引脚 P0.0 P0.7,P1.0 P1.7,P2.0 P2.7和 P3.0 P3.7 (a)PO端口(P0.0 P0.7) (b)P1端口(P1

5、.0 P1.7) (c)P2端口(P2.0 P2.7) (d)P3端口(P3.0 P3.7)3、 DS1302时钟电路(1) DS1302的性能特征a、实时时钟,可对秒、分、时、日、周、月以及带闰年补偿的年进行比较。b、用于高速数据暂存的31X8位RAM。c、最少引脚的串行I/O。d、2.5-5.5V电压工作范围。e、2.5V时耗小于300mA。f、用于时钟或RAM数据读写的单字节或多字节数据传输方式。g、简单的3线接口。h、可选的慢速充电(至VCC1)的能力。(2)DS1302数据操作原理 DS1302在任何数据传送时必须先初始化,把RST脚置为高电平,然后把8位地址和命令字装入移位寄存器,

6、数据在SCLK的上升沿被输入。无论是读周期还是写周期,开始8位指令40个寄存器中哪个被访问到。在开始8个时钟周期,把命令字节装入移位寄存器之后,另外的时钟周期在读操作时输出数据,在写操作时写入数据。时钟脉冲的个数在单字节方式下为8加8,再多字节方式下为8加字节数,最大可达248字节数。24软件流程图一、时间程序的设计流程图二、时间程序的设计流程图三、 闹钟程序程序设计流程图五.软件设计源程序#include<reg51.h>#include<intrins.h>#define uchar unsigned char #define uint unsigned int#d

7、efine LCDIO P0sbit led=P36;sbit ge=P23;sbit shi=P24;sbit bai=P35;sbit qian=P34;sbit rs=P25; sbit rd=P26;sbit lcden=P27;sbit BEEP=P37;sbit menu=P20; /菜单sbit add=P22; /加一sbit dec=P21; /减一 uchar second,minute,hour,day,month,year,week,count=0; uchar second1,minute1,hour1; uchar ReadValue,num,time; uchar

8、 shi1;uchar fen1;uchar miao1;uchar shi2; uchar fen2;uchar miao2; uchar codetable=" 2013-12-01 MON "uchar code table1=" 12:00:00"uchar code table2= "THUFRISATSUNMONTUEWED"uchar code table3=" clock "uchar code table4=" 00:00:00"sbit DATA=P15; sbit RST=

9、P16; sbit SCLK=P13; void delay(uint z)uint x,y;for(x=z;x>0;x-)for(y=110;y>0;y-);void delay1(uint z)for(;z>0;z-);void delay2(uint z)uint x,y;for(x=z;x>0;x-)for(y=50;y>0;y-);/蜂鸣器程序void di()uchar i;for(i=0;i<20;i+)BEEP=0;delay2(10);BEEP=1;delay2(10); void write_com(uchar com)rs=0;rd=0

10、;lcden=0;LCDIO=com;delay(5);lcden=1;delay(5);lcden=0;void write_date(uchar date)rs=1;rd=0;lcden=0;LCDIO=date;delay(5);lcden=1;delay(5);lcden=0;void init()uchar num;lcden=0;qian=0;bai=0;shi=0;ge=0;led=0;write_com(0x38);write_com(0x0c);write_com(0x06);write_com(0x01);write_com(0x80);delay(5);write_com

11、(0x80);for(num=0;num<15;num+)write_date(tablenum);delay(5);write_com(0x80+0x40);for(num=0;num<10;num+)write_date(table1num);delay(5); void Write1302(uchar dat)uchar i; SCLK=0; /拉低SCLK,为脉冲上升沿写入数据做好准备delay1(2); /等待一会,for(i=0;i<8;i+) /连续写8个二进制位数据 DATA=dat&0x01; /取出dat的第0位数据写入1302delay(2);

12、/等待一会,是硬件做好准备SCLK=1; /上升沿写入数据delay1(2); /等待一会,是硬件做好准备SCLK=0; /重新拉低SCLK,形成脉冲dat>>=1; /将dat的各位数据位右移一位,准备写入下一个数据位void WriteSet1302(uchar Cmd,uchar dat)RST=0; /禁止数据传递SCLK=0; /确保写数据前SCLK被拉低RST=1; /启动数据传输delay1(2); /等一会做好硬件准备Write1302(Cmd); /写入命令字Write1302(dat); /写数据SCLK=1; /将时钟电平置于已知状态RST=0; /禁止数据传

13、输uchar Read1302(void)uchar i,dat;delay(2); /等一会做好硬件准备for(i=0;i<8;i+) /连续读8个二进制位数据dat>>=1; /将dat的各数据位右移1位,因为先读出的字节的最低位if(DATA=1) /如果读出的数据是1dat|=0x80; /将1取出,写在dat的最高位SCLK=1; /将SCLK置于高电平,为下降沿读出delay1(2); /稍微等待SCLK=0; /拉低SCLK,形成下降沿delay1(2); /稍微等待 return dat; /将读出的数据返回uchar ReadSet1302(uchar Cm

14、d)uchar dat;RST=0; /拉低RSTSCLK=0; /确保写数据前SCLK被拉低RST=1; /启动数据传输Write1302(Cmd); /写入命令字dat=Read1302(); /读出数据SCLK=1; /将时钟电平置于已知状态RST=0; /禁止数据传输return dat; /将读出的数据返回void Init_DS1302(void) WriteSet1302(0x8E,0x00); /根据写状态寄存器命令字,写入不保护指令WriteSet1302(0x80,(0/10)<<4|(0%10); /根据写秒寄存器命令字,写入秒的初始值WriteSet1302

15、(0x82,(0/10)<<4|(20%10); /根据写分寄存器命令字,写入分的初始值WriteSet1302(0x84,(12/10)<<4|(12%10); /根据写小时寄存器命令字,写入小时的初始值WriteSet1302(0x86,(01/10)<<4|(01%10); /根据写日寄存器命令字,写入日的初始值WriteSet1302(0x88,(11/10)<<4|(12%10); /根据写月寄存器命令字,写入月的初始值WriteSet1302(0x8c,(11/10)<<4|(13%10); /nianWriteSet13

16、02(0x8a,(4/10)<<4|(4%10);void DisplaySecond(uchar x)uchar i,j; i=x/10;j=x%10;write_com(0xca); write_date(0x30+i); write_date(0x30+j); void DisplayMinute(uchar x)uchar i,j; i=x/10;j=x%10; write_com(0xc7); write_date(0x30+i); write_date(0x30+j); void DisplayHour(uchar x)uchar i,j; i=x/10;j=x%10;

17、write_com(0xc4); write_date(0x30+i); write_date(0x30+j); void DisplayDay(uchar x)uchar i,j; i=x/10;j=x%10; write_com(0x89); write_date(0x30+i); write_date(0x30+j); void DisplayMonth(uchar x)uchar i,j; i=x/10;j=x%10; write_com(0x86); write_date(0x30+i); write_date(0x30+j); void DisplayYear(uchar x)uc

18、har i,j; i=x/10;j=x%10; write_com(0x83); write_date(0x30+i);write_date(0x30+j); void DisplayWeek(uchar x)uchar i;x=x*3;write_com(0x8c); for(i=0;i<3;i+)write_date(table2x);x+; void read_date(void)ReadValue = ReadSet1302(0x81); second=(ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);ReadVal

19、ue = ReadSet1302(0x83); minute=(ReadValue&0x70)>>4)*10 + (ReadValue&0x0F); ReadValue = ReadSet1302(0x85); hour=(ReadValue&0x70)>>4)*10 + (ReadValue&0x0F); ReadValue = ReadSet1302(0x87); day=(ReadValue&0x70)>>4)*10 + (ReadValue&0x0F); ReadValue = ReadSet1302(

20、0x89); month=(ReadValue&0x70)>>4)*10 + (ReadValue&0x0F); ReadValue = ReadSet1302(0x8d); year=(ReadValue&0x70)>>4)*10 + (ReadValue&0x0F); ReadValue=ReadSet1302(0x8b); /读星期week=ReadValue&0x07;DisplaySecond(second); DisplayMinute(minute); DisplayHour(hour); DisplayDay(da

21、y); DisplayMonth(month); DisplayYear(year); DisplayWeek(week); void turn_val(char newval,uchar flag,uchar newaddr,uchar s1num)newval=ReadSet1302(newaddr); /读取当前时间newval=(newval&0x70)>>4)*10+(newval&0x0f); /将bcd转成十进制if(flag) /判断加一还是减一 newval+;switch(s1num) case 1: if(newval>99) newva

22、l=0;DisplayYear(newval); break;case 2: if(newval>12) newval=1;DisplayMonth(newval); break;case 3: if(newval>31) newval=1;DisplayDay(newval); break;case 4: if(newval>6) newval=0;DisplayWeek(newval); break;case 5: if(newval>23) newval=0;DisplayHour(newval); break;case 6: if(newval>59) n

23、ewval=0;DisplayMinute(newval); break;case 7: if(newval>59) newval=0;DisplaySecond(newval); break;default:break; elsenewval-;switch(s1num) case 1: if(newval=0) newval=99;DisplayYear(newval); break;case 2: if(newval=0) newval=12;DisplayMonth(newval); break;case 3: if(newval=0) newval=31;DisplayDay(

24、newval); break;case 4: if(newval<0) newval=6;DisplayWeek(newval); break;case 5: if(newval<0) newval=23;DisplayHour(newval); break;case 6: if(newval<0) newval=59;DisplayMinute(newval); break;case 7: if(newval<0) newval=59;DisplaySecond(newval);break;default:break;WriteSet1302(newaddr-1),(

25、newval/10)<<4)|(newval%10); /蒋新数据写入寄存器 /键盘扫描/*void key_scan(void)uchar miao,s1num=0;uchar shi21,shi22,miao21,miao22,fen21,fen22;if(menu=0) delay(5);if(menu=0)di();while(!menu); s1num+;while(1)if(menu=0) delay(5);if(menu=0) di();while(!menu);s1num+;rd=0;miao=ReadSet1302(0x81);second=miao;WriteS

26、et1302(0x80,miao|0x80);write_com(0x0f);/光标闪烁if(s1num=1)year=ReadSet1302(0x8d); write_com(0x80+4);/年光标if(add=0)delay(3);if(add=0) di();while(!add);turn_val(year,1,0x8d,1);if(dec=0)delay(3);if(dec=0)di();while(!dec);turn_val(year,0,0x8d,1); if(s1num=2)month=ReadSet1302(0x89);write_com(0x80+7);/月光标if(a

27、dd=0)delay(3);if(add=0) di();while(!add);turn_val(month,1,0x89,2);if(dec=0)delay(3);if(dec=0) di();while(!dec);turn_val(month,0,0x89,2);if(s1num=3)day=ReadSet1302(0x87);write_com(0x80+10);/日光标if(add=0)delay(3);if(add=0) di();while(!add);turn_val(day,1,0x87,3);if(dec=0)delay(3);if(dec=0)di();while(!d

28、ec);turn_val(day,0,0x87,3);/写入日寄存器if(s1num=4) week=ReadSet1302(0x8b);write_com(0x80+14);/星期光标if(add=0)delay(3);if(add=0) di();while(!add);turn_val(week,1,0x8b,4);if(dec=0)delay(3);if(dec=0) di();while(!dec);turn_val(week,0,0x8b,4);if(s1num=5)hour=ReadSet1302(0x85);write_com(0x80+0x40+5);/时光标if(add=0

29、)delay(3);if(add=0) di();while(!add);turn_val(hour,1,0x85,5);if(dec=0)delay(3);if(dec=0) di();while(!dec);turn_val(hour,0,0x85,5);if(s1num=6)/调时间分 minute=ReadSet1302(0x83);write_com(0x80+0x40+8);if(add=0)delay(5);if(add=0) di();while(!add);turn_val(minute,1,0x83,6);/写入分寄存器 if(dec=0)delay(3);if(dec=0

30、) di();while(!dec);turn_val(minute,0,0x83,6);/写入分寄存器 if(s1num=7)/调整时间秒second=ReadSet1302(0x81);write_com(0x80+0x40+11);/秒光标if(add=0)delay(3);if(add=0) di();while(!add);if(second=0x60)second=0x00;turn_val(second,1,0x81,7);if(dec=0)delay(3);if(dec=0) di();while(!dec);turn_val(second,0,0x81,7);if(s1num

31、=8)miao=ReadSet1302(0x81);second=miao;WriteSet1302(0x80,second&0x7f);s1num=0;/s1num清零/write_com(0x0c);/光标不闪烁/break;if(add=0) /naozhong while(1)write_com(0x80);for(num=0;num<15;num+)write_date(table3num);delay(5);write_com(0x80+0x40+4);/时光标write_date(shi21+0x30);write_com(0x80+0x40+5);/时光标writ

32、e_date(shi22+0x30);write_com(0x80+0x40+7);/FEN光标write_date(fen21+0x30);write_com(0x80+0x40+8);/write_date(fen22+0x30); write_com(0x80+0x40+10);/miao光标write_date(miao21+0x30);write_com(0x80+0x40+11);/write_date(miao22+0x30);s1num=4;delay(5);if(add=0)di();while(!add); s1num+;while(1)if(add=0) delay(5)

33、;if(add=0) di();while(!add);s1num+;rd=0;shi1=ReadSet1302(0x81);second1=miao1;/ WriteSet1302(0x80,miao1|0x80);write_com(0x0f);/光标闪烁if(s1num=5)write_com(0x80+0x40+5);/时光标if(dec=0)delay(3);if(dec=0) di();while(!dec);shi2+;if(shi2=24)shi2=0;shi21=shi2/10;shi22=shi2%10;write_com(0x80+0x40+4);/时光标write_da

34、te(shi21+0x30);write_com(0x80+0x40+5);/时光标write_date(shi22+0x30);if(menu=0)delay(3);if(menu=0) di();while(!menu);shi2-;if(shi2=255)shi2=23;shi21=shi2/10;shi22=shi2%10;write_com(0x80+0x40+4);/时光标write_date(shi21+0x30);write_com(0x80+0x40+5);/时光标write_date(shi22+0x30);if(s1num=6)/调时间分 write_com(0x80+0

35、x40+8);if(dec=0)delay(5);if(dec=0) di();while(!add);fen2+;if(fen2=60)fen2=0;fen21=fen2/10;fen22=fen2%10;write_com(0x80+0x40+7);/FEN光标write_date(fen21+0x30);write_com(0x80+0x40+8);/write_date(fen22+0x30);/写入分寄存器 if(menu=0)delay(5);if(menu=0) di();while(!menu);fen2-;if(fen2=255)fen2=59;fen21=fen2/10;f

36、en22=fen2%10;write_com(0x80+0x40+7);/FEN光标write_date(fen21+0x30);write_com(0x80+0x40+8);/write_date(fen22+0x30);/写入分寄存器 if(s1num=7)/调整时间秒write_com(0x80+0x40+11);/秒光标if(dec=0)delay(3);if(dec=0) di();while(!dec);miao2+;if(miao2=60)miao2=0;miao21=miao2/10;miao22=miao2%10;write_com(0x80+0x40+10);/miao光标write_date(miao21+0x30);write_com(0x80+0x40

温馨提示

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

评论

0/150

提交评论