1、基于51单片机、DS1302和ISD1420数字时钟设计说明书LOGO 目录目录 一、引言 二、总体设计 三、硬件设计 四、软件设计 五、数字钟制作过程中遇到的问题 六、总结 附录:作品图片展示 附录:DS1302时钟芯片的工作原理和使用方发 附录:参考资料LOGO 此次是科技学院举办的首届“电子设计与程序设计”大赛,我们班的同学积极参加,设计出属余自己的满意作品。 为了进一步熟悉51单片机的编程以及学习数字钟的相关设计方法,我们进行了本次数字钟的设计。我们在规定的一个多星期时间里,基于51单片机STC89C52单片机、时钟芯片DS1302及语音芯片ISD1420设计并实现了数字时钟。在硬件焊
2、接完成并且调试成功之际,为了进一步提高自己动手能力和编程能力,对这次数字钟的设计和制作的过程中遇到的问题及设计思路做一总结。 随着人们生活水平的提高和生活节奏的加快,对时间的要求越来越高,精准数字计时的消费需求也是越来越多。现在,最具代表性的计时产品就是电子万年历除了原有的显示时间、日期等基本功能外,还具有闹铃,语音报时、报警等功能。其利用STC89系列单片微机制成万年历电路,采用软件和硬件结合的方法,控制LED数码管输出,分别用来显示年、月、日、时、分、秒,其最大特点是:硬件电路简单,安装方便易于实现,软件设计独特,可靠。在21世纪的今天,单片机仍然有着它不可替代的地位和独,为了进一步学习5
3、1单片机的控制和编程,我们利用51单片机自己设计并制作数字钟。 LOGO二、总体设计二、总体设计 此数字钟主要利用单片机STC89C52、时钟芯片DS1302和语音芯片ISD1420设计完成。2.12.1设计与运行环境设计与运行环境数字钟的程序设计和调试均在Keil uVision2环境下完成的。设计并完成的程序下载至STC89C52单片机后,即可初始化时钟芯片DS1302从而开始计时,系统开始正常运行。2.22.2硬件功能描述硬件功能描述 数字钟能够完成24小时制计时,计时初始化值设为12:30:30,用户可以通过按键调整时钟的初值实现校时功能,可以通过软件设定3个24小时以内任意时刻的闹铃
4、,且能进行语音报时,用户可以手动选择闹铃的开或者关两种状态。LOGO三、硬件设计三、硬件设计3.1 3.1 系统硬件框图系统硬件框图80c52DS1302ISD142074ls234共阳数码管闹铃LM386speaker MICLOGO3.23.2、硬件设计、硬件设计 数字钟的电路主要有电源模块、显示模块、按键模块、复位电路模块、时钟芯片模块、语音芯片模块、主控芯片STC89C52模块和闹铃模块等大模块组成。 3.2.1、电源 电源模块采用7805进行稳压,保证+5V电压的稳定输出,进一步提高系统的抗干扰能力和稳定性。7.4vcc+-+-+电源稳压芯片+-LOGO 3.2.2、独立按键模块 系
5、统有6个独立按键,独立按键S1、S2、S3分别接至单片机P3.2、P0.0、P0.3口,S4、S5、S6分别接至语音芯片P27、P25、P24。s1s2s3s4s5s6调时按键语音芯片录放音按键P3.2 P0.0 P0.3P27 P25 P24LOGO3.2.3、显示模块 一个良好的显示模块对一个系统非常重要,所有操作结果和计时结果,都要通过显示模块来显示出来。常用的显示模式有LED 7段数码管显示、点阵显示和液晶显示。液晶显示屏(LCD)具有轻薄短小、低耗电量、无辐射危险,可视面积大,分辨率高,抗干扰能力强等特点。但由于液晶其成本也偏高。在使用时,不能有静电干扰,否则易烧坏液晶的显示芯片。鉴
6、于LED 7段数码管成本低,也比较容易实现的特点,最终确定使用共阴极数码管来显示。 本系统显示模块电路由一块74ls245、和两个四位一体7段数码管组成。74ls245用来驱动数码管,74ls245的A0A7分别接四位一体数码管的段选。74LS245P2LOGO3.2.4、复位电路模块 复位电路主要的功能是是整个系统初始化,在每次上电时系统自动初始化,如果在程序运行的过程中程序没有响应或者需要进行一次初始化,这是可以通过按复位开关来实现需要的有效操作。LOGO3.2.5时钟芯片模块DS1302时钟芯片是本系统实现高精度计时的关键。利用DS1302时钟芯片独立于单片机来计时,在提高计时进度的同时
7、也提高了整个系统的抗干扰能力。DS1302通过SCLK、I/O、RES端口和单片机STC90C52进行通信。SCLK接至单片机P3.4口,在读写操作时给DS1302提供相应的时钟脉冲;I/O接至P3.5用来传送所有的数据;RES接至单片机P3.6上用来控制单片机与时钟芯片间的数据传送的开始与结束。DS1302的工作原理及使用方法见附录。LOGO 3.2.6语音芯片模块 ISD1420模块单片录放时间20秒,音质好。芯片采用CMOS技术,内含振荡器、话筒前置放大、自动增益控制、防混淆滤波器、平滑滤波器、扬声器驱动及 EEPROM 阵列。最小的录放系统仅需麦克风、喇叭、两个按钮、电源及少数电阻和电
8、容。 其性能特点如下: (1)使用方便的单片20秒语音录放 (2)高质量、自然的语音还原技术(3)边沿/电平触发放音(4)自动节电,维持电流0.5A(5)不耗电信息保存100年(典型值)(6)100,000 次录音周期(典型值)(7)多段信息处理,可分1至160 段(8)片内免调整时钟,也可选用外部时钟(9)无需开发系统(10)5V 单电源工作LOGOISD1420的内部结构框图LOGOISD1420固定地址录放音电路LOGO3.1.7、主控模块主控模块的核心组成部分是单片机STC89C52, 承担着所有操作任务的调控与分派工作。LOGO 3.2.8、闹铃模块闹铃模块由蜂鸣器和蜂鸣器的驱动(三
9、极管)组成。在有闹铃发生的时候,蜂鸣器的驱动电路驱动蜂鸣器发声,产生闹铃的效果。LOGO四、软件设计四、软件设计 4.14.1、程序设计流程图、程序设计流程图 4.1.1、主程序流图 开始DS1302初始化读一次DS1302计数值判断闹铃是否发生?闹铃响Y语音报时动态显示扫描NINTO是否中断?中断校时YNLOGO 4.1.2、DS1302读写流程图结束结束写DS1302读DD1302LOGO4.24.2、源程序、源程序 本程序主要实现的功能:利用时钟芯片DS1302、语音芯片ISD1420和STC89C52进行高精度计时,能够实现时、分、秒的显示,具有校时、定时、闹铃和语音报时的功能。#in
10、clude#includetypedef unsigned char uchar; /驱动程序定义#define WRITE_SECOND 0 x80 #define WRITE_MINUTE 0 x82 #define WRITE_HOUR 0 x84#define READ_SECOND 0 x81#define READ_MINUTE 0 x83#define READ_HOUR 0 x85#define WRITE_PROTECT 0 x8Euchar second,minute,hour; / 定义三个全局量uchar code table=0 xc0,0 xf9,0 xa4,0 x
11、b0,0 x99,0 x92,0 x82,0 xf8,0 x80,0 x90;/共阳 h-a/位寻址寄存器定义sbit ACC_7 =ACC7;sbit SCLK =P34; /DS1032时钟信号sbit DIO =P35; / DS132数据信号sbit CE =P36; / DS1032片选sbit P2_0=P10;sbit P2_1=P21;sbit P2_2=P22;sbit P2_3=P23;sbit P2_4=P24;LOGOsbit P2_5=P25;sbit P2_6=P26;sbit P2_7=P27;sbit P0_0=P00;sbit P0_1=P01;sbit P0
12、_2=P02;sbit P0_3=P03;sbit P0_4=P04;sbit P0_5=P05;sbit P0_6=P06;sbit P0_7=P07; sbit P3_0=P30;sbit P3_1=P31;sbit P3_3=P33;sbit P3_7=P37;/地址、数据发送子程序void Write1302(uchar address,uchar dat) uchar i,temp; CE=0; /数据传送终止 SCLK=0; /清零时钟总线 CE=1; /发送地址 for(i=8;i0;i-) /循环8次移位 SCLK=0; temp=address; DIO=(bit)(temp
13、&0 x01); /每次传送低字节 address=1; /右移一位 SCLK=1; LOGO/发送数据for(i=8;i0;i-) SCLK=0; temp=dat; DIO=(bit)(temp&0 x01); dat=1; SCLK=1; CE=0;/数据读取子程序uchar Read1302(uchar address) uchar i,temp,data1,data2; CE = 0; SCLK = 0; CE = 1; /读取数据for(i=8;i0;i-) ACC_7=DIO; SCLK=1; ACC=1; SCLK=0; LOGO CE=0; data1=ACC; data2=
14、data1/16;/数据进制的转换 data1=data1%16;/16进制转换10进制 data1=data1+data2*10; return(data1);/初始化DS1302 void DS1302Initial() Write1302(WRITE_PROTECT ,0 x00); / 禁止写保护 Write1302(WRITE_SECOND ,0 x30); / 秒初始化 Write1302(WRITE_MINUTE ,0 x30); / 分初始化 Write1302(WRITE_HOUR ,0 x12); / 小时初始化 Write1302(WRITE_PROTECT,0 x80)
15、; / 允许写保护 /定时器延时 void delay( uchar delaytime) uchar i; TMOD=0X02; /T0定时器,方式2,自动重装初值 TL0=0XA3; /每次0.1ms TH0=0XA3; TR0=1; /启动T0 for( i=delaytime;i0;i-) while(!TF0); TF0=0; /溢出标志清零 TR0=0; LOGO/加一操作 uchar INC(uchar time) uchar data1,data2; time+; data1=time%10; data2=time/10; data1=data2*16+data1; /10进制
16、转16进(逆) return(data1); /语音芯片地址void IDS1420_add(uchar a0,uchar a1,uchar a2,uchar a3,uchar a4,uchar a5,uchar a6,uchar a7) P0_4=a0; P0_5=a1; P0_6=a2; P0_7=a3; P0_1=a4; P0_2=a5; P3_1=a6; P3_7=a7; LOGOvoid IDS1420_play() P3_3=0; delay(20); P3_3=1; /数码管显示 void display(uchar sec,uchar min,uchar hou ) P2_7=
17、1; P1=tablesec%10; delay(30); P2_7=0; P2_6=1; P1=tablesec/10; /显示秒 delay(30); P2_6=0; P2_5=1; P1=tablemin%10; delay(30); P2_5=0; P2_4=1; P1=tablemin/10; /显示分 delay(30); LOGO P2_4=0; P2_3=1; P1=tablehou%10; delay(30); P2_3=0; P2_2=1; P1=tablehou/10; /显示时 delay(30); P2_2=0; P2_0=1; P1=table0; /显示余2位为0
18、 delay(30); P2_2=0; P2_1=1; P1=table0; /显示余2位为0 delay(30); P2_1=0; LOGO/主函数 void main() uchar i; P0_4=1; P0_5=1; P0_6=1; P0_7=1; P0_1=1; P0_2=1; P3_1=1; P3_7=1; P3_3=1; EA=1; IT0=1; /外部中断0负沿触发 DS1302Initial(); P3_0=0; LOGO while(1) second= Read1302(READ_SECOND); minute= Read1302(READ_MINUTE); hour =
19、 Read1302(READ_HOUR); display( second, minute, hour) ; EX0=1; delay(10);EX0=0; if(hour=12&minute=31&second=0) P3_0=1; /开闹铃 for(i=5000;i0;i-) /延时3秒,闹响3秒 second= Read1302(READ_SECOND); minute= Read1302(READ_MINUTE); hour = Read1302(READ_HOUR); display( second, minute, hour); delay(20); P3_0=0; /关闹铃 LO
20、GO /IDS1420_play(); for(i=3000;i0;i-) second= Read1302(READ_SECOND); minute= Read1302(READ_MINUTE); hour = Read1302(READ_HOUR); display( second, minute, hour); delay(20); P0_4=1; IDS1420_play(); LOGO if(hour=12&minute=39&second=0) P3_0=1; for(i=50000;i0;i-) second= Read1302(READ_SECOND); minute= Rea
21、d1302(READ_MINUTE); hour = Read1302(READ_HOUR); display( second, minute, hour); delay(20); P3_0=0; /IDS1420_add(0,0,0,0,0,0,0,0); IDS1420_play(); for(i=3000;i0;i-) second=Read1302(READ_SECOND); minute= Read1302(READ_MINUTE); hour = Read1302(READ_HOUR); display( second, minute, hour); delay(20); /IDS
22、1420_add(0,0,0,1,0,1,1,1); IDS1420_play(); LOGO if(hour=12&minute=39&second=0) P3_0=1; for(i=50000;i0;i-) second= Read1302(READ_SECOND); minute= Read1302(READ_MINUTE); hour = Read1302(READ_HOUR); display( second, minute, hour); delay(20); P3_0=0; /IDS1420_add(0,0,0,0,0,0,0,0); IDS1420_play(); for(i=
23、3000;i0;i-) second= Read1302(READ_SECOND); minute= Read1302(READ_MINUTE); hour = Read1302(READ_HOUR); display( second, minute, hour); delay(20); /IDS1420_add(0,0,1,0,0,0,1,1); IDS1420_play(); LOGO/中断调时 void set_time() interrupt 0 using 0 uchar MINUTE = minute; uchar HOUR = hour; uchar i; for(i=5500;
24、i0;i+) if(P0_0=0) delay(2000); if(P0_0=0) MINUTE=INC(minute); Write1302(WRITE_PROTECT ,0 x00); Write1302(WRITE_MINUTE , MINUTE); Write1302(WRITE_PROTECT,0 x80); minute= Read1302(READ_MINUTE); LOGO if(P0_3=0) delay(2000); if(P0_3=0) HOUR=INC(hour); Write1302(WRITE_PROTECT ,0 x00); Write1302(WRITE_HOU
25、R ,HOUR); Write1302(WRITE_PROTECT,0 x80); hour= Read1302(READ_HOUR); display( second, minute, hour) ; delay(1800); LOGO五、数字钟制作过程中遇到的问题五、数字钟制作过程中遇到的问题1、执行完中断程序后,不能返回到主程序。 解决办法:在主程序中设置一段时间,专门检测外部中断,设置的时间要合适,通过多调试几次来确定。2、在调时过程中数码管显示时间不稳定,有时还自动复位。 解决办法:多数情况是由于电源电量不足,导致单片机工作不稳定,此时将电池充满电,接入电路即可。3、数码管显示时间,
26、但有时时间混乱。 可能原因:单片机与时钟芯片连接的三根线间有串扰,用三根单独的线连接,不能整齐排在一起,防止窜扰。4、蜂鸣器在没有闹铃发生时没有声音,在闹铃响完以后还回有比较小的嘟嘟声。可能原因:理想状态下在闹铃响完后驱动蜂鸣器的三极管截止,蜂鸣器上没有电流流过,蜂鸣器出在不发声状态。闹铃响完后蜂鸣器蜂鸣器仍然有很小的嘟嘟声,说明此时有干扰脉冲通过蜂鸣器。为了进一步减小蜂鸣器的嘟嘟声。在蜂鸣器两端接入300PF的电容后声音有所减小但没有消除。但干扰的来源尚不清楚,可能是来自电源地的干扰。LOGO六、总结 通过制作数字钟,加深了对51单片机的理解,能够较熟练地使用74LS245双向驱动器、DS1
27、302时钟芯片、ISD1420语音芯片、蜂鸣器、LM386功率放大器等。加强了动手能力,锻炼了分析和解决实际问题的能力。在制作数字钟的过程中,以为它原理简单,运用理论知识较少,很容易实现。但是,在实际中遇到很多没想到问题,在老师的指导和同学的帮助下这些问题最终得以解决。同时明白了,课本上的理论知识是在理想的条件下成立,而在实际中会受到很多因素的影响,只有把这些因素都排出或降低到最小,那么这些功能才可能实现。 最后,感谢学院提供宝贵的锻炼机会,祝工学部“电子设计与程序设计”大赛越办越好!LOGO附录附录:作品图片展示:作品图片展示图片图片1LOGO图片图片2LOGO图片图片3LOGO图片图片4L
28、OGO附录附录:DS1302DS1302时钟芯片的工作原理和使用方发时钟芯片的工作原理和使用方发1、 DS1302简介 DS13021是美国DALLAS公司推出的一种高性能、低功耗、带RAM的实时时钟芯片,它可以对年、月、日、周日、时、分、秒进行计时,且具有闰年补偿功能,工作电压宽达2.55.5V。时钟可工作在24小时格式或12小时(AM/PM)格式。 DS1302与单片机的接口使用同步串行通信,仅用3条线与之相连接。可采用一次传送一个字节或突发方式一次传送多个字节的时钟信号或RAM数据。DS1302内部有一个318的用于临时性存放数据的RAM寄存器。DS1302是DS1202的升级产品,与D
29、S1202兼容,但增加了主电源后背电源双电源引脚,同时提供了对后背电源进行涓细电流充电的能力。 2、 DS1302引脚功能与内部结构DS1302的引脚功能如表1所示,外形及内部结构如图1所示2: 引脚号 引脚名称 功能 1 VCC2 主电源 2、3 X1、X2 振荡源,外接32768Hz晶振 4 GND 地线 5 RST 复位/片选线 6 I/O 串行数据输入/输出端(双向) 7 SCLK 串行时钟输入端 8 VCC1 后备电源LOGODS1302管脚图及内部结构图管脚图及内部结构图LOGO3、 DS1302的控制字DS1302的控制字节如图2所示: 控制字节的最高有效位(位7)必须是逻辑1,
30、如果它为0,则不能把数据写入到DS1302中。位6如果为0,则表示存取日历时钟数据,为1表示存取RAM数据;位5至位1指示操作单元的地址;最低有效位(位0)如为0表示要进行写操作,为1表示进行读操作,控制字节总是从最低位开始输出。4、 DS1302的复位引脚通过把输入驱动置高电平来启动所有的数据传送。 输入有两种功能:首先,接通控制逻辑,允许地址命令序列送入移位寄存器;其次,提供了终止单字节或多字节数据的传送手段。当为高电平时,所有的数据传送被初始化,允许对DS1302进行操作。如果在传送过程中置为低电平,则会终止此次数据传送,并且I/O引脚变为高阻态。上电运行时,在Vcc2.5V之前,必须保
31、持低电平。只有在SCLK为低电平时,才能将RST置为高电平。LOGO5、 DS1302的数据输入输出在控制指令字输入后的下一个SCLK时钟的上升沿时数据被写入DS1302,数据输入从低位即位0开始。同样,在紧跟8位的控制指令字后的下一个SCLK脉冲的下降沿读出DS1302的数据,读出数据时从低位0位至高位7,数据读写时序如图3所示:6、 DS1302的寄存器DS1302共有12个寄存器,其中有7个寄存器与日历、时钟相关,存放的数据位为BCD码形式。其日历、时间寄存器及其控制字见下表。LOGO此外,DS1302还有年份寄存器、控制寄存器、充电寄存器、时钟突发寄存器及与RAM相关的寄存器等。时钟突
32、发寄存器可一次性顺序读写除充电寄存器外的所有寄存器的内容。 DS1302与RAM相关的寄存器分为两类,一类是单个RAM单元,共31个,每个单元组态为一个8位的字节,其命令控制字为C0H-FDH,其中奇数为读操作,偶数为写操作;再一类为突发方式下的RAM寄存器,此方式下可一次性读写所有的RAM的31个字节,命令控制字为FEH(写)、FFH(读)。LOGO 附录附录:参考文献:参考文献【1】8051系列单片机C程序设计完全手册 求是科技 编著 人民邮电出版社 2006【2】51单片机应用从零开始 杨欣 编著 清华大学出版社 2008【3】单片机原理及接口技术(第三版) 李朝青 编著 北京航空航天大学出版社 2008【4】51单片机C语言教程 郭天祥 编著 电子工业出版社 2009谢谢!谢谢!
侵权处理QQ:3464097650--上传资料QQ:3464097650
【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。