51单片机ds1302时钟报告概述_第1页
51单片机ds1302时钟报告概述_第2页
51单片机ds1302时钟报告概述_第3页
51单片机ds1302时钟报告概述_第4页
51单片机ds1302时钟报告概述_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

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

文档简介

1、杭州电子科技大学信息工程学院杭州电子科技大学信息工程学院单片机课程设计报告项目:DS1302时钟 学生姓名 学 号 完成日期 2016年12月29日1摘要时钟在各行各业发挥着重要的作用,而它满足人们的各种需要,更显得重要,随着数字技术的迅速发展,微控制器在社会的各个领域得到了广泛的应用,由于数字系统有着模拟系统所没有的优势,如抗干扰性强、便于和PC机相联、系统易于升级维护。本设计是以单片机AT80C51和DS1302芯片控制的时间计数。利用AT80C51芯片进行低成本时钟控制系统的设计,能够简化系统构成、降低系统成本、增强系统性能、满足更多应用场合的需要。系统实现对时钟日期等在LCD上的实时显

2、示。关键词 时钟;AT80C51;DS1302;abstractThe clock plays an important role in all walks of life, and it meet the various needs of the people, the more important, with the rapid development of digital technology, micro controller has been widely used in various fields of society, because the digital system ha

3、s a simulation system has advantages, such as strong anti-interference, easy to machine and PC. The system is easy to maintain and upgrade.This design is based on single-chip microcomputer AT80C51 and DS1302 chip control time count. The design of low cost clock control system based on AT80C51 chip c

4、an simplify the system structure, reduce the system cost, enhance the system performance and meet the needs of more applications. System to achieve real-time display of the clock date on the LCD.Keywords: clock; AT80C51; DS1302;第一章 绪论1.1时钟模块的介绍 1.1.1 DS1302简介DS1302 是美国DALLAS公司推出的一种高性能、低功耗、带RAM的实时时钟电

5、路,它可以对年、月、日、周、时、分、秒进行计时,具有闰年补偿功能,工作电压为2.0V5.5V。采用三线接口与CPU进行同步通信,并可采用突发方式一次传送多个字节的时钟信号或RAM数据。DS1302内部有一个31×8的用于临时性存放数据的RAM寄存器。DS1302是DS1202的升级产品,与DS1202兼容,但增加了主电源/后备电源双电源引脚,同时提供了对后备电源进行涓细电流充电的能力。1.1.2 DS1302结构DS1302的引脚排列,其中Vcc2为主电源,VCC1为后备电源。在主电源关闭的情况下,也能保持时钟的连续运行。DS1302由Vcc1或Vcc2两者中的较大者供电。当Vcc2

6、大于Vcc1+0.2V时,Vcc2给DS1302供电。当Vcc2小于Vcc1时,DS1302由Vcc1供电。X1和X2是振荡源,外接32.768kHz晶振。RST是复位/片选线,通过把RST输入驱动置高电平来启动所有的数据传送。RST输入有两种功能:首先,RST接通控制逻辑,允许地址/命令序列送入移位寄存器;其次,RST提供终止单字节或多字节数据传送的方法。当RST为高电平时,所有的数据传送被初始化,允许对DS1302进行操作。如果在传送过程中RST置为低电平,则会终止此次数据传送,I/O引脚变为高阻态。上电运行时,在Vcc>2.0V之前,RST必须保持低电平。只有在SCLK为低电平时,

7、才能将RST置为高电平。I/O为串行数据输入输出端(双向),后面有详细说明。SCLK为时钟输入端。 下图为DS1302的引脚功能图:图1 Ds1302引脚口1.2单片机概述单片微型计算机的诞生是计算机发展史上的一个新的里程碑。近年来,随着技术的发展和进步,以及市场对产品功能和性能的要求不断提高,直流电动机的应用更加广泛,尤其是在智能机器人中的应用。直流电动机的起动和调速性能、过载能力强等特点显得十分重要,为了能够适应发展的要求,单闭环直流电动机的调速控制系统得到了很大的发展。而作为单片嵌入式系统的核心单片机,正朝着多功能、多选择、高速度、低功耗、低价格、大存储容量和强I/O功能等方向发展。随着

