基于DS1302的三个定时器的智能时钟设计
基于DS1302设计的数字钟原理图与PCB教程

基于DS1302设计的数字钟任务一电路原理图的设计1、最小系统电路步骤一:新建设计。
双击桌面PROTEUS软件图标,打开软件,单击工具栏“File”,出现如下图所示下拉菜单。
单击“New Design”菜单,弹出如下对话框。
选择绘图模板,我们选择DEFAULT模板,单击DEFAULT图标,单击“OK”按钮。
进入原理图编辑界面,如下图所示。
步骤二:文件命名和保存。
在绘制电路原理图应当先对文件进行命名,然后保存。
单击保存图标,弹出对话框,选择文件存储路径。
如下图所示:我们把文件保存在桌面的“电路原理图”这个文件夹内。
单击“保存”按钮弹出对话框,在“文件名”编辑框中填写电路原理图名称,“基于DS1302设计的数字钟”。
如下图所示。
单击“保存”按钮,回到原理图编辑页面。
同时在文件夹“电路原理图”中出现电路原理图标,如下图所示。
步骤三:选择主控元器件。
在编辑框最左边的工具栏中选择图标,进入器件模式,然后单击图标,弹出“Pick Device”对话框,如下图所示:在Category下拉框中选择Microprocessor ICs,然后选择芯片AT89C51或AT89C51单片机,如下图所示:单击OK按钮,单片机芯片选择完成,这时在对象选择器和预览窗口中均出现了所选择的芯片AT89C52,在对象选择器单击芯片名称,如AT89C52,再把鼠标移至编辑窗口区(工作区),右击鼠标,主控芯片AT89C52就拖入了工作区。
单片机芯片选择完毕。
如下图所示:步骤四:时钟振荡电路的设计。
51单片机的18和19引脚外接2个皮法级的电容和晶振就可以构成时钟振荡电路。
按照上一步骤选择AT89C52芯片的方法一一从元器件库中选择2个30pf的电容、12M的晶振,还有一个地。
如下图所示:步骤五:复位电路设计。
单片机的9引脚外接复位电路,本系统中用按键k1、2个电阻R1、R2和电容组成,具体电路结构如下图所示:此外,还有电源电路,单片机的20引脚、40引脚分别接电源的地和电。
课程设计(论文)-基于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三键4位1.5寸数码管时钟

说明:最初跑得不太准,把1302的电容换成7p以后,精度非常好,具体没有查误差,反正好几个月与家里的石英钟很对时。
5v供电,亮度不高,室内用正好。
本人程序基本抄袭的,其中秒是用定时器模拟闪动,各位老师多多指教,原来是显示带拐角的7,让我改了,第一位为零时也改作不显示了,请各位大大批评指正!随便挣俩钱儿(感谢江顺万老师的细心批评指正,由于自己不够严谨导致一点错误,已经在原文改过,深表歉意!)先上电路图:再上个实物图:分解图:最后上c程序,不用下载,照顾没米的大大,欢迎批评,砸点儿币过来。
三鞠躬!/**********************************DS1302 四位数码管***********************************/#include <reg52.h>#define uchar unsigned char#define uint unsigned int#define D P2 //段选#define D P0 //位选sbit IO=P1^1; //数据口sbit SCLK=P1^2; //控制数据时钟sbit RST=P1^0; //使能端、复位端/************按键引脚定义***********/sbit s1=P1^5; //按键加sbit s2=P1^3; //按键减sbit s3=P1^4; //按键选择sbit led=P1^7; //闪烁的小数点uchar s, knum=0,snum,fnum;标志。
/***********写时分秒地址************/#define write_shi 0x84#define write_fen 0x82#define write_miao 0x80/***********读时分秒地址************/#define read_shi 0x85#define read_fen 0x83#define read_miao 0x81bit miao_flag;char miao_num;char Dmiao;char shi,fen,miao; //读出数据存储变量uchar d[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xd8,0x80,0x90}; //不带小数点,共阳uchar dd[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10}; //带小数点,共阳void delay(uint z) //延时函数,z的取值为这个函数的延时ms数,如 delay(200);大约延时200ms.{ //delay(500);大约延时500ms.uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}void t0_init() //定时50ms一个中断{TMOD=0X01;TH0=(65536-50000)/256;TL0=(65536-50000)%256;EA=1;ET0=1;TR0=1;}uchar read_1302(uchar add) //读函数{uchar i,date;RST=0; //禁止读写数据for(i=0;i<8;i++){RST=1;SCLK=0;IO=add&0x01;add>>=1;SCLK=1;}for(i=0;i<8;i++){if(IO)date=date|0x80;elsedate=date|0x00;SCLK=1;date>>=1;SCLK=0;}RST=0;date=date/16*10+date%16;//进制转换16转10进制IO=0; //数据读完后,IO口必须为0,不然小时一直显示85 return date;}void write_1302(uchar add,uchar dat) //写函数{uchar i;RST=0; //禁止读写数据SCLK=0;for(i=0;i<8;i++) //写地址{RST=1; //允许读写数据SCLK=0;IO=add&0x01;add>>=1;SCLK=1;}for(i=0;i<8;i++) //写数据{RST=1; //允许读写数据SCLK=0;IO=dat&0x01;dat>>=1;SCLK=1;}RST=0;}void init_1302() //初始化函数设置时间{flag=read_1302(0x81);if(flag&0x80)write_1302(0x8e,0x00); //保护取消,可以进行读写操作write_1302(write_miao,0x56);write_1302(write_fen,0x49);write_1302(write_shi,0x14);write_1302(0x90,0xa5);write_1302(0x8e,0x80); //保护启动,不能进行读写操作}void display(uchar shi,uchar fen) //显示函数{if(knum==0){snum=30;fnum=30;}if(knum==1){fnum++;snum=30;}if(knum==2){snum++;fnum=30;}if(snum>=30){W=0xF7; //位选s=d[shi/10];//段码先给s,判断其值是否为0,if(s==0xc0){W=0xff;D=0xff;}D=s;//s不为零则给D,让其显示delay(5);D=0Xff; //消隐if(miao_flag) //小数点闪烁 {miao_flag=0;W=0xFb;D=dd[shi%10];delay(5);D=0Xff; //消隐}else{W=0xFb;D=d[shi%10];delay(5);D=0Xff;}if(snum==60)snum=0;}if(fnum>=30){W=0xFd;D=d[fen/10];delay(5);D=0Xff; //消隐W=0xFe;D=d[fen%10];delay(5);D=0Xff; //消隐if(fnum==60)fnum=0;}}void read_sf(){miao=read_1302(read_miao); /*if(miao!=Dmiao){Dmiao=miao;TR0=1;miao_flag=1;} */fen=read_1302(read_fen);shi=read_1302(read_shi);display(shi,fen);}void keyscan() //按键扫描函数{if(s3==0) //选择按键按下{delay(10);if(s3==0){while(!s3)display(shi,fen); //加上这句,按键按下就不会闪knum++;if(knum==1) //分闪烁{write_1302(0x8e,0x00); //保护取消write_1302(write_miao,0x80);}if(knum==3) //时钟启动{knum=0;write_1302(write_miao,0x00);write_1302(0x8e,0x80); //保护启动}}}if(knum==1) //分钟调节{if(s1==0) //加{delay(10);if(s1==0){while(!s1)display(shi,fen); //加上这句,按键按下就不会闪fen++;if(fen==60)fen=0;write_1302(write_fen,fen/10*16+fen%10); //写入1302 // read_sf(); //读出时间,然后显示}}if(s2==0){delay(10);if(s2==0){while(!s2)display(shi,fen); //加上这句,按键按下就不会闪 fen--;if(fen==-1)fen=59;write_1302(write_fen,fen/10*16+fen%10);read_sf();}}}if(knum==2){if(s1==0){delay(10);if(s1==0){while(!s1)display(shi,fen); //加上这句,按键按下就不会闪 shi++;if(shi==24)shi=0;write_1302(write_shi,shi/10*16+shi%10);read_sf();}}if(s2==0){delay(10);if(s2==0){while(!s2)display(shi,fen); //加上这句,按键按下就不会闪 shi--;if(shi==-1)shi=23;write_1302(write_shi,shi/10*16+shi%10);read_sf();}}}}void main(){init_1302();t0_init();while(1){ if(miao_num<10)led=0;if(miao_num>=10)led=1;read_sf();keyscan();}}void t0_timer() interrupt 1 {TMOD=0X01;TH0=(65536-50000)/256; TL0=(65536-50000)%256; miao_num++;if(miao_num>=20){miao_num=0;miao_flag=1;}}。
基于单片机及时钟芯片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实时时钟的设计与制作毕业论文

