单片机秒表课程设计报告.docx
《单片机秒表课程设计报告.docx》由会员分享,可在线阅读,更多相关《单片机秒表课程设计报告.docx(11页珍藏版)》请在冰点文库上搜索。
单片机秒表课程设计报告
一:
课程设计题目
秒表/时钟计时器
二:
课程设计任务与要求:
利用89C51单片机设计秒表/时钟计时器,通过LED显示器显示秒十位和个位,在设计过程中用一个存储单元作为秒计数单元,当一秒钟到来时,就让秒计数单元加1,当秒计数达到60时,就自动返回到0,重新开始秒计数。
三:
设计过程:
1.设计原理:
此次课程设计题目是秒表/时钟计时器,由课程设计的要求和任务,我采用的C语言编程,设计秒表要求一秒定时,采用了定时器和FOR循环来定时,其中一个软件一个硬件,会在方案论证中分析在1秒时采用的是硬件定时,即用单片机内部的定时器T0。
先将时钟初始化,赋入初值50ms定时,循环20次来进行1秒定时。
然后由定义的变量second来进行加一运算,然后将其值通过P1,P2口在数码管上进行显示。
其中数码管的显示时,我在程序中首先定义了一个关于数码管显示的字形码定义,以便在显示时调用即可。
(1)方案论证:
方案1:
在方案1中,我们所选用的是软件定时,即用for循环来定时1秒进行显示的变化。
方案2:
在方案2中,采用的是硬件定时,即用单片机内部的定时器T0。
先将时钟初始化,赋入初值50ms定时,循环20次来进行1秒定时。
方案比较:
我们从两方面进行两种方案的比较,第一,由于此次课程设计要求是秒表,则在定时时要求比较精确,所以采用硬件的定时器定时时比较准确的。
第二,由于秒表的定时程序是很小的,在利用软件定时占用的CPU并不是很多,不能显现出来,但真正大程序时会很占用资源的,所以在用定时中断过程中是非常节省资源的。
综合上述两种比较,我们选用了第二种方案。
(2)创新点:
a.在课程要求的基础上,我们做成的电路板上,用复位键来控制秒表计时的重新开始,即清零。
b.在以上设计的基础上,我们又重新设计了一个程序,基本原理没有变,只是将秒表在到达59清零的瞬间向分的位数上进1,程序将会在附录3中给出。
2.硬件系统框图与说明:
首先,连接的是单片机51的最小系统,其中包括时钟电路,复位电路,在此中包括的元器件在附录3中。
我们所选用的数码管是共阴极的,置1时导通,所以将单片机的P1.0~P1.7连接数码管的a~dp,P2口同理。
然后在数码管秒表个十位的显示则由软件程序来控制。
3.软件主要模块流程图与说明:
在真正应用时,我们的一秒定时是用定时中断的,但单片机的T0最长也不能1秒定时,所以我们采用50ms定时循环20次,用count来控制。
当秒的时间达到59时,用软件来清零时循环从00重新开始。
四:
课程设计总结:
1:
本次的课程设计,使关于51系列单片机的,正是我们刚刚学到的51单片机,在平时课程的学习中,我们仅限于理论知识的讲解,即使知识是很扎实的,实际应用并不是这样的。
开始时我也觉得自己的理论知识已经够了,但当我拿到课题时,在脑海里想的是非常好的,但真正编成和控制时,理论和实际结合不到一起,甚至于51芯片的使用我都感觉很迷茫,还是经过搜集大量资料才将理论与实际结合到一起了。
本次课程设计我主要负责编程,这次不仅锻炼了我C语言的知识,更加我们正在学习的51的定时与中断结合在一起,进行了实际的操作,让我的知识掌握得更加牢固。
本次的实际经验之后,让我对单片机定时赋初值有了更新的认识,对程序的循环顺序、结构类型都有了非常深刻的认识,对真正硬件的连接也有了认识,不再将自己的知识局限于自己狭隘的空间中。
2:
通过这次课程设计——秒表/时钟计时器,使我又重新开始学习C语言,因为C语言是大一学的,至从学完就再也没用过,所以开始很陌生,我又找了有关资料来了解,才有了一点眉目。
刚开始以为可以用汇编很容易就写出来,因为我们正在学习汇编语言,以为学的很明白了,但是用汇编时才发现原来都不怎么熟练,编了一会程序发现只有一种感觉——举步维艰啊!
还是放弃汇编选择C语言吧!
对于单片机,我们课本学习的是80C51,但是这次做课程设计用的是89C51,这样不仅使我们掌握了80C51,而且对89C51也有了一定的了解了,在课堂上学习的都理论的,跟实际永远有一定的差距,不实践就不会发现问题。
通过这次课程设计使我把课堂上学习的东西都用到了实践中,例如:
定时/计数器的应用与中断。
学习的时候不怎么理解,但是在实践中应用了以后就自然了解了。
这次课程设计使我受益匪浅,而且都是实际的东西。
3:
这次课程设计,我们做的是秒表/时钟计时器,最终我们选择的是用C语言编程,但原来学的也只是能看懂别人写好的程序而已,通过这次课程设计,更加熟练了C语言的程序设计思路。
这次课程设计我主要负责焊接电路板,焊接过程中最困难的地方就是数码管的焊接,因为数码管的管脚和89C51的管脚是不对应的,而且要避免接线的交叉,所以最后确定了布线最合理的方案,如硬件电路图所示。
我们这次设计的出现的最大问题是电路当中的复位电路,开始电路在Proteus上仿真时都是可以正常复位的,但实际的电路中复位按键后的电阻的参数不合理,导致了RST上有电压,复位电路无效,所以最后我们去掉了那个电阻,此时复位电路才有效,所以理论和实际永远有差距,不实践永远发现不了问题。
在焊接前我们没有想到给数码管用插槽固定,而是直接焊在了电路板上,这造成了后面的很多麻烦,我们方案中用的是共阴极的数码管,焊接第一个数码管时没有注意型号,等焊接到一半时才发现焊上的是共阳极的,所以不得不解焊重新焊接,这也是一个教训,以后焊接器件时能用上插槽的尽量用插槽,这在器件出了问题时很方便更换。
最后焊接完成后在试验的过程中,刚一接通电源后的上电电压烧坏了LED显示器显示秒十位的c脚,这也是这次课程设计的遗憾,以后在硬件的实验时还要多小心,避免造成不必要的损失。
4:
通过本次秒表/时钟计时器的设计实验,使我对这学期学所学51系列的单片机从理论知识到实践硬件的应用以及C语言知识的回顾,更加熟悉了89C51单片机的每一个拐角的输出和各项功能,而且对硬件电路的布线以及焊接能力有了很大的进步。
在这次试验中,我主要负责的是硬件电路的布线和焊接以及硬件测试。
由于本次试验电路比较简单,所以我们按照电路图布线后就马上开始焊接。
焊好一个数码管检测后才发现我们把共阴极的数码管焊接成共阳级的了,很不容易才解焊下来,有了这次教训后,我们在焊接其他元器件的时候都提前检测好才开始焊接。
第一次焊接完成后我们上电后发现实现了基本功能,可是不能复位,经过我们的讨论和反复试验,我们发现软件仿真和硬件实现并不是完全一致的,我们按照课本上焊接后终于完全实现了秒表/时钟计时器的功能。
快要验收时我们发现数码管的一个二极管坏了,这才让我们意识到没有焊接插针的缺陷,以后一实验时一定要尽可能让原件可以取下,以便出现问题是更好的更换。
这次课程设计终于圆满的完成了,我从理论和硬件以及实践上懂得了很多,也明白了一个团队的合作精神可以让我们战胜所有的困难。
五:
附录
附录1:
电路原理图:
附录2:
实物图:
附录3:
源程序及程序解释:
#include//包含头文件REG51。
H
#defineuintunsignedint
#defineucharunsignedchar
unsignedcharcodeSEG7[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//数码管0~9的字型码
ucharcount,second;//定义变量
/*===================================*/
voidinit()//定义定时器T0初始化程序
{
TMOD=0x01;
TH0=(65536-50000)/256;//赋初值定时1秒
TL0=(65536-50000)%256;
ET0=1;
TR0=1;
EA=1;
P2=SEG7[0];
P1=SEG7[0];
}
voiddelay(unsignedintk)//定义延时程序
{
unsignedinti,j;
for(i=0;i{
for(j=0;j<121;j++)
{
;
}
}
}
//-----------------------------------------------------------
voidmain(void)
{
init();//定时器初始化
while
(1)//无限循环
{
;
}
}
//----------------------------------------------------
voidtimer0()interrupt1//定时器T0中断
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
count++;
if(count==20)
{
count=0;
second++;
if(second>59)second=0;
P1=SEG7[second/10];//显示秒的十位
delay(10);//延时
P2=SEG7[second%10];//显示秒的个位
delay(10);
}
附录4:
for循环程序
#include
unsignedcharcodeSEG7[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
/*===================================*/
voiddelay(unsignedintk);
//-----------------------------------------------------------
voidmain(void)
{
unsignedcharval1=0;
longi;
while
(1)
{
for(i=0;i<380;i++)
{
/*P2=0xfd;*/
P2=SEG7[val1%10];
delay
(1);
/*P2=0xfe;*/
P1=SEG7[val1/10];
delay
(1);
}
val1=val1+1;
if(val1>59)
val1=0;
}
}
//----------------------------------------------------
voiddelay(unsignedintk)
{
unsignedinti,j;
for(i=0;i{
for(j=0;j<121;j++)
;
}
}
附录5:
汇编程序
ORG0000H
START:
MOVR1,#20
MOVR2,#10
MOVR3,#6
MOVR4,#00H
LOOP1:
MOVR2,#10
LOOP:
MOVA,R4
MOVB,#0AH
DIVAB
MOVDPTR,#TAB
MOVCA,@A+DPTR
MOVP1,A
MOVA,B
MOVCA,@A+DPTR
MOVP2,A
LCALLDEL
INCR4
DJNZR2,LOOP
DJNZR3,LOOP1
MOVP1,#00
MOVP2,#00
LJMPSTART
DEL:
MOVR7,#12
DEL1:
MOVR6,#123
NOP
DEL2:
DJNZR6,DEL2
DJNZR7,DEL1
DJNZR1,DEL
RET
TAB:
DB3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH
END
附录6:
使用元器件一览表:
序号
名称
型号
数量
备注
1
单片机
P89c51
1
2
数码管
SM42056
2
3
开关
WJW603
1
4
电阻
10K100
2
5
电容
30PF10uF
3
6
电压表
VC890D
1
附录7:
参考资料:
单片机原理及接口技术李全利迟荣强编著C语言程序设计