MCS51单片机可调电子钟设计.docx
《MCS51单片机可调电子钟设计.docx》由会员分享,可在线阅读,更多相关《MCS51单片机可调电子钟设计.docx(13页珍藏版)》请在冰豆网上搜索。
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年;