MCS51单片机最小系统设计.docx
- 文档编号:29211886
- 上传时间:2023-07-21
- 格式:DOCX
- 页数:12
- 大小:28.42KB
MCS51单片机最小系统设计.docx
《MCS51单片机最小系统设计.docx》由会员分享,可在线阅读,更多相关《MCS51单片机最小系统设计.docx(12页珍藏版)》请在冰豆网上搜索。
MCS51单片机最小系统设计
MCS-51单片机最小系统设计
第一部分课程设计任务书
一、课程设计题目
可调数字电子钟
二、课程设计时间
一周
三、课程设计提交方式
提交打印课程设计报告
四、设计要求
1)自动计时,显示24小时制时间,由6位LED显示器显示时、分、秒。
2)起始时间为:
00:
00:
00。
3)具备校准功能,可以直接由按键设置当前时间。
第二部分课程设计报告
一、单片机发展概况
单片机诞生于1971年,经历了SCM、MCU、SoC三大阶段,早期的SCM单片机都是8位或4位的。
其中最成功的是INTEL的8031,此后在8031上发展出了MCS51系列MCU系统。
基于这一系统的单片机系统直到现在还在广泛使用。
随着工业控制领域要求的提高,开始出现了16位单片机,但因为性价比不理想并未得到很广泛的应用。
90年代后随着消费电子产品大发展,单片机技术得到了巨大提高。
随着INTELi960系列特别是后来的ARM系列的广泛应用,32位单片机迅速取代16位单片机的高端地位,并且进入主流市场。
而传统的8位单片机的性能也得到了飞速提高,处理能力比起80年代提高了数百倍。
高端的32位Soc单片机主频已经超过300MHz,性能直追90年代中期的专用处理器,而普通的型号出厂价格跌落至1美元,最高端的型号也只有10美元。
当代单片机系统已经不再只在裸机环境下开发和使用,大量专用的嵌入式操作系统被广泛应用在全系列的单片机上。
而在作为掌上电脑和手机核心处理的高端单片机甚至可以直接使用专用的Windows和Linux操作系统。
二、MCS-51单片机系统简介
8051单片机包含中央处理器、程序存储器(ROM)、数据存储器(RAM)、定时/计数器、并行接口、串行接口和中断系统等几大单元及数据总线、地址总线和控制总线等三大总线,现在我们分别加以说明:
中央处理器:
中央处理器(CPU)是整个单片机的核心部件,是8位数据宽度的处理器,能处理8位二进制数据或代码,CPU负责控制、指挥和调度整个单元系统协调的工作,完成运算和控制输入输出功能等操作。
数据存储器(RAM)
8051内部有128个8位用户数据存储单元和128个专用寄存器单元,它们是统一编址的,专用寄存器只能用于存放控制指令数据,用户只能访问,而不能用于存放用户数据,所以,用户能使用的RAM只有128个,可存放读写的数据,运算的中间结果或用户定义的字型表。
程序存储器(ROM):
8051共有4096个8位掩膜ROM,用于存放用户程序,原始数据或表格。
定时/计数器(ROM):
8051有两个16位的可编程定时/计数器,以实现定时或计数产生中断用于控制程序转向。
并行输入输出(I/O)口:
8051共有4组8位I/O口(P0、P1、P2或P3),用于对外部数据的传输。
三、设计思想
整个程序先给数码管送初值000000,然后进行初始化工作。
程序由一个主函数,一个定时器中断程序,一个延时子程序,一个调时子程序,一个显示子程序构成。
程序通过按键扫描程序来确定是否调用中断程序来对时间进行调整。
用一子程序完成时分秒的调整,通过循环扫描三个按键的电平变化来判断对应按键是否按下,并带有去抖动功能,当P_4按一次时进行秒调,两次时进行分调整,三次时进行时调整,四次时显示时间。
若分秒增一到达60次或者时增一到达24次,将对其清零;若分秒减一到0时,将其赋值59,若时减一到0时,将其赋值23。
各个操作均实时的通过数码管显示
四、硬件电路设计
五、软件设计
可分为以下几个功能模块:
1)主程序:
初始化与键盘监控。
2)计时:
为定时器中断服务子程序,完成刷新计时缓冲区的功能。
3)时间设置:
由按键设置当前时间。
4)键盘扫描:
判断是否有键按下,并确定键号。
5)显示:
完成8位动态显示。
六、程序源代码
#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;
sbitP3_4=P3^4;//second调整定义
sbitP3_5=P3^5;//minite调整定义
sbitP3_6=P3^6;//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(P3_4==0)
{delay(10);
if(P3_4==0)
{
ET0=0;
TR0=0;
++key_flag;
while(!
P3_4);
}
mstcnt=0;
}
switch(key_flag)
{case1:
{if(P3_5==0)
{delay(200);
second++;
if(second==60)
second=0;
while(!
P3_5);
}
if(P3_6==0)
{delay(200);
second--;
if(second==0)
second=59;
while(!
P3_6);
}
}break;
case2:
{if(P3_5==0)
{delay(200);
minite++;
if(minite==60)
minite=0;
while(!
P3_5);
}
if(P3_6==0)
{delay(200);
minite--;
if(minite==0)
minite=59;
while(!
P3_6);
}
}break;
case3:
{if(P3_5==0)
{delay(200);
hour++;
if(hour==24)
hour=0;
while(!
P3_5);
}
if(P3_6==0)
{delay(200);
hour--;
if(hour==0)
hour=23;
while(!
P3_6);
}
}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秒定时部分和如何把时分秒在数码管中显示出来,同时设计出来的产品还必须具备一些基本的人机交互功能。
从理论到实践,在这段日子里,可以说得是苦多于甜,但是可以学到很多很多的东西,同时不仅可以巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。
通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能提高自己的实际动手能力和独立思考的能力。
实验过程中,也对团队精神的进行了考察,让我们在合作起来更加默契,在成功后一起体会喜悦的心情。
果然是团结就是力量,只有互相之间默契融洽的配合才能换来最终完美的结果。
此次设计也让我明白了思路即出路,有什么不懂不明白的地方要及时请教或上网查询,只要认真钻研,动脑思考,动手实践,就没有弄不懂的知识,收获颇丰。
这次课程设计终于顺利完成了,在课程设计的过程中,可谓各个方面的能力都得到了一定的提高,为我以后的学习打下了良好的基础。
在此我非常感谢我的指导老师——张岩,感谢张老师不辞辛苦的细心辅导,让我对单片机原理这门课程有了更深刻的认识,让我对独立做课程设计有了信心,同时我还要感谢我的队友,感谢他的努力和配合,这次课程设计才能顺利完成。
八、参考文献
[1]郭天祥十天征服单片机和C语言(网上视频)
[2]霖锋霖锋带你征服嵌入式(网上视频)
[3]李想手把手教你学51单片机与Proteus(网上视频)
[4]余永权单片机在控制系统中的应用、北京:
电子工业出版社,2003.10
[5]夏继强单片机实验与实践教程、北京:
航空航天大学出版社,2001.11
[6]李学海标准80C51单片机基础教程、北京:
航空航天大学出版社,2006.8
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- MCS51 单片机 最小 系统 设计