单片机课程设计报告基于MCS51单片机的时钟设计.docx

上传人:b****2 文档编号:12642779 上传时间:2023-04-21 格式:DOCX 页数:28 大小:654.88KB
下载 相关 举报
单片机课程设计报告基于MCS51单片机的时钟设计.docx_第1页
第1页 / 共28页
单片机课程设计报告基于MCS51单片机的时钟设计.docx_第2页
第2页 / 共28页
单片机课程设计报告基于MCS51单片机的时钟设计.docx_第3页
第3页 / 共28页
单片机课程设计报告基于MCS51单片机的时钟设计.docx_第4页
第4页 / 共28页
单片机课程设计报告基于MCS51单片机的时钟设计.docx_第5页
第5页 / 共28页
点击查看更多>>
下载资源
资源描述

单片机课程设计报告基于MCS51单片机的时钟设计.docx

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

单片机课程设计报告基于MCS51单片机的时钟设计.docx

单片机课程设计报告基于MCS51单片机的时钟设计

 

单片机课程设计报告

 

设计课题:

基于MCS-51单片机的时钟设计

 

专业班级:

小组成员:

指导教师:

设计时间:

 

设计任务与要求

1.基本设计要求

(1)在ZY15MCU12BD型综合单片机实验箱的硬件结构上编写软件完成设计。

也可以在其它MCS—51单片机硬件板上完成,或自行设计硬件并制做完成。

(2)程序的首地址应使目标机可以直接运行,即从0000H开始。

在主程序的开始部分必须设置一个合适的栈底。

程序放置的地址须连续且靠前,不要在中间留下大量的空闲地址,以使目标机可以使用较少的硬件资源。

(3)6位LED数码管从左到右分别显示时、分、秒(各占用2位),采用24小时标准计时制。

开始计时时为000000,到235959后又变成000000。

(4)在键盘上选定3个键分别作为小时、分、秒的调校键。

每按一次键,对应的显示值便加1。

分、秒加到59后再按键即变为00;小时加到23后再按键即变为00。

在调校时均不向上一单位进位(例如分加到59后变为00,但小时不发生改变)。

(5)软件设计必须使用MCS-51片内定时器,采用定时中断结构,不得使用软件延时法。

(6)上机调试通过。

2.选作项目

有能力的同学,在做完以上设计后,可选作此项设计内容。

(1)另设三个键,分别作小时、分、秒的减1调校。

(2)在以上设计的基础上,修改程序制作一个电子秒表。

分、秒各占用2位显示,1/10秒、1/100秒各占用1位显示。

设定二个键分别作启动/停止、清零。

(3)在做完

(2)后,将时钟与秒表合二为一,并且在同时使用时互不影响。

即可在时钟与秒表之间任意切换,而不影响走时、计秒。

 

相关硬件结构概述

硬件结构原理

该课程设计基于STC89C52单片机为核心完成的,外加少量其他辅助器件,硬件结构比较简单。

由于本电路结构比较简单,单片机I/O口完全够用,故我们将6位8段LED直接和单片机相连。

硬件结构中的6位8段LED显示器,采用动态方式驱动。

我们采用的是共阳电路,一位LED显示器显示内容一段时间,然后下一位LED显示器显示内容一段时间……,周而复始。

只要刷新频率不小于50Hz,就可以获得清晰稳定的显示效果。

为了增加和位选相连接的I/O口的驱动能力,直接接上上拉电阻。

在本设计中,只使用了6个按键。

复位键,模式设定键、2个上下调节键。

1、定时器/计数器

定时器/计数器简称定时器,其作用主要用于生产各种时间间隔、记录外部脉冲与事件的数量等,是微机中最常用、最基本的部件之一。

89C52单片机有2个16位的定时器/计数器0(T0)和定时器1(T1).T0由2个定时寄存器TH0和Th0构成,T1则由Th1和TL1构成,他们分别映射在特殊功能寄存器中,从而可以通过对特殊功能寄存器的读写来实现对这两个定时器的操作。

作为定时器时,每个机器周期定时寄存器自动加1,所以定时器也可以看做是计量机器周期的计数器。

