51单片机电子时钟课程设计.docx
- 文档编号:3287115
- 上传时间:2022-11-21
- 格式:DOCX
- 页数:14
- 大小:291.49KB
51单片机电子时钟课程设计.docx
《51单片机电子时钟课程设计.docx》由会员分享,可在线阅读,更多相关《51单片机电子时钟课程设计.docx(14页珍藏版)》请在冰豆网上搜索。
51单片机电子时钟课程设计
摘要
近年来随着计算机在社会领域的渗透和大规模集成电路的发展,单片机的应用正在不断地走向深入,由于它具有功能强,体积小,功耗低,价格便宜,工作可靠,使用方便等特点,因此特别适合于与控制有关的系统,越来越广泛地应用于自动控制,智能化仪器,仪表,数据采集,军工产品以及家用电器等各个领域,单片机往往是作为一个核心部件来使用,在根据具体硬件结构,以及针对具体应用对象特点的软件结合,以作完善。
本次设计中以单片机的发展过程和发展方向为背景,介绍了单片机的输入输出的工作原理和操作方法,中断的工作原理和操作方法,74HC573驱动器的工作原理和与数码管连接的方法。
本次做的数字钟是以单片机(STC89C52)为核心,结合相关的元器件(共阴极LED数码管、驱动器74HC573等),再配以相应的软件,是它具有时,分,秒显示的功能,并且时,分,秒还可以调整。
此次设计电子数字钟是为了了解电子数字钟的原理,从而学会制作电子数字钟。
而且通过电子数字钟的制作进一步的了解各种在制作中用到的中小规模集成电路的作用及实用方法。
通过它可以进一步学习与掌握单片机原理与使用方法。
关键词:
单片机STC89C52共阴极LED数码显示器74HC573驱动器
一.设计目的
1、实现时钟的基本功能
2、能够手动对时间的调整
3、实现跑秒功能
二.数字钟基本原理
它是利用单片机的内部的定时/计数器工作与定时方式,对机器周期计数形成基准时间(如10ms)然后用另外一个计数器或软件计数的形式对基准时间进行计数形成秒(如对10ms计数100次),“秒”计数60次形成“分”,“分”计数60次形成“时”,“时”计数24次形成“天”并清零,然后通过译码器,数码管把他们的内容在相应的位置显示出来。
在具体的设计时定时器采用中断方式工作,对时钟的形成在终中断序中实现,在主程序只是对定时/计数器的定义初始化,调用显示程序和控制程序的初始化。
另外为了使用的方便,也设计了按键,可以通过按键对时分秒进行调整,这样程序就加了按键程序。
三.单片机数字时钟的程序设计
3.1主程序
主程序是先开始,系统初始化、定时器初始化,脉冲基时开始跑秒后进行按键检测。
若没有按键设置,显示当前时间;若有按钮按下,按键调时,检测完后,
就可以显示更新后的时间。
主程序流程:
3.2定时中断(走时)子程序流程
定时器中断时,先检测50ms脉冲是否计数20次,计数到20次,秒就加1;
如果没计满60,就返回显示时间,如果秒计满60秒,就清零秒,给分加1;检测分钟,如果没计满60,继续计时,返回显示时间,如果满60,就清零分钟,给小时加1;检测小时,如果没计满24,就继续计时,返回显示时间,如果计满24,就清零,给秒加1,显示时间。
3.3按键扫描子程序:
按键调试程序,是检测是否有按键按下:
(1)如果小时增加键/减小键按下,就给小时加1/减1
(2)如果分钟增加键/减小键按下,就给分钟加1/减1
(3)如果秒增加键/减小键按下,就给秒加1/减1
(4)如果显示键(key7)按下,则显示当前时间
3.4程序代码
#include
#defineuintunsignedint
#defineucharunsignedchar
sbitdula=P2^0;//段选
sbitwela=P2^1;//位选
sbitkey1=P1^0;
sbitkey2=P1^1;
sbitkey3=P1^2;
sbitkey4=P1^3;
sbitkey5=P1^4;
sbitkey6=P1^5;
sbitkey7=P1^6;
sbitkey8=P1^7;
charflag=0;
intnum1=0,num2,shi,shih,shil,fen,fenh,fenl,miao,miaoh,miaol,p,ph,pl;
voiddelayms(uintz)
{
uintx,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
ucharcodetable[]={0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};//共阴
voiddiaplay(intshih,intshil,intfenh,intfenl,intmiaoh,intmiaol,intph,intpl)//动态显示
{
dula=1;
P0=table[ph];
dula=0;
P0=0xff;
wela=1;
P0=0xbf;//10111111
wela=0;
delayms
(1);
dula=1;
P0=table[pl];
dula=0;
P0=0xff;
wela=1;
P0=0x7f;//01111111
wela=0;
delayms
(1);
dula=1;
P0=table[miaol];
dula=0;
P0=0xff;
wela=1;
P0=0xdf;//11011111
wela=0;
delayms
(1);
dula=1;
P0=table[miaoh];
dula=0;
P0=0xff;
wela=1;
P0=0xef;//11101111
wela=0;
delayms
(1);
dula=1;
P0=table[fenl];
dula=0;
P0=0xff;
wela=1;
P0=0xf7;//11110111
wela=0;
delayms
(1);
dula=1;
P0=table[fenh];
dula=0;
P0=0xff;
wela=1;
P0=0xfb;//11111011
wela=0;
dula=1;
P0=table[shil];
dula=0;
P0=0xff;
delayms
(1);
wela=1;
P0=0xfd;//11111101
wela=0;
delayms
(1);
dula=1;
P0=table[shih];
dula=0;
P0=0xff;
wela=1;
P0=0xfe;//11111110
wela=0;
delayms
(1);
}
voidkeyscan()//键盘扫描
{
if(key1==0)
{
delayms(10);
if(key1==0)
{
shi++;shih=shi/10;shil=shi%10;
if(shi==24)shi=0;
while(!
key1);
}
}
if(key2==0)
{
delayms(10);
if(key2==0)
{
shi--;if(shi<0)shi=23;
shih=shi/10;shil=shi%10;
if(shi==0)shi=24;
while(!
key2);
}
}
if(key3==0)
{
delayms(10);
if(key3==0)
{
fen++;fenh=fen/10;fenl=fen%10;
if(fen==60)fen=0;
while(!
key3);
}
}
if(key4==0)
{
delayms(10);
if(key4==0)
{
fen--;if(fen<0)fen=59;
fenh=fen/10;fenl=fen%10;
if(fen==0)fen=60;while(!
key4);
}
}
if(key5==0)
{
delayms(10);
if(key5==0)
{
miao++;miaoh=miaoh/10;miaol=miao%10;
if(miao==60)miao=0;while(!
key5);
}
}
if(key6==0)
{
delayms(10);
if(key6==0)
{
miao--;if(miao<0)miao=59;
miaoh=miaoh/10;miaol=miao%10;
if(miao==0)miao=60;while(!
key6);
}
}
if(key7==0)
{
delayms(10);
if(key7==0)
{
while(key7==0);
if(flag==1)
flag=0;
else
flag=1;
}
}
}
voidmain()
{
TMOD=0x01;//工作方式0
TH0=(65536-9174)/256;//装初值,11.0592晶振定时1ms为9174
TL0=(65536-9174)%256;//机器周期为12*(1/11059200)=1.09us
//N=1ms/1.09us=9174
EA=1;
ET0=1;
TR0=1;
while
(1)
{
keyscan();
if(flag==1)
{
dula=1;
diaplay();
dula=0;
delayms
(2);
wela=1;
P0=0x00;
wela=0;
}
else
diaplay(shih,shil,fenh,fenl,miaoh,miaol,ph,pl);
}
}
voidT0_time()interrupt1
{
TH0=(65536-9174)/256;
TL0=(65536-9174)%256;
num1++;
if(num1==1)//跑秒
{
num1=0;p++;
ph=p/10;
pl=p%10;
if(p==100)p=0,miao++;
if(miao==60)miao=0,fen++;
miaoh=miao/10;
miaol=miao%10;
if(fen==60)fen=0,shi++;
fenh=fen/10;
fenl=fen%10;
if(shi==24)shi=0;
shih=shi/10;
shil=shi%10;
}
}
四、心得体会
首先要感谢张老师对程序的指导与调试,特别是学到了对按键消抖的处理方法,按照按键上升沿的特点对按键进行消抖,还有就是对程序整体设计思路的提高,让主要的功能分成几个部分来进行判断,而不是全部都放在一些想要实现的子程序中根据自己的意愿来实现,要对程序整体的首先要考虑的成熟和完善。
这次的课程设计,总体的来说对于一个程序的设计的能力有了更大的提高,一个再简单的程序,牵扯到的知识是方方面面的,所以对综合能力也有一定的要求。
以下是设计各个模块时想到的考虑到的方面,分类进行描述。
1、硬件配置:
从开始的晚上向大四借到的51单片机开始,这个单片机板子是没有用过的,于是要来了开发板电路图,了解单片机的GPIO,然后结合电路图开始构思,根据设计要求,所需开发板上的硬件有:
51芯片、数码管、驱动数码管的74HC573的两块芯片
然后看开发板电路图对GPIO进行配置,根据电路图,首先用杜邦线将PO口的8位与573口想接,然后对两片573的上拉使能端(即段选、位选)进行配置、截至单片机P2^0口和P2^1口
2、设计思路:
利用单片机的计数器,产生出相当准确的时间模值,可以通过累加进位的办法产生,跑秒级时间、秒、分、时
显示时间
然后设计按键、可以对时间的时、分、秒,来调整时间
其次,跑秒,与时间显示设计在一起,当跑秒记到最大值然后向秒进位,并且设置停止键显示当前时间,可实现跑秒的功能
最后是如何显示当前的时间,注意到锁存器的配置功能,硬件电路本身OE=0,当LE=1,Q=D时,显示值为当前值,可实现动态显示功能。
当LE=0,Q=Q*时,当前的显示值只与最后一次所存的数据有关,可以实现按键按下,静态显示的功能
74HC573功能图:
3、软件编写、调试:
软件的编写、调试需要keil和STC-ISPV31两个软件来实现,一个程序的编写,是对一个个功能逐个实现,各个击破来编写的,编写程序的时候,需要编写之后生成hex文件,查看自己编写是所要达到显示的状态,与单片机程序下载进去之后所显示的状态,是否一致,若不一致,则应回过头来,检查硬件的配置管脚,也可用万用表示波器来检测的状态,反复调试反复验证,会得到自己构思让单片机按照自己所想,所显示的结果。
一个程序是不可能一次性编写成功的,即使显示功能完好,还有很大的不足可以提高,例如可以再对程序资源的使用进行优化,对程序的编写进行注释改写,使程序更为易懂、熟练
4、改进
程序设计时欠考虑工作在方式0,仍需改进的使单片机工作在方式2
附录1:
开发板硬件电路图
用杜邦线将P0口依次与数码管J2口相接,J2两个接口接至P2^0和P2^1构成段选和位选,J26口截至单片机P1口
附录2:
实物显示
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 51 单片机 电子 时钟 课程设计
![提示](https://static.bdocx.com/images/bang_tan.gif)