MCS51单片机可调电子钟设计.docx

上传人:b****2 文档编号:3119664 上传时间:2023-05-05 格式:DOCX 页数:13 大小:63.32KB
下载 相关 举报
MCS51单片机可调电子钟设计.docx_第1页
第1页 / 共13页
MCS51单片机可调电子钟设计.docx_第2页
第2页 / 共13页
MCS51单片机可调电子钟设计.docx_第3页
第3页 / 共13页
MCS51单片机可调电子钟设计.docx_第4页
第4页 / 共13页
MCS51单片机可调电子钟设计.docx_第5页
第5页 / 共13页
MCS51单片机可调电子钟设计.docx_第6页
第6页 / 共13页
MCS51单片机可调电子钟设计.docx_第7页
第7页 / 共13页
MCS51单片机可调电子钟设计.docx_第8页
第8页 / 共13页
MCS51单片机可调电子钟设计.docx_第9页
第9页 / 共13页
MCS51单片机可调电子钟设计.docx_第10页
第10页 / 共13页
MCS51单片机可调电子钟设计.docx_第11页
第11页 / 共13页
MCS51单片机可调电子钟设计.docx_第12页
第12页 / 共13页
MCS51单片机可调电子钟设计.docx_第13页
第13页 / 共13页
亲,该文档总共13页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

MCS51单片机可调电子钟设计.docx

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

MCS51单片机可调电子钟设计.docx

MCS51单片机可调电子钟设计

MCS-51单片机可调电子钟设计

目录

第一部分课程设计任务书1

一、课程设计题目1

二、课程设计时间1

三、课程设计提交方式1

四、设计要求1

第二部分课程设计报告2

一、单片机发展简史2

二、MCS-51单片机系统简介2

三、设计思路2

四、硬件设计电路2

五、软件设计流程2

六、程序源代码2

七、结束语2

八、参考文献2

第一部分课程设计任务书

一、课程设计题目

可调数字电子钟

二、课程设计时间

一周

三、课程设计提交方式

提交打印课程设计报告

四、设计要求

1)自动计时,显示24小时制时间,由6位LED显示器显示时、分、秒。

2)起始时间为:

00:

00:

00。

3)具备校准功能,可以直接由按键设置当前时间。

第二部分课程设计报告

一、单片机发展概况

单片机诞生于20世纪70年代末,它的发展史大致可分为三个阶段:

第一阶段(1976-1978):

初级单片机微处理阶段。

该时期的单片机具有8位CPU,并行I/O端口、8位时序同步计数器,寻址范围4KB,但是没有串行口。

第二阶段(1978-1982):

高性能单片机微机处理阶段,该时期的单片机具有I/O串行端口,有多级中断处理系统,15位时序同步技术器,RAM、ROM容量加大,寻址范围可达64KB。

第三阶段(1982-至今)位单片机微处理改良型及16位单片机微处理阶段民用电子产品、计算机系统中的部件控制器、智能仪器仪表、工业测控、网络与通信的职能接口、军工领域、办公自动化、集散控制系统、并行多机处理系统和局域网络系统。

二、MCS-51单片机系统简介

MCS-51系列单片机产品都是以Intel公司最早的典型产品8051为核心构成的。

MCS-51单片机由CPU、RAM、ROM、I/O接口、定时器/计数器、中断系统、内部总线等部件组成。

8051单片机的基本性能有:

◆8位CPU;

◆布尔代数处理器,具有位寻址能力;

◆128B内部RAM,21个专用寄存器;

◆4KB内部掩膜ROM;

◆2个16位可编程二进制加1定时器/计数器;

◆32个(4×8位)双向可独立寻址的I/O口;

◆1个全双工UART(异步串行通信口);

◆5个中断源,两级中断结构;

◆片内振荡器及时钟电路,晶振频率为1.2MHz~12MHz;

◆外部程序/数据存储器寻址空间均为64KB;

◆111条指令,大部分为单字节指令;

◆单一+5V电源供电,双列直插40引脚DIP封装。

MCS-51以其典型的结构和完善的总线专用寄存器的集中管理,众多的逻辑位操作功能及面向控制的丰富的指令系统,堪称为一代“名机”,为以后的其它单片机的发展奠定了基础。

三、设计思路

整个程序先给数码管送初值000000,然后进行初始化工作。

程序由一个主函数,一个定时器中断程序,一个延时子程序,一个调时子程序,一个显示子程序构成。

程序通过按键扫描程序来确定是否调用中断程序来对时间进行调整。

用一子程序完成时分秒的调整,通过循环扫描三个按键的电平变化来判断对应按键是否按下,并带有去抖动功能,当P_4按一次时进行秒调,两次时进行分调整,三次时进行时调整,四次时显示时间。

若分秒增一到达60次或者时增一到达24次,将对其清零;若分秒减一到0时,将其赋值59,若时减一到0时,将其赋值23。

各个操作均实时的通过数码管显示

可分为以下几个功能模块:

1)主程序:

初始化与键盘监控。

2)计时:

为定时器中断服务子程序,完成刷新计时缓冲区的功能。

3)时间设置:

由按键设置当前时间。

4)键盘扫描:

判断是否有键按下,并确定键号。

5)显示:

完成8位动态显示。

四、硬件电路设计

我们组的引脚是设计在P1.0、P1.1、P1.2的地方的

五、软件设计框图