8、计算机档次的不断提高,功能的不断完善,单片机已越来越广泛地应用在各种领域的控制、自动化、智能化等方面,特别是在直流电动机的调速控制系统中。这是因为单片机具有很多优点:体积小,功能全,抗干扰能力强,可靠性高,结构合理,指令丰富,控制功能强,造价低等。所以选用单片机作为控制系统的核心以提高整个系统的可靠性和可行性。本设计的80C51单片机属于MCS-51系列单片机,由Intel公司开发,其结构是8048的延伸,改进了8048的缺点,增加了如乘(MUL)、除(DIV)、减(SUBB)、比较(CMP)、16位数据指针、布尔代数运算等指令,以及串行通信能力和5个中断源。采用40引脚双列直插式DIP(Du

9、al In Line Package),内有128个RAM单元及4K的ROM。图2 80C51单片机引脚口第2章 总体方案2.1系统框架设计方案说明:时钟系统以80C51单片机为控制核心,由输入模块、LCD显示模块及时钟电路组成。采用独立式键盘作为命令的输入,单片机在程序控制下,定时读取DS1302的片内数据,完成年、月、日、小时、分钟、秒的实时显示。图3 系统框架设计2.2设计思路时钟系统的主要功能包括:实现对时间的显示,时间的调整,能够很方便的实现时间系统控制。程序启动后,由DS1302的初始化,LCD1602的初始化后进入主循环,主循环由扫描按键,读取时间,显示三部分构成。第3章 系统硬

10、件设计3.1 单片机控制模块本设计采用protues仿真,80C51单片机的VCC、GND、XTAL1、XTAL2、RST、EA脚均没有接外部电路,也可使用图4 80C51电路的设计3.2 DS1302模块本设计采用protues仿真,DS1302的X1、X2、GND脚没有接外部电路,即可使用图5 DS1302电路的设计3.3 LCD显示模块本设计采用protues仿真,LCD1602的Vcc、VEE、VDD、VSS、GND脚没有接外部电路,即可使用图6 LCD1602电路的设计3.1 独立键盘控制模块本设计采用protues仿真,共有5个按键,分别对应不同功能,如下表:本设计中有5个独立式按

11、键,具体功能如下:I/O口按键具体功能P3.0K1开启时间修改P3.1K2时间位选加P3.2K3时间位选减P3.3K4时间加P3.7K5时间减表1 独立按键功能图7 独立按键电路的设计结论通过本次实验设计,使我们学到了许多书本上无法学到的知识,也使我们深刻体会到单片机技术应用领域的广泛。不仅让我们对学过的单片机知识有了很多的巩固,同时也对单片机这一门学科产生了更大的兴趣。通过本次设计,较系统地掌握有关单片机控制的设计思想和设计方法,主要对51系列单片机的结构、功能、及内部资源,LCD显示器等的了解,并对其进行测试和加以应用的知识得到学习。附录一:总电路图附录二:程序15#include <

12、;reg51.h>#include <intrins.h>#define uchar unsigned char#define uint unsigned intsbit K1 = P30;/定义K1键sbit K2 = P31;/定义K2键 sbit K3 = P32;/定义K3键sbit K4 = P33;/P13定义K4键sbit K5 = P37;sbit BEEP=P23;/定义蜂鸣器sbit reset = P12;/P25;sbit sclk = P10;/P26;sbit io = P11;/P27;sbit LCD_RS=P35;sbit LCD_RW=P3

13、6; sbit LCD_EN=P34;uchar count_10ms;/定义10ms计数器bit K1_FLAG=0;/定义按键标志位,当按下K1键时,该位置1,K1键未按下时0。uchar disp_buf16 =0x00;/定义显示缓冲区uchar time_buf7 =0,0,0,0,0,0,0;/DS1302时间缓冲区,存放秒、分、时、日、月、星期、年uchar temp 2=0;/用来存放设置时的小时、分钟的中间值uint m=0,n=0,r=0;/*以下是函数声明*/void Delay_ms(uint xms);bit lcd_busy();void lcd_wcmd(ucha

14、r cmd);void lcd_wdat(uchar dat);void lcd_clr();void lcd_init();void write_byte(uchar inbyte);/写一字节数据函数声明uchar read_byte();/读一字节数据函数声明void write_ds1302(uchar cmd,uchar indata);/写DS1302函数声明uchar read_ds1302(uchar addr);/读DS1302函数声明void set_ds1302(uchar addr,uchar *p,uchar n); /设置DS1302初始时间函数声明void get

