基于C51单片机的三层电梯控制Word文件下载.docx
《基于C51单片机的三层电梯控制Word文件下载.docx》由会员分享,可在线阅读,更多相关《基于C51单片机的三层电梯控制Word文件下载.docx(13页珍藏版)》请在冰豆网上搜索。
![基于C51单片机的三层电梯控制Word文件下载.docx](https://file1.bdocx.com/fileroot1/2022-11/21/55893b3b-b03d-46de-ab08-6e0cff857e8a/55893b3b-b03d-46de-ab08-6e0cff857e8a1.gif)
5.1.AT89C51单片机介绍
微型计算机系统的硬件部分通常由五部分组成:
中央处理器CPU
、数据存储器RAM、程序存储器ROM、定时/计数器、I/O接口。
MCS-51单片机内部的总体硬件结构:
1、中央处理单元CPU(8位)
用于数据处理、位操作(位测试、置位、复位)。
2、只读存储器ROM(4KB或8KB)
用于永久性存储应用程序,掩膜ROM、EPROM、EEPROM。
3、随机存取存取器RAM(128B或256B)
用于程序运行中存储工作变量和数据。
4、并行输入/输出口I/O(32线)
4个8位并行I/O口P0、P1、P2、P3口用作系统总线、扩展外存、I/O接口芯片。
5、串行输入/输出口UART(二线)
1个全双工的异步串行口;
用于串行通信。
6、定时/计数器T(16位增量可编程)
2个或三个16位定时器/计数器;
它与CPU之间各自独立工作,当它计数满时向CPU中断。
7、时钟电路fosc
振荡频率fosc在1.2~12Mhz;
分为内部振荡器、外接振荡电路。
8、中断系统
5源中断、2个中断优先级;
,可编程进行控制。
5.2.硬件系统原理框图
#include<
reg51.h>
voidZero();
voidDelay_ms(unsignedintTime);
voidDisplay(unsignedintn,unsignedchara);
voidFlash(unsignedintTime);
voidKBScan();
voiddl_ms();
voidDestination();
voidUp();
voidDown();
unsignedcharcodeTAB[3][8]={{0,0,0,0,0,1,1,0},{0,1,0,1,1,0,1,1},{0,1,0,0,1,1,1,1}};
/*楼层数码管显示矩阵*/
//P2与查询式键盘硬件相连
sbitP2_0=P2^0;
sbitP2_1=P2^1;
sbitP2_2=P2^2;
sbitP2_3=P2^3;
sbitP2_4=P2^4;
sbitP2_5=P2^5;
sbitP2_6=P2^6;
sbitP2_7=P2^7;
//P0与LED灯硬件相连
sbitP0_0=P0^0;
sbitP0_1=P0^1;
sbitP0_2=P0^2;
sbitP0_3=P0^3;
sbitP0_4=P0^4;
sbitP0_5=P0^5;
sbitP0_6=P0^6;
sbitP0_7=P0^7;
sbitP1_0=P1^0;
/*用于产生时钟信号*/
sbitP1_1=P1^1;
/*用于产生串行输入信号(显示or清零)*/
unsignedintlift=1;
/*电梯所在楼层*/
unsignedintstatus=1;
/*电梯上行为1,下行为0*/
unsignedcharrequest[3]={0,0,0};
/*1~3楼有无请求,有请求为1*/
unsignedchardst=1;
/*电梯的目的楼层*/
//清零程序
voidZero()
{
unsignedchark;
P1_1=0;
P1_0=0;
for(k=0;
k<
40;
k++)
{
dl_ms();
P1_0=1;
}
}
//延时程序,以毫秒为单位,用软件计时,输入的参数
voidDelay_ms(unsignedintTime)
unsignedinti=0,j=0;
for(i=0;
i<
Time;
++i)
KBScan();
for(j=0;
j<
125;
++j);
//显示某一楼层
voidDisplay(unsignedintn,unsignedchara)
unsignedcharb[]={0,0,0,0,0,0,0,0};
if(a==1)
b[7]=1;
b[6]=1;
b[5]=0;
b[4]=0;
b[3]=1;
b[2]=1;
b[1]=1;
b[0]=0;
elseif(a==0)
b[7]=0;
b[5]=1;
b[4]=1;
b[2]=0;
Zero();
8;
P1_1=b[k];
P1_1=TAB[n-1][k];
//闪烁显示到达楼层
voidFlash(unsignedintTime)
unsignedchari;
i++)
Delay_ms(1000);
Display(lift,status);
//查询式键盘扫描
voidKBScan()
if(P2!
=0xff)
switch(P2)
case0xfe:
{P0_0=1;
request[0]=1;
break;
}/*电梯内请求1楼*/
case0xfd:
{P0_1=1;
request[1]=1;
}/*电梯内请求2楼*/
case0xfb:
{P0_2=1;
request[2]=1;
}/*电梯内请求3楼*/
case0xf7:
{P0_3=1;
}/*电梯外1楼请求向上*/
case0xef:
{P0_4=1;
}/*电梯外2楼请求向上*/
case0xdf:
{P0_5=1;
}/*电梯外2楼请求向下*/
case0xbf:
{P0_6=1;
}/*电梯内3楼请求向下*/
default:
{break;
}/*错误请求*/
//消抖延时
voiddl_ms()
30;
++i);
//获取目的楼层
voidDestination()
unsignedcharj;
//j循环控制变量
//有键按下
if(status==1)//若电梯向上走则从高楼层到低楼层扫描
{//以此达到判断优先级的目的
for(j=3;
j>
=1;
--j)
if(request[j-1]==1)
dst=j;
//则将目的楼层设为该楼
break;
//并将其对应的request置1,然后跳出
elseif(status==0)//若电梯向下走则从低楼层到高楼层扫描
for(j=1;
=3;
++j)
//电梯向上走
voidUp()
status=1;
//置1表示电梯向上走
for(;
lift<
=dst;
lift++)//电梯到达目的楼层之前往上走
Display(lift,1);
//每到达一楼就显示该楼层数
Destination();
//读取点阵键盘
if(request[lift-1]==1)//若请求到达的楼层在所在楼层和目的楼层之间则停下闪烁显示并将其对应的request清零
Delay_ms(3000);
if(P0_5==1&
&
lift==2);
else
request[lift-1]=0;
switch(lift)
case1:
{P0_0=0;
P0_3=0;
case2:
{P0_1=0;
P0_4=0;
case3:
{P0_2=0;
P0_6=0;
{break;
Flash(3);
Delay_ms(800);
lift--;
//电梯向下走
voidDown()
status=0;
lift>
lift--)//电梯到达目的楼层之前往上走
Display(lift,0);
if(P0_4==1&
P0_5=0;
lift++;
voidmain()
P0=0;
while
(1)//电梯程序的循环
//查询有无楼层请求到达
if(dst>
=lift)//请求的楼层比要到达的楼层高
Up();
//电梯向上走
Down();
//否则电梯向下走
七.软硬件调试
系统调试包括硬件调试和软件调试,而且两者是密不可分的。
我们设计好的硬件电路和软件程序,只有经过联合调试,才能验证其正确性;
软硬件的是否达到设计任务的要求,也只有经过调试,才能发现问题并加以解决、完善,最终实现设计目的。
7.1硬件调试
硬件调试仅这里作比较简单的介绍,不必费太多的心思。
7.2软件调试
软件调试一般包括分块调试和联机调试两个阶段。
程序的分块调试一般在单片机开发装置上进行,可根据所调程序功能块的入口参量初值编制一个特殊的程序段,并连同被调程序功能块一起在开发装置上运行;
也可配合对应硬件电路单独运行某程序功能块,然后检查是否正确,如果执行结果与预想的不一致,可以通过单步运行或设置断点的方法,查出原因并加以改正,直到运行结果正确为止。
这时该程序功能块已调试完毕,可去掉附加程序段。
其它程序功能块可按此法进行调试。
程序联机调试就是将已调试好的各程序功能块按总体结构联成一个完整程序,在所研制的硬件电路上运行。
从而试验程序整体运行的完整性、正确性和与硬件电路的配合情况。
软件调试主要在电脑上进行仿真模拟。
先全部编译文件,观察是否有错误和警告,在确定没有错误和警告的情况下,点击DEBUG。
进去仿真阶段。
本次的实验难度系数其实并不大,关键是要看各部分负责的同学的协助与互动,当然这也与老师的细心教导是分不开的。
除此之外,对系统软件的熟悉和对程序编写的熟练程度也很大意义上起到了加快实验速度,减少差错,减轻工作量的作用。
对于这些过程与步骤的熟悉与了解能很好的帮助我们解决在实际应用当中碰到的诸多问题,比如说在程序当中设计到延时,但是具体延时的时间,我们要从几个方面考虑,最后调试了很多次,试验了很多次的时间参数,最后才找到了一个比较合适的延时参数。
除了认为的设定他的数值以外,我们还要熟悉和掌握芯片的自身功能,也就是它的运算速度。
只要知道了运算速度,那么大致上的时间就可以根据计算认为得到。
还有在关于程序先后运行顺序的设置上也很有讲究。
如果安排不好程序执行的步骤,将会造成电梯门没关便开始上升下降或者LED动态显示暂时熄灭不显示等由于程序执行顺序所导致的问题。
所以,合理的安排步骤,并且配合这块芯片本身的功能,可以发挥出事半功倍的效果。
但是在调试过程中还是出现了一些问题比如延时程序设定时间太短,数组定义错误,引脚对应错误等等
我认为对于我们这些初学者来说,出现这种错误也是在情理之中的,关键的问题是如何解决这些问题,我们通过同组同学的讨论和向外组同学和老师的请教,经过了一次一次的调试,修改,历经整整2天的时间完成了程序,我们组员表示在这次的设计当中学到了很多,下次我们会珍惜这机会的。
八.实验小结
一周的课程设计马上就要结束了,对于这周的课程设计大体也有了不少自己的学习经验和对于这课程设计的心得,我们这小组做的是电梯升降序控制器,以下便是我的对其简单的小结:
1.由于我们小组在之前有了明确的分工所以整体来说我们小组进程还是比较顺利的,在编程序方面在以xx同学为主力在第一天我们将其大致完成了,在电路图方面我们小组由xx利用了Poteus软件制作,虽然在之前我们并没有学过这个软件的使用方法,但经过一天的自我学习,我们最终还是按要求完成了制图。
2.第二天由于程序的基本成型,并在电路板上进行了实践的操作,流程图这一块便有我来制作了,由于我们的程序比较大应用的模块比较多说以,制作流程图还是花了我不少的时间。
3.第三天我们将写好的程序烧进了单片机,并给老师看过之后,老师指导我们修改了部分细节后,我们便开始制作最后的收尾工作,xx同学将最后的图纸完善,xxx,xxx同学进行最后的实验排版,我对流程图按照修改后的程序进行了最后的修正。
4.当然在最终的结果中还是存在些不足,但总的来说,我们这次收获了更多。
在与同学和老师的交流中,我们再次系统的复习了专业知识,对专业知识掌握和运用更加熟练。
此次课程设计,我们收获的不只是将其完成,更多的是再次把知识学习巩固了一遍。
在这次设计的学习中,我们得到了不少启示,相信在以后的学习生活上也会给予我们很多的帮助。
九.心得体会
大三的第二学期末的第一门课程设计马上就要结束了,整体来说这周时间并不十分紧张,我们有了充分的时间去学习课程设计所需要的其他软件的应用,总体来说我们还是收获颇丰,我做的是单片机的流程图,平时一般的流程图都是老师给了参考的流程,而且在制作报告的时候还是手写的,现在这一切都是自己操作,第一天刚开始的时候有点手足无措的感觉,突然发现原来实际与想法还是会有一定的差距的,比如有一次流程图的横向很宽,一页纸完全放不下,但是相对长度却绰绰有余,但将页面横置却花了很长时间。
这次课程设计从选题到定稿,从理论到实践,在接近一个星期的日子里,可以说是苦多于甜,但是学到了很多很多的东西,同时不仅可以巩固以前所学过的知识,而且还学到了很多在书本上所没有学到过的知识。
通过这次课程设计使我懂得了理论与实践相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论。
在设计的过程中遇到问题,可以说是困难重重,这毕竟是第一次做的,难免会遇到各种各样的问题,同时在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固,比如说不懂一些元器件的使用方法,对单片机汇编语言掌握得不好等等。
通过这次课程设计之后,也把之前所学过的知识重新温故了。
总的来说这次的课程设计还算满成功的,收获也很丰富的,因此在最后我要感谢跟我同组的同学,是大家的努力换来的今天的结果,同时也要感谢老师对我们的指导。