完整word版基于PIC16F877A的数字钟设计.docx
- 文档编号:7702443
- 上传时间:2023-01-25
- 格式:DOCX
- 页数:9
- 大小:81.91KB
完整word版基于PIC16F877A的数字钟设计.docx
《完整word版基于PIC16F877A的数字钟设计.docx》由会员分享,可在线阅读,更多相关《完整word版基于PIC16F877A的数字钟设计.docx(9页珍藏版)》请在冰豆网上搜索。
完整word版基于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
五、程序清单(要求有详尽的注释)
main()//主函数
{
inta=1,b,z,h=1;//定义一个标志位a,b
ints1=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显示4
while
(1)
{
RD4=1;//按键SW1一端高电平
if(RD0==1)//判断按键是否按下
{
delay(10);//延时10mS去键抖
if(RD0==1)//再次确认按键是否按下
{RD2=1;delay(30);RD2=0;//蜂鸣器响30mS
if(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;//蜂鸣器响30mS
a++;//位选标志位加1
if(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;//蜂鸣器响30mS
if(h==1)//判断显示标志位
{{LED1=s1;LED2=s2;LED3=s3;LED4=s4;}//数码管显示时钟页面
if(a==1)s1++;//如果位选标志位a=1,则小时十位加1
if(a==2)s2++;//如果位选标志位a=2,则小时个位加1
if(a==3)s3++;//如果位选标志位a=3,则分钟十位加1
if(a==4)s4++;//如果位选标志位a=4,则分钟十位加1
if(s1==3)s1=0;//使时钟在校时时也能按计时规则进行
if(s1<2)
{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,则小时十位加1
if(a==2)n2++;//如果位选标志位a=2,则小时个位加1
if(a==3)n3++;//如果位选标志位a=3,则分钟十位加1
if(a==4)n4++;//如果位选标志位a=4,则分钟十位加1
if(s1==3)s1=0;//使闹钟在定时时也能按计时规则进行
if(s1<2)
{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;//蜂鸣器响30mS
h++;//显示标志位加1
if(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(s1〈2)
{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;}
}
}
}
六、心得体会
在这次的时钟项目中,我根据一些电子钟的功能要求,在这个时钟项目中集成了较多的功能,包括常用的时钟、闹钟、整点报时、校时和定时功能,另外我还新增了一个秒表的功能;所以这个时钟的功能还是比较强大的。
但对于我的设计来说却是一个挑战,因为我还没有编写过多显示页面的程序,后来我通过定义标志位来实现数码管显示页面的切换,但这种方法原理虽然简单,但程序却变得复杂。
标志位太多,在编写程序时很容易出错,程序量也比较多.这些问题都是我日后需要完善的地方。
不管怎样说,在这次时钟项目中,我学到了很多,利用新方法去实现自己想要实现的功能,虽然还有很多不足的地方,但对于我来说,这是对自己的一个证明,说明我的努力有收获;但在这次时钟项目中,也让我看到了自己的不足,需要学习的地方还有很多,所以,以后还要加强学习,以弥补自己的不足.
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 完整 word 基于 PIC16F877A 数字 设计
![提示](https://static.bdocx.com/images/bang_tan.gif)