15、_ds1302(uchar addr,uchar *p,uchar n); /读当前时间函数声明void init_ds1302();/DS1302初始化函数声明/*以下是延时函数*/void Delay_ms(uint xms)uint i,j;for(i=xms;i>0;i-)/i=xms即延时约xms毫秒for(j=70;j>0;j-);/*以下是LCD忙碌检查函数*/bit lcd_busy()bit result;LCD_RS = 0;LCD_RW = 1;LCD_EN = 1;_nop_();_nop_();_nop_();_nop_();result = (bit)(

16、P0&0x80);LCD_EN = 0;return result;/*以下是写指令寄存器IR函数*/void lcd_wcmd(uchar cmd)Delay_ms(5);LCD_RS = 0;LCD_RW = 0;LCD_EN = 0;_nop_();_nop_();P0 = cmd;_nop_();_nop_();_nop_();_nop_();LCD_EN = 1;_nop_();_nop_();_nop_();_nop_();LCD_EN = 0;/*以下是写寄存器DR函数*/void lcd_wdat(uchar dat)Delay_ms(5);LCD_RS = 1;LCD

17、_RW = 0;LCD_EN = 0;P0 = dat;_nop_();_nop_();_nop_();_nop_();LCD_EN = 1;_nop_();_nop_();_nop_();_nop_();LCD_EN = 0;/*以下是LCD清屏函数*/void lcd_clr()lcd_wcmd(0x01);/清除LCD的显示内容Delay_ms(5);/*以下是LCD初始化函数*/void lcd_init()Delay_ms(15);/等待LCD电源稳定lcd_wcmd(0x38);/16*2显示,5*7点阵,8位数据Delay_ms(5);lcd_wcmd(0x38);Delay_m

18、s(5);lcd_wcmd(0x38);Delay_ms(5);lcd_wcmd(0x0c);/显示开,关光标Delay_ms(5);lcd_wcmd(0x06);/移动光标Delay_ms(5);lcd_wcmd(0x01);/清除LCD的显示内容Delay_ms(5);/*以下是写一字节数据函数*/void write_byte(uchar inbyte)uchar i;for(i=0;i<8;i+)sclk=0;/写时低电平改变数据if(inbyte&0x01)io=1;elseio=0;sclk=1;/高电平把数据写入DS1302_nop_();inbyte=inbyte

19、>>1;/*以下是读一字节数据函数*/uchar read_byte()uchar i,temp=0;io=1;for(i=0;i<7;i+)sclk=0;if(io=1)temp=temp|0x80;elsetemp=temp&0x7f;sclk=1;/产生下跳沿temp=temp>>1;return (temp);/*写DS1302函数,往DS1302的某个地址写入数据*/void write_ds1302(uchar cmd,uchar indata)sclk=0;reset=1;write_byte(cmd);write_byte(indata);

20、sclk=0;reset=0;/*读DS1302函数,读DS1302某地址的的数据*/uchar read_ds1302(uchar addr)uchar backdata;sclk=0;reset=1;write_byte(addr);/先写地址backdata=read_byte();/然后读数据sclk=0;reset=0;return (backdata);/*以下是蜂鸣器响一声函数*/void beep()BEEP=0;/蜂鸣器响Delay_ms(100);BEEP=1; /关闭蜂鸣器Delay_ms(100);/*以下是转换函数,负责将走时数据转换为适合LCD显示的数据*/void