由于每个机器周期为12个时钟震荡周期,所以定时器的分辨率是时钟震荡频率的1/12.作为计数器时,只要在单片机外部引脚T0(T1)有从1到0电平的负跳变,计数器自动加1.计数的最高频率一般为振荡频率的1/24,例如,选用12MHz晶振,则最高计数频率为0.5MHz。

2、中断系统

当中央处理器CPU正在执行某程序时,由于某种原因,外界向CPU发出暂停目前工作去处理更重要的事情的请求,程序被打断;CPU响应该请求并转入相应的处理程序,处理程序完成以后,再返回原来程序被打断的位置,继续原来的工作,这一过程称为中断。

实现中断功能的部件称为中断系统,或称为中断控制逻辑系统。

89C52单片机的中断系统简单实用。

其基本特点是:

有6个固定的可屏蔽的中断源,4个在片内,2个在片外,他们在程序存储器中各有固定的中断入口地址,由此进入中断服务程序;6个中断源由两级有先级,可形成中断嵌套;2个特殊功能寄存器用于中断控制和条件设置的编程。

若某个中断源通过编程设置,处于被打开的状态,并满足中断响应的条件,而且满足如下3个条件时,单片机响应此中断:

1)当前正在执行的那条指令已被执行完。

2)当前未响应同级或高级中断。

3不在操作IE、IP中断控制寄存器或执行RETI中断指令。

在正常情况下,从中断请求信号有效开始,到中断得到响应,通常需要3个机器周期到8个机器周期。

中断得到响应后,自动清除中断请求标志(对串行I\O端口的中断标志,要用软件清除),将断点即程序计数器之值(PC)压入堆栈(以备恢复用);然后把相应的中断入口地址装入PC,使程序转入相应的中断服务程序中去执行。

各个中断源在程序寄存器中的中断入口地址如表1所示。

中断源

入口地址

INT0(外部中断0)

0003H

TF0(T0中断)

000BH

INT1(外部中断T1)

0013H

TF1(T1中断)

001BH

RI/TI(串行口中断)

0023H

TF2(T2中断)

002BH

各个中断入口地址相隔很近,不便于存放各个比较长的中断服务程序,故通常将中断服务程序存放在另外方便存放的地方,而在中断入口地址开始的二三个单元中,安排一条转移类指令,以转入中断服务程序。

由于6个中断源各有其中断求标志IE0、TF0、IE1、TF1、RI/TI以及TF2,在中断源满足中断请求的条件下,各标志自动置1,向CPU请求中断。

如果某个中断源提出中断请求后,CPU不能立即响应,只要该中断请求标志不被软件认为清除,中断请求的状态就将一直保持,直到CPU响应此中断为止。

对串行口中断而言,这一过程与其他5个中断的不同之处在于,即使CPU响应了中断,其中断标志RI/TI也不会清零,必须在中断服务程序中设置清除RI/TI的指令后,才有可能再一次提出中断请求。

CPU的现场保护和恢复必须由被响应的相应中断服务程序去完成。

当执行RI/TI中断返回指令后,断点值自动从栈顶2字节弹出并装入PC寄存器,使CPU继续执行被打断的程序。

本课程设计中用到的定时器T0,并通过T0定时时间到产生中断。

由于实验中定时器T0工作于方式1(即16位方式)且定时器中断允许,因此当定时器计满回零时,TF=1,并可申请中断;当CPU响应中断并进入中断服务程序后,TF自动清零。

所以,在中断服务程序中只需要重新设置定时器初始值。

如果通过对TF查询来确定定时器状态(定时器中断不被允许),在查得TF=1,亦即定时器回零后,要用指令将TF清零,以便下次操作。

相关电路图:

八段数码管:

共阳极电路:

 

各部分电路原理图:

显示部分电路:

电源部分电路:

单片机部分电路:

数码管驱动电路:

 

控制按钮:

复位电路:

 

仿真原理图:

最后的PCB图:

 

软件结构概述

1.主程序

在主程序中只完成系统的初始化,同时进行时、分、秒按键的扫描。

如果有按键按下,则做相应时、分、秒计数数据的加1处理。

主程序执行的流程图如下图所示:

 

 

 

图1主程序流程图

 

(2)定时器中断服务程序

定时器T0用于时间计时。

定时计数个数为5000,由于采用12MHz晶体振荡器,所以定时益处中断周期为5000us=1ms。