目录
目录 .......................................................................................ห้องสมุดไป่ตู้.......................................................... 1 摘要 .................................................................................................................................................. 2 第 1 章 引言................................................................................................................................... 3
1.1 课题的背景....................................................................................................................... 3 1.2 课题的设计目标与意义................................................................................................... 3 1.3 课题的章节安排...................................................................
基于DS1302芯片的数字时钟设计

路 蜂 鸣 电 , \
二 二 二 : > l 数 码 管 显 示
DS 1 3 0 2 是 美 国D AL L AS 公司研 发 的实 时 时钟 电 路 , 带R AM芯片、 低功耗、 高性能等特点, 可以采用各种方
法对时间进行精确显示, 具有对闰年和非闰年的判断功能, 2 . 5 ~5 . 5 V电压为芯片的工作电压范 围。 最大特点是C P U与 图1系统 总体 结 构 2 . 3 系统硬 件 电路 设计 芯片的三线接 口可以进行 同步通信, 一次可以传送 若干个字 ( 1 ) 整体 电路设计。 系统的实时时钟 电路 的部分由单片 节 的R A M数据 。 2 硬件设计 机A T 8 9 S 5 2 的P 1 接 口与DS 1 3 0 2 时钟芯片相连接而成, 将键 2 . 1设 计 思路 盘与单片机的P 3 . 2 接 口和P 3 . 3 接 口连接 组成 系统的按键 电 用来对显示器的控制, 数码管与单片机的P 0 接 口连接构 利用A T 8 9 S 5 2 进行全局的控制, 用数码管来 显示时、 分、 路, 秒, 时、 分、 秒从 DS 1 3 0 2 上 读 取 出来 。 由于要设 置 时 间所 以装 成系统 的显示, 最后用三极管连接数码管与P 2 接口。 了两个按键。 一个用来 选中所要修改的时间, 一个进行修改 ( 2 ) DS 1 3 0 2 时钟电路设计。 芯片的供 电电路是将V C C 2 ( 就是+ 1 ) , 为了使定时闹钟 能够 实现 , 又加了个蜂鸣器 , 当 接电源, 将晶振分别与x. , x 引脚相连 ; 芯片的复位引脚 电路 时 间走到设定的时间时, 蜂 鸣器开始发 出声音, 该数字时钟 是将单片机P 1 . 2 收引脚与R S T  ̄ J I 脚相连接; 芯片的时钟端电路 是将单片机的P 1 . 0 引脚与芯片的S L K 引脚相连组成; 芯片的I / 硬件 电路简单、 使用灵活、 功能稳定。 2 . 2 系统 结 构 及 总 流 程设 计 o端口的电路是将单片机的P 1 . 1 引脚与I / o 引脚相连 组成。 根据系统设计的要求和设计思路, 确定该系统的系统设 ( 3 ) 显示电路。 将数码显示管 的段选端与单片机 的P 0 由于数码 管采用的是动态显示 , 所 以通过对P 0 的 计 结构图。 系统总体结构 如图1 所 示。 硬件 电路主要由MC U 接 口相连, 微处理控制器单元 、 DS 1 3 0 2 时钟电路、 储存 器、 复位 电路、 8 位二进制数据 的不断改变使数码显示 管不断的动态显示;
基于DS1302电子时钟的设计

