基于1302的数字时钟设计
课程设计(论文)-基于DS1302的电子时钟设计
目录摘要: (1)1 引言: (2)1.1 功能电子时钟研究的背景和意义 (2)1.2 电子时钟的功能 (2)2 基于单片机的电子时钟硬件选择分析 (2)2.1 微处理器选择 (2)2. 2 DS1302简介 (4)2. 3 DS1302引脚说明 (4)3 电子时钟硬件电路设计 (5)3.1 时钟电路设计 (6)3.2 显示器的选择 (6)3.3 按键调时电路 (6)4 proteus软件仿真及调试 (7)4.1 系统工作流程图 (8)4.2 电路板的仿真 (8)4.3 软件调试 (8)5 源程序 (9)总结 (16)参考文献 (17)附录 (18)基于DS1302的电子时钟设计摘要:电子时钟主要是利用电子技术将时钟电子化、数字化,拥有时钟精确、体积小、界面友好、可扩展性能强等特点,被广泛应用于生活和工作当中。
另外,在生活和工农业生产中,也常常需要温度,这就需要电子时钟具有多功能性。
本文对当前电子钟开发手段进行了比较和分析,最终确定了采用单片机技术实现多功能电子时钟。
本设计应用AT89C52芯片作为核心,LCD1602显示,使用DS1302实时时钟日历芯片完成时钟/日历的基本功能。
这种实现方法的优点是电路简单,性能可靠,实时性好,时间精确,操作简单,编程容易。
关键词:电子时钟;多功能;A T89C52;时钟日历芯1 引言:时间是人类生活必不可少的重要元素,如果没有时间的概念,社会将不会有所发展和进步。
从古代的水漏、十二天干地支,到后来的机械钟表以及当今的石英钟,都充分显现出了时间的重要,同时也代表着科技的进步。
致力于计时器的研究和充分发挥时钟的作用,将有着重要的意义。
1.1 功能电子时钟研究的背景和意义20世纪末,电子技术获得了飞速的发展。
在其推动下,现代电子产品几乎渗透到了社会的各个领域,有力的推动和提高了社会生产力的发展与信息化程度,同时也使现代电子产品性能进一步提升,产品更新换代的节奏也越来越快。
基于DS1302的数字时钟
实现功能:以DS1302数字时钟芯片为基础的时钟程序,用LED1602显示当前时间,功能键能显示年月日和星期。
#include<reg52.h>#include<intrins.h>#define uint unsigned int#define uchar unsigned charsbit SCK=P3^6; //时钟端口sbit SDA=P3^4; //数据端口sbit RST=P3^5; //复位端口sbit LCD_RS = P2^6;sbit LCD_RW = P2^5;sbit LCD_EP = P2^7;sbit key=P2^0;uchar code write_address[7]={0x80,0x82,0x84,0x86,0x88,0x8a,0x8c}; //秒分时日月周年uchar code read_address[7]={0x81,0x83,0x85,0x87,0x89,0x8b,0x8d};uchar code a[]={" The time is:"};uchar code w1[]={" Monday"};uchar code w2[]={" Tuesday"};uchar code w3[]={" Wednesday"};uchar code w4[]={" Thursday"};uchar code w5[]={" Friday"};uchar code w6[]={" Saturday"};uchar code w7[]={" Sunday"};uchar init_time[] = {10,10,22,19,7,2,11}; //秒分时日月周年11-07-19 22:10:10uchar buff[7];uchar buff1[8];uchar buff2[13];uchar buff3;delay(uint z){uint x,y;for(x=z;x>0;x--)for(y=120;y>0;y--);}/******DS1302部分*****/void write_byte(uchar n){uint i;for(i=0;i<8;i++){SCK=0;SDA=n&0x01;n=n>>1;SCK=1;}}uchar read_byte(){uint i;uchar n;for(i=0;i<8;i++){if(SDA)n=n|0x80;SCK=0;n=n>>1;_nop_();_nop_();SCK=1;}return n;}void write_DS1302(uchar address,uchar n) {RST=0;_nop_();SCK=0;_nop_();RST=1;_nop_();write_byte(address);write_byte(n);SCK=1;RST=0;}uchar read_DS1302(uchar address){uchar n;RST=0;_nop_();_nop_();SCK=0;_nop_();RST=1;write_byte(address);n=read_byte();_nop_();RST=0;_nop_();_nop_();_nop_();RST=0;SCK=0;_nop_();_nop_();_nop_();_nop_();SCK=1;_nop_();_nop_();SDA=0;_nop_();_nop_();SDA=1;_nop_();_nop_();return n;}void get_data(){unsigned char i,*p;p=read_address;for(i=0;i<7;i++){buff[i]=read_DS1302(*p);p++;}}void set_DS1302(){unsigned char i,*p,n;for(i=0;i<7;i++) //转换成BCD码{n=init_time[i]/10;init_time[i]=init_time[i]%10;init_time[i]=init_time[i]+n*16;}write_DS1302(0x8E,0X00);p=write_address;for(i=0;i<7;i++){write_DS1302(*p,init_time[i]);p++;}write_DS1302(0x8E,0x80);}bit lcd_bz(){ // 测试LCD忙碌状态bit result;LCD_RS = 0;LCD_RW = 1;LCD_EP = 1;_nop_();_nop_();_nop_();_nop_();result=(bit)(P0 & 0x80);LCD_EP=0;return result;}lcd_wcmd(uchar cmd){ // 写入指令数据到LCD while(lcd_bz());LCD_RS = 0;LCD_RW = 0;LCD_EP = 0;_nop_();_nop_();P0 = cmd;_nop_();_nop_();_nop_();_nop_();LCD_EP = 1;_nop_();_nop_();_nop_();_nop_();LCD_EP = 0;}lcd_pos(uchar pos){ //设定显示位置lcd_wcmd(pos|0x80);}lcd_wdat(uchar dat){ //写入字符显示数据到LCD while(lcd_bz());LCD_RS = 1;LCD_RW = 0;LCD_EP = 0;P0 = dat;_nop_();_nop_();_nop_();_nop_();LCD_EP = 1;_nop_();_nop_();_nop_();_nop_();LCD_EP = 0;}lcd_init(){ //LCD初始化设定lcd_wcmd(0x38); //16*2显示,5*7点阵,8位数据delay(1);lcd_wcmd(0x0c); //显示开,关光标delay(1);lcd_wcmd(0x06); //移动光标delay(1);lcd_wcmd(0x01); //清除LCD的显示内容delay(1);}void dispaly(){uint i;if(0==key)delay(5);if(0==key){lcd_wcmd(0x01);while(0==key){buff2[0]=0x20;buff2[1]=0x20;buff2[2]=0x20;buff2[3]=0x32;buff2[4]=0x30;buff2[5]=buff[6]/16+0x30;buff2[6]=(buff[6]&0x0f)+0x30;buff2[7]=0x2d;buff2[8]=buff[4]/16+0x30;buff2[9]=(buff[4]&0x0f)+0x30;buff2[10]=0x2d;buff2[11]=buff[3]/16+0x30;buff2[12]=(buff[3]&0x0f)+0x30;lcd_pos(0);for(i=0;i<13;i++){lcd_wdat(buff2[i]);delay(5);}buff3=buff[5]&0x0f;lcd_pos(0x40);if(buff3==1){i = 0;while(w1[i]!= '\0'){lcd_wdat(w1[i]);i++;delay(5);}}else if(buff3==2){i = 0;while(w2[i]!= '\0'){lcd_wdat(w2[i]);i++;delay(5);}}else if(buff3==3){i = 0;while(w3[i]!= '\0'){lcd_wdat(w3[i]);i++;delay(5);}}else if(buff3==4){i = 0;while(w4[i]!= '\0'){lcd_wdat(w4[i]);i++;delay(5);}}else if(buff3==5){i = 0;while(w5[i]!= '\0'){lcd_wdat(w5[i]);i++;delay(5);}}else if(buff3==6){i = 0;while(w6[i]!= '\0'){lcd_wdat(w6[i]);i++;delay(5);}}else if(buff3==7){i = 0;while(w7[i]!= '\0'){lcd_wdat(w7[i]);i++;delay(5);}}}lcd_wcmd(0x01);}else{lcd_pos(0);i = 0;while(a[i]!= '\0'){lcd_wdat(a[i]);i++;delay(5);}buff1[0]=buff[2]/16;buff1[1]=buff[2]&0x0f;buff1[2]=0x0a;buff1[3]=buff[1]/16;buff1[4]=buff[1]&0x0f;buff1[5]=0x0a;buff1[6]=buff[0]/16;buff1[7]=buff[0]&0x0f;lcd_pos(0x44);for(i=0;i<8;i++){lcd_wdat(buff1[i]+0x30);delay(5);}}}void main(){lcd_init();set_DS1302();while(1){get_data();dispaly();}}。
51单片机实战指南-使用DS1302设计数字时钟
YEAR
WP
0
0
0 0000
本章内容:
1
DS1302芯片介绍
22 封装的编程思想和结构体类型
3 2
DS1302读写操作的编程实现
4
DS1302读写实战
12.2.1 封装的编程思想
➢ 封装是面向对象编程三大特性(封装、继承、多态)之一 ➢ 核心思想就是尽可能地隐藏内部的细节,只保留一些对外接
口使之与外部发生联系 ➢ 就C语言而言,封装的体现就是函数的编写(小封装)和模
} DS1302_CE = 0;
//传送数据结束
return dat;
}
12.3.2 读写函数的封装-DS1302WriteByte
/* 发送一个字节到DS1302通信总线上 */
void DS1302WriteByte(unsigned char dat)
{
unsigned char i;
for (i=0; i<8; i++)
bit 5
bit 4
bit 3
bit 2
bit 1
bit 0
1
RAM/CK A4
A3
A2
A1
A0
R/W
寄存器名
秒寄存器 分钟寄存器 小时寄存器 日期寄存器 月份寄存器 星期寄存器 年份寄存器 控制寄存器
命令字
写操作 读操作
80H
81H
82H
83H
84H
85H
86H
87H
88H
89H
8AH 8BH
8CH 8DH
12.4 DS1302读写实战-ds1302.c
void mai时间后会刷新显示
基于单片机及时钟芯片DS1302的电子时钟设计
基于单片机及时钟芯片DS1302的电子时钟设计一、概述二、电子时钟的基本原理电子时钟是一种以单片机为核心的智能电子产品,采用数字电路来显示时间。
电子时钟的核心部件是一个定时器,通过周期性的计数来确定时间,然后再将计数器的结果通过数码管等显示装置进行显示。
除此之外,电子时钟还需要一个能够准确计时的时钟芯片,如本文所使用的时钟芯片DS1302。
三、电子时钟的设计方法本文设计的电子时钟采用AT89C52单片机和时钟芯片DS1302,并通过外围的驱动电路和数码管来实现时间的显示。
该电子时钟具有以下特点:1.可进行24小时制和12小时制的切换:电子时钟可以通过按键实现24小时制和12小时制的切换,可按需选择。
2.自动夏令时判断:电子时钟可自动识别夏令时,并根据设定值进行切换,方便易用。
3.温度显示:电子时钟的DS1302时钟芯片自带温度探测器,可实现温度的实时显示。
本文所设计的电子时钟的硬件设计方案如下:1.主控芯片:采用AT89C52单片机2.显示装置:采用数码管进行时分秒的显示,共4位数码管。
3.时钟芯片:采用DS1302时钟芯片,保证时间的准确性。
5.电源:采用开关电源或锂电池供电。
锂电池供电时,电子时钟可实现断电后不重置的功能。
1.初始化:在电子时钟启动时,需要对各个模块进行初始化,如DS1302时钟芯片的读写口、数码管和按键都需要进行初始化。
2.频率切换:按下切换按键后,电子时钟的频率从24小时制切换到12小时制。
3.设定夏令时:按下设定按键后,可以进行夏令时设定。
设定值以秒为单位存储,在夏季过渡期改变时,只需修改设定值即可。
5.时间的显示:通过程序将DS1302时钟芯片中的时间读出并在数码管上显示,实现实时显示的功能。
五、总结本文设计的基于单片机及时钟芯片DS1302的电子时钟,可通过按键实现24小时制和12小时制的切换、自动夏令时判断、温度显示等多种功能,实现了电子时钟的多种要求和需求。
该设计方案具有简单实用、成本低廉、易于维护等优点,可广泛应用于各个领域。
基于DS1302时钟芯片数字钟报告
课程设计报告题目:基于DS1302的数字钟报告学院:专业:电子信息工程班级:学号:指导教师:2010 年 7 月 7日摘要 (4)ABSTRACT (4)前言 (5)第一章数字钟设计的意义及任务 (6)1.1数字钟设计的意义 (6)1.2设计任务 (6)第二章系统的硬件设计和方案对比选择 (7)2.1系统设计结构图 (7)2.2系统设计方案对比选择 (7)2.2.1 MCU微处理控制器的方案对比选择 (7)2.2.2 LCD液晶显示模块的方案对比选择 (8)2.2.3 实时时钟电路的方案对比选择 (9)第三章系统的硬件设计电路及元件说明 (10)3.1MCU微控制器电路 (10)3.2LCD液晶显示电路 (12)3.3实时时钟电路 (16)3.4复位电路 (17)3.5晶振电路 (17)第四章系统的软件设计。
(18)4.1主程序 (18)第五章程序的调试 (19)5.1PROTEUS仿真 (19)5.2利用学习板进行调试 (20)5.3调试过程中出现的问题 (21)设计总结 (21)参考文献 (22)附录一系统程序: (23)附录二基于DS1302数字钟设计的原理图 (33)附录三基于DS1302数字钟设计的PCB图 (34)附录四基于DS1302数字钟设计的元件清单 . 错误!未定义书签。
基于DS1302的数字钟设计报告摘要根据AT89C52的特点和数字钟的特点,本文提出一种用单片控制DS1302利用LCD1602显示的数字钟的设计方法,同时给出软硬件电路的设计方法。
设计报告硬件电路设计和软件编程两个方面。
本系统通过AT89C52做为CPU进行总控制,利用AT89C52对DS1302进行控制,DS1302可以对年、月、日、周、日、时、分、秒进行计时,最后利用LCD1602液晶显示进行显示。
该设计实用简便能够对年、月、日、周、日、时、分、秒进行有效准确的计时及显示。
关键词:单片机 DS1302 LCD1602 数字钟Based on the design of the digital clock DS1302 reportAbstractAccording to the characteristics and the digital clock AT89C52 characteristics, this paper presents a DS1302 control by using single chip LCD1602 digital clock shows the design method and design method of software and hardware circuit is given. Design report hardware and software programming. The system through the AT89C52 as CPU for total control and utilization of DS1302 AT89C52 control, DS1302 to year, month, day, week, day, when, minutes and seconds on the clock LCD1602 LCD display show.Keywords: SCM DS1302 LCD1602 digital clock前言自古就有:“一寸光阴,一寸金”的说法。
基于DS1302多功能数字钟电子电工课程设计
物理与电子科学学院电子电工实验基于DS1302多功能数字时钟--万年历实验报告实验名称:基于DS1302多功能数字钟实验日期: 2014年 01 月 05 日专业:电子信息工程姓名:刘斌班级:物电 1105 班学号: 2020112030560一、设计理念:电子万年历是一个应用超级普遍的有效日常计时工具,带有显示温度,显示世纪,年,月,日,礼拜,时,分,秒和按键可调时刻及其按键设置闹钟的功能,同时具有月末自动更新,闰年补偿功能,整点报时等多种功能。
环境温度检测系统在日常生活和工业应用超级普遍,能实时搜集周围的温度信息进行显示。
此系统是基于STC89C52单片机设计的,包括液晶显示模块,DS1302实不时钟模块,DS18B20温度搜集模块,键盘扫描模块,蜂鸣器报警模块。
STC89C52作为操纵核心,具有功耗低,功能强等特点,电压可选3到5V电源供电。
显示模块采纳1602液晶动态显示,相对数码管而言经济有效,占用空间小,关于显示数字、字母最为适合,而且与单片机连线简单,占用IO口相对较少。
实不时钟芯片DS1302是一款经济实惠功能壮大的较新型产品,该器件提供RTC/日历,可外加器件实现按时闹钟等功能,若是检测到主电源故障,该器件可自动切换到备用电源供电,能够保证在断电情形下精准走时,计时。
温度检测显示模块采纳数字式温度传感器DS18B20,该芯片具有精度高,测量范围广等优势,易与单片机连接,模块电路组成简单并同时具有温度报警功能。
关键词:STC89C52,DS1302,DS18B20,1602液晶显示,电子万年历,搜集设备周围环境温度、整点报时,闹钟时分通过按键设置,时、分、秒、年、月、日、礼拜通过按键进行调剂校准……二、设计思路:核心操纵体:STC89C52单片机实不时钟芯片:DS1302数字式温度传感器:DS18B20总共设有四个按键,为节约资源考虑,每一个按键都有多种功能。
四个按键别离标号为key1,key2,key3,key4。
基于DS1302的多功能数字钟
多功能数字钟一、多功能数字钟硬件电路简介该数字钟是一款基于STC89C52单片机控制的多功能数字钟,利用串行时钟芯片DS1302进行精确计时,并有纽扣电池作为其备用电源,保证在单片机系统掉电后,时间依然准确无误。
使用LED数码管作为显示器件,设计简单可靠,外观显示效果清晰明了,使用两片74LS373作为数码管的驱动电路,保证LED数码管的亮度很高,即使在室外强光条件下,显示依然清晰。
该数字钟的声光提示部分,使用了一路继电器控制蜂鸣器和一个高亮度LED,蜂鸣器的驱动方波来源于一个555定时器芯片,并由一个可调电阻来根据需要,调节方波频率。
作息时间或定时闹钟时间到后,可以产生清晰明了的声光提示,并采用了反射式红外发送接收传感器,以实现非接触止闹,通过调试,传感距离可达10cm左右,效果明显,使用方便。
二、多功能数字钟功能简介该数字钟具有时间,日期,星期显示和调节功能,操作简单可靠,按键都采用了防抖动程序,以防按一次造成多次输入。
该数字钟可对预设的18个作息时间点进行准确声光提示,提示时间为10秒,在该声光提示期间,将手放在电路板上方(与电路板的距离不能大于15cm),可实现非接触止闹,使用相当方便。
该数字钟还带有一个定时闹钟,可以自定闹钟时间与闹钟开关。
该数字钟具有断电时间保护功能,当单片机系统掉电后,纽扣电池可以保持至少两个月的准确时间,一般来说,数字钟的时间设置一次后,以后几乎不用再次设置。
三、多功能数字钟硬件电路图1、非接触止闹部分ST178实物图ST178属于反射式红外传感器,它由一个红外发射管和一个红外三极管组成,工作的时候,红外发射管发射红外线,当它前方一定范围内有障碍物的时候,发射出的红外线遇到障碍物发射回去,被红外三极管接受,红外三极管由断开变为导通,P32端口上的电压变为低电平,从而被单片机检测到。
其中电阻R1作为限流电阻,如果不用限流电阻,ST178会在瞬间被烧毁。
电阻R2作为上拉电阻,其电阻值大小直接决定该传感器的检测范围,其值越小,检测范围越小。
基于DS1302的数码管时钟电路设计
单片机与可编程器件LED数码管时钟电路采用24h计时方式,时、分、秒用六位数码管显示,其中小时、分、秒之间用小数点分开。
该电路采用AT89C52单片机和DS1302实时时钟芯片,使用5V电源进行供电,使用两个按键进行调时,调整过程中被调节的分钟或时钟将进入闪亮状态,看上去非常直观,另外,本设计还具有快速调时功能,当按键一直被按下时,便进入快速调时状态。
由于本时钟电路的计时是由芯片DS1302来完成的,计时准确 ,单片机通过串行通信来控制DS1302工作,同时进行键盘和显示的控制。
DS1302芯片介绍1.DS1302的功能及其结构DS1302芯片是美国DALLAS公司推出的低功耗实时时钟芯片,它采用串行通信方式,只需3条线便可以和单片机通信,并且其片内均含RAM,可增加系统的RAM,DS1302的时钟校准比较容易,若采用专用的晶体振荡器,几乎无须调整即可以达到国家要求的时钟误差标准。
DS1302有两个电源输入端,其中的一个用来做备用电源,这样避免了由于突然停电而造成时钟停止,因此它非常适合于长时间无人职守的监测控制系统或需经常记录某些具有特殊意义的数据及对应时间的场合。
DS1302提供秒、分、时、日、星期、月、年的信息,每月的天数和闰年的天数可自动调整,并可通过AM/PM 指示决定采用24 或12 小时格式。
DS1302串行时钟芯片主要由移位寄存器、控制逻辑、振荡器、实时时钟及31B的RAM组成。
在数据传送前,必须把RST置为高电平,且把提供地址和命令信息的8位装入到移位寄存器。
在进行单字节传送或多字节传送时,开始的8位命令字节用于指定40B(前31B RAM和9B时钟寄存器)中哪个将被访问。
在开始的8个时钟周期把命令装入移位寄存器之后,另外的时钟在读操作时输出数据,在写操作时输入数据。
DS1302的封装引脚示意图和内部结构图分别见图1和图2。
其中,X1、X2接32.768kHz 晶振,GND为地,复位线驱动至高电平,启动所有的数据传送。
基于DS1302的数字时钟设计
一、设计目的 (1)二、设计思路 (1)三、设计过程 (1)五、主要元器件与设备 (10)六、课程设计体会 (10)七、参考文献 (10)一、设计目的1、掌握电子时钟的基本工作方式。
2、进一步熟悉DS1302芯片的特性。
3、通过使用各基本指令,进一步熟练掌握单片机的编程和程序调试。
二、设计思路利用AT89C52的特点及DS1302的特点,设计一种基于DS1302单片机控制,再利用数码管静态显示的可调可定时数字钟。
本系统硬件利用AT89S52作为CPU 进行总体控制,通过DS1302时钟芯片获取准确详细的时间(年、月、日、周、日、时、分、秒准确时间),对时钟信号进行控制,同时利用数码管对时间进行准确显示年、月、日、周、日、时、分、秒。
三、设计过程3.1系统设计结构图图1系统设计结构图根据系统设计的要求和设计思路,确定该系统的系统设计结构图。
如图1所示。
硬件电路主要由MCU微处理控制器单元、DS1302时钟电路、储存器、复位电路、晶振电路、数码管显示模块构成。
3.2 MCU微控制器电路AT89S52作为系统的核心控制元件,只有它能正常工作后才能使其它的元件进入正常工作状态。
因此,下面对AT89S52进行必要的说明,AT89S52的管脚如图3所示。
图3 AT89S52的管脚1)VCC:40脚,供电电压,一般接+5V电压。
2)GND:20脚,接工作地。
3)P0口:1~8脚,P0口是一个8位漏极开路的双向I/O口。
作为输出口,每位能驱动8个TTL逻辑电平。
对P0端口写“1”时,引脚用作高阻抗输入。
当访问外部程序和数据存储器时,P0口也被作为低8位地址/数据复用。
在这种模式下,P0具有内部上电阻。
但是P0口在程序校验作为输出指令字节时,需要外部加上拉电阻,一般上拉电阻选4.7K~10K为宜。
本设计中用5.1K的排阻对P0口进行上拉电平。
4)P1口:32~39脚,P1口是一个内部具有上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4个TTL门电流。
基于DS1302的多功能数字时钟
HUBEI NORMAL UNIVERSITY 综合课程设计(一)Integrated Curriculum Design(1)基于DS1302的多功能数字时钟设计1设计目的(1)掌握单片机芯片STC89C51的基本功能和使用。
(2)熟悉Proteus仿真软件的使用,了解各元件的功能及作用。
(3)了解时钟芯片DS1302的基本知识,了解温度传感器DS18B20的基本使用。
(4)提高数字电子电路的综合应用能力。
(5)掌握Keil软件的使用方法,以及如何创建文件和编写程序。
(6)提高焊接能力以及实际问题分析能力。
2 设计思路时间,对人们来说是非常宝贵的,准确的掌握时间和分配时间对人们来说至关重要。
因此自从时钟发明的那刻起,就成为人类的好朋友。
随着时间的流逝,科学技术的不断发展和提高,人们对时间计量的精度要求越来越高,应用越来越广。
怎样让时钟更好、更方便、更精确的显示时间,这就要求人们不断设计研发出新型的时钟。
高精度的计时工具大多数都使用了石英晶体振荡器,由于电子钟,石英表,石英钟都采用了石英技术,因此走时精度高,稳定性好,使用方便,不需要经常调校。
数字式电子钟用集成电路计时时,译码代替机械式传动,用LED显示器代替指针进而显示时间,减小了计时误差,这种表具有时,分,秒显示时间的功能,还可以进行时和分的校对,片选的灵活性好。
时钟电路在计算机系统中起着非常重要的作用,是保证系统正常工作的基础。
在单片机的应用系统中,时钟有两个方面的含义:一是指为保障系统正常工作的基准振荡定时信号,主要由晶振和外围电路组成,晶振频率的大小决定了单片机系统工作的快慢;二是指系统的标准定时时钟,即定时时间,它通常有两种实现方法:一是用软件实现,即用单片机内部的可编程定时器/计数器来实现;二是用专门的时钟芯片实现。
多功能数字时钟将万年历、时钟与温度计结合,设计和制作了一款具有推广价值的多功能数字时钟。
3方案论证3.1单片机芯片的选择方案和论证:方案一: 采用STC89C52芯片作为硬件核心。
基于ds1302闹钟课程设计
基于ds1302闹钟课程设计一、教学目标本课程旨在让学生了解和掌握DS1302闹钟的工作原理和基本使用方法。
通过本课程的学习,学生将能够:1.知识目标:了解DS1302闹钟的内部结构、工作原理和接口定义;掌握DS1302闹钟的基本编程和使用方法。
2.技能目标:能够使用DS1302闹钟进行时间设定和闹钟设置;能够编写简单的程序实现DS1302闹钟的功能。
3.情感态度价值观目标:培养学生对电子技术的兴趣和好奇心,提高学生动手实践的能力,培养学生团队合作的精神。
二、教学内容本课程的教学内容主要包括以下几个部分:1.DS1302闹钟的内部结构和工作原理;2.DS1302闹钟的接口定义和编程方法;3.DS1302闹钟的使用方法和操作步骤;4.DS1302闹钟的实验操作和程序编写。
三、教学方法为了更好地实现教学目标,本课程将采用以下几种教学方法:1.讲授法:用于讲解DS1302闹钟的内部结构、工作原理和接口定义;2.讨论法:用于探讨DS1302闹钟的编程方法和使用步骤;3.实验法:用于实践DS1302闹钟的操作和程序编写;4.案例分析法:通过分析具体的DS1302闹钟应用案例,加深学生对DS1302闹钟的理解和应用能力。
四、教学资源为了支持本课程的教学内容和教学方法,我们将准备以下教学资源:1.教材:DS1302闹钟的使用手册和编程指南;2.参考书:关于DS1302闹钟的内部结构和工作原理的书籍;3.多媒体资料:关于DS1302闹钟的内部结构和工作原理的PPT、视频等资料;4.实验设备:DS1302闹钟实验套件,用于学生的实验操作和程序编写。
五、教学评估为了全面、客观地评估学生在DS1302闹钟课程中的学习成果,我们将采用以下评估方式:1.平时表现:通过学生在课堂上的参与度、提问回答、小组讨论等表现来评估其学习态度和理解程度;2.作业:布置与课程内容相关的编程和实践作业,评估学生对DS1302闹钟知识的掌握和应用能力;3.考试:安排一次课程结束考试,测试学生对DS1302闹钟内部结构、工作原理、编程方法等知识的掌握程度;4.实验报告:评估学生在实验操作中的表现和实验报告的撰写能力,检验其对DS1302闹钟的实际操作和问题解决能力。
基于日历时钟DS1302的时钟设计
课程设计课程单片机课程设计题目基于日历时钟DS1302的时钟设计院系专业班级学生姓名学生学号指导教师2012年3月30日课程单片机课程设计题目基于日历时钟DS1302的时钟设计专业姓名学号一、任务设计一款基于DS1302,可以显示年月日时分秒及周信息,具有可调整日期和时间功能的电子万年历。
二、设计要求[1] 自动计时,显示年、月、日、时、分、秒。
[2] 时间显示可调整。
[3] 写出详细的设计报告。
[4] 给出全部电路和源程序。
三、参考资料[1]陈景初.单片机应用系统设计与实践[M].北京:航空航天大学出版社,2006.[2] 陈正振.电子电路设计与制作.广西:交通职业技术学院信息工程系,2007.[3] 杨子文.单片机原理及应用.西安:电子科技大学出版社,2006.[4]刘勇.数字电路.北京:电子工业出版社,2004.[5]黄明强.DS1302在单片机系统中的应用.保定:师范学校学报,2004, (2).完成期限2012.3.19至2012.3.30指导教师专业负责人2012年3月16 日目录第1章绪论 (3)1.1 DS1302简介 (3)1.2 DS1302的性能特性 (3)1.3 DS1302数据操作原理 (3)1.4 DS1302 的应用 (4)1.5 本设计任务 (4)第2 章总体方案论证与设计 (5)2.1 单片机芯片的选择方案和论证 (5)2.2 显示模块选择方案和论证 (5)2.3 时钟芯片的选择方案和论证 (5)2.4 总体硬件组成框图 (6)第3章系统硬件设计 (7)3.1 单片机主控制模块的设计 (7)3.2 时钟电路模块的设计 (8)3.3 电路原理及说明 (9)3.4 显示模块的设计 (10)第4章系统的软件设计 (12)4.1 主程序设计 (12)4.2 液晶驱动程序 (13)第5章系统调试与测试结果分析 (14)5.1 硬件测试 (14)5.2 软件测试 (14)5.3 测试结果 (14)结论 (16)参考文献 (17)附录1 程序 (18)附录2 仿真效果图 (26)第1章绪论随着当今世界经济的快速发展和信息化时代的来临,各种各样的小型智能家电产品陆续出现在我们的生活中。
基于DS1302的数字钟方案设计书
基于DS1302的数字钟设计Design of digital clock based on DS1302学生学号: 10530221学生姓名:郭芬芬专业班级:电信1002指导教师:程立敏起止日期: 2013.4.1~2013.4.19吉林化工学院Jilin Institute of Chemical Technology课程设计任务书一、设计题目:基于DS1302的数字钟设计二、设计目的1、掌握DS1302时钟芯片的硬件电路原理及软件编程方法,熟悉DS1302时钟芯片的性能指标和特点;2、熟悉STC12C5A60S2单片机的性能特点,并掌握STC12C5A60S2单片机控制DS1302读写时间、日期的硬件电路组成及软件编程方法;3、了解LED显示及按键电路的组成原理,熟悉LED动态显示原理及实现方法;4、了解7805构成直流稳压电源的电路组成及工作原理。
三、设计任务及要求(宋体,小四号字,加黑)设计并实现具有显示日期和时间的电子数字钟,数字钟具有以下基本功能:1、使用6位LED显示时间、日期和星期,正常显示时、分、秒、星期,使用按键可切换显示年、月、日;2、具有时间、日期调整功能,通过键盘可进行时间、日期的调整;3、具有闹钟功能,使用键盘设定闹铃时间,由蜂鸣器产生闹铃;4、定时控制功能,使用小型继电器完成定时控制功能(发挥部分)。
四、设计时间及进度安排(宋体,小四号字,加黑)设计时间共三周(2013.4.1 – 2013.4.19),具体安排如下表:摘要本系统采用STC89C52单片机和DS1302配合,实现LED数码管显示时间、日期和星期,正常显示时、分、秒、星期,使用按键可切换显示年、月、日。
系统中还有四个独立式按键,用于系统操作与控制,并有一个直流蜂鸣器,用以产生闹铃。
DS1302可以实现对系统的时、分、秒、星期、日期等信息的保存,使系统在掉电情况下仍然能够准确的保存并运行时间信息。
利用单片机的定时器,实现了时间、日期和闹钟功能的设计。
用ds1302制作一个精密的电子时钟
用ds1302制作一个精密的电子时钟感想:我看视频的时候讲的是DS12CR887这块芯片,两块毕竟是不一样的,所以,我只是看了他讲怎样看时序,之后的就没再看了。
我就拿着自己下载打印的DS1302数据手册,研习,研习,再研习。
还查了书上的,网上的,源程序。
但是,你别指望着谁会把所有的东西都给你写上去。
只能作为参考。
后来,我终于写出了一个程序,可是一编译,就漏洞百出。
最主要的有两点:for循环和BCD码。
不过还好,都得到了很好的解决。
解决方案:#include#include#define uchar unsigned char#define uint unsigned intuchar data table[]="2009-01-01 Mon.";uchar data table1[]=" 00:00:00";uchar code xingqi[]="Mon. Tue. Wed. Thu. Fri. Sat. Sun.";uchar num;uchar hour,min,sec,week,day,month,year;sbit ds1302_sclk=P1^4;sbit ds1302_io=P1^5;sbit ds1302_ce=P2^2;sbit acc0=ACC^0;sbit acc7=ACC^7;sbit lcdrs=P1^7; //端口定义sbit lcdrw=P1^6;sbit lcde=P2^4;sbit le=P3^ 6;sbit led en=P2^5;sbit dkle=P3^7;void delay(uint a);void write_byte(uchar dat) //写入一个字节{uchar i;ACC=dat;for(i=8;i>0;i--){ds1302_io=acc0;ds1302_sclk=1;ds1302_sclk=0;ACC=ACC>>1;}}uchar read_byte() //读出一个字节{uchar i;for(i=8;i>0;i--){ACC=ACC>>1;acc7=ds1302_io;ds1302_sclk=1;ds1302_sclk=0;}return(ACC);}void s_write(uchar add,uchar dat)//单字节写入子函数{ds1302_ce=0;ds1302_sclk=0;ds1302_ce=1;write_byte(add);write_byte(dat);ds1302_sclk=1;ds1302_ce=0;}uchar s_read(uchar add) //单字节读出子函数{uchar temp;ds1302_ce=0;ds1302_sclk=0;ds1302_ce=1;write_byte(add);temp=read_byte();ds1302_sclk=1;ds1302_ce=0;temp=(temp/0x0a)*10+temp%0x0a;return(temp);}void set_ds1302(uchar *pClock) //设置ds1302的时间{uchar i;uchar add=0x80;EA=0;s_write(0x8e,0x00);for(i=7;i>0;i--){s_write(add,*pClock);pClock++;add+=2;}s_write(0x8e,0x80);EA=1;}void read_ds1302(uchar Curtime[]) //读取ds1302的时间{uchar i;uchar add=0x81;EA=0;for(i=7;i>0;i--){Curtime[i]=s_read(add);add+=2;}EA=1;}void write_com(uchar com) //写命令子函数{lcde=0;lcdrw=0;lcdrs=0;delay(1);lcde=1;delay(1);P0=com;delay(1);lcde=0;}void write_data(uchar dat) //写数据子函数{lcde=0;lcdrw=0;lcdrs=1;delay(1);lcde=1;delay(1);P0=dat;delay(1);lcde=0;}void init(){month=1;day=1;year=9;lcde=0; //LCD1602初始化le=0;leden=0;write_com(0x38);delay(100);write_com(0x38);delay(50);write_com(0x38);delay(10);write_com(0x08);write_com(0x01);write_com(0x0c);write_com(0x80);for(num=0;num<15;num++) //在第一行显示“ 2000-00-00 Mon.”{write_data(table[num]);}write_com(0x80+0x40);for(num=0;num<10;num++) //在第二行末尾显示“00:00:00”{write_data(table1[num]);}}void write_time(uchar add,uchar dat) //写入时间子函数{uchar shi,ge;shi=dat/16;ge=dat%16;write_com(0x80+0x40+add);write_data(0x30+shi);write_data(0x30+ge);}void write_riqi(uchar add,uchar dat) //写入日期子函数{uchar shi,ge;shi=dat/16;ge=dat%16;write_com(0x80+add);write_data(0x30+shi);write_data(0x30+ge);}void write_xingqi(uchar dat) //写入星期子函数{write_com(0x80+0x0b);switch(dat){case 1: for(num=0;num<4;num++){write_data(xingqi[num]);};break;case 2: for(num=5;num<9;num++){write_data(xingqi[num]);};break;case 3: for(num=10;num<14;num++){write_data(xingqi[num]);};break;case 4: for(num=15;num<19;num++){write_data(xingqi[num]);};break;case 5: for(num=20;num<24;num++){write_data(xingqi[num]);};break;case 6: for(num=25;num<29;num++){write_data(xingqi[num]);};break;case 7: for(num=30;num<34;num++){write_data(xingqi[num]);};break;}}void main(){init();delay(5);s_write(0x8e,0x00); //控制写入WP=0 s_write(0x90,0xa5);s_write(0x80,0x00); //秒s_write(0x82,0x20); //分s_write(0x84,0x09); //时24时制s_write(0x86,0x27); //日s_write(0x88,0x08); //月s_write(0x8a,0x04); //星期s_write(0x8c,0x09); //年 */s_write(0x8e,0x80);//控制写入WP=1;P0=0xff;while(1){sec=s_read(0x81);write_time(8,sec);write_com(0x80+0x40+9);min=s_read(0x83);write_time(5,min);write_com(0x80+0x40+6);hour=s_read(0x85);write_time(2,hour);write_com(0x80+0x40+3); week=s_read(0x8b);write_xingqi(week);write_com(0x80+0x0d);day=s_read(0x87);write_riqi(8,day);write_com(0x80+9);month=s_read(0x89);write_riqi(5,month);write_com(0x80+6);year=s_read(0x8d);write_riqi(2,year);write_com(0x80+3);}}void delay(uint a) { //延时子函数uint i,j;for(j=a;j>0;j--)for(i=250;i>0;i--) ;}。
基于DS1302的单片机数字时钟
源程序如下:#include <at89x52.h>#include <DS1302.h>//定义共阳极字型码0123456789-//unsigned char code dispcode[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf}; unsigned char code dispcode[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40}; unsigned char time[]={0,0,0,0,0,0,0,0};//用来储存时间unsigned char date[]={0,0,0,0,0,0,0,0};//用来储存日期SYSTEMTIME time1; //在ds1302.h文件中已经定义了一个名字为SYSTEMTIME的结构体,在这里我们定义一个变量名//为time的SYSTEMTIME结构体void delay(unsigned char i) //延时子程序{unsigned char j;while((i--)!=0){for(j=123;j>0;j--);}}unsigned char button_time(n,x,y) //时钟调整子程序unsigned char n,x,y;{if(P1_7==0){delay(50);if(P1_7==0){n++;if(n==x)n=0;while(P1_7==0);}}if(P1_5==0){delay(50);if(P1_5==0){if(n==0)n=y;elsen--;while(P1_5==0);}return n;}unsigned char button_date(n,x,y) //日期调整子程序unsigned char n,x,y;{if(P1_7==0){delay(50);if(P1_7==0){n++;if(n==x)n=1;while(P1_7==0);}}if(P1_5==0){delay(50);if(P1_5==0){if(n==1)n=y;elsen--;while(P1_5==0);}}return n;}void display(second10,second1,minute10,minute1,hour10,hour1) //显示子程序unsigned char second10,second1,minute10,minute1,hour10,hour1;{P2=0xfe;P0=dispcode[second10];//显示秒的十位delay(1);P2=0xfd;P0=dispcode[second1]; //显示秒的个位P2=0xfb;P0=dispcode[10]; //显示"-"delay(1);P2=0xf7;P0=dispcode[minute10];//显示分的十位delay(1);P2=0xef;P0=dispcode[minute1]; //显示分的个位delay(1);P2=0xdf;P0=dispcode[10]; //显示"-"delay(1);P2=0xbf;P0=dispcode[hour10]; //显示时的十位delay(1);P2=0x7f;P0=dispcode[hour1]; //显示时的个位delay(1);}void main(){unsigned char flag;Initial_DS1302(); //初始化DS1302这个时钟芯片, while(1){DS1302_GetTime(&time1); //读取时间参数time[5]=(time1.Second)%10; //把秒的个位数据存入time[5]time[4]=(time1.Second)/10; //把秒的十位数据存入time[4]time[3]=(time1.Minute)%10; //把分的个位数据存入time[3]time[2]=(time1.Minute)/10; //把分的十位数据存入time[2]time[1]=(time1.Hour)%10; //把时的个位数据存入time[1]time[0]=(time1.Hour)/10; //把时的十位数据存入time[0] date[5]=(time1.Day)%10;date[4]=(time1.Day)/10;date[3]=(time1.Month)%10;date[2]=(time1.Month)/10;date[1]=(time1.Year)%10;date[0]=(time1.Year)/10;if(P1_4==0) //如果按下Time Start键一下,时钟开始正常显示时间,再按一下,显示日期{delay(50);if(P1_4==0){flag++;if(flag>1){flag=0;}}while(P1_4==0);}if(P1_6==0) //如果按下Time Set键一下,开始显示日期,再按一下进入日期跟时钟的调节模式{delay(50);if(P1_6==0){flag++;if(flag>7){flag=0;}}while(P1_6==0);}switch(flag){case 0:display(time[0],time[1],time[2],time[3],time[4],time[5]); //调用子函数display,把存入数组time的数据给显示出来break;case 1:display(date[0],date[1],date[2],date[3],date[4],date[5]); //调用子函数display,把存入数组date的数据给显示出来break;case 2:time1.Year=button_date(time1.Year,100,99); //调整年DS1302_SetTime(0x8c,time1.Year);display(date[0],date[1],10,10,10,10);break;case 3:time1.Month=button_date(time1.Month,13,12); //调整月DS1302_SetTime(0x88,time1.Month);display(10,10,date[2],date[3],10,10);break;case 4:time1.Day=button_date(time1.Day,32,31); //调整日DS1302_SetTime(0x86,time1.Day);display(10,10,10,10,date[4],date[5]);break;case 5:time1.Hour=button_time(time1.Hour,24,23); //调整时DS1302_SetTime(0x84,time1.Hour);display(time[0],time[1],10,10,10,10);break;case 6:time1.Minute=button_time(time1.Minute,60,59); //调整分DS1302_SetTime(0x82,time1.Minute);display(10,10,time[2],time[3],10,10);break;case 7:time1.Second=button_time(time1.Second,60,59); //调整秒DS1302_SetTime(0x80,time1.Second);display(10,10,10,10,time[4],time[5]);break;}}}头文件ds1302.h程序如下:#ifndef _REAL_TIMER_DS1302_2003_7_21_#define _REAL_TIMER_DS1302_2003_7_21_#include <at89x52.h>sbit DS1302_CLK = P1^0; //实时时钟时钟线引脚sbit DS1302_IO = P1^1; //实时时钟数据线引脚sbit DS1302_RST = P1^2; //实时时钟复位线引脚sbit ACC0 = ACC^0;sbit ACC7 = ACC^7;typedefstruct __SYSTEMTIME__{unsigned char Second;unsigned char Minute;unsigned char Hour;unsigned char Week;unsigned char Day;unsigned char Month;unsigned char Year;unsigned char DateString[9];unsigned char TimeString[9];}SYSTEMTIME; //定义的时间类型#define AM(X) X#define PM(X) (X+12) // 转成24小时制#define DS1302_SECOND 0x80 //秒寄存器#define DS1302_MINUTE 0x82 //分寄存器#define DS1302_HOUR 0x84#define DS1302_WEEK 0x8A#define DS1302_DAY 0x86#define DS1302_MONTH 0x88#define DS1302_YEAR 0x8C#define DS1302_RAM(X)(0xC0+(X)*2) //用于计算DS1302_RAM 地址的宏void DS1302InputByte(unsigned char d) //实时时钟写入一字节(内部函数) {unsigned char i;ACC = d;for(i=8; i>0; i--){DS1302_IO = ACC0; //相当于汇编中的RRCDS1302_CLK = 1;DS1302_CLK = 0; //发一个高跳变到低的脉冲ACC = ACC >> 1;}}unsigned char DS1302OutputByte(void) //实时时钟读取一字节(内部函数) {unsigned char i;for(i=8; i>0; i--){ACC = ACC >>1; //相当于汇编中的RRCACC7 = DS1302_IO;DS1302_CLK = 1;DS1302_CLK = 0; //发一个高跳变到低的脉冲}return(ACC);}void Write1302(unsigned char ucAddr, unsigned char ucDa) //ucAddr: DS1302地址, ucData: 要写的数据{DS1302_RST = 0;DS1302_CLK = 0;DS1302_RST = 1;DS1302InputByte(ucAddr); // 地址,命令DS1302InputByte(ucDa); // 写1Byte数据DS1302_CLK = 1;DS1302_RST = 0; //RST 0->1->0,CLK 0->1}unsigned char Read1302(unsigned char ucAddr) //读取DS1302某地址的数据{unsigned char ucData;DS1302_RST = 0;DS1302_CLK = 0;DS1302_RST = 1; //enableDS1302InputByte(ucAddr|0x01); // 地址,命令ucData = DS1302OutputByte(); // 读1Byte数据DS1302_CLK = 1; //RST 0->1->0,CLK 0->1DS1302_RST = 0;return(ucData);}void DS1302_SetProtect(bit flag) //是否写保护{if(flag)Write1302(0x8E,0x10); //WP=1,不能写入elseWrite1302(0x8E,0x00);//WP=0,可以写入}void DS1302_SetTime(unsigned char Address, unsigned char Value) // 设置时间函数{DS1302_SetProtect(0);Write1302(Address, ((Value/10)<<4 | (Value%10))); //高4位为十位,低4位为个位}void DS1302_GetTime(SYSTEMTIME *Time){unsigned char ReadValue;ReadValue = Read1302(DS1302_SECOND);Time->Second = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);//转换成10进制的秒ReadValue = Read1302(DS1302_MINUTE);Time->Minute = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);ReadValue = Read1302(DS1302_HOUR);Time->Hour = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);ReadValue = Read1302(DS1302_DAY);Time->Day = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);ReadValue = Read1302(DS1302_WEEK);Time->Week = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);ReadValue = Read1302(DS1302_MONTH);Time->Month = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);ReadValue = Read1302(DS1302_YEAR);Time->Year = ((ReadValue&0xf0)>>4)*10 + (ReadValue&0x0F);}/*voidDateToStr(SYSTEMTIME *Time){Time->DateString[0] = Time->Year/10 + '0'; //数字类型转化为字符类型Time->DateString[1] = Time->Year%10 + '0';Time->DateString[2] = '-';Time->DateString[3] = Time->Month/10 + '0';Time->DateString[4] = Time->Month%10 + '0';Time->DateString[5] = '-';Time->DateString[6] = Time->Day/10 + '0';Time->DateString[7] = Time->Day%10 + '0';Time->DateString[8] = '\0';}voidTimeToStr(SYSTEMTIME *Time){Time->TimeString[0] = Time->Hour/10 + '0'; //数字类型转化为字符类型Time->TimeString[1] = Time->Hour%10 + '0';Time->TimeString[2] = ':';Time->TimeString[3] = Time->Minute/10 + '0';Time->TimeString[4] = Time->Minute%10 + '0';Time->TimeString[5] = ':';Time->TimeString[6] = Time->Second/10 + '0';Time->TimeString[7] = Time->Second%10 + '0';Time->DateString[8] = '\0';}*/void Initial_DS1302(void){unsigned char Second=Read1302(DS1302_SECOND);if(Second&0x80) //如果第七为1(表明没有启动), 则启动时钟DS1302_SetTime(DS1302_SECOND,0);}/****************************************************************************** **void BurstWrite1302(unsigned char *pWClock) //往DS1302写入时钟数据(多字节方式) {unsigned char i;Write1302(0x8e,0x00); // 控制命令,WP=0,写操作?DS1302_RST = 0;DS1302_CLK = 0;DS1302_RST = 1;DS1302InputByte(0xbe); // 0xbe:时钟多字节写命令for (i = 8; i>0; i--) //8Byte = 7Byte 时钟数据+ 1Byte 控制{DS1302InputByte(*pWClock); // 写1Byte数据pWClock++;}DS1302_CLK = 1;DS1302_RST = 0;}void BurstRead1302(unsigned char *pRClock) //读取DS1302时钟数据(时钟多字节方式) {unsigned char i;DS1302_RST = 0;DS1302_CLK = 0;DS1302_RST = 1;DS1302InputByte(0xbf); // 0xbf:时钟多字节读命令for (i=8; i>0; i--){*pRClock = DS1302OutputByte(); // 读1Byte数据pRClock++;}DS1302_CLK = 1;DS1302_RST = 0;}void DS1302_TimeStop(bit flag) // 是否将时钟停止{unsigned char Data;Data=Read1302(DS1302_SECOND);DS1302_SetProtect(0);if(flag)Write1302(DS1302_SECOND, Data|0x80);//停止elseWrite1302(DS1302_SECOND, Data&0x7F);不停止}******************************************************************************* */#endif。
单片机应用课程设计基于DS1302电子时钟的设计报告参考模板教材
单片机应用课程设计报告(2012~2013学年第2学期)设计题目:基于DS1302电子时钟的设计班别:2010级自动化1班姓名:李永兴贺孝言王永伟指导教师:***时间:2013年5月目录1 设计任务 (3)2 系统总体方案设计 (3)2.1各个模块方案论证 (3)2.1.1 时钟芯片的选择 (3)2.1.2 显示器的选择 (3)2.2总体方案设计 (4)3 硬件电路设计 (4)3.1单片机最小系统 (4)3.21302时钟电路 (5)3.3按键调时电路 (6)4 系统软件设计 (7)4.1主程序流程图 (7)4.2子程序流程图 (8)4.2.1 DS1302子程序流程图 (8)4.2.2 1602子程序流程图 (9)4.3按键校正调时程序 (9)5 实物调试 (10)5.1实物性能分析 (10)5.2总结 (13)附录1 (15)(1)系统总电路图 (15)(2)系统仿真图 (15)附录2 (17)部分程序清单 (17)1 设计任务基本要求:采用DS1302时钟芯片与单片机STC89C52相结合设计电子时钟,能够显示出实时年、月、日、时、分、秒等时间,并且可以通过按键进行时间调整。
2 系统总体方案设计2.1 各个模块方案论证2.1.1 时钟芯片的选择由于设计的是电子时钟,而单片机STC89C52自带计时功能,利用单片机实现数据的显示和调整是可行的,采用单片机计时,利用它的一个16位定时器/计数器每50ms产生一个中断信号,中断20次后产生一个秒信号,然后根据时间进制关系依次向分、时、日、星期、月、年进位。
这样可以直接用单片机的内部定时/计数器来完成电子万年历的设计。
用单片机内部的定时/计数器来制作电子万年历,虽然无须外接其他芯片,充分利用了单片机的资源,但是计时精度不够高,误差较大,掉电后所有数据将被丢失,且软件编程较为复杂。
在以单片机为核心构成的装置中,经常需要一个实时的时钟和日历,以便对一些实时发生事件记录时给予时标。
基于DS1302数字时钟电路的设计123
核心芯片简介1.1 DS1302简介DS1302[1]是美国DALLAS公司推出的一种高性能、低功耗、带RAM的实时时钟芯片,它可以对年、月、日、周日、时、分、秒进行计时,且具有闰年补偿功能,工作电压宽达2.5~5.5V。
时钟可工作在24小时格式或12小时(AM/PM)格式。
DS1302与单片机的接口使用同步串行通信,仅用3条线与之相连接。
可采用一次传送一个字节或突发方式一次传送多个字节的时钟信号或RAM数据。
DS1302内部有一个31×8的用于临时性存放数据的RAM寄存器。
DS1302是DS1202的升级产品,与DS1202兼容,但增加了主电源/后背电源双电源引脚,同时提供了对后背电源进行涓细电流充电的能力。
1.1.1 DS1302引脚功能与内部结构DS1302的引脚功能如表1所示,外形及内部结构如图1所示[2]:表1 DS1302引脚功能表图1 DS1302管脚图及内部结构图1.1.2 DS1302的控制字DS1302的控制字节如图2所示:7 6 5 4 3 2 1 0图2 DS1302控制字节的含义控制字节的最高有效位(位7)必须是逻辑1,如果它为0,则不能把数据写入到DS1302中。
位6如果为0,则表示存取日历时钟数据,为1表示存取RAM数据;位5至位1指示操作单元的地址;最低有效位(位0)如为0表示要进行写操作,为1表示进行读操作,控制字节总是从最低位开始输出。
1.1.3 DS1302的复位引脚通过把RST 输入驱动置高电平来启动所有的数据传送。
RST 输入有两种功能:首先,RST 接通控制逻辑,允许地址/命令序列送入移位寄存器;其次,RST 提供了终止单字节或多字节数据的传送手段。
当RST 为高电平时,所有的数据传送被初始化,允许对DS1302进行操作。
如果在传送过程中置RST 为低电平,则会终止此次数据传送,并且I/O 引脚变为高阻态。
上电运行时,在Vcc≥2.5V 之前,RST 必须保持低电平。
基于1302数码管显示可调时钟C程序设计
这是我最近完善的1302数字可调时钟,经过20多个小时的走时实验,走时相当准确,与电脑时间完全一致,最起码肉眼看不出误差,1302的另一个突出优点是可以接备用电源,用纽扣电池供电,在外部系统电力中断的情况下,仍能保持内部时钟正常走时,经多次故意掉电实验,走时正常。
本次的完善主要在软件。
一个系统能够实现功能并不一定意味着成功,关键要让这个系统如何稳定的工作,提高其可靠性,是现代电子行业努力追求的目标。
本项目完全由本人在目前比较简陋的“振勇电子实验室”完成,介于条件简陋,设备简单,导致硬件系统尚不完善。
在软件编程方面,用先进的ASP下载取代了我一贯使用的串口下载,其好处是不用冷启动(个人认为除此之外没别的好处,而且下载效率没有串口的高,成功率保持在50%就很不错了)。
单片机用ATMEL公司的AT89S52取代了我以前用的STC系列单片机,STC是国产单片机,虽然我们提倡支持国产,但是很多时候国产真的太不争气了。
另一个比较大的改动在软件调时方面,按键抖动是一个很让人头疼的问题,就连我一直很佩服的郭天祥老师在这一块也曾犯过错误,而且错误还著书出版了,单片机的扫描是很快的,那么怎么才能有效地去除按键抖动呢下面我介绍的这种方法是我自己纯脑力劳动的结晶,实验证明运行效果良好。
if(key==0){con++;if(con==20){con==0;qita();}}一般人都能理解这个用法,也能想到,但关键这个程序不完整,比方说con没加到20,加到10就松开了,那么请问con 还能被清0吗显然不能。
那么你下一次再按的时候就有可能按一下加两下,这种不稳定性在编程中是不能存在的,最起码一个合格的产品不能有这样的毛病。
所以在这个函数里面应该加上下面这句:else if(key==1){if(con!=0){con=0;}}这个函数很简单,关键是它的位置,一定要与上面的的那个函数在同一位置。
该数字时钟另一个有技术含量的地方就是在调节时间的时候会在对应的位置闪烁,原理也很简单,就是在显示之前加一个门卡,比方说占空比50%的闪烁,那我就定义一个son,让son++;加满是60,那加到30以后让数码管不显示,就行了。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
《智能控制与高级应用》课程设计基于DS1302的数字时钟姓名:班级:学号:专业:指导教师:摘要电子时钟主要是利用电子技术将时钟电子化、数字化,拥有时钟精确、体积小、界面友好、可扩展性能强等特点,被广泛应用于生活和工作当中。
另外,在生活和工农业生产中,也常常需要温度,这就需要电子时钟具有多功能性。
本设计应用AT89 C51芯片作为核心,LED显示,使用DS1302实时时钟日历芯片完成时钟/日历的基本功能。
这种实现方法的优点是电路简单,性能可靠,实时性好,时间精确,操作简单,编程容易。
该电子时钟可以应用于一般的生活和工作中,也可通过改装,提高性能,增加新功能,从而给人们的生活和工作带来更多的方便。
关键词:电子时钟;多功能;AT89C51;DS1302;时钟日历芯片目录一、多功能电子时钟研究的背景和意义 (5)1.1 、多功能电子时钟的研究意义 (5)1.2 、电子时钟的功能 (5)二、硬件电路设计及描述 (7)2.1、基于单片机的电子时钟硬件选择分析 (7)2.11、主要芯片的选择 (8)2.12、主要特性: (9)2.13、特性概述: (9)2.14、管脚说明 (8)2.2 、DS1302 (10)2.21 、DS1302简介 (10)2.22、引脚功能及结构 (11)2.23、DS1302的控制字节 (11)2.24、数据输入输出(I/O) (12)2.3、时钟电路设计 (12)2.31、整点报时功能 (12)2.4、74LS245介绍 (14)2.5、晶振电路 (15)2.6、复位电路 (16)2.7、系统工作流程图 (18)2.8、字仿真图 (19)2.9、程序代码 (20)三、课程设计体会 (27)3.1、实验结论 (27)3.2、实验心得 (27)四、参考文献 (29)一、多功能电子时钟研究的背景和意义1.1 、多功能电子时钟的研究意义20世纪末,电子技术获得了飞速的发展。
在其推动下,现代电子产品几乎渗透到了社会的各个领域,有力的推动和提高了社会生产力的发展与信息化程度,同时也使现代电子产品性能进一步提升,产品更新换代的节奏也越来越快。
时间对人们来说总是那么宝贵,工作的忙碌性和繁杂容易使人忘记当前的时间。
然而遇到重大事情的时候,一旦忘记时间,就会给自己或他人造成很大麻烦。
平时我们要求上班准时,约会或召开会议必然要提及时间;火车要准点到达,航班要准点起飞;工业生产中,很多环节都需要用时间来确定工序替换时刻。
所以说能随时准确的知道时间并利用时间,是我们生活和工作中必不可少的。
电子钟是采用电子电路实现对时、分、秒进行数字显示的计时装置,广泛应用于个人家庭,车站,码头办公室等公共场所,成为人们日常生活中不可少的必需品。
由于数字集成电路的发展和石英晶体振荡器的广泛应用,使得数字钟的精度,远远超过老式钟表,钟表的数字化给人们生产生活带来了极大的方便,而且大大地扩展了钟表原先的报时功能。
诸如定时自动报警、0按时自动打铃、定时广播、自动起闭路灯、定时开关烘箱、通断动力设备、甚至各种定时电气的自动启用等,所有这些,都是以钟表数字化为基础的。
因此,研究数字钟及扩大其应用,有着非常现实的意义。
1.2 电子时钟的功能电子时钟主要是利用电子技术将时钟电子化、数字化,拥有时间精确、体积小、界面友好、可扩展性能强等特点,被广泛应用于生活和工作当中。
当今市场上的电子时钟品类繁多,外形小巧别致。
也有体型较大的,诸如公共场所的大型电子报时器等。
电子时钟首先是数字化了的时间显示或报时器,在此基础上,人们可以根据不同场合的要求,在时钟上加置其他功能,比如定时闹铃,万年历,环境温度、湿度检测,环境空气质量检测,USB扩展口功能等。
本设计电子时钟主要功能为:1.具有时间显示和手动校对功能,24小时制;2.具有年、月、日、星期显示和手动校对功能;3.具有整点报时功二、硬件电路设计及描述2.1、基于单片机的电子时钟硬件选择分析电子时钟硬件电路设计电子闹钟至少要包括秒信号发生器、时间显示电路、按键电路、供电电源、闹铃指示电路等几部分。
该系统使用AT89C51单片机作为核心,通过读取时钟日历芯片DS1302数据,完成此电子时钟的主要功能——时钟。
使用比较通用的数码管,做显示,分别显示时、分、秒。
多功能电子时钟硬件系统框图键盘是为了完成时钟/日历的校对和日历/温度的显示功能。
由于此电子时钟要求具有闹铃功能,所以设计有闹铃电路,进行声音响铃。
整个电路使用了两种电源,+5V电源将为整个电路供电。
而+3V电源仅作为DS1302的备用电源。
当+5V电源被切断后,DS1302启用+3V电源,可以保持DS1302继续工作。
当+5V电源恢复供电,LED依旧显示当前时间,而不会因为断电使系统复位到初始化时间,避免了重新校时的麻烦。
2.11主要芯片的选择目前在单片机系统中,应用比较广泛的微处理器芯片主要为8XC5X系列单片机。
该系列单片机均采用标准MCS-52内核,硬件资源相互兼容,品类齐全,功能完善,性能稳定,体积小,价格低廉,货源充足,调试和编程方便,所以应用极为广泛。
AT89C51简介AT89C51是一种带4K字节FLASH存储器(FPEROM—Flash Programmable and Erasable Read Only Memory)的低电压、高性能CMOS 8位微处理器,俗称单片机。
AT89C2051是一种带2K字节闪存可编程可擦除只读存储器的单片机。
单片机的可擦除只读存储器可以反复擦除1000次。
该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。
由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的AT89C51是一种高效微控制器,AT89C2051是它的一种精简版本。
AT89C单片机为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。
外形及引脚排列如图所示AT89C51外形及引脚排列2.12 主要特性:·与MCS-51 兼容·4K字节可编程FLASH存储器·寿命:1000写/擦循环·数据保留时间:10年·全静态工作:0Hz-24MHz·三级程序存储器锁定·128×8位内部RAM·32可编程I/O线·两个16位定时器/计数器·5个中断源·可编程串行通道·低功耗的闲置和掉电模式·片内振荡器和时钟电路2.13 特性概述:AT89C51 提供以下标准功能:4k 字节Flash 闪速存储器,128字节内部RAM,32 个I/O 口线,两个16位定时/计数器,一个5向量两级中断结构,一个全双工串行通信口,片内振荡器及时钟电路。
同时,AT89C51可降至0Hz的静态逻辑操作,并支持两种软件可选的节电工作模式。
空闲方式停止CPU的工作,但允许RAM,定时/计数器,串行通信口及中断系统继续工作。
掉电方式保存RAM中的内容,但振荡器停止工作并禁止其它所有部件工作直到下一个硬件复位。
2.14 管脚说明:VCC:供电电压。
GND:接地。
P0口:P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL门电流。
当P0口的管脚第一次写1时,被定义为高阻输入。
P0能够用于外部程序数据存储器,它可以被定义为数据/地址的低八位。
在FIASH编程时,P0 口作为原码输入口,当FIASH进行校验时,P0输出原码,此时P0外部必须接上拉电阻。
P1口:P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL门电流。
P1口管脚写入1后,被内部上拉为高,可用作输入,P1口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。
在FLASH编程和校验时,P1口作为低八位地址接收。
P2口:P2口为一个内部上拉电阻的8位双向I/O口,P2口缓冲器可接收,输出4个TTL门电流,当P2口被写“1”时,其管脚被内部上拉电阻拉高,且作为输入。
并因此作为输入时,P2口的管脚被外部拉低,将输出电流。
这是由于内部上拉的缘故。
P2口当用于外部程序存储器或16位地址外部数据存储器进行存取时,P2口输出地址的高八位。
在给出地址“1”时,它利用内部上拉优势,当对外部八位地址数据存储器进行读写时,P2口输出其特殊功能寄存器的内容。
P2口在FLASH编程和校验时接收高八位地址信号和控制信号。
P3口:P3口管脚是8个带内部上拉电阻的双向I/O口,可接收输出4个TTL门电流。
当P3口写入“1”后,它们被内部上拉为高电平,并用作输入。
作为输入,由于外部下拉为低电平,P3口将输出电流(ILL)这是由于上拉的缘故。
2.2DS13022.21 DS1302简介DS1302是美国DALLAS公司推出的一种高性能、低功耗的实时时钟日历芯片,附加31字节静态RAM,采用SPI三线接口与CPU进行同步通信,并可采用突发方式一次传送多个字节的时钟信号和RAM数据。
实时时钟可提供秒、分、时、日、星期、月和年,一个月小于31天时可以自动调整,且具有闰年补偿功能。
工作电压宽达2.5~5.5V。
采用双电源供电(主电源和备用电源),可设置备用电源充电方式,提供了对后备电源进行涓细电流充电的能力。
有主电源和备份电源双引脚,而且备份电源可由大容量电容(>1F)来替代。
需要强调的是,DS1302需要使用32.768KHz的晶振。
2.22 引脚功能及结构DS1302的引脚排列,其中Vcc1为后备电源,VCC2为主电源。
在主电源关闭的情况下,也能保持时钟的连续运行。
DS1302由Vcc1或Vcc2两者中的较大者供电。
当Vcc2大于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 为低电平时,才能将RST 置为高电平。
I/O 为串行数据输入输出端(双向),后面有详细说明。
SCLK 为时钟输入端。
下图为DS1302的引脚功能图:VCC11X12X23GND 4VCC28SCLK 7I/O 6RST5DS1302为0表示要进行写操作,为1表示进行读操作,控制字节总是从最低位开始输出。