为保证计时的准确性,进入中断服务程序时应立即重设计数初始值。

在中断程序中还要判断是否计时1s,若是,还应通过调用其他子程序作时、分、秒值的处理。

 

 

N

N

分到60?

分清0、小时加1

小时到24?

小时清0

中断返回

恢复现场

 

图2定时器中断程序流程图

 

(3)显示子程序

该子程序通过在中断服务程序中被调用而执行。

每一次中断程序调用一次,其作用是根据扫描指针循环驱动各个数码管。

(4)时钟调整子程序

当中断程序中判断出计时1s时,该程序即被调用执行。

其作用为将秒的计数值加1,同时判断是否应对时批、分作相应修改。

(5)延时子程序

用于键盘的延时去抖。

程序清单:

#include

#include

#defineucharunsignedchar

#defineuintunsignedint

/*八段共阴管显示定义*/

unsignedcharwei[8]={0x1f,0x2f,0x37,0x3b,0x3d,0x3e};

unsignedcharcodeduan1[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};

unsignedcharcodeduan2[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};

ucharBUFF[6];

/*定义并初始化变量*/

ucharsecond=0;minute=0;hour=0;unit=0;hun=0;ten=0;sec=0;min=0;m,n,q;

sbitP_s_add_on_off=P1^0;//键值的定义

sbitP_m_add=P1^1;

sbitP_h_add=P1^2;

sbitP_s_sub=P1^3;

sbitP_m_sub=P1^4;

sbitP_h_sub=P1^5;

sbitP_del=P1^6;

sbitP_tran=P3^7;

/*函数声明*/

voiddelay(uchark);//延时子程序

voidtime();//时间处理子程序

voiddisplay();//时间显示子程序

voidkeyboard();//键盘扫描子程序

voidstopwatch();//秒表显示子程序

/*****************************/

/*延时子程序*/

/****************************/

voiddelay(uchark)

{

ucharj;

while((k--)!

=0)

{

for(j=0;j<125;j++)

{;}

}

}

/*****************************/

/*时间显示子程序*/

/*****************************/

voiddisplay(void)

{

uchari;

BUFF[0]=duan1[second%10];//显示秒的个位

BUFF[1]=duan1[second/10];//显示秒的十位

BUFF[2]=duan2[minute%10];//显示分的个位

BUFF[3]=duan1[minute/10];//显示分的十位

BUFF[4]=duan2[hour%10];//显示时的个位

BUFF[5]=duan1[hour/10];//显示时的十位

for(i=0;i<6;i++)

{

P0=BUFF[i];

P2=wei[i];

delay(4);

P2=0xff;

}

}

/*******************************/

/*秒表显示子程序*/

/******************************/

voidstopwatch(void)

{uchara;

if(n==1){TR0=1;ET0=1;TR1=1;ET1=1;}

if(n==0){TR0=1;ET0=1;TR1=0;ET1=0;}

BUFF[0]=duan1[hun];

BUFF[1]=duan2[ten];

BUFF[2]=duan2[sec%10];

BUFF[3]=duan1[sec/10];

BUFF[4]=duan2[min%10];

BUFF[5]=duan1[min/10];

for(a=0;a<6;a++)

{

P0=BUFF[a];

P2=wei[a];

delay(4);

P2=0xff;

}

}

/*******************************/

/*键盘扫描子程序*/

/*******************************/

voidkeyboard(void)

