版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、精选文档 基于DS1302的数字时钟的设计 姓名: 学号: 专业:电子信息科学与技术 指定老师:一, 试验目的 时表作为一种定时工具被广泛的使用在生产生活的各方面。而电子钟又具有价格廉价,质量轻,定时误差小等优点,被广泛的应用在生产,生活的各个方面。本次课程设计,我利用单片机和DS1302实现数字时钟。并在设计过程中体验学习单片机设计的基本流程,提高对单片机的生疏。为毕业工作打下坚实的基础。二, 试验内容 以AT89S52为核心,结合DS1302和LCD1602,设计一个数字时钟。在液晶上实现年,月,日,时,分,秒和星期的显示,并且日期和时间都可以通过按键选择进行调整。给DS1302设置初始化
2、的时间。当选择CHG键时,可以跳转到年月日时分秒和星期处的位置,此时,通过INC键可以进行增加调整,DEC可以进行减小调整。三, 试验器件介绍 1,AT89S52 AT89S52是一种低功耗、高性能CMOS 8位微把握器,具有8K 在系统可编程Flash 存储器。使用Atmel 公司高密度非易失性存储器技术制造,与工业80C51 产品指令和引脚完全兼容。片上Flash允许程序存储器在系统可编程,亦适于常规编程器。在单芯片上,拥有灵活的8 位CPU 和在系统可编程Flash,使得AT89S52在众多嵌入式把握应用系统中得到广泛应用。 AT89S52 是一种低功耗、高性能CMOS8位微把握器,具有
3、 8K 在系统可编程Flash 存储器。使用Atmel 公司高密度非 易失性存储器技术制造,与工业80C51 产品指令和引脚完 全兼容。片上Flash允许程序存储器在系统可编程,亦适于 常规编程器。在单芯片上,拥有灵活的8 位CPU 和在系统 可编程Flash,使得AT89S52为众多嵌入式把握应用系统提 供高机敏、超有效的解决方案。 AT89S52具有以下标准功能: 8k字节Flash,256字节RAM, 32 位I/O 口线,看门狗定时器,2 个数据指针,三个16 位 定时器/计数器,一个6向量2级中断结构,全双工串行口, 片内晶振准时钟电路。另外,AT89S52 可降至0Hz 静态逻 辑
4、操作,支持2种软件可选择节电模式。空闲模式下,CPU 停止工作,允许RAM、定时器/计数器、串口、中断连续工 作。掉电爱护方式下,RAM内容被保存,振荡器被冻结, 单片机一切工作停止,直到下一个中断或硬件复位为止。 AT89S52管脚图 2,DS1302 DS1302 是美国DALLAS公司推出的一种高性能、低功耗、带RAM的实时时钟电路,它可以对年、月、日、周日、时、分、秒进行计时,具有闰年补偿功能,工作电压为2.5V5.5V。接受三线接口与CPU进行同步通信,并可接受突发方式一次传送多个字节的时钟信号或RAM数据。DS1302内部有一个318的用于临时性存放数据的RAM寄存器。DS1302
5、是DS1202的升级产品,与DS1202兼容,但增加了主电源/后备电源双电源引脚,同时供应了对后备电源进行涓细电流充电的力量。 DS1302的引脚排列,其中Vcc1为后备电源,VCC2为主电源。在主电源关闭的状况下,也能保持时钟的连续运行。DS1302由Vcc1或Vcc2两者中的较大者供电。当Vcc2大于Vcc1+0.2V时,Vcc2给DS1302供电。当Vcc2小于Vcc1时,DS1302由Vcc1供电。X1和X2是振荡源,外接32.768kHz晶振。RST是复位/片选线,通过把RST输入驱动置高电平来启动全部的数据传送。RST输入有两种功能:首先,RST接通把握规律,允许地址/命令序列送入
6、移位寄存器;其次,RST供应终止单字节或多字节数据的传送手段。当RST为高电平常,全部的数据传送被初始化,允许对DS1302进行操作。假如在传送过程中RST置为低电平,则会终止此次数据传送,I/O引脚变为高阻态。上电运行时,在Vcc2.0V之前,RST必需保持低电平。只有在SCLK为低电平常,才能将RST置为高电平。I/O为串行数据输入输出端(双向),后面有具体说明。SCLK为时钟输入端。 DS1302的管脚图 3,LCD1602 1602液晶也叫1602字符型液晶它是一种特地用来显示字母、数字、符号等的点阵型液晶模块它有若干个5X7或者5X11等点阵字符位组成,每个点阵字符位都可以显示一个字
7、符。每位之间有一个点距的间隔每行之间也有间隔起到了字符间距和行间距的作用,正由于如此所以他不能显示图形。 四,试验的硬件设计 这次数字时钟设计主要由四个模块组成,分别是数据处理模块,DS1302模块,键盘输入模块和液晶显示模块。通过DS1302供应时间数据,单片机处理数据并且通过液晶显示时间。修改时间时,通过键盘来选择修改位置和执行增加或者减小的数量。原理图: 五,试验的软件设计在系统设计中,除了硬件设计之外,软件设计也是很重要的,它是系统工作的指挥者,因此系统软件设计时要遵循结构合理、操作性能好、具有肯定的爱护措施、兼容性好的设计原则来开发设计。数字时钟软件设计主要包括主程序模块、LCD16
8、02模块、DS1302模块,键盘扫描模块和修改时间模块 。系统的流程图:实物图:1,整体结构图2,正常的日期显示结果3,关掉电源再打开,时间不会失去4,修改时间的演示图程序清单:#include#include#includesbit a0 = ACC0;sbit a1 = ACC1;sbit a2 = ACC2;sbit a3 = ACC3;sbit a4 = ACC4;sbit a5 = ACC5;sbit a6 = ACC6;sbit a7 = ACC7;sbit speaker = P36 ;/蜂鸣器sbit INC = P15 ;/增加键sbit DEC = P16 ;/削减键sbi
9、t CHG = P17 ;/修改键sbit RS=P20;/指令OR数据寄存器选择sbit RW=P21;/读写把握sbit EN=P22;/使能把握sbit SCLK=P10;/1302时钟线sbit IO=P11;/1302数据线sbit RST=P12;/1302复位线#define LCLR 0x01/清屏#define MODE 0x38/8位数据,双列显示,5*7字形#define DATA P0/8位数据并行口#define ON 0x0c/开显示,关光标,光标不闪烁#define ADDR_MODE 0x06volatile unsigned char data timedat
10、a7 ;/时间值unsigned char display_buffer116;/显示缓冲区1 unsigned char display_buffer216;/显示缓冲区2volatile unsigned int self_pos = 0 ;/自定义三角形标志显示位置变量volatile data WZ = 0 ; /修改的位置值volatile data ZENG = 0 ;/增加的值volatile data JIAN = 0 ;/减小的值unsigned char code self_table1=0x08,0x0f,0x12,0x0f,0x0a,0x1f,0x02,0x02,/年0
11、x1f,0x11,0x1f,0x11,0x1f,0x11,0x15,0x17,/月0x00,0x1f,0x11,0x1f,0x11,0x11,0x1f,0x00,/日;void delay_ms(unsigned char count) / 延时时间unsigned char i;for(;count0;count-)for(i=0;i0;speak_count-)speaker = 0 ;delay_ms(1) ;speaker = 1 ;delay_ms(3) ;/*忙检测*/ void LCD1602_check_busy(void)DATA = 0xff;RS =0;RW =1;EN
12、=1;while(DATA & 0x80) ;EN =0 ;/*写指令*/ void LCD1602_write_cmd(unsigned char cmd)LCD1602_check_busy();RS = 0 ;RW = 0 ;DATA = cmd ;EN = 1 ;EN = 0 ;/*写数据*/ void LCD1602_write_data(unsigned char dat)LCD1602_check_busy();RS = 1 ;RW = 0 ;DATA = dat ;EN = 1 ;EN = 0 ; void LCD1602_init(void)unsigned char i ;
13、LCD1602_write_cmd(0x40);/CGRAM起始地址for(i=0;i40;i+)LCD1602_write_data(self_table1i);/写入自定义字符LCD1602_write_cmd(MODE) ;LCD1602_write_cmd(ON) ;LCD1602_write_cmd(ADDR_MODE) ;LCD1602_write_cmd(LCLR) ; void LCD1602_set_postion(unsigned char x , unsigned char y)if(y2)y &= 0x01 ;/y值限定在01之间x &= 0x0f ;/x值限定在015
14、之间if(y = 0)x |= 0x40 ;/假如显示是在其次行,则x的值加0x40x |= 0x80 ;/获得x的值LCD1602_write_cmd(x) ;/写入坐标值到LCD void LCD1602_write_char(unsigned char x , unsigned char y , unsigned char chardata)LCD1602_set_postion(x,y) ;LCD1602_write_data(chardata) ; void LCD1602_write_string(unsigned char x , unsigned char y , unsign
15、ed char *string)LCD1602_set_postion(x,y) ;while(*string) != 0)LCD1602_write_data(*string) ;string+ ; void input(unsigned char inputdata)/输入函数ACC = inputdata ;IO = a0 ; SCLK = 1 ; SCLK = 0 ;IO = a1 ; SCLK = 1 ; SCLK = 0 ;IO = a2 ; SCLK = 1 ; SCLK = 0 ;IO = a3 ; SCLK = 1 ; SCLK = 0 ;IO = a4 ; SCLK = 1
16、 ; SCLK = 0 ;IO = a5 ; SCLK = 1 ; SCLK = 0 ;IO = a6 ; SCLK = 1 ; SCLK = 0 ;IO = a7 ; SCLK = 1 ; SCLK = 0 ;unsigned char output(void)/输出函数IO = 1 ;a0 = IO ;SCLK = 1 ; SCLK =0 ; a1 = IO ;SCLK = 1 ; SCLK =0 ; a2 = IO ;SCLK = 1 ; SCLK =0 ; a3 = IO ;SCLK = 1 ; SCLK =0 ; a4 = IO ;SCLK = 1 ; SCLK =0 ; a5 =
17、IO ;SCLK = 1 ; SCLK =0 ; a6 = IO ;SCLK = 1 ; SCLK =0 ; a7 = IO ;return(ACC); void DS1302_write_byte(unsigned char cmd , unsigned char dat)/指定位置写数据SCLK = 0 ;RST = 0 ;RST = 1 ;input(cmd) ;input(dat) ;RST = 0 ;SCLK = 1 ; unsigned char DS1302_read_byte(unsigned char cmd)/指定位置读取数据unsigned char receivedat
18、a = 0 ;SCLK = 0 ;RST = 0 ;RST = 1 ;input(cmd) ;receivedata = output() ;RST = 0 ;SCLK = 1 ;return(receivedata) ; void DS1302_init()/设置1302的时间if(DS1302_read_byte(0xc9) != 0xf0) DS1302_write_byte(0x8e,0x00) ;/允许写操作DS1302_write_byte(0xc8,0xf0) ; /写入初始化标志,系统上电后检测此标志,即此子函数只会在第一次初始化一次。DS1302_write_byte(0x8
19、c,0x08) ;/年DS1302_write_byte(0x8a,0x05) ;/星期DS1302_write_byte(0x88,0x09) ;/月DS1302_write_byte(0x86,0x19) ;/日DS1302_write_byte(0x84,0x12) ;/时DS1302_write_byte(0x82,0x00) ;/分DS1302_write_byte(0x80,0x00) ;/秒DS1302_write_byte(0x90,0xa5) ;/充电DS1302_write_byte(0x8e,0x80) ;/禁止写操作 void readDS1302()/读取时间到tim
20、edatatimedata0 = DS1302_read_byte(0x8d) ;/年timedata1 = DS1302_read_byte(0x89) ;/月timedata2 = DS1302_read_byte(0x87) ;/日timedata3 = DS1302_read_byte(0x85) ;/时timedata4 = DS1302_read_byte(0x83) ;/分timedata5 = DS1302_read_byte(0x81) ;/秒timedata6 = DS1302_read_byte(0x8b) ;/星期 void updata_buffer(void)/更新
21、缓冲区的时间 unsigned char i;display_buffer10 = 2 ;display_buffer11 = 0 ;display_buffer12 = timedata0/16+0x30 ;display_buffer13 = timedata0%16+0x30 ;display_buffer14 = 0 ;display_buffer15 = timedata1/16+0x30 ;display_buffer16 = timedata1%16+0x30 ;display_buffer17 = 1 ;display_buffer18 = timedata2/16+0x30
22、;display_buffer19 = timedata2%16+0x30 ;display_buffer110 = 2 ;display_buffer111 = ;switch(timedata6%16)case 1 : display_buffer112 = M ; display_buffer113 = o ;display_buffer114 = n ;break ;case 2 : display_buffer112 = T ; display_buffer113 = u ;display_buffer114 = e ;break ;case 3 : display_buffer11
23、2 = W ; display_buffer113 = e ;display_buffer114 = d ;break ;case 4 : display_buffer112 = T ; display_buffer113 = h ;display_buffer114 = u ;break ;case 5 : display_buffer112 = F ; display_buffer113 = r ;display_buffer114 = i ;break ;case 6 : display_buffer112 = S ; display_buffer113 = a ;display_buf
24、fer114 = t ;break ;case 7 : display_buffer112 = S ; display_buffer113 = u ;display_buffer114 = n ;break ;default : break;display_buffer115= ;display_buffer20 = timedata3/16+0x30 ;display_buffer21 = timedata3%16+0x30 ;display_buffer22 = : ;display_buffer23 = timedata4/16+0x30 ;display_buffer24 = time
25、data4%16+0x30 ;display_buffer25 = : ;display_buffer26 = timedata5/16+0x30 ;display_buffer27 = timedata5%16+0x30 ;for(i=0;i8;i+)display_buffer28+i= ; void display_buffer(void)unsigned char i ;LCD1602_write_cmd(0x80) ;for(i=0;i16;i+)LCD1602_write_data(display_buffer1i);LCD1602_write_cmd(0xc0) ;for(i=0
26、;i16;i+)LCD1602_write_data(display_buffer2i);void key_sm(void) if(CHG = 0)delay_ms(20);if(CHG=0)speakers(5);WZ+;if(WZ=8)WZ=1;while(!CHG);if(DEC = 0 )delay_ms(20) ;while(!DEC) ;speakers(5) ;ZENG+;if(INC = 0)delay_ms(20) ;while(!INC) ;speakers(5) ;JIAN+;void change(void)unsigned char i ,j;if(1)LCD1602
27、_write_cmd(0x0f) ;/开光标LCD1602_write_cmd(0x80) ;/地址码for(i=0;i15;i+)LCD1602_write_data(display_buffer1i) ;LCD1602_write_cmd(0xc0) ;for(j=0;j8;j+)LCD1602_write_data(display_buffer2j) ;if(WZ = 1)unsigned char item ;LCD1602_write_cmd(0x83) ;if(ZENG !=0 )item = DS1302_read_byte(0x8d) ;item=(item/16)*10+it
28、em%16;item+;if(item=100)item=0;item=(item/10)*16+item%10;DS1302_write_byte(0x8e,0x00);/允许写操作DS1302_write_byte(0x8c,item);ZENG = 0 ;if(JIAN != 0)item = DS1302_read_byte(0x8d) ;item=(item/16)*10+item%16;item-;if(item 0)item=99;item=(item/10)*16+item%10;DS1302_write_byte(0x8e,0x00);/允许写操作DS1302_write_b
29、yte(0x8c,item);JIAN = 0 ;else if(WZ = 2)unsigned char item ;LCD1602_write_cmd(0x86) ;if(ZENG !=0 )item = DS1302_read_byte(0x89) ;item=(item/16)*10+item%16;item+;if(item=13)item=1;item=(item/10)*16+item%10;DS1302_write_byte(0x8e,0x00);/允许写操作DS1302_write_byte(0x88,item);ZENG = 0 ;if(JIAN != 0)item = D
30、S1302_read_byte(0x89) ;item=(item/16)*10+item%16;item-;if(item = 0)item=12;item=(item/10)*16+item%10;DS1302_write_byte(0x8e,0x00);/允许写操作DS1302_write_byte(0x88,item);JIAN = 0 ;else if(WZ = 3)unsigned char item ;LCD1602_write_cmd(0x89) ;if(ZENG !=0 )item = DS1302_read_byte(0x87) ;item=(item/16)*10+ite
31、m%16;item+;if(item=32)item=1;item=(item/10)*16+item%10;DS1302_write_byte(0x8e,0x00);/允许写操作DS1302_write_byte(0x86,item);ZENG = 0 ;if(JIAN != 0)item = DS1302_read_byte(0x87) ;item=(item/16)*10+item%16;item-;if(item = 0)item=31;item=(item/10)*16+item%10;DS1302_write_byte(0x8e,0x00);/允许写操作DS1302_write_b
32、yte(0x86,item);JIAN = 0 ;else if(WZ = 4)unsigned char item ;LCD1602_write_cmd(0x8e) ;if(ZENG !=0 )item = DS1302_read_byte(0x8b) ;item=(item/16)*10+item%16;item+;if(item=8)item=1;item=(item/10)*16+item%10;DS1302_write_byte(0x8e,0x00);/允许写操作DS1302_write_byte(0x8a,item);ZENG = 0 ;if(JIAN != 0)item = DS
33、1302_read_byte(0x8b) ;item=(item/16)*10+item%16;item-;if(item = 0)item=7;item=(item/10)*16+item%10;DS1302_write_byte(0x8e,0x00);/允许写操作DS1302_write_byte(0x8a,item);JIAN = 0 ;else if(WZ = 5)unsigned char item ;LCD1602_write_cmd(0xc4) ;if(ZENG !=0 )item = DS1302_read_byte(0x85) ;item=(item/16)*10+item%16;item+;if(item=24)item=0;item=(item/10)*16+item%10;DS1302_write_byte(0x8e,0x00);/允许写操作DS1302_write_byte(0x84,item);ZENG = 0 ;if(JIAN != 0)item = DS1302_read_byte(0x85) ;item=(item/16)*10+item%16;item-;if(item = -1)item=23;item=(item/10)*16+item%1
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 课程设计是必修课嘛
- 课程设计带轮传动比
- 课程设计溢洪道河海大学
- 认识红领巾主题课程设计
- 配送服务合同
- 战略管理企业成功的规划与执行考核试卷
- 金属丝绳的动态力学性能研究考核试卷
- 微观管理与宏观调控找到管理平衡点考核试卷
- 2024年计算机技术服务协议模板版
- 2024年专业担保协议补充条款模板版
- 专科护理技术操作常见并发症的处理课件
- 《旅游管理信息系统》课程教学
- 乡村医生健康教育培训讲稿课件
- 威海市商业银行普惠客户经理招聘考试真题2022
- 《无机化学》课程标准
- 物流统计与实务PPT完整版全套教学课件
- 2023年副主任医师(副高)-普通外科学(副高)考试黑钻拔高历年高频考点试题附答案
- 行政法与行政诉讼法
- 创业修炼知到章节答案智慧树2023年同济大学
- 冷冻式干燥机安全检查表分析(SCL+LS)评价记录
- JJF 1878-2020 电容型设备在线监测装置校准规范
评论
0/150
提交评论