STC51单片机课程设计电子时钟.docx
《STC51单片机课程设计电子时钟.docx》由会员分享,可在线阅读,更多相关《STC51单片机课程设计电子时钟.docx(20页珍藏版)》请在冰点文库上搜索。
STC51单片机课程设计电子时钟
课程设计
课程名称:
单片机课程设计
题目名称:
单片机电子时钟
学院:
河南工院
专业:
计算机控制
姓名:
王过
学号:
123456789
指导教师:
XXX
2012年6月21日
硬件描述及系统设计构思
一.单片机电子时钟功能
二.系统硬件描述
1.控制器用AT89S51,12M晶振
2.数码管动态扫描驱动——P2口
3.数码管段码驱动——P0口
4.闹铃驱动——P0.4
5.调整键K1——P3.3(外部中断0,正常、调时、调分)
6.定时/正常切换键K2——P3.2
7.时间参数低位加1键K3——P3.4
8.时间参数高位加1键K4——P3.5
三.系统设计构思
1.主流程是取时间参数,显示时间参数。
2.利用T0中断来完成计时、比较定时时间、驱动闹铃。
3.利用T1中断完成动态显示中,调整时间闪烁效果的定时。
4.利用外部中断0来完成调整选择功能。
5.利用外部中断1完成定时显示,当前时间显示的切换
6.K3、K4键完成时间参数的循环加1操作。
1、课程设计名称:
51单片机电子时钟
2、设计方案:
1、通过单片机内部的计数/定时器,采用软件编程来实现时钟计数,一般称为软时钟,这种方法的硬件线路简单,系统的功能一般与软件设计相关,通常用在对时间精度要求不高的场合。
2、采用时钟芯片,它的功能强大,功能部件集成在芯片内部,具有自动产生时钟等相关功能,硬件成本相对较高;软件编程简单,通常用在对时钟精度要求较高的场合。
三、设计内容:
这里采用应用广泛的AT89C52作为时钟控制芯片,利用单片机内部的定时/计数器T0实现软时钟的目的。
首先将T0设定工作于定时方式,对机器周期计数形成基准时间(50ms),然后用另一个定时/计数器T1对基准时间计数形成秒,妙计60次形成分,分计60形成小时,小时计到12。
最后通过数码管把它们的内容在相应的位置显示出来,达到时、分、秒计时的功能。
此外还要实现对时间的调整功能,89C52的P1.0、P1.1、P1.2外接三个独立按键,当按下P1.0按键时,系统进入调时间的状态或启动时间显示的功能;当按下P1.1按键时,对显
示的数码管进行加一的功能;当按下P1.2按键时,对显
示的数码管进行减一的功能,达到调整时间的目的。
四、系统软件程序设计
1.主程序
先对显示单元和定时器/计数器初始化,然后重复调用数码管显示模块和按键处理模块,当有按键按下时,则转入相应的功能程序。
2、数码管显示模块
本实验有1个四段数码管,从右到左为分、时。
在本系统中数码管显示采用软件译码动态显示。
在存储器中首先建立一张显示信息的字段码表,显示时,先从显示缓冲区中取出显示的信息,然后通过查表程序在字段表中查出所显示的信息的断码,从P0端口输出,同时在P2端口进行数码管显示。
3、定时器/计数器T0中断服务程序
T0用于计时,选中方式一,重复定时,定时时间设为50ms,定时时间到则中断,在中断服务程序中用一个计数器对50ms计数,计20次则对秒单元加一。
秒单元加到60则对分单元加一,同时秒单元清0;分单元加到60则对时单元加一,同时分单元清0;时单元加到24则对时单元清0,标
志一天时间计满。
在对各单元计数的同时,把他们的值放到存储器单元的指定位置。
流程图如下:
4、按键处理模块
按键设置为:
如果没有按键吗,则时钟正常走时。
当按下K0键时,进入调分状态,时钟停止走动;按K1和K2按键可以进行加一和减一操作;继续按K0键可以分别进行分和小时的调整;最后按K0键启动计时。
5、C语言程序
#include"reg51.h"
#defineucharunsignedchar
#defineuintunsignedint
#defineSMGdataP2
sbitSMGHH=P0^3;//小时位
sbitSMGHL=P0^2;//小时位
sbitSMGMH=P0^1;//分钟位
sbitSMGML=P0^0;//分钟位
sbitSlemp1=P1^2;
sbitSlemp2=P1^5;
sbitSPKlemp=P1^0;
sbitkeysub=P3^5;//定时减1
sbitkeyadd=P3^4;//定时加1
sbitSPK=P0^4;
ucharhhdata,hldata,mhdata,mldata;
uchardhhdata,dhldata,dmhdata,dmldata;
ucharSecdata,T0num1,T0num2;
ucharcodeSMGtab[]={0x03,0x9F,0x25,0x0D,0x99,0x49,0x41,0x1F,0x01,0x09,0x11,0xC1,0x63,0x85,0x61,0xfd};
bitflagxs=0;
ucharflagxz=0;
ucharloopss=0;
bitflagss=0;
bitflagspk=0;
bitflagspkout=1;
voiddelayxs(uinti);
voidmain()
{
keysub=keyadd=1;
Secdata=0;
hhdata=1;
hldata=7;
mhdata=5;
mldata=8;
dhhdata=1;
dhldata=8;
dmhdata=0;
dmldata=5;
SPK=SPKlemp=1;
Slemp1=Slemp2=0;
EA=ET0=ET1=EX0=IT0=EX1=IT1=1;
TMOD=0x61;//T0,定时方式1,T1计数方式2
TH0=0x3c;
TL0=0xb0;
T0num1=10;//10
T0num2=2;
TH1=TL1=255;
TR0=TR1=1;
while
(1)
{
while(!
flagxs)
{
if(flagxz)
{loopss++;
if(loopss==8)
{
loopss=0;
flagss=!
flagss;}
}
else
loopss=0;
if((flagspk)&&(!
flagspkout))
SPK=!
SPK;
delayxs(20);
SMGdata=SMGtab[hhdata];
SMGHL=SMGMH=SMGML=1;
if(flagxz==1)
SMGHH=flagss;
else
SMGHH=0;
delayxs(20);
SMGdata=SMGtab[hldata];
SMGHH=SMGMH=SMGML=1;
if(flagxz==1)
SMGHL=flagss;
else
SMGHL=0;
delayxs(20);
SMGdata=SMGtab[mhdata];
SMGHL=SMGHH=SMGML=1;
if(flagxz==2)
SMGMH=flagss;
else
SMGMH=0;
delayxs(20);
SMGdata=SMGtab[mldata];
SMGHL=SMGHH=SMGMH=1;
if(flagxz==2)
SMGML=flagss;
else
SMGML=0;
}
while(flagxs)
{
if(flagxz)
{loopss++;
if(loopss==8)
{
loopss=0;
flagss=!
flagss;}
}
else
loopss=0;
if(flagxz!
=0)
{
if(keyadd==0)
{
delayxs(120);
if(flagxz==1)
{
dhldata++;
if((dhhdata==2)&&(dhldata==4))
dhhdata=dhldata=0;
elseif((dhhdata!
=2)&&(dhldata==10))
{
dhldata=0;
dhhdata++;
if(dhhdata==3)
dhhdata=0;}
}
if(flagxz==2)
{
dmldata++;
if(dmldata==10)
{
dmldata=0;
dmhdata++;
if(dmhdata==6)
dmhdata=0;}
}
}
if(keysub==0)
{
delayxs(120);
if(flagxz==1)
{
if((dhhdata==0)&&(dhldata==0))
{dhhdata=2;
dhldata=3;}
elseif(dhldata==0)
{dhldata=9;
dhhdata--;}
else
{dhldata--;}
}
if(flagxz==2)
{
if((dmhdata==0)&&(dmldata==0))
{dmhdata=5;
dmldata=9;}
elseif(dmldata==0)
{dmldata=9;
dmhdata--;}
else
{dmldata--;}
}
}
}
if((flagspk)&&(!
flagspkout))
SPK=!
SPK;
delayxs(20);
SMGdata=SMGtab[dhhdata];
SMGHL=SMGMH=SMGML=1;
if(flagxz==1)
SMGHH=flagss;
else
SMGHH=0;
delayxs(20);
SMGdata=SMGtab[dhldata];
SMGHH=SMGMH=SMGML=1;
if(flagxz==1)
SMGHL=flagss;
else
SMGHL=0;
delayxs(20);
SMGdata=SMGtab[dmhdata];
SMGHL=SMGHH=SMGML=1;
if(flagxz==2)
SMGMH=flagss;
else
SMGMH=0;
delayxs(20);
SMGdata=SMGtab[dmldata];
SMGHL=SMGHH=SMGMH=1;
if(flagxz==2)
SMGML=flagss;
else
SMGML=0;
}
}
}
voiddelayxs(uinti)
{
ucharj;
while(i--)
for(j=0;j<50;j++);
}
voidwbzd0()interrupt0
{
flagxz=0;
TMOD=0x61;
TR0=1;
flagxs=!
flagxs;
}
voidwbzd1()interrupt2
{
flagxz++;
flagxz%=3;
if(!
flagxs)
{
if(flagxz!
=0)
{
TR0=Slemp1=Slemp2=0;
Secdata=0;
TR1=1;
TMOD=0x66;
TH0=TL0=255;
TR0=1;
}
else
{
TMOD=0x61;
TH0=0x3c;
TL0=0xb0;
T0num1=10;//10
T0num2=2;
TR0=1;
TF1=0;
}
}
}
voidt1zd()interrupt3
{
if(!
flagxs)
{
if(flagxz==1)
{
if((hhdata==0)&&(hldata==0))
{hhdata=2;
hldata=3;}
elseif(hldata==0)
{hldata=9;
hhdata--;}
else
{hldata--;}
}
elseif(flagxz==2)
{
if((mhdata==0)&&(mldata==0))
{mhdata=5;
mldata=9;}
elseif(mldata==0)
{mldata=9;
mhdata--;}
else
{mldata--;}
}
}
if((!
flagxs)&&(flagxz==0))
{flagspk=!
flagspk;
SPKlemp=!
flagspk;
}
}
voidt0zd()interrupt1
{
if(((!
flagxs)&&(flagxz==0))||(flagxs))
{
TH0=0x3c;
TL0=0xb0;
T0num1--;
if(T0num1==0)
{
T0num1=10;//10
if(!
flagxs)
{Slemp1=!
Slemp1;
Slemp2=!
Slemp2;}
else
{Slemp1=1;
Slemp2=1;}
T0num2--;
if(T0num2==0)
{
T0num2=2;
Secdata++;
if(Secdata==60)
{
Secdata=0;
mldata++;
if(mldata==10)
{
mldata=0;
mhdata++;
if(mhdata==6)
{
mhdata=0;
hldata++;
if((hhdata==2)&&(hldata==4))
hhdata=hldata=0;
elseif((hhdata!
=2)&&(hldata==10))
{
hldata=0;
hhdata++;
if(hhdata==3)
hhdata=0;}}}
if((flagspk==1)&&(hhdata==dhhdata)&&(hldata==dhldata)&&(mhdata==dmhdata)&&(mldata==dmldata))
flagspkout=0;
else
SPK=flagspkout=1;
}}}}
if((flagxz==1)&&(!
flagxs))
{
hldata++;
if((hhdata==2)&&(hldata==4))
hhdata=hldata=0;
elseif((hhdata!
=2)&&(hldata==10))
{
hldata=0;
hhdata++;
if(hhdata==3)
hhdata=0;}
}
if((flagxz==2)&&(!
flagxs))
{
mldata++;
if(mldata==10)
{
mldata=0;
mhdata++;
if(mhdata==6)
mhdata=0;}}
}
6、软件编译环境:
KeiluVision2
确保生成".Hex"文件
5、系统硬件电路的设计
系统的硬件主要包括单片机芯片,数码管显
示,按键开关电路,它的硬件电路如下图所示,单片机采用广泛使用的AT89C52,系统时钟采用12MHz的晶振,八个数码管显示,小时与分钟与秒钟间用短横线,采用共阳极七段式数码管,P0口为段选码输出端,P2口为位选码输出端。
STC-ISP如图所示:
6、课程设计总结
经过一周的时间以及对整本教材的知识总结,把课程设计分成了硬件和软件两大模块。
总的来说,硬件部分很好入手,电路也教简单,主要涉及的是简单的按键、电容、电阻、晶振和数码管。
在软件部分,细分为了按键模块、显示模块、定时/计数模块,最后把几个模块整合在主程序模块中,使得程序简单明了。
整个设计过程中遇到的最大问题是软件的
编写,由于采用的是汇编语言,其间使用到的各种寄存器、存储器地址、变量很多,很难对程序的整体把握。
通过电子钟的设计,对单片机的原理、结构、外围电路进一步的了解。
在整个设计过程中学到了团体精神和独立解决问题的重要性。
为以后的求职之路打下了基础。
7、参考资料
[1]《单片机原理与应用》谢维成杨加国编著
[2]《单片机应用与仿真调试》严天峰编著
[3]《模拟电子技术(第三版)》胡宴如耿苏燕编著
[4]《数字电子技术(第三版)》杨志忠卫桦林编著