单片机课程设计电子时钟.docx

上传人:b****3 文档编号:1846843 上传时间:2022-10-24 格式:DOCX 页数:20 大小:555.57KB
下载 相关 举报
单片机课程设计电子时钟.docx_第1页
第1页 / 共20页
单片机课程设计电子时钟.docx_第2页
第2页 / 共20页
单片机课程设计电子时钟.docx_第3页
第3页 / 共20页
单片机课程设计电子时钟.docx_第4页
第4页 / 共20页
单片机课程设计电子时钟.docx_第5页
第5页 / 共20页
点击查看更多>>
下载资源
资源描述

单片机课程设计电子时钟.docx

《单片机课程设计电子时钟.docx》由会员分享,可在线阅读,更多相关《单片机课程设计电子时钟.docx(20页珍藏版)》请在冰豆网上搜索。

单片机课程设计电子时钟.docx

单片机课程设计电子时钟

 

●毕竟是两年前写的东西了,在这里分享一下自己的思路,程序100%能运行,只不过是在我的那块板子上,要参考的话,最好去看看自己用的板子的接口和板子的原理图啥样。

第一部分设计任务及要求

1.1单片机设计设计内容

利用STC89C51RC单片机和LCD7407六段数码管实现可预置参数的电子钟,可由按键切换不同的功能。

1.2单片机课程设计要求

80C51系列单片机的外围接口电路设计,掌握应用软件的编写及调试。

学会用软件调试硬件和用硬件调试软件。

1.硬件设计要求:

CPU选用STC89C51RC,内有4KBFlashROM。

显示用6位LED,LED共阴极接法,采用动态显示法。

用芯片7407作7段LED段选驱动,用芯片7406段LED位段选驱动。

要求有单片机复位键,功能选择键,加/减键,移位键,确认键。

要求用Protel绘制电路原理图

2.软件编写要求:

(1)基本要求:

实时时钟:

显示年月日时分秒,各两位,分二页显示。

可以上电自动按预置时间走时。

(2)提高要求:

时钟上电后,显示时分秒,用按键切换年月日3秒后,返回时分秒。

可以手动预置年、月、日、时、分、秒后,时间走时。

预置的位要求闪烁。

闹钟功能:

定时到报警(喇叭发声),手动预置定时时间。

定时器(倒计时)功能:

定时清0报警(喇叭发声),手动预置定时时间。

1.3系统运行流程

程序首先进行初始化。

上电后,开始自动走时,然后调用显示程序,在判断是否有按键按下。

若有按键按下,则跳到该按键的相应的功能程序执行。

若没有按键按下,则执行走时功能系统一直走时,到最大时间时清零,继续走时,以此循环。

若没到则循环执行,中段服务程序从秒开始走时,完成秒的走时及向分、时、的进位以及日、月、年、的进位。

由于闪烁和移位功能相联系,因此调用闪烁功能时,以移位为前提。

闪烁用于被调单元的闪烁显示。

调试程序用于对时分秒及年月日的加减。

主要是通过主程序对子程序的调用来实现年月日和时分秒的转换,移位,调时,闹钟,倒计时等功能。

具体的调整通过按键的判断来实现。

第二部分设计方案

2.1总体设计方案说明

1.根据单片机课程设计内容和要求,来完成protues仿真电路的绘制和用keil软件编写程序,并对软、硬件进行调试。

以达到预期目的。

2.对问题进行处理。

3.对实验过程进行总结,完成实验报告。

2.2系统方框图

2.3系统流程图

键盘扫描流程图

显示函数流程图

闰年,闰月的判断(从日到月及年的加程序,从年到月再到日减得程序与此类似,因此不再编写流程图)

调时函数流程图(移位键按一次,调秒。

按两次调分,按三次,调时。

此外功能切换键按一次是时分秒切换到年月日,按两次是切换到闹钟,按三次是切换倒计时。

流程图和上图类似)

闹钟函数流程图

主函数流程图

中断函数流程图

