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

上传人:b****2 文档编号:915394 上传时间:2023-04-30 格式:DOCX 页数:20 大小:306.09KB
下载 相关 举报
STC51单片机课程设计电子时钟.docx_第1页
第1页 / 共20页
STC51单片机课程设计电子时钟.docx_第2页
第2页 / 共20页
STC51单片机课程设计电子时钟.docx_第3页
第3页 / 共20页
STC51单片机课程设计电子时钟.docx_第4页
第4页 / 共20页
STC51单片机课程设计电子时钟.docx_第5页
第5页 / 共20页
STC51单片机课程设计电子时钟.docx_第6页
第6页 / 共20页
STC51单片机课程设计电子时钟.docx_第7页
第7页 / 共20页
STC51单片机课程设计电子时钟.docx_第8页
第8页 / 共20页
STC51单片机课程设计电子时钟.docx_第9页
第9页 / 共20页
STC51单片机课程设计电子时钟.docx_第10页
第10页 / 共20页
STC51单片机课程设计电子时钟.docx_第11页
第11页 / 共20页
STC51单片机课程设计电子时钟.docx_第12页
第12页 / 共20页
STC51单片机课程设计电子时钟.docx_第13页
第13页 / 共20页
STC51单片机课程设计电子时钟.docx_第14页
第14页 / 共20页
STC51单片机课程设计电子时钟.docx_第15页
第15页 / 共20页
STC51单片机课程设计电子时钟.docx_第16页
第16页 / 共20页
STC51单片机课程设计电子时钟.docx_第17页
第17页 / 共20页
STC51单片机课程设计电子时钟.docx_第18页
第18页 / 共20页
STC51单片机课程设计电子时钟.docx_第19页
第19页 / 共20页
STC51单片机课程设计电子时钟.docx_第20页
第20页 / 共20页
亲,该文档总共20页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

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

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

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

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]《数字电子技术(第三版)》杨志忠卫桦林编著

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

当前位置:首页 > 法律文书 > 调解书

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2