完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
一、 前言
<1>利用所学知识设计一个单片机数字电子钟 <2>数字电子钟的功能要求: (1)有自动计时功能; (2)能显示计时时间,显示效果良好; (3)有校时功能,能对时间进行校准 <3>设计要求: (1)主电路由秒信号发生器、“时、分、秒”计数器、译码器及显示器、校准电路等构成。 (2)秒信号发生器一般用石英晶体振荡器加分频器实现。 (3)译码电路将时、分、秒计数器的输出状态送七段译码器译码,经过六位LED七段显示器显示出来。 (4)校时电路用来对时、分、秒显示数字进行校对。 二、 硬件原理分析 1、时钟信号部分 单片机XTAL1,XTAL2端接外部时钟电路(时钟电路参考课本),EA端接5V电源,使得单片机读取片内程序。 2、按键开关部分 开始仿真,按下开关K1,时钟暂停,然后按下开关K2一次,切到调时位,再按K3,K4实现时位加减;按K1两次切到调分位,按K4,K4实现分位加减;按K1三次切到调秒位,按K4,K4实现秒位加减;按下K5,确定当前操作,然后再按K1,重新启动时钟。 3、数码管显示器部分(共阴极) 所用的是一个六位七段共阴极数码管 4、共阴极数码管编码 三、 程序设计 四、 程序代码 #include #define uchar unsigned char #define uint unsigned int ***it set=P1^0; ***it save=P1^5; ***it rselect=P1^1; ***it lselect=P1^2; ***it add=P1^3; ***it reduce=P1^4; uchar code tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; uchar disp_buf[6]; uchar disp_bit=0; uint hour,min,sec; uint select_num=0; uint hour_adj,min_adj,sec_adj; uchar count; uchar key_num=0; void key_scan() { if(!set) { hour_adj=hour; min_adj=min; sec_adj=sec; key_num++; } while(!set); if(key_num%2==1) { if(rselect==0) { select_num++; if(select_num==4) select_num=1; } while(!rselect); if(lselect==0) { select_num--; if(select_num<=0) select_num=3; } while(!lselect); } if(!add&&(key_num%2)) { switch(select_num) { case 1 : { hour_adj++; if(hour_adj==24) hour_adj=0; break; } case 2 : { min_adj++; if(min_adj==60) min_adj=0; break; } case 3 : { sec_adj++; if(sec_adj==60) sec_adj=0; break; } default:break; } while(!add); } if(!reduce&&(key_num%2)) { switch(select_num) { case 1 : { hour_adj--; if(hour_adj<=0) hour_adj=23; break; } case 2 : { min_adj--; if(min_adj<=0) min_adj=59; break; } case 3 : { sec_adj--; if(sec_adj<=0) sec_adj=59; break; } default:break; } while(!reduce); } if(!save&&(key_num%2)) { select_num=0; hour=hour_adj; min=min_adj; sec=sec_adj; while(!save); } } void main() { TMOD=0x11; TH0=0xf7; TL0=0x00; TH1=0x4c; TH0=0x00; ET0=1; ET1=1; EA=1; TR0=1; TR1=1; PT1=1; hour=23; min=59; sec=59; count=0; while(1) { key_scan(); if(key_num%2) { switch(select_num) { case 1 : { if(count<=10) { disp_buf[0]=hour_adj/10; disp_buf[1]=hour_adj%10; } else { disp_buf[0]=0x40; disp_buf[1]=0x40; } disp_buf[2]=min_adj/10; disp_buf[3]=min_adj%10; disp_buf[4]=sec_adj/10; disp_buf[5]=sec_adj%10; break; } case 2 : { if(count<=10) { disp_buf[2]=min_adj/10; disp_buf[3]=min_adj%10; } else { disp_buf[2]=0x40; disp_buf[3]=0x40; } disp_buf[0]=hour_adj/10; disp_buf[1]=hour_adj%10; disp_buf[4]=sec_adj/10; disp_buf[5]=sec_adj%10; break; } case 3 : { if(count<=10) { disp_buf[4]=sec_adj/10; disp_buf[5]=sec_adj%10; } else { disp_buf[4]=0x40; disp_buf[5]=0x40; } disp_buf[0]=hour_adj/10; disp_buf[1]=hour_adj%10; disp_buf[2]=min_adj/10; disp_buf[3]=min_adj%10; break; } default : break; } } if(key_num%2==0) { disp_buf[0]=hour/10; disp_buf[1]=hour%10; disp_buf[2]=min/10; disp_buf[3]=min%10; disp_buf[4]=sec/10; disp_buf[5]=sec%10; } } } void timer0() interrupt 1 { TH0=0xf7; TL0=0x00; P2=~(0x01< disp_bit++; if(disp_bit==6) disp_bit=0; } void timer1() interrupt 3 { TH1=0x4c; TL1=0x00; if(++count==20) { count=0; if(++sec==60) { sec=0; if(++min==60) { min=0; if(++hour==24) { hour=0; } } } } } 五、 仿真效果 六、 参考文献 1. 网上搜索 2. 单片机教材 3. 网上论坛 七、学习体会 通过本次单片机课程设计,不仅加深了我对单片机理论课程知识的认识,而且通过将理论与实践相结合,使我真正地全面理解单片机的功能。 在刚开始编程时,没有一点思路,通过书上所提供的例程,慢慢理清了思路、基本了解了程序大致需要那几部分,基本确定编程思想。在课程设计的整个过程中也遇到了很多问题,但本着遇到问题解决问题的原则,通过查找资料和询问老师、同学的办法,基本解决了所遇到问题。整个课程设计过程学到了不少通过理论学习没法学到的东西,真正增强了自己的能力。 课程设计的这天时间,虽然辛苦但是收获巨大。 |
|
|
|
只有小组成员才能发言,加入小组>>
2549 浏览 0 评论
1147浏览 2评论
746浏览 1评论
499浏览 0评论
265浏览 0评论
428浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-22 15:56 , Processed in 1.837763 second(s), Total 81, Slave 62 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号