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

    基于单片机设计的多功能数字钟设计报告.doc

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

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

    基于单片机设计的多功能数字钟设计报告.doc

    多功能数字钟设计报告目录1. 设计任务与要求2. 设计原理及方案3. 主要元器件清单4. 电路原理图5. 原理说明6. 系统软件部分7. 整机调整过程8. 总结六位多功能数字钟制作报告一设计任务与要求。1.任务。设计制作一个24小时制多功能数字钟。示意图如下(仅供参考): 2要求.基本要求(1)具有时间设置(小时和分钟)、闹钟时间设置、闹钟开、闹钟关功能。(2)数字显示小时、分钟,有AM、PM指示器,闹钟就绪灯,蜂鸣器。(3)220V供电。发挥部分(1)键盘切换现场环境温度显示。(060 1)(2)键盘切换电网频率、电压显示。 (3)电压欠压、过压报警(220V 10)功能。二,设计原理及方案1,计数原理 数字计中是一个对标准频率进行校准的计数电路。它的计时周期是24小时,由于计数器的起始时间不可能与标准时间一致,所以采用校准功能和报时功能。 数字钟电路主要由译码显示器、校准电路、报时电路、时计数、分计数、秒计数器,振荡器和单脉冲产生组成。其中电路系统由秒信号产生器是整个系统基本信号,它直接决定计数器的精度,用石英振荡器加分频器来实现,将标准秒信号送入秒计数器。分、秒计数器采用60进制,时计数器采用24进制,。译码器显示电路将时、分、秒计数器的输出状态通过三个两位共阳数码管显示出来。整点报时电路根据计时系统的输出状态产生一个脉冲信号,用蜂鸣器输出。二、模块电路设计与比较1、 时钟方案选择采用带 RAM的时钟芯片AT89C2051。该芯片可以进行时分秒的计数,可编程接口,还具有报警功能和掉电保存功能,并且可以对其方便的进行程序控制,完全能满足题目的要求。C程序:#include<REG2051.H>code senen_seg10=0x81,0xe7,0x92,0xa2,0xe4,0xa8,0x88,0xe3,0x80,0xa0; /P1.7(冒号)口高电平bit key1_enter=0,key2_enter=0,key3_enter=0,countdown_mark=0,stopwatch_mark=0,count_mark=0,bell_mark=0; /状态标志unsigned char program=0,program_variable=0,count_bit=0,count=0;unsigned char hour=10,minute=10,second=0; /时间变量unsigned char delayed_hour=22,delayed_minute=10,delayed_second=0;/定时变量 unsigned char count_hour=0,count_minute=0,count_second=0; /计时计数变量unsigned char count_time=0,count_count=0; void delay(unsigned int t)/延时子程序 unsigned int i,j; for(i=0;i<t;i+) for(j=0;j<10;j+) ; void time0_init(void) /定时计数0器初始化EA=0; TR0=0;TMOD=0x01;TH0=0xec;TL0=0x73;ET0=1;TR0=1;EA=1; static void timer0_isr(void) interrupt TF0_VECTOR using 1 /定时计数0器中断函数TR0=0;TH0=0xec;TL0=0x73;TR0=1;count_time+; /时钟计时程序if(count_time>=199) count_time=0; second+; if(second>=60) second=0; minute+; if(minute>=60) minute=0; hour+; if(hour>=24)hour=0; if(delayed_hour=hour && delayed_minute=minute && second<4) P3_7=0;else P3_7=1;if(countdown_mark=1) /倒计时程序 count_count+; if(count_count>=199 && (count_second!=0|count_minute!=0|count_hour!=0)count_count=0;count_second-;if(count_second>=60) count_second=59; count_minute-; if(count_minute>=60) count_minute=59; count_hour-; if(count_hour>=100) count_hour=99; if(count_second=0&&count_minute=0&&count_hour=0&&count_count<=12000) P3_7=0;else P3_7=1;if(count_count>=15000) count_count=14000; if(stopwatch_mark=1) /秒表程序 count_count+; if(count_count>=2)count_count=0;count_second+;if(count_second>=100) count_second=0; count_minute+; if(count_minute>=60) count_minute=0; count_hour+; if(count_hour>=60) count_hour=0; unsigned char show_key (void)unsigned char x=0,y=0;switch (program)case 0: P1&=senen_segsecond%10; /时钟秒的个位 break;case 1: if(count_time>=90) P1&=senen_segsecond%10; /校正秒的个位 break;case 2: if(delayed_hour=24) P1=0xfe;/闹钟秒的个位 else P1&=senen_segdelayed_second%10; break;case 3: if(count_bit>=0) P1&=senen_segcount_second%10;/倒计时秒的个位 else P1=0xff; break;case 4: P1&=senen_segcount_second%10; /秒表秒的个位break;case 5: P1&=senen_segcount_second%10; /计数器个位break; P3_3=0; delay(10); if(P3_5=0)/功能键1识别 key1_enter=1;if(count<=254)count+; if(P3_4=0) key2_enter=1;/功能键2识别 if(P3_2=0) key3_enter=1; /功能键3识别 P3_3=1; P1|=0xff;switch (program) case 0: P1&=senen_segsecond/10; /时钟秒的十位break;case 1: if(count_time>=90) P1&=senen_segsecond/10; /校正秒的十位 break;case 2: if(delayed_hour=24) P1=0xfe; /闹钟秒的十位 else P1&=senen_segdelayed_second/10; break;case 3: if(count_bit>=1) P1&=senen_segcount_second/10;/倒计时秒的十位else P1=0xff; break;case 4: P1&=senen_segcount_second/10; /秒表秒的十位break;case 5: P1&=senen_segcount_second/10; /计数器十位break; P3_1=0; delay(10); P3_1=1; P1|=0xff;switch (program) case 0: P1&=senen_segminute%10; /时钟分的个位break;case 1: if(count_time>=90) P1&=senen_segminute%10; /校正分的个位break;case 2: if(delayed_hour=24) P1=0xfe;/闹钟分的个位 else P1&=senen_segdelayed_minute%10; break;case 3: if(count_bit>=2) P1&=senen_segcount_minute%10;/倒计时分的个位else P1=0xff;break;case 4: P1&=senen_segcount_minute%10; /秒表分的个位break;case 5: P1&=senen_segcount_minute%10; /计数器百位break; P3_2=0; delay(10); P3_2=1; P1|=0xff;switch (program)case 0: P1&=senen_segminute/10; /时钟秒的个位break;case 1: if(count_time>=90) P1&=senen_segminute/10; /校正秒的个位 break;case 2: if(delayed_hour=24) P1=0xfe;/闹钟秒的个位 else P1&=senen_segdelayed_minute/10; break;case 3: if(count_bit>=3) P1&=senen_segcount_minute/10;/倒计时秒的个位else P1=0xff;break; case 4: P1&=senen_segcount_minute/10; /秒表秒的个位break;case 5: P1&=senen_segcount_minute/10; /计数器千位break; P3_5=0; delay(10); P3_5=1; P1|=0xff;switch (program)case 0: P1&=senen_seghour%10; /时钟时的个位break;case 1: if(count_time>=90) P1&=senen_seghour%10; /校正时的个位break;case 2: if(delayed_hour=24) P1=0xfe; /闹钟时的个位 else P1&=senen_segdelayed_hour%10; break;case 3: if(count_bit>=4) P1&=senen_segcount_hour%10;/倒计时时的个位else P1=0xff;break;case 4: P1&=senen_segcount_hour%10; /秒表时的个位break;case 5: P1&=senen_segcount_hour%10; /计数器万位break; P3_0=0; delay(10); if(P3_4=1 && key2_enter=1) x=3; /确认功能键2识别,返回3 key2_enter=0; P3_0=1; P1|=0xff;switch (program) case 0: P1&=senen_seghour/10; /时钟时的个位break;case 1: if(count_time>=90) P1&=senen_seghour/10; /校正时的个位break;case 2: if(delayed_hour=24) P1=0xfe; /闹钟时的个位 else P1&=senen_segdelayed_hour/10; break;case 3: if(count_bit>=5)P1&=senen_segcount_hour/10; /倒计时时的个位else P1=0xff;break;case 4: P1&=senen_segcount_hour/10; /秒表时的个位break;case 5: P1&=senen_segcount_hour/10; /计数器万位break; P3_4=0; delay(10); if(P3_5=1 && key1_enter=1)/确认功能键1识别,执行退出或进入下一个功能 if(count>=127) x=1; /确认功能键1为长按,返回1else x=2; /确认功能键1为短按,返回2 key1_enter=0;count=0; if(P3_2=1 && key3_enter=1) x=4; /确认功能键3识别,返回4 key3_enter=0; P3_4=1; P1|=0xff;if(program<=1 && count_time>=100) P1&=0xff;/校时和显示功能时钟时冒号闪烁if(program<=1 && count_time<=100) P1&=0x7f;if(program=2) P1&=0x7f;/设置闹钟功能时冒号长亮if(program=3) P1&=0xff;/设置倒计时功能时冒号长灭if(program=4) P1&=0x7f;/设置秒表功能时冒号长亮if(program=5) P1&=0xff;/设置计数时冒号长灭y=x;x=0;return y;void main()/主程序P1=0xff; P3=0xff;time0_init();while(1)switch(program)case 0: while(program=0) /时钟菜单 switch(show_key() case 0: break;case 1:program=0; break;case 2:program=1; break; break; /校时菜单case 1: while(program=1)switch(show_key() case 0: break;case 1:program=0; break;case 2:program=2;break;case 3: hour+; if(hour>=24)hour=0;break;case 4: minute+; if(minute>=60)minute=0;break; break;case 2: while(program=2) /闹钟菜单 switch(show_key() case 0: break;case 1:program=0; break;case 2:program=3;break;case 3:delayed_hour+;if(delayed_hour>=25)delayed_hour=0;break;case 4:delayed_minute+; if(delayed_minute>=60)delayed_minute=0;break; break;case 3: while(program=3) /倒计时菜单 switch(show_key() case 0: break;case 1:program=0; break;case 2:program=4;break;case 3:count_bit+; if(count_bit>=7)count_bit=0;break;case 4:switch(count_bit) case 0: count_second+=1; break; case 1: count_second+=10; break; case 2: count_minute+=1; break; case 3: count_minute+=10; break; case 4: count_hour+=1; break; case 5: count_hour+=10; break; case 6: break; if(count_hour>=100) count_hour-=100; if(count_minute>=60) count_minute-=60; if(count_second>=60) count_second-=60; break;if(count_bit=6) countdown_mark=1;else countdown_mark=0; break;case 4: count_hour=0;/秒表菜单 count_minute=0;count_second=0; while(program=4) switch(show_key() case 0: break;case 1:program=0; break;case 2:program=5;break;case 3:stopwatch_mark=stopwatch_mark;break;case 4:if(stopwatch_mark=0) count_hour=0; count_minute=0; count_second=0;break; break; /计数器菜单case 5: count_hour=0; count_minute=0;count_second=0; while(program=5) switch(show_key() case 0: break;case 1:program=0; break;case 2:program=0;break;case 3:count_second+; if(count_second>=100) count_second=0; count_minute+; if(count_minute>=100) count_minute=0; count_hour+; if(count_hour>=100)count_hour=0; break;case 4:count_hour=0; count_minute=0; count_second=0;break;if(P3_7=0)while(P3_7=0) show_key(); count_second+; if(count_second>=100) count_second=0;count_minute+;if(count_minute>=100) count_minute=0; count_hour+; if(count_hour>=100)count_hour=0; break;if(program!=3) countdown_mark=0;if(program!=4) stopwatch_mark=0;2、 电压有效值方案选择采用7805五伏稳压电源,电路图如下:3、 显示模块的选择 采用数码管显示。数码管亮度高、体积小、重量轻,但其显示信息简单、有限,在本题目中应用受到很大的限制。 数码管三,主要元器件清单 序号名称规格位号数量序号名称规格位号数量1单片机AT89C2051U1113三极管9012Q1Q772三端集成稳压78L05U2114电阻220R3R9732位共阳数码管红色0.4寸LED1LED33151KR2、R10R1574发光二极管红色3D1D44162KR17、R1825蜂鸣器5V有源U31175.1KR1616瓷片电容30PFC2、C321810KR1170.1uFC4、C5219按键6*6*5S1、S2、S3382位排针间距2.54J1J3320电池盒4节5号19集成电路插座20PU1121DC插座5.5*2.1110电解电容10uFC1122电源线双色2P带热缩管111100uFC6123电路板105*55112晶振12MHzY1124说明书A4双面1四、电路原理图五、原理说明:  1、显示原理:      显示部分主要器件为3只两位一体共阳极数码管,驱动采用 PNP 型三极管驱动,各端口配有限流电阻,驱动方式为动态扫描,占用 P3.0P3.5 端口,段码由P1.0P1.6输出。冒号部分采用 4 个 3.0的红色发光二极管,驱动方式为独立端口P1.7驱动。  2、键盘原理:      按键 S1S3 采用复用的方式与显示部分的 P3.5、P3.4、P3.2 口复用。其工作方式为,在相应端口输出高电平时读取按键的状态并由单片机消除抖动并赋予相应的键值。  3、迅响电路及输入、输出电路原理:     迅响电路由有源蜂鸣器和 PNP 型三极管组成。其工作原理是当 PNP 型三极管导通后有源蜂鸣器立即发出定频声响。驱动方式为独立端口驱动,占用P3.7端口。    输出电路是与迅响电路复合作用的,其电路结构为有源蜂鸣器,5.1K定值电阻R6,排针J3并联。当有源蜂鸣器无迅响时J3输出低电平,当有源蜂鸣器发出声响时J3输出高电平,J3可接入数字电路等各种需要。驱动方式为迅响复合输出,不占端口。    输入电路是与迅响电路复合作用的,其电路结构是在迅响电路的 PNP 型三极管的基极电路中接入排针J2。引脚排针可改变单片机I/O口的电平状态,从而达到输入的目的。驱动方式为复合端口驱动,占用P3.7端口。  4、单片机系统:   本产品采用了单片机AT89C2051为核心器件,并配合所有的外围电路,具有上电复位的功能,无手动复位功能。六、系统软件部分 为实现系统功能,系统软件共设六个运行状态和各部分功能描述如下: 1、功能按键说明:S1为功能选择按键,S2为功能扩展按键,S3为数值加一按键。 2、功能及操作说明: 操作时,连续短时间(小于1秒)按动S1,即可在以上的6个功能中连续循环。中途如果长按(大于2秒)S1,则立即回到时钟功能的状态。    1)时钟功能:上电后即显示10:10:00 ,寓意十全十美。    2)校时功能:短按一次 S1,即当前时间和冒号为闪烁状态,按动 S2 则小时位加 1,按动 S3则分钟位加1,秒时不可调。  3)闹钟功能:短按二次S1,显示状态为22:10:00,冒号为长亮。按动S2刚小时位加1,按动S3则分钟位加1,秒时不可调。当按动小时位超过23时则会显示-:-:-,这个表示关闭闹钟功能。闹铃声为蜂鸣器长鸣3秒钟。  4)倒计时功能:短按三次S1,显示状态为 0,冒号为长灭。按动S2则从低位依此显示高位,按动S3则相应位加1,当S2按到第6次时会在所设定的时间状态下开始倒计时,再次按动S2将再次进入调整功能,并且停止倒计时。  5)秒表功能:短按四次 S1,显示状态为 00:00:00,冒号为长亮。按动 S2 则开始秒表计时,再次按动S2则停止计时,当停止计时的时候按动S3则秒表清零。  6)计数器功能:短按五次S1,显示状态为00:00:00,冒号为长灭,按动S2则计数器加1,按动S3则计数器清零。 七.整机调整过程各功能模块均调整通过后,进行整机调试,其过程如下:将调好的各功能模块连接在一起,用函数信号发生器模拟交流电压信号,先用仿真机代AT89C2051 单片机进行模拟调试,对每一芯片的片选、启动进行检测,并对数据线和地址线也进行检测。调试成功后再将程序写到单片机中进行调试。八.总结本系统以AT89C2051为核心部件,利用软件编程,通过键盘控制和数码管显示实现了时钟功能、闹钟功能,并完成了对环境温度和市电信号频率及有效值的测量显示,能实现题目的基本要求。尽量做到硬件电路简单稳定、减小电磁干扰和其他环境干扰,充分发挥软件编程的优点,减小因元器件精度不够引起的误差。由于时间有限和本身知识水平的限制,无法完成发挥部分,而且由于材料的购取有限,导致有些部分不是很达标,我们认为本系统还有需要改进和提高的地方,例如选用更高精度的元器件,硬件电路更加精确稳定,软件测量算法进一步地改进与完善等。

    注意事项

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

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




    备案号:宁ICP备20000045号-2

    经营许可证:宁B2-20210002

    宁公网安备 64010402000987号

    三一办公
    收起
    展开