{if(P_tran==0)

{

delay(100);

if(P_tran==0)

switch(m)

{

case0:

m++;break;//切换到秒表

case1:

m--;break;//切换到时间

}

}

if(m==1)

{

if(P_s_add_on_off==0)

{delay(100);

if(P_s_add_on_off==0)

{

switch(n)

{

case0:

n++;break;

case1:

n--;break;

}

}

}

}

if(m==1&&n==0)

{

if(P_del==0)

{

delay(100);

if(P_del==0)

{

hun=0;ten=0;sec=0;min=0;}}}

if(m==0)

{

if(P_del==0)

delay(100);

if(P_del==0)

{

switch(q)

{case0:

q++,TR0=0,ET0=0;break;

case1:

q--,TR0=1,ET0=1;break;}}}

if(q==1)

{if(P_s_add_on_off==0)//秒的调整

{

TR0=0;

delay(100);

if(P_s_add_on_off==0)//秒的加法

{

second++;

if(second==60)

{second=0;}

}

TR0=1;

}

if(P_s_sub==0)//秒的减法

{

TR0=0;

delay(100);

if(P_s_sub==0)

second--;

if(second==0)

{

second=59;

}

TR0=1;

}

if(P_m_add==0)//分的调整

{

TR0=0;

delay(100);

if(P_m_add==0)//分的加法

{

minute++;

if(minute==60)

{minute=0;}

}

TR0=1;

}

if(P_m_sub==0)//分的减法

{

TR0=0;

delay(100);

if(P_m_sub==0)

minute--;

if(minute==0)

{

minute=59;

}

TR0=1;

}

if(P_h_add==0)//时的调整

{

TR0=0;

delay(100);

if(P_h_add==0)//时的加法

{

hour++;

if(hour==24)

{hour=0;}

}

TR0=1;

}

if(P_h_sub==0)//时的减法

{

TR0=0;

delay(100);

if(P_h_sub==0)

hour--;

if(hour==0)

{

hour=23;

}

TR0=1;

}

}

}

voidtimer0(void)interrupt1//定时器0方式1,50ms中断一次

{

TH0=(65536-50000)/256;

TL0=(65536-50000)%256;

unit++;

if(unit==20)

{

second++;

unit=0;//注意点。

对计数单元的清零十分的重要,本次调试中就是

if(second==60)//秒钟设为60进制

{second=0;

minute++;

if(minute==60)//分钟设为60进制

{minute=0;

hour++;

if(hour==24)//时钟设为24进制

{hour=0;}

}

}

}

}

voidtimer1(void)interrupt3//定时器1方式1,10ms中断一次

{

TH1=(65536-10000)/256;

TL1=(65536-10000)%256;

hun++;

if(hun==10)

{

hun=0;

ten++;

if(ten==10)

{

ten=0;

sec++;

if(sec==60)

{

sec=0;

min++;

if(min==60)

{

min=0;}

}

}

}

}

/**************************/

/*主函数*/

/**************************/

voidmain(void)

{m=n=q=0;

TMOD=0x11;//time0为定时器,方式1

TH0=(65536-50000)/256;//预置计数初值

TL0=(65536-50000)%256;

TH1=(65536-10000)/256;

TL1=(65536-10000)%256;

EA=1;

ET0=1;//开定时器0中断

ET1=1;

TR0=1;//启动定时器0

while

(1)

{

keyboard();//按键扫描

if(m==0){display();}

if(m==1){stopwatch();}

}

}

 

程序调试

初LED显示时钟时间与实际时间快慢不一致,通过调整定时器,改变给TLO、THO赋初值的大小,经过几次调试最终显示时间与实际时间相接近。

秒表和时钟功能能经过几次调试,始终不能够完成切换,存在一定的问题。

课程总结

这几周我们做了单片机课程设计,真正的的做到了把所学到的知识应用于实践中。

通过此次课程设计,使我更加扎实的掌握了有关单片机方面的知识,在设计过程中虽然遇到了一些问题,但经过一次又一次的思考,一遍又一遍的检查终于找出了原因所在,也暴露出了前期在这方面的知识欠缺和经验不足。

实践出真知,通过亲自动手制作,使我们掌握的知识不再是纸上谈兵。

过而能改,善莫大焉。

在课程设计过程中,我们不断发现错误,不断改正,不断领悟,不断获取。

最终的检测调试环节,本身就是在践行“过而能改,善莫大焉”的知行观。

这次课程设计终于顺利完成了,在设计中遇到了很多问题,最后在老师的指导下,终于游逆而解。

在今后社会的发展和学习实践过程中,一定要不懈努力,不能遇到问题就想到要退缩,一定要不厌其烦的发现问题所在,然后一一进行解决,只有这样,才能成功的做成想做的事,才能在今后的道路上劈荆斩棘,而不是知难而退,那样永远不可能收获成功,收获喜悦,也永远不可能得到社会及他人对你的认可!

我认为,在这学期的实验及课程设计中,不仅培养了独立思考、动手操作的能力,在各种其它能力上也都有了提高。

更重要的是,在实验课上,我们学会了很多学习的方法。

而这是日后最实用的,真的是受益匪浅。