第三部分主要器材及基本简介

3.1主要器材

1.STC89C51RC单片机一个,LCD7406数码管。

3.2主要器材简介

STC89C51RC单片机是采用8051核的ISP在系统可编程芯片,片内涵4Kbytes的可反复擦写的Flash制度程序储存器,器件80C51引脚结构,芯片内集成了6位中央处理器。

具有在系统中可编程特性,配合PC端的控制程序即可将用户的程序下载到单片机内部,省去了购买通用编成器,而且速度更快。

80C51引脚图

第四部分系统硬件设计

4.1数码管显示电路

数码管的显示屏S0-S5和单片机的P2.0-P2.5相接。

段选地址和单片机的P1.0-P1.7相连。

4.2键盘输入电路

采用点阵式键盘,6个独立式按键由P0.0-P0.1和P2.0-P2.2共同控制,先判断行为0其他制1,在检测那个列线为0,则该列与制0的行线交叉处的按键就是被按下的按键。

4.3蜂鸣器

蜂鸣器的作用是整点报时,定时时间到时报时以及倒计时时间归零是报警。

与单片机P0.3相连,低电平有效。

第五部分课程设计总结

历时两周多的努力钻研,这个单片机实训终于画上了一个完美的的句号;然而这短短的两周,却令我收益匪浅。

我记得开始看见题目要求是自己还是一片茫然,感觉要独自把这些要求做完对我来说是过于勉强,加上考试将近,我的心思没法完全集中在实训上,前几天的开始设计程序是我就遇到不少难题没法解决,当时自己的心里就想着万一不行就弄出个基础要求就行。

当听见同寝室的学霸*在考试前就基本完成了,这时让我如梦初醒,也许这个实训没我想象中这么难;于是我决定在考完试后全身心投入到这实训中去。

考试考完,我总结了一些难点,并逐个突破最终完成实训:

难点1;实验中我们所用的自己早就焊好的单片机的矩阵键盘的编程方法让人头疼,因为它的键盘的设定端口一端在P0,一端在P2,不会设定这种类型的矩阵键盘,那么就只能用两个键,这将给编程实现的功能带来极大的麻烦。

自己看书,也查了一些资料,但总是差那么一步,我就请教了*,终于找到了解决办法,自己的键盘扫描函数内部需要补上(while!

R0)以保证键盘扫描循环进行;之后的编程我不断思考一个问题:

怎样能够极大地在简化编程同时满足逻辑的严谨;答案就是熟悉各种编程逻辑语言和加深对单片机各种功能的理解,不断地问自己自己思考的是否全面,是否漏了什么或者多了什么,不断地尝试,从失败中查找自己的错误,首先是自己错在哪,之后是为什么错了,最后是怎么改。

这样步步为营,为我的编程省了很大的精力和时间。

难点2;实验中要求在调时的时候,调时位要做到闪烁;闪烁就是一暗一灭;联想到有LED闪烁,那么原理是一样的,半个周期亮,半个周期灭,那么借鉴这点运用到数码管的话,只要在定时器的计时上和显示函数上进行一个关联就行,这样就可以在定时器在0.5s时给他的闪烁标志位置数(同时联想到移位就调时,就可以令移位键与闪烁标志位的所置的数相联系),在达到1s时把标志位的置数清零,这样在显示函数内用闪烁标志位进行判断是否执行闪烁,这样巧妙利用定时器和标志位就做到了闪烁。

这次实训让我学到了很多东西,让我对一些自己忽略的基本有了新的认识,让我对细节的重要性有了更深的体会,往往是一些自己不注意的细节让自己陷入困境,同时我也认识到无论有多少困难,那并不重要,重要的是自己努力了多少,因为你不努力那么你永远也不会知道自己的极限和潜力能达到一个什么样的位置。

附录

1.系统源程序及功能说明

#include//调用头文件

#defineucharunsignedchar//宏定义

#defineuintunsignedint//宏定义