单片机应用课程设计报告(2012~2013学年第2学期)设计题目:基于DS1302电子时钟的设计班别:姓名:指导教师:时间:目录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按键调时电路 (5)4 系统软件设计 (6)4.1主程序流程图 (6)4.2子程序流程图 (7)4.2.1 DS1302子程序流程图 (7)4.2.2 1602子程序流程图 (8)4.3按键校正调时程序 (8)5 实物调试 (9)5.1实物性能分析 (9)5.2总结 (12)附录1 (14)(1)系统总电路图 (14)(2)系统仿真图 (14)附录2 (16)部分程序清单 (16)1 设计任务基本要求:采用DS1302时钟芯片与单片机STC89C52相结合设计电子时钟来显示出实时年、月、日、时、分、秒等时间,并且可以通过按键进行时间调整。
2 系统总体方案设计2.1 各个模块方案论证2.1.1 时钟芯片的选择由于设计的是电子时钟,而单片机STC89C52自带计时功能,利用单片机实现数据的显示和调整是可行的,采用单片机计时,利用它的一个16位定时器/计数器每50ms产生一个中断信号,中断20次后产生一个秒信号,然后根据时间进制关系依次向分、时、日、星期、月、年进位。
这样就实现了直接用单片机来实现电子万年历设计。
用单片机来实现电子万年历设计,无须外接其他芯片,充分利用了单片机的资源。
但是精度不够高,误差较大,掉电后丢失所有数据,软件编程较复杂。
在以单片机为核心构成的装置中,经常需要一个实时的时钟和日历,以便对一些实时发生事件记录时给予时标,实时时钟芯片便可起到这一作用。
利用单片机进行控制,采用DS1302作为实时时钟芯片,其三线接口SCLK、I/O、/RST与单片机进行同步通信,外加掉电存储电路、显示电路、键盘电路,即构成一个基本的电子万年历系统。
基于DS1302实时时钟系统的设计论文

学士学位论文(设计)Bachelor’s Thesis论文题目基于DS1302实时时钟系统的设计目录1.绪论 (1)2.方案对比与选择分析介绍 (2)2.1单片机控制器的选择与对比 (2)2.2实时时钟芯片的选择与对比 (3)2.3显示器件的选择与对比 (3)3.系统设计概述 (4)3.1设计内容及要求 (4)3.2系统框架及说明 (4)4.硬件电路设计分析 (5)4.1STC89C52单片机简介 (5)4.2STC89C52单片机内部结构 (6)4.3MCU控制电路设计分析 (7)4.4数码管显示设计分析 (8)4.5DS1302时钟电路设计分析 (10)4.6蜂鸣器报警电路设计分析 (15)4.7电源部分设计分析 (15)5.系统软件设计分析 (16)5.1DS1302模块程序设计 (16)5.2定时器模块程序设计 (16)5.3按键模块程序设计 (17)5.4数码管显示模块程序设计 (19)5.5蜂鸣器报警模块程序设计 (20)5.6主程序设计 (20)6.总结 (21)7.参考文献 (22)8.致谢 (1)附录...................................................... 错误!未定义书签。
附录1作品(设计)原理图................................ 错误!未定义书签。
附录2作品(设计)实物图................................ 错误!未定义书签。
基于DS1302实时时钟系统的设计摘要: 本论文(设计)采用STC89C52单片机和DS1302实时时钟芯片为主要器件设计的实时时钟系统。
能够准确的显示实时时间、日期、星期。
通过8位低功耗数码管将时间信息显示出来,数码管由单片机直接驱动,无需其他驱动芯片,通过按键切换显示时间、日期、星期、闹钟等信息。
系统设计有闹钟报警功能,当实时时间到达闹钟设计时间时,闹钟就会蜂鸣器报警,报警时间可通过按键自行设定。
基于DS1302的电子时钟设计报告

常熟理工学院电气与自动化工程学院《微机原理与接口技术》课程设计题目:基于DS1302的电子钟设计姓名:祝朝贺学号:160512231班级:测控122班指导教师:陈景波起止日期:2015年7月目录摘要.................................................................................. - 1 -一、《微机原理与接口技术》课程设计任务书 ................................. - 2 -二、总体设计方案 (2)2.1 设计框图................................................................... - 2 -2.2 模块说明................................................................... - 3 -2.2.1 DS1302模块 (3)三、硬件电路设计 (4)3.1 单片机最小系统 .......................................................... - 5 -3.1.1 系统结构 (4)3.1.2 系统特点......................................................................... - 5 -3.2 时钟电路设计 ............................................................. - 5 -3.3 数码管显示设计 (5)3.4 键盘电路 (5)四、软件设计....................................................................... - 7 -4.1 主程序流程................................................................ - 7 -4.2 时钟电路设计 (8)五、程序调试与运行结果 ........................................ 错误!未定义书签。
基于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电子钟的设计

