欢迎来到三一办公! | 帮助中心 三一办公31ppt.com(应用文档模板下载平台)
三一办公
全部分类
  • 办公文档>
  • PPT模板>
  • 建筑/施工/环境>
  • 毕业设计>
  • 工程图纸>
  • 教育教学>
  • 素材源码>
  • 生活休闲>
  • 临时分类>
  • ImageVerifierCode 换一换
    首页 三一办公 > 资源分类 > DOC文档下载  

    单片机电子时钟及报时设计.doc

    • 资源ID:4147414       资源大小:218.50KB        全文页数:28页
    • 资源格式: DOC        下载积分:8金币
    快捷下载 游客一键下载
    会员登录下载
    三方登录下载: 微信开放平台登录 QQ登录  
    下载资源需要8金币
    邮箱/手机:
    温馨提示:
    用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP免费专享
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    单片机电子时钟及报时设计.doc

    电子时钟的设计一、 设计要求1、准确计时,以数字、英语形式显示年、月、日、时、分、秒、闹钟时间。2、小时以24小时计时形式,分秒计时为60进位。 3、校正时间功能(即调整时间)、闰年补偿、并且具有单片机断电后时钟持续走的功能。4、闹钟功能。5、整点报时、任意时间报时。 6、总结检验电路设计结果 二、 设计方案和论证本次设计时钟电路,使用了STC89C52单片机微控制器、1602液晶作为显示器件。但考虑到如果用单片机的定时器来作时钟,在单片机掉电时时钟就会停止,并且每一次上电后都得从同一个时间开始变化,所以为了得到准确的时间,每次上电后都得调整时间,为了刻服这一难点,本次课程设计采用了DS1302作为时钟蕊片。并且DS1302还具有闰年补偿功能,很好地满足了以上的掉电保持以及闰年补偿功能。以ISD4004作为语音蕊片,使报时更加人性化。使用键盘键上的按键来调整时钟的时、分、秒,同时使用C语言程序来控制整个时钟显示,使得编程变得更容易,这样通过五个模块:键盘、单片机、时钟蕊片、语音蕊片、显示屏即可满足设计要求。 1、 总设计原理框图如下图所示:微型控制器STC89C52时钟电路(DS1302)(语音报时(ISD4004)校时输入数据显示(1602)2、元器件清单 名称数量STC89C52单片机1ISD4004_81DS13021L780513171咪头1110592M晶振132768K晶振210k排阻410k微调电阻610k电阻154.7k电阻2Led发光二极管4四角按键4扬声器110uF电容830pF电容6104电容11103电容52200U电容1100U电容433P电容71602液晶显示器140脚插座4铜板15cm*15cm1排针和排插若干3、各部分功能实现(1)单片机发送的信号通过程序控制最终在1602显示出来。 (2) 通过DS1302作时钟芯片。(3)通过ISD40048MP来进行语音存储,并驱动扬声器来进行报时。(4)单片机通过输出各种电脉冲信号来驱动控制各部分正常工作。(5)为使时钟走时与标准时间一致,校时电路是必不可少的,键盘用来校正液晶显示器上显示的时间。(6)单片机通过控制闹铃(ISD4004)电路来完成定时闹钟的功能。4、DS1302介绍(1) DS1302的结构及工作原理DS1302 是美国DALLAS公司推出的一种高性能、低功耗、带RAM的实时时钟电路,它可以对年、月、日、周日、时、分、秒进行计时,具有闰年补偿功能,工作电压为2.5V5.5V。采用三线接口与CPU进行同步通信,并可采用突发方式一次传送多个字节时钟信号或RAM数据。DS1302内部有一个31×8的用于临时性存放数据的RAM寄存器。DS1302是DS1202的升级产品,与DS1202兼容,但增加了主电源/后背电源双电源引脚,同时提供了对后背电源进行涓细电流充电的能力。 (2) 引脚功能及结构DS1302的引脚排列,其中Vcc1为后备电源,VCC2为主电源。在主电源关闭的情况下,也能保持时钟的连续运行。DS1302由Vcc1或Vcc2两者中的较大者供电。当Vcc2大于Vcc10.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的引脚功能图:    DS1302封装图(3) DS1302的控制字节DS1302 的控制字如图2所示。控制字节的最高有效位(位7)必须是逻辑1,如果它为0,则不能把数据写入DS1302中,位6如果为0,则表示存取日历时钟数据,为1表示存取RAM数据;位5至位1指示操作单元的地址;最低有效位(位0)如为0表示要进行写操作,为1表示进行读操作,控制字节总是从最低位开始输出。      (4) 数据输入输出(I/O)在控制指令字输入后的下一个SCLK时钟的上升沿时,数据被写入DS1302,数据输入从低位即位0开始。同样,在紧跟8位的控制指令字后的下一个SCLK脉冲的下降沿读出DS1302的数据,读出数据时从低位0位到高位7。 (5) DS1302的寄存器DS1302有12个寄存器,其中有7个寄存器与日历、时钟相关,存放的数据位为BCD码形式,其日历、时间寄存器及其控制字见表1。 此外,DS1302 还有年份寄存器、控制寄存器、充电寄存器、时钟突发寄存器及与RAM相关的寄存器等。时钟突发寄存器可一次性顺序读写除充电寄存器外的所有寄存器内容。 DS1302与RAM相关的寄存器分为两类:一类是单个RAM单元,共31个,每个单元组态为一个8位的字节,其命令控制字为C0HFDH,其中奇数为读操作,偶数为写操作;另一类为突发方式下的RAM寄存器,此方式下可一次性读写所有的RAM的31个字节,命令控制字为FEH(写)、FFH(读)。 5、ISD4004介绍 ISD4004语音芯片是由美国ISD公司推出不久的新产品。关于该语音芯片的引脚说明以及内部电路等,因为很容易在ISD公司提供的芯片资料中查到,笔者就不在本文作过多的描述。只简单对其特点做一介绍。 与普通的录音/重放芯片相比,ISD4004具有如下特点:首先是记录声音没有段长度限制,并且声音记录不需要A/D转换和压缩。其次,快速闪存作为存储介质,无需电源可保存数据长达100年,重复记录10000次以上。此外,ISD4004具有记录时间长(可达16分钟,次课程设计采用的为8分钟的ISD4004语音芯片)的优点。最后,ISD4004开发应用具有所需外围电路简单的优点6、STC89C52单片机介绍STC89C52单片机是由深圳宏晶公司代理销售的一款MCU,是由美国设计生产的一种低电压、高性能CMOS 8位单片机,片内含8kbytes的可反复写的FlashROM和128bytes的RAM,2个16位定时计数器5。 STC89C52单片机内部主要包括累加器ACC(有时也简称为A)、程序状态字PSW、地址指示器DPTR、只读存储器ROM、随机存取存储器RAM、寄存器、并行I/O接口P0P3、定时器/计数器、串行I/O接口以及定时控制逻辑电路等。这些部件通过内部总线联接起来,构成一个完整的微型计算机。其管脚图如图所示。STC89C52单片机管脚结构图7、1602液晶显示器8、 引脚功能说明1602LCD采用标准的14脚(无背光)或16脚(带背光)接口,各引脚接口说明如表8-1所示:编号符号引脚说明编号符号引脚说明1VSS电源地9D2数据2VDD电源正极10D3数据3VL液晶显示偏压11D4数据4RS数据/命令选择12D5数据5R/W读/写选择13D6数据6E使能信号14D7数据7D0数据15BLA背光源正极8D1数据16BLK背光源负极表8-1:引脚接口说明表第1脚:VSS为地电源。第2脚:VDD接5V正电源。第3脚:VL为液晶显示器对比度调整端,接正电源时对比度最弱,接地时对比度最高,对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度。第4脚:RS为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器。第5脚:R/W为读写信号线,高电平时进行读操作,低电平时进行写操作。当RS和R/W共同为低电平时可以写入指令或者显示地址,当RS为低电平R/W为高电平时可以读忙信号,当RS为高电平R/W为低电平时可以写入数据。第6脚:E端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令。第714脚:D0D7为8位双向数据线。第15脚:背光源正极。第16脚:背光源负极。9、单片机最小系统、DS1302、1602电路图10、外接电源(单片机电源)电路11、ISD4004以及功放电路12、ISD4004电源电路图13、程序流程图(略)14、源程序#include<reg51.h>/ds1302、1602控制程序;ISD4004的模块还没有整合到主程序。#define uint unsigned int#define uchar unsigned charsbit RS=P26;/数据/命令选择线sbit EL=P27;/使能信号线sbit gl=P13;sbit ja=P14;sbit jan=P15;sbit dgl=P16;sbit lao=P17;sbit laoto=P32;sbit ds1302_clk=P10;/脉冲线sbit ds1302_io=P11;/数据线sbit ds1302_rst=P12;/复位控制线uchar kk='0','1','2','3','4','5','6','7','8','9'uchar y1,y2,num,change;uchar table1="Alarm:12:25 "uchar table2=" "uchar on="on "uchar off="off "/-void delay1(uint z)/延时函数uint x,y;for (x=z;x>0;x-) for(y=0;y<100;y+);void comand_1602(uchar com)/1602命令输入P0=com;/命令输入RS=0;EL=0;delay1(1);EL=1;delay1(1);EL=0;void indat_1602(uchar dat)/1602数据输入P0=dat;/命令输入RS=1;EL=0;delay1(1);EL=1;delay1(1);EL=0;void Print(unsigned char *str)/1602显示函数while(*str!='0')indat_1602(*str);str+;void innit_1602()/1602初始化comand_1602(0x38);/功能设定delay1(20);comand_1602(0x38);/功能设定delay1(20);comand_1602(0x38);/功能设定delay1(20);/-comand_1602(0x38);/分两行显示,5*7显示方式delay1(20);comand_1602(0x0f);/开显示,有光标,光标闪烁delay1(20);comand_1602(0x01);/清屏delay1(20);comand_1602(0x06);/输入时光标自动向右移动一格,并且加一delay1(20);/-void delay(uint z)uchar x,y;for(x=z;x>0;x-)for(y=110;y>0;y-);uchar ds1302_read()/读出数据uchar i,b=0;ds1302_clk=0;for(i=0;i<8;i+)if(ds1302_io=1)b=b|0x80;/先读低位elseb=b|0x00;ds1302_clk=1;ds1302_clk=0; if (i<7) b=b>>1; return(b);void ds1302_write(uchar com)uchar i,a;a=com;ds1302_clk=0;for(i=0;i<8;i+)if(a&0x01)ds1302_io=1;/先写低位elseds1302_io=0;ds1302_clk=1;ds1302_clk=0; a=a>>1; uchar ds1302_read_baye(uchar adrr)uchar aa;ds1302_rst=0;ds1302_clk=0;ds1302_rst=1;ds1302_write(adrr);/写入地址ds1302_io=0;aa=ds1302_read();ds1302_clk=1;ds1302_rst=0;return (aa);uchar ds1302_write_baye(uchar adrr,dat)ds1302_rst=0;ds1302_clk=0;ds1302_rst=1;ds1302_write(adrr);/写入地址ds1302_write(dat);ds1302_clk=1;ds1302_rst=0;uchar go10to16(uchar u)/10进制转换为16进制uchar a,b,c;if (u<16)/小于16不用转换return(u);elsea=u/16;/取商b=u%16;/取模c=a*10+b;return(c);void cuanhuan(uchar i)uchar a,b;a=i;b=go10to16(a);if(b>0&b<10)y1=kk0;y2=kkb;elsey1=kkb/10;y2=kkb%10;/*-此函数在第一次用到DS1302时才用,初始化后,以后就不用初始化了,除非你想再一次设定DS1302才用,注意填写10位与个位所放的位置,如我要设27号,应为:0010 011110位放在这 个位放在这而不是0x1B 0001 1011-*/void ds1302int(uchar year,moon,date,week,hour,mini,sen)/当DS1302第一次使用时要进行设置ds1302_rst=0;ds1302_clk=0;ds1302_rst=1;ds1302_write(0x8e);ds1302_write(0x00);ds1302_rst=0;ds1302_clk=1;ds1302_write_baye(0x8c,year);/设置年为08年ds1302_write_baye(0x88,moon);/设置月为3月ds1302_write_baye(0x86,date);/设置日为27号ds1302_write_baye(0x8B,week);/设置星期ds1302_write_baye(0x84,hour);/设置时9时ds1302_write_baye(0x82,mini);/设置分为5分ds1302_write_baye(0x80,sen);/设置秒为00秒ds1302_rst=0;ds1302_clk=0;ds1302_rst=1;ds1302_write(0x8e);ds1302_write(0x80); void ds1302change(uchar addr,date)/修改ds1302_rst=0;ds1302_clk=0;ds1302_rst=1;ds1302_write(0x8e);ds1302_write(0x00);ds1302_rst=0;ds1302_clk=1;ds1302_write_baye(addr,date);ds1302_rst=0;ds1302_clk=0;ds1302_rst=1;ds1302_write(0x8e);ds1302_write(0x80); void xs() comand_1602(0x80); /清除第一行if(lao=0)Print(table1); if(laoto=0) Print(on); if(laoto=1) Print(off); if(lao=1)comand_1602(0x80);Print("Date:");comand_1602(0x85);/在址00开始显示,第一行显示年-月-日cuanhuan(ds1302_read_baye(0x8d);indat_1602(y1);/显示年indat_1602(y2);indat_1602('-');cuanhuan(ds1302_read_baye(0x89);/读出月份indat_1602(y1);/显示月indat_1602(y2);indat_1602('-');cuanhuan(ds1302_read_baye(0x87);/读出日indat_1602(y1);/显示日indat_1602(y2);indat_1602(' ');indat_1602(' ');/擦除闹钟数据cuanhuan(ds1302_read_baye(0x8B);/读出星期/indat_1602(y1);comand_1602(0x80+15);indat_1602(y2);/显示星期comand_1602(0x80+0x45);/在第二行显示时:分:秒cuanhuan(ds1302_read_baye(0x85);/读出时indat_1602(y1);/显示时indat_1602(y2);indat_1602(':');cuanhuan(ds1302_read_baye(0x83);/读出分indat_1602(y1);/显示分indat_1602(y2);indat_1602(':');cuanhuan(ds1302_read_baye(0x81);/读出秒indat_1602(y1);/显示秒indat_1602(y2); void key1()/ if(gl=0) delay(5); if(gl=0) num+;while(!gl);if(num=1)comand_1602(0xC0+6); comand_1602(0x0f); if(num=2)comand_1602(0xC0+9); comand_1602(0x0f); if(num=3)comand_1602(0xC0+12); comand_1602(0x0f); if(num=4)comand_1602(0xC0+15); comand_1602(0x0f); if(num=5)num=0; comand_1602(0x0c); /comand_1602(0x01);/清屏void keytime_add()/加时间 if(num!=0)&&(ja=0)&&(dgl=0) if(ja=0)&&(dgl=0) delay(5); if(ja=0)&&(dgl=0) while(!ja); if(num=1) change=ds1302_read_baye(0x85); change+; ds1302change(0x84,change); if(num=2) change=ds1302_read_baye(0x83); change+; ds1302change(0x82,change); if(num=3) change=ds1302_read_baye(0x81); change+; ds1302change(0x80,change); xs(); void keydate_add()/加日期 if(num!=0)&&(ja=0)&&(dgl=1) if(ja=0)&&(dgl=1) delay(10); while(!ja); if(ja=0)&&(dgl=1) if(num=1) change=ds1302_read_baye(0x8D); change+; ds1302change(0x8C,change); if(num=2) change=ds1302_read_baye(0x89); change+; ds1302change(0x88,change); if(num=3) change=ds1302_read_baye(0x87); change+; ds1302change(0x86,change); if(num=4) change=ds1302_read_baye(0x8B); change+; ds1302change(0x8A,change); xs(); void keytime_reduce()/减 if(num!=0)&&(jan=0)&&(dgl=0) if(jan=0)&&(dgl=0) delay(5); while(!jan); if(jan=0)&&(dgl=0) while(!jan); if(num=1) change=ds1302_read_baye(0x85); change-; ds1302change(0x84,change); if(num=2) change=ds1302_read_baye(0x83); change-; ds1302change(0x82,change); if(num=3) change=ds1302_read_baye(0x81); change-; ds1302change(0x80,change); xs(); void keydate_reduce()/减日期 if(num!=0)&&(jan=0)&&(dgl=1) if(jan=0)&&(dgl=1) delay(5); while(!jan); if(jan=0)&&(dgl=1) if(num=1) change=ds1302_read_baye(0x8D); change-; ds1302change(0x8C,change); if(num=2) change=ds1302_read_baye(0x89); change-; ds1302change(0x88,change); if(num=3) change=ds1302_read_baye(0x87); change-; ds1302change(0x86,change); if(num=4) change=ds1302_read_baye(0x8B); change-; ds1302change(0x8A,change); xs(); void key() keytime_add(); keydate_add(); keytime_reduce(); keydate_reduce(); void main()delay1(20);innit_1602();/1602初始化ds1302int(10,12,20,1,9,0x27,6);/DS1302初始化comand_1602(0x80);Print("Date:");comand_1602(0xC0);Print("Time:");/P3=0x00;/if(dgl=0)/P3=0x00;while(1) if(num=0) xs(); key1(); key();/delay1(300);/*-ISD4004-*/#include<reg51.h>#include<intrins.h>sbit sclk_4004=P25;sbit int_4004=P24;sbit rac_4004=P23;sbit cs_4004=P22;sbit mosi_4004=P21;sbit miso_4004=P20;sbit led=P31;sbit dgl=P17;/*sbit cs_4004=P20; /LOW IS ACTIVELYsbit mosi_4004=P21;sbit miso_4004=P22;sbit sclk_4004=P23;*/unsigned char t;/void delay(unsigned int i) while(i-); void Delay1Ms(unsigned int t) unsigned int i; for (;t>0;t-)for (i=0;i<120;i+);void send8( unsigned char isdx8 )/spi数据传送unsigned char i; cs_4004= 0;/选中ISD4004delay(3);sclk_4004 = 0; delay(3);for(i=0;i<8;i+) /先发低位再发高位,依次发送。if (isdx8 & 0x01) = 1)/发送最低位mosi_4004 = 1; else mosi_4004 = 0; isdx8 >>= 1; /右移一位 sclk_4004 = 0;/时钟下降沿发送delay(3);sclk_4004 = 1; delay(3); cs_4004=1; delay(3);void stopmode()/停止send8(0x30); void powerdown()/下电 send8(0x10); void powerup()/上电 send8(0x20); void record(unsigned int address)/ 从指定位置录音 unsigned char i; unsigned int datasout=0; powerup(); Delay1Ms(50); powerup(); Delay1Ms(100); sclk_4004=0; delay(3); cs_4004=0; delay(3); for(i=0;i<16;i+) address=_iror_(address,1); datasout=address<<1; mosi_4004=CY; sclk_4004=0; delay(3); sclk_4004=1; delay(3); send8(0xA0);/从指定位置录音 send8(0xB0);/从当前位置录音 int_4004=1;/要读值先拉高 while(int_4004=1) ; /*-*/void audiout(unsigned int address)/放音 unsigned char i; unsigned int datasout; powerup(); Delay1Ms(50); sclk_4004=0; delay(3); cs_4004=0; delay(3); for(i=0;i<16;i+) address=_iror_(address,1); datasout=address<<1; mosi_4004=CY; sclk_4004=0; delay(3); sclk_4004=1; delay(3); send8(0xE0);/从指定位置放音 send8(0xF0);/从当前位置放音 int_4004=1;/要读值先拉高 while(int_4004=1); /*- -*/void audn(unsigned int addr,n)/放音n line unsigned char i,k; unsigned int datasout; powerup(); Delay1Ms(50); sclk_4004=0; delay(3); cs_4004=0; delay(3); for(k=0;k<n;k+) for(i=0;i<16;i+) addr=_iror_(addr,1); datasout=addr<<1; addr+; mosi_4004=CY; sclk_4004=0; delay(3); sclk_4004=1; delay(3); send8(0xE0);/从指定位置放音 Delay1Ms(1000); /*-*/void main() t=0; P1=0xff; P2=0xff; P3=0xff; led=0; EA=0; TMOD=0X06; TH0=0XFF; TL0=0XFF; TCON=0X10; IE=0X9F; led=0; if(dgl=0)record(2000); stopmode(); delay(100); led=1; TH0=0XFA; TL0=0XFA; audiout(2000); stopmode(); delay(100); while(1); if(dgl=1) while(1) audn(1800,50); audiout(1800); /*- -*/ void counter() interrupt 1 led=!led; TF0=0; t+; if(t=100) t=0; powerdown(); stopmode(); /audiout(1800);

    注意事项

    本文(单片机电子时钟及报时设计.doc)为本站会员(仙人指路1688)主动上传,三一办公仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知三一办公(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    备案号:宁ICP备20000045号-2

    经营许可证:宁B2-20210002

    宁公网安备 64010402000987号

    三一办公
    收起
    展开