21、 LCD_conv (uchar in7,in5,in4,in1,in2,in3 )/形参in1、in2、in3接收实参time_buf2、time_buf1、time_buf0传来的小时、分钟、秒数据disp_buf0=in1/10+0x30;/小时十位数据disp_buf1=in1%10+0x30;/小时个位数据disp_buf2=in2/10+0x30;/分钟十位数据disp_buf3=in2%10+0x30;/分钟个位数据disp_buf4=in3/10+0x30;/秒十位数据disp_buf5=in3%10+0x30;/秒个位数据disp_buf6=2+0x30;/年千位数据disp

22、_buf7=0+0x30;/年百位数据disp_buf8=in7/10+0x30;/年十位数据disp_buf9=in7%10+0x30;/年时个位数据disp_buf10=in5/10+0x30;/月十位数据disp_buf11=in5%10+0x30;/月个位数据disp_buf12=in4/10+0x30;/日十位数据disp_buf13=in4%10+0x30;/日个位数据/*以下是LCD显示函数,负责将函数LCD_conv转换后的数据显示在LCD上*/void LCD_disp ()lcd_wcmd(0x80+3);/显示第一行lcd_wdat(disp_buf6);/显示年千位lc

23、d_wdat(disp_buf7);/显示年百位lcd_wdat(disp_buf8);/显示年十位lcd_wdat(disp_buf9);/显示年个位lcd_wdat(0x3a);lcd_wdat(disp_buf10);/显示月十位lcd_wdat(disp_buf11);/显示月个位lcd_wdat(0x3a);lcd_wdat(disp_buf12);/显示日十位lcd_wdat(disp_buf13);/显示日个位lcd_wcmd(0x44 + 0x80);/从第2行第4列开始显示lcd_wdat(disp_buf0);/显示小时十位lcd_wdat(disp_buf1);/显示小时

24、个位lcd_wdat(0x3a);/显示':'lcd_wdat(disp_buf2);/显示分钟十位lcd_wdat(disp_buf3);/显示分钟个位lcd_wdat(0x3a);/显示':'lcd_wdat(disp_buf4);/显示秒十位lcd_wdat(disp_buf5);/显示秒个位/*以下是按键处理函数*/void KeyProcess()uchar miao16,min16,hour16,ri16,yue16,nian16;/定义16进制的分钟和小时变量write_ds1302(0x8e,0x00);/DS1302写保护控制字,允许写lcd_

25、wcmd(0x0f);lcd_wcmd(0x80+0x40+12);if(K2=0)Delay_ms(10);/延时去抖if(K2=0)while(!K2);m+;if(m=7)m=1;if(K3=0)Delay_ms(10);/延时去抖if(K3=0)while(!K3);m-;if(m=0)m=6;if(m!=0)if(m=1&&K4=0)Delay_ms(10);/延时去抖if(m=1&&K4=0)lcd_wcmd(0x0f);lcd_wcmd(0x80+0x40+8);while(!K4);beep();time_buf1=time_buf1+1;/分钟

26、加1if(time_buf1=60) time_buf1=0;/当分钟加到60时初始化为0min16=time_buf1/10*16+time_buf1%10;/将所得的分钟数据转变成16进制数据write_ds1302(0x82,min16);if(m=2&&K4=0)Delay_ms(10);/延时去抖if(m=2&&K4=0)lcd_wcmd(0x0f);lcd_wcmd(0x80+0x40+5);while(!K4);beep();time_buf2=time_buf2+1;/小时减1if(time_buf2=24) time_buf2=0;/当变成0时

27、初始化为24hour16=time_buf2/10*16+time_buf2%10;/将所得的小时数据转变成16进制数据write_ds1302(0x84,hour16);if(m=3&&K4=0)Delay_ms(10);/延时去抖if(m=3&&K4=0)lcd_wcmd(0x0f);lcd_wcmd(0x80+12);while(!K4);beep();time_buf3=time_buf3+1;/日减1if(time_buf3=32) time_buf3=1;/当日加到31初始化为0ri16=time_buf3/10*16+time_buf3%10;/将