staticunsignedchars=55,m=59,h=23,s1=5,m1=0,h1=0,s2=0,m2=0,h2=0,s3=0,m3=0,h3=0;//实时、闹钟、定时器、倒数计时器的时分秒定义和赋初值;

sbitR0=P0^0;

sbitR1=P0^1;

sbitC0=P2^0;

sbitC1=P2^1;

sbitC2=P2^2;//键盘端口定义

sbitbell=P0^3;//蜂鸣器端口定义

unsignedinttcount,t1count,key,number,k,a,t,i,flag,nian,b,r=28,y=2,n=1900;//参数定义以及年月日赋初值

ucharcodetable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//数码管显示的段选

voiddelay(uchari)//延时函数;进行延时;入口参数i;无出口参数;没有调用子程序;

{

ucharj,k;

for(j=i;j>0;j--)

for(k=125;k>0;k--);

}

voidkeyscan()//键盘扫描函数;判断哪个键被按下;入口参数C0、C1、R0、R1、R2;出口参数a、k、number、t、key;调用的子函数为delay(uchari),进行消抖;

{

C0=1;列0(最右边)列扫描

if(R0==0){delay(15);if(R0==0)a=(a+1)%3;while(!

R0);}//关闹钟以及定时清零键S6被按下;

if(R1==0){delay(15);if(R1==0)k=(k+1)%4;while(!

R1);}//移位调时键S7被按下;

C1=1;列1(最左边)列扫描

if(R0==0){delay(15);if(R0==0)number=2;while(!

R0);}//减一键S5被按下;

if(R1==0){delay(15);if(R1==0)number=1;while(!

R1);}//加一键S4被按下;

C2=1;列2(中间列)列扫描

if(R0==0){delay(15);if(R0==0)t=(t+1)%2;while(!

R0);}//定时器以及倒计时器的开关和暂停键S2被按下;

if(R1==0){delay(15);if(R1==0)key=(key+1)%5;while(!

R1);}//功能键S3被按下;

}

voiddisplay(uchars,ucharm,ucharh)//显示函数:

显示实时、调时、计时的时间;入口参数s,m,h;出口参数s/10,s%10,m/10,m%10,h/10,h%10;

嵌套子程序有delay(uchari)、keyscan();

{if(flag!

=1)//移位标志flag不与数码管位选的标志位对应,则正常显示;

{P2=0x20;//数码管显示的位选地址0x20,0x10;

P1=table[s%10];//P1口向数码管输入数据并显示;

delay(3);//延时

P2=0x10;//

P1=table[s/10];

delay(3);}

if(flag==1)//移位标志flag与数码管位选的标志位对应,则闪烁;

P2=0x00;//关显示;

if(flag!

=2)

{P2=0x08;

P1=table[m%10];

delay(3);

P2=0x04;

P1=table[m/10];

delay(3);}

if(flag==2)

P2=0x00;

if(flag!

=3)

{P2=0x02;

P1=table[h%10];

delay(3);

P2=0x01;

P1=table[h/10];

delay(3);}

if(flag==3)

P2=0x00;

keyscan();//键盘扫描

}

voidmonth1()//闰月和大小月判断函数:

判断月份包含多少天,适用于累加;入口参数:

r、y、n,出口参数y;没有嵌套子程序;

{if((y==1)||(y==3)||(y==5)||(y==7)||(y==8)||(y==10)||(y==12)){if(r==32){r=1;y++;}}//大月31天

if((y==4)||(y==6)||(y==9)||(y==11)){if(r==31){r=1;y++;}}//小月30天

if(y==2){if(n%400==0||(n%4==0&&n%100!

=0)){if(r==30){r=1;y++;}}//闰年二月29天

if(n%4!

=0||(n%100==0&&n%400!

=0)){if(r==29){r=1;y++;}}}//平年二月28天

}

voidmonth2()//闰月和大小月判断函数:

判断月份包含多少天,适用于递减;入口参数:

r、y、n,出口参数y;没有嵌套子程序;

{

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 农林牧渔 > 林学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1