《单片机技术》课程设计任务书(二)题目:基于DS1302的电子钟设计一、课程设计任务DS1302是DALLAS公司推出的一种高性能、低功耗、带RAM的实时时钟芯片,它可以对年、月、日、星期、时、分、秒进行计时,且具有闰年补偿功能,工作电压为2.5~5.5V。
DS1302采用三线接口,与CPU进行同步通信,并可采用突发方式一次传送多个字节的时间数据或RAM数据。
DS1302内部有一个31X8的用于临时性存放数据的RAM存储器。
本课题要求设计一基于DS1302的电子钟,该系统要求包含时钟显示模块(可用数码管或液晶显示)和键盘输入模块等。
按1键可以查看当前的时间,按2键可以修改当前的时间,按3键可以设置控制的时间,按4键可以查看及删除所设置的时间,当设定的控制时间到时,铃声响起。
二、课程设计目的通过本次课程设计使学生掌握:1)专用时钟芯片DS1302与单片机的接口及DS1302的编程;2)矩阵式键盘的设计与编程;3)经单片机为核心的系统的实际调试技巧。
从而提高学生对微机实时控制系统的设计和调试能力。
三、课程设计要求1、要求可以从键盘上接收相关信息,按1键可以查看当前的时间,按2键可以修改当前的时间,按3键可以设置控制的时间,按4键可以查看及删除所设置的时间,当设定的控制时间到时,铃声响起。
2、能实时显示时钟。
四、课程设计内容1、人机“界面”设计;2、单片机端口及外设的设计;3、硬件电路原理图、软件清单。
五、课程设计报告要求报告中提供如下内容:1、目录2、正文(1)课程设计任务书;(2)总体设计方案(3)针对人机对话“界面”要有操作使用说明,以便用户能够正确使用本产品;(4)硬件原理图,以便厂家生成产(可手画也可用protel软件);(5)程序流程图及清单(子程序不提供清单,但应列表反映每一个子程序的名称及其功能);(6)调试、运行及其结果;3、收获、体会4、参考文献六、课程设计进度安排七、课程设计考核办法本课程设计满分为100分,从课程设计平时表现、课程设计报告及课程设计答辩三个方面进行评分,其所占比例分别为20%、40%、40%。
基于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电子实时时钟姓名:XXX同组人:XXX班级学号:XX指导老师:XXXXX日期:2011-12-22目录摘要第一部分:题目要求 (4)第二部分:方案论证与选择 (4)第三部分:电路设计与参数选择 (7)第四部分:系统软件设计 (10)第五部分:系统调试与仪器使用 (12)第六部分:测试数据与结果分析 (18)第七部分:使用说明书 (19)总结 (19)摘要本作品是以89C52单片机为核心,DS1302时钟芯片、数码管做显示器及74LS08与门构成的24小时制单功能电子实时时钟。
这种单功能电子实时时钟不仅具有了一般数字钟的基本功能,并且通过两个按钮实现时钟运行与停止功能。
如果我们要设置时间,只需在软件程序上改变时钟芯片的初始化程序。
在电子产品盛行的今天,像这样的设计我们可以给它更大的发展空间。
第一部分题目要求我们设计的这种24小时制功能钟,可以在数码管上显示时、分、秒,并且我们可以通过按钮来控制时钟的运行及停止(按钮KEY1控制时钟停止运行,按钮KEY2控制时钟运行)并采用220V交流电源供电。
第二部分方案论证与选择一、系统功能框图在现今的这个社会,每天的时间都很紧迫,有些人怕误了时间做自己重要的事,尤其是对现在的学生而言,他们早上要早起,上课要准时,这样都少不了有一个时钟;早上干早班的人,在外出行的人,工厂里某些要严格按时间标准来控制的产品等等一些我们身边无时无刻都有的,而在这个关键的部分就要用到我们本次设计的时钟来计时了。
下面我们就介绍一下本次设计的基本设计框图。
二、系统主要部分有:1:中央处理器电路:采用单片机芯片机外围电路构成最小系统。
2:时钟信号产生电路:时钟芯片3:人机接口电路:按键电路、数码管显示电路。
三、方案论证及选择1.时钟电路部分方案一:利用单片机内部的定时功能来实现时钟的走时,通过计算可知,使定时器每25ms产生一次中断,当产生40次中断后秒单元将加一,以此类推,从而实现时、分、秒的走时,并加以显示。
基于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芯片的电子时钟的设计系别名称电子信息工程0专业名称电子信息工程0学生姓名******班级122902学号******指导教师******毕业时间2013年6月0毕业任务书 一、题目基于DS1302芯片的电子时钟的设计二、基本内容及重点 此系统主要由1个DS1302数字时钟芯片、1个AT89S52单片机、AT24C02掉电数据存储单元、LCD12864液晶进行显示,完成显示日期和计时的功能。
研究内容主要包括:(1)时钟电路的设计:采用DS1302数字时钟芯片对年、月、日、周、日、时、分、秒进行计时,工作电压宽达2.5~5.5V 。
与单片机的接口使同步串行通信,仅用3条线与之相连接。
该电路不但能准确地计时、附加其它功能,而且,其三线接口可以节省接口资源,在断电后不丢失时间和数据信息。
(2)显示部分的设计:采用led12864进行显示,它具有功耗低,体积小,重量轻,大规模显示的优点。
(3)按键的设计:通过按键进行调时。
实验设计选用时钟芯片对年月日时分秒进行计时,并与单片机通过三线接口进行同步通信构成数字时钟电路。
系统总体框图总体框架设计图设计 论文 At89s52单片机 闹钟功能模块 Lcd 显示模块Ds1302时钟模块 电源模块三、预期达到的成果1、电路设计无差错,lcd12864上完整显示电子钟的年月日时分秒,准确的显示在预订的位置。
2、按键准确控制,并且在系统掉电后不丢失时间信息。
3、电路能按照给定信息提供闹铃服务。
四、存在的问题及拟采取的解决措施1、怎样从DS1302得到时间数据?思路:要从DS1302里得到系统时间,所以要按照ds1302的时序图进行编程,以便得到准确的数据。
2、怎样将读取的数据显示在lcd12864上?思路:利用程序对lcd12864进行初始化驱动,然后将得到的数据显示在适当的位置,以便清晰,准确的目测数据。
3、如何运用键盘对时间进行调整?思路:根据设计要求,需要对时间进行加、减,以及时分秒的定义,需要设定三个按键,分别为加、减、确认按钮,然后通过程序对相应的端口进行控制,达到对时间调整的目的。
基于ds1302数字时钟电路的设计