28、所得的日数据转变成16进制数据write_ds1302(0x86,ri16);if(m=4&&K4=0)Delay_ms(10);/延时去抖if(m=4&&K4=0)lcd_wcmd(0x0f);lcd_wcmd(0x80+9);while(!K4);beep();time_buf4=time_buf4+1;/月加1if(time_buf4=13) time_buf4=1;/当月加到12初始化为1yue16=time_buf4/10*16+time_buf4%10;/将所得的月数据转变成16进制数据write_ds1302(0x88,yue16);if(m=5&

29、amp;&K4=0)Delay_ms(10);/延时去抖if(m=5&&K4=0)lcd_wcmd(0x0f);lcd_wcmd(0x80+6);while(!K4);beep();time_buf6=time_buf6+1;/年减1if(time_buf6=100) time_buf6=0;/当年加到100初始化为0nian16=time_buf6/10*16+time_buf6%10;/将所得的年数据转变成16进制数据write_ds1302(0x8C,nian16);if(m=6&&K4=0)Delay_ms(10);/延时去抖if(m=6&

30、;&K4=0)lcd_wcmd(0x0f);lcd_wcmd(0x80+0x40+11);while(!K4);beep();time_buf0=time_buf0+1;/秒加1if(time_buf0=60) time_buf0=0;/当秒加到60时初始化为0nian16=time_buf0/10*16+time_buf0%10;/将所得的秒数据转变成16进制数据write_ds1302(0x80,miao16);if(m=1&&K5=0)Delay_ms(10);/延时去抖if(m=1&&K5=0)lcd_wcmd(0x0f);lcd_wcmd(0x

31、80+0x40+8);while(!K5);beep();time_buf1=time_buf1-1;/分钟减1if(time_buf1=-1) time_buf1=59;/当分钟加到60时初始化为0min16=time_buf1/10*16+time_buf1%10;/将所得的分钟数据转变成16进制数据write_ds1302(0x82,min16);if(m=2&&K5=0)Delay_ms(10);/延时去抖if(m=2&&K5=0)lcd_wcmd(0x0f);lcd_wcmd(0x80+0x40+5);while(!K5);beep();time_bu

32、f2=time_buf2-1;/小时减1if(time_buf2=-1) time_buf2=23;/当小时变成0时初始化为24hour16=time_buf2/10*16+time_buf2%10;/将所得的小时数据转变成16进制数据write_ds1302(0x84,hour16);if(m=3&&K5=0)Delay_ms(10);/延时去抖if(m=3&&K5=0)lcd_wcmd(0x0f);lcd_wcmd(0x80+12);while(!K5);beep();time_buf3=time_buf3-1;/日减1if(time_buf3=0) tim

33、e_buf3=31;/当日加到60时初始化为0ri16=time_buf3/10*16+time_buf3%10;/将所得的日数据转变成16进制数据write_ds1302(0x86,ri16);if(m=4&&K5=0)Delay_ms(10);/延时去抖if(m=4&&K5=0)lcd_wcmd(0x0f);lcd_wcmd(0x80+9);while(!K5);beep();time_buf4=time_buf4-1;/月减1if(time_buf4=0) time_buf4=12;/当月加到12时初始化为0yue16=time_buf4/10*16+ti

34、me_buf4%10;/将所得的月数据转变成16进制数据write_ds1302(0x88,yue16);if(m=5&&K5=0)Delay_ms(10);/延时去抖if(m=5&&K5=0)lcd_wcmd(0x0f);lcd_wcmd(0x80+6);while(!K5);beep();time_buf6=time_buf6-1;/年减1if(time_buf6=0) time_buf6=99;/当年加到60时初始化为0nian16=time_buf6/10*16+time_buf6%10;/将所得的年数据转变成16进制数据write_ds1302(0x8

35、C,nian16);if(m=6&&K5=0)Delay_ms(10);/延时去抖if(m=6&&K5=0)lcd_wcmd(0x0f);lcd_wcmd(0x80+0x40+11);while(!K5);beep();time_buf0=time_buf0-1;/秒减1if(time_buf0=0) time_buf0=59;/当秒加到60时初始化为0nian16=time_buf0/10*16+time_buf0%10;/将所得的秒数据转变成16进制数据write_ds1302(0x80,miao16);/*以下是读取时间函数,负责读取当前的时间,并将读取到的时间转换为10进制数*/void get_time

温馨提示

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

评论

0/150

提交评论