六、程序源代码:

#include

#include

#defineucharunsignedchar

#defineuintunsignedint

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

ucharcodedispcode[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,

0xBF,0x86,0xCB,0xCF,0xEF,0xED,0xFD,0x87,0xFF,0xDF};

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

ucharsecond=0;

ucharminite=0;

ucharhour=0;

ucharmstcnt=0;

sbitP1_0=P1^0;//second调整定义

sbitP1_1=P1^1;//minite调整定义

sbitP1_2=P1^2;//hour调整定义

intkey_flag=0;

/*函数声明*/

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

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

voiddisplay();//显示子程序

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

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

/*延时子程序*/

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

voiddelay(uchark)

{

ucharj;

while((k--)!

=0)

{

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

{;}

}

}

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

/*时间处理子程序*/

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

voidtime_pro(void)

{

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

{second=0;

minite++;

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

{minite=0;

hour++;

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

{hour=0;}

}

}

}

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

/*显示子程序*/

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

voiddisplay(void)

{

P2=0xdf;

P0=dispcode[hour/10];//显示小时的十位

delay

(1);

P2=0xef;

P0=(dispcode[(hour%10)])|0X80;//显示小时的个位

delay

(1);

P2=0xf7;

P0=dispcode[minite/10];//显示分的十位

delay

(1);

P2=0xfb;

P0=(dispcode[minite%10])|0X80;//显示分的个位

delay

(1);

P2=0xfd;

P0=dispcode[second/10];//显示秒的十位

delay

(1);

P2=0xfe;

P0=dispcode[second%10];//显示秒的个位

delay

(1);

}

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

/*键盘扫描子程序*/

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

voidkeyscan(void)

{if(P1_0==0)

{delay(10);

if(P1_0==0)

{

ET0=0;

TR0=0;

++key_flag;

while(!

P1_0);

}

mstcnt=0;

}

switch(key_flag)

{case1:

{if(P1_1==0)

{delay(200);

second++;

if(second==60)

second=0;

while(!

P1_1);

}

if(P1_2==0)

{delay(200);

second--;

if(second==0)

second=59;

while(!

P1_2);

}

}break;

case2:

{if(P1_1==0)

{delay(200);

minite++;

if(minite==60)

minite=0;

while(!

P1_1);

}

if(P1_2==0)

{delay(200);

minite--;

if(minite==0)

minite=59;

while(!

P1_2);

}

}break;

case3:

{if(P1_1==0)

{delay(200);

hour++;

if(hour==24)

hour=0;

while(!

P1_1);

}

if(P1_2==0)

{delay(200);

hour--;

if(hour==0)

hour=23;

while(!

P1_2);

}

}break;

case4:

break;}

if(key_flag==4)

{key_flag=0;

ET0=1;TR0=1;

}

}

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

{

TH0=0x3c;

TMOD=0x11;

mstcnt++;

if(mstcnt==20)

{second++;

mstcnt=0;

}

}

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

/*主函数*/

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

voidmain(void)

{P1=0xff;//初始化p1口,全设为1

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

TH0=0x3c;//预置计数初值

TL0=0xb0;

EA=1;

ET0=1;

TR0=1;

while

(1)

{keyscan();//按键扫描

time_pro();//时间处理

display();//显示时间

}

}

七、结束语

我所选的课程设计题目是数字时钟。

刚拿到这个课题时,不只如何动手去做。

就去上网查询资料和源程序,认真研究了老师所给的程序之后,才有了基本的思路,先将整个系统根据不同的功能化分成模块,再分别进行设计,逐个攻破,最后将其整合即可。

知道最重要的是1秒定时部分和如何把时分秒在数码管中显示出来,同时设计出来的产品还必须具备一些基本的人机交互功能。

通过这次的设计使我认识到本人对单片机方面的知识知道的太少了,对于书本上的很多知识还不能灵活运用,尤其是对程序设计语句的理解和运用,导致编程的程序过于复杂,设计思路混乱。

本次的设计使我从中学到了如何从理论到实践的转化,怎样将我所学到的知识运用到我以后的生活、工作中去。

在大学的课堂只能学到书本上的专业知识,但是我们的实际应用还很欠缺,此次的电子时钟设计给我带来了新的希望,我能够自己独立制图,编写程序,做出最终的成品,这种成就感是非常让人激动的。

同时在查找资料的过程中我也学到了许多新的知识,在和同学协作过程中增进同学间的友谊,使我对团队精神的积极性和重要性有了更加充分的理解。

我知道,今后我的路还是很长,我要学的东西也有很多。

通过这次实习,我深刻的认识到如果专业知识掌握得不够牢固,就不能很好的应用,但我会更加努力的学习这方面的知识,充实自己。

PS:

老师,非常抱歉的是,由于之前拷贝程序的时候,同组的同学拷错了文件夹,交作品的时候,我去参加了驾校考试,所以这次我们组的作品没有能够保存下来,我们只好向有些同学那里拷贝过来了制图和程序上交,但是我们做的和他们的并不完全相同,引脚也不一样,虽然这给老师带来了很大的困扰,但是我们还是感到非常抱歉。

希望老师能够原谅我们,再次感谢老师这段时间的辛苦教导。

八、参考文献

1、张鑫.单片机原理及应用(第2版)[M].电子工业出版社,2010年;

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

当前位置:首页 > 工程科技 > 能源化工

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

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