要面对社会的挑战,只有不断的学习、实践,再学习、再实践。

这对于我们的将来也有很大的帮助。

以后,不管有多苦,我想我们都能变苦为乐,找寻有趣的事情,发现其中珍贵的事情。

这样我们都可以在实验结束之后变的更加成熟,会面对需要面对的事情。

其次,在这次课程设计中,我们运用到了以前所学的专业课知识,如:

CAD制图、汇编语言、模拟和数字电路知识等。

虽然过去从未独立应用过它们,但在学习的过程中带着问题去学我发现效率很高,这是我们做这次课程设计的又一收获。

要做好一个课程设计,就必须做到在设计程序之前,对所用单片机的内部结构有一个系统的了解,知道该单片机内有哪些资源;要有一个清晰的思路和一个完整的的软件流程图;在设计程序时,不能妄想一次就将整个程序设计好,反复修改、不断改进是程序设计的必经之路;要养成注释程序的好习惯,一个程序的完美与否不仅仅是实现功能,而应该让人一看就能明白你的思路,这样也为资料的保存和交流提供了方便;在设计课程过程中遇到问题是很正常德,但我们应该将每次遇到的问题记录下来,并分析清楚,以免下次再碰到同样的问题的课程设计结束了,但是从中学到的知识会让我受益终身。

发现、提出、分析、解决问题和实践能力的提高都会受益于我在以后的学习、工作和生活中。

设计过程,常有一些不如意,但毕竟这是第一次做,难免会遇到各种各样的问题。

在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固。

我们通过查阅大量有关资料,并在小组中互相讨论,交流经验和自学,若遇到实在搞不明白的问题就会及时请教老师,使自己学到了不少知识,也经历了不少艰辛,但收获同样巨大。

通过这次课程设计我也发现了自身存在的不足之处,虽然感觉理论上已经掌握,但在运用到实践的过程中仍有意想不到的困惑,经过一番努力才得以解决。

这也激发了我今后努力学习的兴趣,我想这将对我以后的学习产生积极的影响。

通过这次设计,我懂得了学习的重要性,了解到理论知识与实践相结合的重要意义,学会了坚持、耐心和努力,这将为自己今后的学习和工作做出了最好的榜样。

我觉得作为一名自动化专业的学生,单片机的课程设计是很有意义的。

更重要的是如何把自己平时所学的东西应用到实际中。

虽然我们对于这门课懂的并不多,很多基础的东西都还没有很好的掌握,觉得很难,也没有很有效的办法通过自身去理解,但是靠着这一个多礼拜的“学习”,在小组同学的帮助和讲解下,渐渐对这门课逐渐产生了些许的兴趣,自己开始主动学习并逐步从基础慢慢开始弄懂它。

我认为这个收获应该说是相当大的。

觉得课程设计反映的是一个从理论到实际应用的过程,但是更远一点可以联系到以后毕业之后从学校转到踏上社会的一个过程。

小组人员的配合﹑相处,以及自身的动脑和努力,都是以后工作中需要的

回顾起此课程设计,从理论到实践,在这段日子里,可以说得是苦多于甜,但是可以学到很多很多的东西,同时不仅可以巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。

通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。

在设计的过程中遇到问题,可以说得是困难重重,但可喜的是最终都得到了解决。

整个过程中,也对团队精神的进行了考察,让我们在合作起来更加默契,在成功后一起体会喜悦的心情。

果然是团结就是力量,只有互相之间默契融洽的配合才能换来最终完美的结果。

 

参考文献

(1)胡汉才单片机原理及其接口技术(第二版).北京:

清华大学出版社,2004.2

(2)徐安等单片机原理及应用.北京:

北京希望电子出版社,2003.2

(3)丁元杰单片微机原理及应用(第二版).北京:

机械工业出版社,1999.10

(4)李建忠单片机原理及应用.西安:

西安电子科技大学出版社,2002.2

(5)徐惠民单片微型计算机原理、接口及应用(第二版).北京:

北京邮电大学出版社,2000.10

(6)闫玉德MCS-51单片机原理及应用(C语言版).北京:

机械工业出版社

(7)何桥等单片机原理及应用.北京:

中国铁道出版社,200

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

当前位置:首页 > 小学教育 > 小升初

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

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