1 引言从古代的滴漏更鼓到近代的机械钟,从电子表到目前的数字时钟,为了准确的测量和记录时间,人们一直在努力改进着计时工具。
钟表的数字化,大力推动了计时的精确性和可靠性。
在单片机构成的装置中,实时时钟是必不可少的部件。
目前常用的实时时钟,很多采用单片机的中断服务来实现,这种方式一方面需要采用计数器,占用硬件资源,另一方面需要设置中断、查询等,同样耗费单片机的资源,而且某些测控系统可能不允许;有的则使用并行接口的时钟芯片,如MC146818、DS12887等,它们虽然能满足单片机系统对实时时钟的要求,但是这些芯片与单片机接口复杂,占用地址、数据总线多,芯片体积大,占用空间多,给其它设计带来诸多不便。
本设计选取串行接口时钟芯片DS1302与单片机同步通信构成数字时钟电路。
其简单的三线接口能为单片机节省大量资源,DS1302的后背电源及对后背电源进行涓细电流充电的能力保证电路断电后仍能保存时间和数据信息等。
这些优点解决了目前常用的实时时钟所无法解决的问题。
该时钟电路强大的功能和优越的性能,在很多领域的应用中,尤其是某些自动化控制、长时间无人看守的测控系统等对时钟精确性和可靠性有较高要求的场合,具有很高的使用价值。
1.1 多功能数字钟的起源1350年6月6日意大利人乔万尼•德•党笛制造了世界上第一台结构简单的机械打点多功能数字钟。
1657年,荷兰人惠更斯首先把重力摆引入机械钟,从而创立了摆钟。
到了20世纪,随着电子工业的迅速发展,电池驱动钟、交流电钟、电机械表、指针式石英电子钟表、数字显示式石英钟表相继问世,多功能数字钟的日差已小于0.5秒。
特别是原子钟的出现,它是原子的振动来控制,是目前世界上最精确的钟,即使经过100万年,其偏差也不会超过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多功能数字时钟--万年历实验报告实验名称:基于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。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
//**电信(1)班吴锦生日期:2012.12.18**//#include<reg52.h>#include<intrins.h>#include <absacc.h>#define uint unsigned int#define uchar unsigned char#define lcd_date P0#define data 1000#define N 8sbit LEDCLK=P3^4;sbit LEDDIN=P2^3;sbit Key_Input=P1^0;sbit lcd_en=P2^2;sbit lcd_rs=P2^4;sbit lcd_rw=P2^3;sbit ACC0=ACC^0;sbit ACC7=ACC^7;sbit DQ=P3^2;sbit SDA=P3^7;//串行数据/地址控制端sbit SCL=P3^6;//串行时钟sbit sound=P1^2;uchar idata disp[N];uchar keytemp=0;uchar keyval=0;uchar keyback;uint keynum;bit add_dec_flag;uchar mod;uchar t_open;bit time_mod;uchar temper_mod;uchar set_mod;int time1_hour,time1_minute,time2_hour,time2_minute,time3_yue,time3_day; bit keyup;bit flag_num;uchar timebuf[8]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};uchar chu[8]={0x00,0x00,0x07,0x16,0x04,0x01,0x13,0x00};#define NOP3() _nop_();_nop_();_nop_()/**DS1302与MCU连接的各端口定义*****************/sbit DS_IO=P2^0;//DS1302数据口sbit DS_SCLK=P2^7;//DS1302串行时钟sbit DS_RST=P2^4;/**DS1302内部各个寄存器地址定义***********/#define DS1302_SECOND 0X80 // 秒#define DS1302_MINUTE 0X82 // 分#define DS1302_HOUR 0X84 // 时#define DS1302_DAY0X86 // 日#define DS1302_MONTH 0X88 // 月#define DS1302_WEEK 0X8A // 星期#define DS1302_YEAR 0X8C // 年#define DS1302_CONTROL 0X8E //写保护控制位#define DS1302_RAM(X) (0XC0+(X)*2)//用于计算DS1302静态RAM地址void delayms(uint z){uint x;uchar y;for(x=z;x>0;x--)for(y=123;y>0;y--);}/**********************************************写入单个字节**********************************************/void DS1302WriteByte(uchar Wdate){uchar i;for(i=0;i<8;i++){DS_IO=(bit)(Wdate&0x01);DS_SCLK=1;DS_SCLK=0;NOP3();Wdate>>=1;}}/***********************************************读取一个字节*************************************************/uchar DS1302ReadByte(void){uchar i,temp;temp=0;for(i=0;i<8;i++){temp>>=1;if(DS_IO==1){temp=temp|0x80;}DS_SCLK=1;NOP3();DS_SCLK=0;}return(temp);}/********************************************** 对单个地址写相应的数据***********************************************/ void Write1302(uchar addr,uchar DSdate){DS_RST=0;DS_SCLK=0;DS_RST=1;EA=0;DS1302WriteByte(addr); //地址DS1302WriteByte(DSdate); //数据DS_SCLK=1;DS_RST=0;EA=1;}/********************************************** 读相应地址的数据***********************************************/ uchar Read1302(uchar addr){uchar Rdate;DS_RST=0;DS_SCLK=0;DS_RST=1;EA=0;DS1302WriteByte(addr|0x01);Rdate=DS1302ReadByte();DS_SCLK=1;DS_RST=0;EA=1;return(Rdate);}void bell(){ uchar j;for(j=0;j<8;j++){ sound=~sound;delayms(1);}}void close_led(){uchar i;for(i=0;i<8;i++){LEDCLK=0;LEDDIN=1;_nop_();LEDCLK=1;}}void Read_Key() //**键值读取函数**//{keytemp<<=1;if(Key_Input==1){keytemp++;}}void keyscan() //键值确认函数{if(keytemp==0xff){ keyup=1; //按键已经放开keyback=0; //清除按键备份值keyval=0; //清除按键存放单元}else if(keytemp==keyback&&keyup==1) //两次的检测的值一样且按键已经放开{keyval=keytemp; //存放按键值keyup=0; //按下按键keyback=0; //清除按键备份值}else{ keyback=keytemp;}}void Key_job() //**键值工作程序**//{switch(keyval){case 0x7f: { time_mod= ~time_mod;flag_num=0;keynum=1;keyval=0;break;}case 0xbf: { set_mod ++;if(set_mod==4){set_mod=0;}flag_num=0;keynum=2;keyval=0;break;}case 0xdf: { if(add_dec_flag==0){if(set_mod==1){ time1_hour++;if(time1_hour==24){ time1_hour=0;}}if(set_mod==2){ time2_hour++;if(time2_hour==24){ time2_hour=0;}}if(set_mod==3){ time3_yue++;if(time3_yue==13){ time3_yue=1;}}}else{if(set_mod==1){ time1_hour--;if(time1_hour<0){ time1_hour=23;}}if(set_mod==2){ time2_hour--;if(time2_hour<0){ time2_hour=23;}}if(set_mod==3){ time3_yue--;if(time3_yue<1){ time3_yue=12;}}}flag_num=0;keynum=3;keyval=0;break;}case 0xef: { if(add_dec_flag==0){ if(set_mod==1){ time1_minute++;if(time1_minute==61){ time1_minute=0;}}if(set_mod==2){ time2_minute++;if(time2_minute==61){ time2_minute=0;}}if(set_mod==3){ time3_day++;if(time3_day==32){ time3_day=1;}}}else{ if(set_mod==1){ time1_minute--;if(time1_minute<0){ time1_minute=60;}}if(set_mod==2){ time2_minute--;if(time2_minute<0){ time2_minute=60;}}if(set_mod==3){ time3_day--;if(time3_day<1){ time3_day=31;}}}flag_num=0;keynum=4;keyval=0;break;}case 0xf7: { t_open++;if(t_open==4){t_open=0;}flag_num=0;keynum=5;keyval=0;break;}case 0xfb: { add_dec_flag=~add_dec_flag;flag_num=0;keynum=6;keyval=0;break;}case 0xfd:keynum=7;break;case 0xfe:keynum=8;break;default: if(keyup==1){keynum=0;}keyval=0;break;}}void Write_com(uchar com){lcd_rs=0;lcd_date=com;delayms(2);lcd_en=1;delayms(2);lcd_en=0;}void Write_dat(uchar dat){lcd_rs=1;lcd_date=dat;delayms(2);lcd_en=1;delayms(2);lcd_en=0;}void lcd_init(){lcd_rw=0;lcd_en=0;delayms(15);Write_com(0x38);delayms(5);Write_com(0x38);delayms(5);Write_com(0x38);//显示模式设置Write_com(0x08);//显示关闭Write_com(0X01);//清屏Write_com(0x06);//显示光标移动设置Write_com(0X0c);//显示开及光标设置}void display_key(){ Write_com(0x4b+0x80);Write_dat('K');Write_com(0x4c+0x80);Write_dat('E');Write_com(0x4d+0x80);Write_dat('Y');Write_com(0x4e+0x80);Write_dat(':');Write_com(0x4f+0x80);Write_dat('0'+keynum);}init_mcu(){TMOD=0x01;TH1=(65536-data)/256;TL1=(65536-data)%256;ET1=1;TR1=1;EA=1;}/******************************************** DS1302初始化********************************************/ void Init_DS1302(){DS_RST=0;DS_SCLK=0;DS_IO=0;}/****************************************** 设置时钟芯片时间*******************************************/ void SET_DS1302(){Write1302(DS1302_CONTROL,0X00);///* Write1302_All(timebuf);*/Write1302(DS1302_SECOND,0X00);//Write1302(DS1302_MINUTE,0X0);//Write1302(DS1302_HOUR,0X07);//Write1302(DS1302_DAY,0X16);//Write1302(DS1302_MONTH,0X4);//Write1302(DS1302_YEAR,0X13);//Write1302(DS1302_WEEK,0x01);Write1302(DS1302_CONTROL,0X80);//}void read_date(){ uchar j;for(j=0;j<7;j++){ timebuf[j]=Read1302(0x80+j*2);}}void display1_date(){ //uchar k;Write_com(0x00+0x80);Write_dat('2');Write_com(0x01+0x80);Write_dat('0');Write_com(0x02+0x80);Write_dat((timebuf[6]/16)+0x30);Write_com(0x03+0x80);Write_dat((timebuf[6]%16)+0x30);Write_com(0x04+0x80);Write_dat('-');Write_com(0x05+0x80);Write_dat((timebuf[4]/16)+0x30);Write_com(0x06+0x80);Write_dat((timebuf[4]%16)+0x30);Write_com(0x07+0x80);Write_dat('-');Write_com(0x08+0x80);Write_dat((timebuf[3]/16)+0x30);Write_com(0x09+0x80);Write_dat((timebuf[3]%16)+0x30);Write_com(0x0b+0x80);Write_dat((timebuf[5]%16)+0x30);Write_com(0x0c+0x80);Write_dat('t');Write_com(0x0d+0x80);Write_dat('h');Write_com(0x40+0x80);Write_dat((timebuf[2]/16)+0x30);Write_com(0x41+0x80);Write_dat((timebuf[2]%16)+0x30);Write_com(0x42+0x80);Write_dat(':');Write_com(0x43+0x80);Write_dat((timebuf[1]/16)+0x30);Write_com(0x44+0x80);Write_dat((timebuf[1]%16)+0x30);Write_com(0x45+0x80);Write_dat(':');Write_com(0x46+0x80);Write_dat((timebuf[0]/16)+0x30);Write_com(0x47+0x80);Write_dat((timebuf[0]%16)+0x30); }void display_date(){ // uchar k;Write_com(0x00+0x80);Write_dat('2');Write_com(0x01+0x80);Write_dat('0');Write_com(0x02+0x80);Write_dat((disp[6]/16)+0x30);Write_com(0x03+0x80);Write_dat((disp[6]%16)+0x30);Write_com(0x04+0x80);Write_dat('-');Write_com(0x05+0x80);Write_dat((disp[4]/16)+0x30);Write_com(0x06+0x80);Write_dat((disp[4]%16)+0x30);Write_com(0x07+0x80);Write_dat('-');Write_com(0x08+0x80);Write_dat((disp[3]/16)+0x30);Write_com(0x09+0x80);Write_dat((disp[3]%16)+0x30);Write_com(0x0b+0x80);Write_dat((disp[5]%16)+0x30);Write_com(0x0c+0x80);Write_dat('t');Write_com(0x0d+0x80);Write_dat('h');Write_com(0x40+0x80);Write_dat((disp[2]/16)+0x30);Write_com(0x41+0x80);Write_dat((disp[2]%16)+0x30);Write_com(0x42+0x80);Write_dat(':');Write_com(0x43+0x80);Write_dat((disp[1]/16)+0x30);Write_com(0x44+0x80);Write_dat((disp[1]%16)+0x30);Write_com(0x45+0x80);Write_dat(':');Write_com(0x46+0x80);Write_dat((disp[0]/16)+0x30);Write_com(0x47+0x80);Write_dat((disp[0]%16)+0x30);}void read1302_all(uchar addr,uchar *shu) { uchar i;DS_RST=0;DS_SCLK=0;DS_RST=1;EA=0;DS1302WriteByte(addr);for(i=0;i<N;i++){shu[i]=DS1302ReadByte();}DS_SCLK=1;DS_RST=0;EA=1;}void Write1302_All(uchar *p,uchar addr){uchar i;Write1302(DS1302_CONTROL,0X00);DS_RST=0;DS_SCLK=0;DS_RST=1;EA=0;DS1302WriteByte(addr); //地址for(i=0;i<N;i++){DS1302WriteByte(*(p+i));}DS_SCLK=1;DS_RST=0;EA=1;Write1302(DS1302_CONTROL,0X80);}/************************************************ 延时函数*功能: 可随意设置延时时间,延时时间为tt ms.晶振为12MHz *************************************************/ void delay1ms(unsigned int tms){unsigned char i;while(tms--)for(i=123;i>0;i--);}/******************************************启动I2C总线函数******************************************/void Start(){SDA=1;SCL=1;NOP3();SDA=0;NOP3();SCL=0;}/****************************************** I2C停止******************************************/ void Stop(){SDA=0;SCL=1;NOP3();SDA=1;NOP3();}/****************************************** I2C应答检测函数******************************************/ void I2C_ACK(){SDA=0;NOP3();SCL=1;NOP3();SCL=0;NOP3();SDA=1;}/****************************************** I2C非应答检测函数******************************************/ void I2C_NACK(){SDA=1;NOP3();SCL=1;NOP3();SCL=0;NOP3();SDA=0;}/******************************************I2C初始化******************************************/ void Init_24cxx(){SDA=1;NOP3();SCL=1;NOP3();}/****************************************** 读I2C函数******************************************/ uchar I2C_Read(){uchar i,temp;SDA=1;for(i=0;i<8;i++){temp=temp<<1;SCL=1;NOP3();if(SDA==1){temp++;}NOP3();SCL=0;}return temp;}/****************************************** 写I2C函数******************************************/ I2C_Write(uchar date1){uchar i,temp;temp=date1;for(i=0;i<8;i++){SDA=(bit)(temp&0x80);SCL=1;NOP3();SCL=0;temp=temp<<1;}SDA=1;NOP3();}/****************************************** 写相应地址的数据******************************************/ void Write_add(uint address,uchar date1){uchar addrh,addrl;addrh=address>>8;addrl=address%256;EA=0;Start();I2C_Write(0xa0);//发送命令字+芯片编号+P0+W I2C_ACK();I2C_Write(addrh);//发高位地址I2C_ACK();I2C_Write(addrl);//发低位地址I2C_ACK();I2C_Write(date1);//发送数据I2C_ACK();Stop();//停止EA=1;}/**页写**/void Write_ye_add(uint address,uchar *shu){ uint i;uchar addrh,addrl;addrh=address>>8;addrl=address%256;EA=0;Start();I2C_Write(0xa0);//发送命令字+芯片编号+P0+W I2C_ACK();I2C_Write(addrh);//发高位地址I2C_ACK();I2C_Write(addrl);//发低位地址I2C_ACK();for(i=0;i<N;i++){I2C_Write(shu[i]);//发送数据I2C_ACK();}Stop();//停止EA=1;}//***页读*//Read_ye_add(uint address){ uint i;uchar addrh,addrl;addrh=address>>8;addrl=address%256;EA=0;Start();I2C_Write(0xa0);//发送命令字+芯片编号+P0+W I2C_ACK();I2C_Write(addrh);//发高位地址I2C_ACK();I2C_Write(addrl);//发低位地址I2C_ACK();Start();I2C_Write(0xa1);//发送命令字+芯片编号+P0+RI2C_ACK();for(i=0;i<N;i++){ I2C_ACK();*(disp+i)=I2C_Read();}I2C_NACK();Stop();EA=1;}/****************************************** 读相应地址的数据******************************************/ uchar Read_add(uint address){uchar addrh,addrl,temp;addrh=address>>8;addrl=address%256;EA=0;Start();I2C_Write(0xa0);//发送命令字+芯片编号+P0+W I2C_ACK();I2C_Write(addrh);//发高位地址I2C_ACK();I2C_Write(addrl);//发低位地址I2C_ACK();Start();I2C_Write(0xa1);//发送命令字+芯片编号+P0+R I2C_ACK();temp=I2C_Read();I2C_NACK();Stop();EA=1;return temp;}void display_set_time(){ Write_com(0x00+0x80);Write_dat('T');Write_com(0x01+0x80);Write_dat('1');Write_com(0x02+0x80);Write_dat(':');Write_com(0x03+0x80);Write_dat((time1_hour/10)+0x30);Write_com(0x04+0x80);Write_dat((time1_hour%10)+0x30);Write_com(0x05+0x80);Write_dat(':');Write_com(0x06+0x80);Write_dat((time1_minute/10)+0x30);Write_com(0x07+0x80);Write_dat((time1_minute%10)+0x30);Write_com(0x09+0x80);Write_dat('D');Write_com(0x08+0x80);Write_dat(' ');Write_com(0x0a+0x80);Write_dat(':');Write_com(0x0b+0x80);Write_dat((time3_yue/10)+0x30);Write_com(0x0c+0x80);Write_dat((time3_yue%10)+0x30);Write_com(0x0d+0x80);Write_dat('-');Write_com(0x0e+0x80);Write_dat((time3_day/10)+0x30);Write_com(0x0f+0x80);Write_dat((time3_day%10)+0x30);Write_com(0x40+0x80);Write_dat('T');Write_com(0x41+0x80);Write_dat('2');Write_com(0x42+0x80);Write_dat(':');Write_com(0x43+0x80);Write_dat((time2_hour/10)+0x30);Write_com(0x44+0x80);Write_dat((time2_hour%10)+0x30);Write_com(0x45+0x80);Write_dat(':');Write_com(0x46+0x80);Write_dat((time2_minute/10)+0x30);Write_com(0x47+0x80);Write_dat((time2_minute%10)+0x30); }void time1_compare(){ uchar k;if(t_open==1){ if(timebuf[2]>time1_hour){ for(k=0;k<3;k++){ Write_com(0x00+0x80+k);Write_dat(0xff);}bell();}if(timebuf[2]==time1_hour){ if(timebuf[1]>=time1_minute){ for(k=0;k<3;k++){ Write_com(0x00+0x80+k);Write_dat(0xff);}bell();}}}if(t_open==2){ if(timebuf[2]>time2_hour){ for(k=0;k<3;k++){ Write_com(0x40+0x80+k);Write_dat(0xff);}bell();}if(timebuf[2]==time2_hour){ if(timebuf[1]>=time2_minute){ for(k=0;k<3;k++){ Write_com(0x40+0x80+k);Write_dat(0xff);}bell();}}}if(t_open==3){ if(timebuf[4]>time3_yue){ for(k=0;k<2;k++){ Write_com(0x09+0x80+k);Write_dat(0xff);}bell();}else{sound=1;}if(timebuf[4]==time3_yue){ if(timebuf[3]>time3_day){ for(k=0;k<2;k++){ Write_com(0x09+0x80+k);Write_dat(0xff);}bell();}else{sound=1;}}}}void time_compare(){ uchar k;if(t_open==1){ if(disp[2]>time1_hour){ for(k=0;k<3;k++){ Write_com(0x00+0x80+k);Write_dat(0xff);}bell();}if(disp[2]==time1_hour){ if(disp[1]>=time1_minute){ for(k=0;k<3;k++){ Write_com(0x00+0x80+k);Write_dat(0xff);}bell();}}}if(t_open==2){ if(disp[2]>time2_hour){ for(k=0;k<3;k++){ Write_com(0x40+0x80+k);Write_dat(0xff);}bell();}if(disp[2]==time2_hour){ if(disp[1]>=time2_minute){ for(k=0;k<3;k++){ Write_com(0x40+0x80+k);Write_dat(0xff);}bell();}}}if(t_open==3){ if(disp[4]>time3_yue){ for(k=0;k<2;k++){ Write_com(0x09+0x80+k);Write_dat(0xff);}bell();}if(disp[4]==time3_yue){ if(disp[3]>time3_day){ for(k=0;k<2;k++){ Write_com(0x09+0x80+k);Write_dat(0xff);}bell();}else{ sound=1;}}}}main(){ lcd_init();close_led();init_mcu();Init_DS1302();SET_DS1302();// Write1302_All(chu,0xbe);time_mod=0;set_mod=0;time1_hour=7;time1_minute=30;time2_hour=23;time2_minute=30;time3_yue=4;time3_day=16;t_open=0;add_dec_flag=0;sound=1;while(1){ uchar j;lcd_en=0;LEDCLK=0;LEDDIN=0;_nop_();LEDCLK=1;for(j=0;j<8;j++){ Read_Key();delayms(2);LEDCLK=0;LEDDIN=1;_nop_();LEDCLK=1;}keyscan();Key_job();lcd_en=0;LEDDIN=1;// read_date();read1302_all(0xbf,timebuf); // Write_ye_add(0x02,timebuf); // Read_ye_add(0x02);Write1302_All(timebuf,0xfe);read1302_all(0xff,disp);lcd_rw=0;if(time_mod==0){display1_date();}// else// { display1_date();// }else{ display_set_time();}display_key();LEDDIN=1;lcd_rw=0;time_compare();}}本设计采用DS1302片内自带的RAM做存储器。