您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > 基于PIC16F877A的数字钟设计
电子工程系项目考核(报告)项目名称:数字时钟项目姓名班级学号课程名称一、项目要求:数码管默认显示00:00。数码管1,2表示小时,数码管3,4表示分钟。如此,实现时钟功能。要求能够整点报时、闹钟提示;并附带有秒表功能。按键可以调整时钟时间、切换显示页面和设定闹钟时间等。二、项目原理分析在项目用的单片机开发板上单片机的IO口接四位数码管的各段。同时开发板共阴数码管的阴极由138译码器的输出端控制。在该项目中我采用了数码管的动态显示,即每位数码管点亮2ms时间左右,由于人的视觉暂留现象及发光二极管的余辉效应,只要扫描的速度足够快,给人的印象就是一组稳定的显示数据,不会有闪烁感,动态显示的效果和静态显示是一样的,能够节省大量的I/O端口,而且功耗更低。在实现了数码管的动态显示的基础上在主程序中通过计算定时器1的中断次数,从而得到计时时间和秒表时间的基准时间。同时在主程序中添加按键处理程序,实现时钟的开始、中断和校时,同时实现闹钟定时和切换显示等功能,还有秒表计时功能。三、硬件电路图以及原理3.1硬件电路图如下:3.2硬件原理:该项目中,主要的功能模块有:数码管显示模块;按键模块;蜂鸣器模块。数码管显示模块主要是由芯片PIC16F877A内部的定时器1的定时中断实现数码管的动态显示。按键模块主要利用矩阵式按键实现多按键功能,矩阵式按键原理是在一端加高电平,然后检测另一端是否为高电平来判断按键是否按下,通过不同的定义可以让按键实现不同的功能。蜂鸣器模块通过三极管的开关作用和驱动作用由芯片控鸣叫与否。四、程序说明以及程序流程图该时钟默认显示页面为时钟计时页面,按键SW1控制时钟、秒表的开始和中断,按按键SW1一次,如果数码管在显示秒表,则开始计秒功能;否则,开始正常计时;再按一次SW1则实现中断功能。按键SW2实现是数码管的选位,从第一个数码管开始,按一次就选中下一位数码管,循环选择。SW3实现的是加1功能,每按一次就在SW2选中的位上加1。SW4是实现数码管切换显示功能,按一次就进入闹钟调时的显示页面,再按一次就进入秒表显示页面,实现数码管显示在时钟计时、闹钟定时和秒表计时这三个不同页面的循环切换显示。图1是时钟、秒表计时开始和中断,以及闹钟提醒的流程图;图2是显示页面的却换流程图;图3是校时和定时流程图。下面就是程序的流程图:h=1上电h=3时钟计时秒表计时SW1按下SW1再按下h=3是时钟计时中断秒表计时中断,时钟正常计时是否否SW4每按一次h加1(1=h=3)上电h=1h=2h=3显示时钟页面显示时钟页面显示秒表页面SW2每按一次a加1(1=a=4)上电a=1a=2a=3a=4SW3按下SW3按下SW3按下SW3按下h=1h=2h=1h=2h=1h=2h=1h=2时钟小时十位加1闹钟小时十位加1时钟小时个位加1闹钟小时个位加1时钟分钟十位加1时钟分钟个位加1闹钟分钟个位加1闹钟分钟十位加1整点报时,闹钟提醒图1图2图3闹钟五、程序清单(要求有详尽的注释)main()//主函数{inta=1,b,z,h=1;//定义一个标志位a,bints1=0,s2=0,s3=0,s4=0;//时钟小时分钟的十位和个位intn1=0,n2=0,n3=0,n4=0;//闹钟小时分钟的十位和个位intm1=0,m2=0,m3=0,m4=0;//秒表的标志位staticbitbiaozhi=0;//时钟的静态标志位staticbitmbz=0;//秒表的静态标志位ADCON1=0X06;//初始化TRISA=0X00;TRISB=0X01;//外部中断输入PORTB=0X00;TRISD=0X01;//设置RD0输入PORTD=0X01;//设置RD0输入TRISE=0X00;timer1init();//定时器1初始化INTE=1;//外部中断使能INTEDG=1;//外部中断上升沿RA1=1;//使能138译码器LED1=0;LED2=0;LED3=0;LED4=0;//数码管1显示4while(1){RD4=1;//按键SW1一端高电平if(RD0==1)//判断按键是否按下{delay(10);//延时10mS去键抖if(RD0==1)//再次确认按键是否按下{RD2=1;delay(30);RD2=0;//蜂鸣器响30mSif(h==3)//判断是否是秒表显示页面{mbz=!mbz;t=0;}//秒表标志位取反,开始计时或中断else{biaozhi=!biaozhi;time=0;}//时钟标志位取反,开始计时或中断}while(RD0==1);//等待放手}RD4=0;RD5=1;//按键SW2一端高电平if(RD0==1)//判断按键SW2是否按下{delay(10);//延时10mS去键抖if(RD0==1)//再次确认按键SW2是否按下{RD2=1;delay(30);RD2=0;//蜂鸣器响30mSa++;//位选标志位加1if(a==5)a=1;if(a==1){b=LED1;//先关闭数码管300毫秒,然后再点亮LED1=10;delay(300);//延时300毫秒LED1=b;}if(a==2){b=LED2;//先关闭数码管300毫秒,然后再点亮LED2=10;delay(300);//延时300毫秒LED2=b;}if(a==3){b=LED3;//先关闭数码管300毫秒,然后再点亮LED3=10;delay(300);//延时300毫秒LED3=b;}if(a==4){b=LED4;//先关闭数码管300毫秒,然后再点亮LED4=10;delay(300);//延时300毫秒LED4=b;}}while(RD0==1);//等待放手}RD5=0;RD6=1;//按键SW3一端高电平if(RD0==1)//判断按键SW3是否按下{delay(10);//延时10mS去键抖if(RD0==1)//再次确认按键SW3是否按下{RD2=1;delay(30);RD2=0;//蜂鸣器响30mSif(h==1)//判断显示标志位{{LED1=s1;LED2=s2;LED3=s3;LED4=s4;}//数码管显示时钟页面if(a==1)s1++;//如果位选标志位a=1,则小时十位加1if(a==2)s2++;//如果位选标志位a=2,则小时个位加1if(a==3)s3++;//如果位选标志位a=3,则分钟十位加1if(a==4)s4++;//如果位选标志位a=4,则分钟十位加1if(s1==3)s1=0;//使时钟在校时时也能按计时规则进行if(s12){if(s2==10)s2=0;}if(s1==2){if(s2==4)s2=0;}if(s3==6)s3=0;if(s4==10)s4=0;}if(h==2)//判断显示标志位{{LED1=n1;LED2=n2;LED3=n3;LED4=n4;}//数码管显示闹钟定时页面if(a==1)n1++;//如果位选标志位a=1,则小时十位加1if(a==2)n2++;//如果位选标志位a=2,则小时个位加1if(a==3)n3++;//如果位选标志位a=3,则分钟十位加1if(a==4)n4++;//如果位选标志位a=4,则分钟十位加1if(s1==3)s1=0;//使闹钟在定时时也能按计时规则进行if(s12){if(s2==10)s2=0;}if(s1==2){if(s2==4)s2=0;}if(s3==6)s3=0;if(s4==10)s4=0;}}while(RD0==1);//等待放手}RD6=0;RD7=1;//按键SW4一端高电平if(RD0==1)//判断按键SW4是否按下{delay(10);//延时10mS去键抖if(RD0==1)//再次确认按键SW4是否按下{RD2=1;delay(30);RD2=0;//蜂鸣器响30mSh++;//显示标志位加1if(h==4)h=1;}while(RD0==1);//等待放手}RD7=0;if(h==1)//如果标志位h=1,则数码管显示时钟页面{LED1=s1;LED2=s2;LED3=s3;LED4=s4;}if(h==2)//如果标志位h=2,则数码管显示闹钟页面{LED1=n1;LED2=n2;LED3=n3;LED4=n4;}if(h==3)//如果标志位h=3,则数码管显示秒表页面{LED1=m1;LED2=m2;LED3=m3;LED4=m4;}if(biaozhi)//判断标志位{if(time=400)//time为定时器1的中断次数,利用定时器1提供的2.5mS的基准时间计时{time=0;z++;//1秒计算if(z==60){s4++;z=0;}//时钟计时if(s4==10){s3++;s4=0;}if(s3==6){s2++;s3=0;}if(s12){if(s2==10){s1++;s2=0;}}if(s1==2){if(s2==4){s1=0;s2=0;}}}if(s1==n1&&s2==n2&&s3==n3&&s4==n4)//闹钟提醒{RD2=1;//蜂鸣器响if(time=40)RD2=0;}if(s3==0&&s4==0)//整点报时{RD2=1;//蜂鸣器响if(time=40)RD2=0;}}if(mbz)//判断秒表标志位{if(t=40)//实现秒表0.1秒精度t=0;//秒表计时m4++;if(m4==10){m3++;m4=0;}if(m3==10){m2++;m3=0;}if(m2==6){m1++;m2=0;}if(m1==10){m1=0;}}}}六、心得体会在这次的时钟项目中,我根据一些电子钟的功能要求,在这个时钟项目中集成了较多的功能,包括常用的时钟、闹钟、整点报时、校时和定时功能,另外我还新增了一个秒表的功能;所以这个时钟的功能还是比较强大的。但对于我的设计来说却是一个挑战,因为我还没有编写过多显示页面的程序,后来我通过定义标志位来实现数码管显示页面的切换,但这种方法原理虽然简单,但程序却变得复杂。标志位太多,在编写程序时很容易出错,程序量也比较多。这些问题都是我日后需要完善的地方。不管怎样说,在这次时钟项目中,我学到了很多,利用新方法去实现自己想要实现的功能,虽然还有很多不足的地方,但对于我来说,这是对自己的一个证明,说明我的努力有收获;但在这次时钟项目中,也让我看到了自己的不足,需要学习的地方还有很多,所以,以后还要加强学习,以弥补自己的不足。
本文标题:基于PIC16F877A的数字钟设计
链接地址:https://www.777doc.com/doc-4727608 .html