1、 - 单片机课程设计 一、设计名称:电梯控制系统设计 二、设计人员:周海峰、柳、吴晶晶、邹敏 三、指导教师:王宪菊 四、设计要求: 楼层:共六层设计名称:电梯控制系统设计 六个按键:用来输入要去的楼层
2、 点阵1:显示当前楼层 点阵2:显示“↑〞或“↓〞箭头 例如:当前电梯停在三楼,当按下键1时,点阵1间隔一秒依次显示“2〞,“1〞,点阵2显示箭头↓;当按下键6时,点阵1间隔一秒依次显示“4〞,“5〞,“6〞,点阵2显示箭头↑。 器件:89c51芯片、两个8*8点阵、6个按键 五、器件介绍: 89c51芯片: 89C51是一种带4K字节闪烁可编程可擦除只读存储器〔FPEROM—Falsh Programmable and Erasable Read Only Memory〕的低电压、高性能CMOS8位微处理器,俗称单片机。单片机的可擦除只读存储
3、器可以反复擦除100次。该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的89C51是一种高效微控制器,89C2051是它的一种精简版本。89C单片机为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。 构造特点: 8位CPU; 片振荡器和时钟电路; 32根I/O线; 外部存贮器寻址围ROM、RAM64K; 2个16位的定时器/计数器; 5个中断源,两个中断优先级; 全双工串行口; 布尔处理器;
4、 管脚说明: VCC:供电电压。 GND:接地。 P0口:P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL门电流。当P1口的管脚第一次写1时,被定义为高阻输入。P0能够用于外部程序数据存储器,它可以被定义为数据/ 地址的第八位。在FIASH编程时,P0 口作为原码输入口,当FIASH进展校验时,P0输出原码,此时P0外部必须被拉高。 P1口:P1口是一个部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL门电流。P1口管脚写入1后,被部上拉为高,可用作输入,P1口被外部下拉为低电平时,将输出电流,这是由于部
5、上拉的缘故。在FLASH编程和校验时,P1口作为第八位地址接收。 P2口:P2口为一个部上拉电阻的8位双向I/O口,P2口缓冲器可接收,输出4个TTL门电流,当P2口被写“1〞时,其管脚被部上拉电阻拉高,且作为输入。并因此作为输入时,P2口的管脚被外部拉低,将输出电流。这是由于部上拉的缘故。P2口当用于外部程序存储器或16位地址外部数据存储器进展存取时,P2口输出地址的高八位。在给出地址“1〞时,它利用部上拉优势,当对外部八位地址数据存储器进展读写时,P2口输出其特殊功能存放器的容。P2口在FLASH编程和校验时接收高八位地址信号和控制信号。 P3口:P3口管脚是8个带部上拉电
6、阻的双向I/O口,可接收输出4个TTL门电流。当P3口写入“1〞后,它们被部上拉为高电平,并用作输入。作为输入,由于外部下拉为低电平,P3口将输出电流〔ILL〕这是由于上拉的缘故。 P3口也可作为AT89C51的一些特殊功能口,如下表所示: 口管脚 备选功能 P3.0 RXD〔串行输入口〕 P3.1 TXD〔串行输出口〕 P3.2 /INT0〔外部中断0〕 P3.3 /INT1〔外部中断1〕 P3.4 T0〔记时器0外部输入〕 P3.5 T1〔记时器1外部输入〕 P3.6 /WR〔外部数据存储器写选通〕 P3.7
7、/RD〔外部数据存储器读选通〕 P3口同时为闪烁编程和编程校验接收一些控制信号。 RST:复位输入。当振荡器复位器件时,要保持RST脚两个机器周期的高电平时间。 ALE/PROG:当外部存储器时,地址锁存允许的输出电平用于锁存地址的地位字节。在FLASH编程期间,此引脚用于输入编程脉冲。在平时,ALE端以不变的频率周期输出正脉冲信号,此频率为振荡器频率的1/6。因此它可用作对外部输出的脉冲或用于定时目的。然而要注意的是:每当用作外部数据存储器时,将跳过一个ALE脉冲。如想制止ALE的输出可在SFR8EH地址上置0。此时, ALE只有在执行MOVX,MOVC指令是ALE才
8、起作用。另外,该引脚被略微拉高。如果微处理器在外部执行状态ALE制止,置位无效。 /PSEN:外部程序存储器的选通信号。在由外部程序存储器取指期间,每个机器周期两次/PSEN有效。但在外部数据存储器时,这两次有效的/PSEN信号将不出现。 /EA/VPP:当/EA保持低电平时,那么在此期间外部程序存储器 〔0000H-FFFFH〕,不管是否有部程序存储器。注意加密方式1时,/EA将部锁定为RESET;当/EA端保持高电平时,此间部程序存储器。在FLASH编程期间,此引脚也用于施加12V编程电源〔VPP〕。 XTAL1:反向振荡放大器的输入及部时钟工作电路的输入。 XT
9、AL2:来自反向振荡器的输出 8*8点阵显示: 8X8点阵LED构造如下列图所示 从图中可以看出,8X8点阵共需要64个发光二极管组成,且每个发光二极管是放置在行线和列线的穿插点上,当对应的某一列置1电平,某一行置0电平,那么相应的二极管就亮;因此要实现一根柱形的亮法,如下图,对应的一列为一根竖柱,或者对应的一行为一根横柱,因此实现柱的亮的方法如下所述: 一根竖柱:对应的列置1,而行那么采用扫描的方法来实现。 一根横柱:对应的行置0,而列那么采用扫描的方法来实现。 硬件电路连线 (1). 把“单片机系统〞区域中的P1端口用8芯排芯连接到“点阵模
10、块〞区域中的“DR1-DR8〞端口上;
(2). 把“单片机系统〞区域中的P3端口用8芯排芯连接到“点阵模块〞区域中的“DC1-DC8〞端口上;
开场
六、设计流程图:
初始化,显示第3层
是否按键?
是否大于当前楼层?
点阵1显示楼层;
点阵2显示↑。
点阵1显示楼层;
点阵2显示↓。
Y
七、设计程序:
#include
11、 sbit k2=P2^1; sbit k3=P2^2; sbit k4=P2^3; sbit k5=P2^4; sbit k6=P2^5; uchar code tab[]={ 0x00,0x10,0x30,0x10,0x10,0x10,0x10,0x38, // -1- 0x00,0x38,0x44,0x04,0x08,0x10,0x20,0x7C, // -2- 0x00,0x38,0x44,0x04,0x38,0x04,0x44,0x38, // -3- 0x00,0x08,0x18,0x28,0x48,0x7C,0x08,0x08, /
12、/ -4- 0x00,0x7C,0x40,0x40,0x38,0x04,0x44,0x38, // -5- 0x00,0x38,0x44,0x40,0x78,0x44,0x44,0x38 // -6- }; uchar code tab1[]={0x00,0x18,0x18,0x18,0x99,0x5A,0x3C,0x18, 0x00,0x18,0x18,0x18,0x99,0x5A,0x3C,0x18, 0x00,0x18,0x18,0x1
13、8,0x99,0x5A,0x3C,0x18, 0x00,0x18,0x18,0x18,0x99,0x5A,0x3C,0x18, 0x00,0x18,0x18,0x18,0x99,0x5A,0x3C,0x18, 0x00,0x18,0x18,0x18,0x99,0x5A,0x3C,0x18 }; uchar code tab2[]={0x00,0x18,0x3C,0x5A,0x99,0x18,0x18,0x18, 0x00,0x18,0x3C,0x5A,0x99,0x18,0x18,0x18
14、 0x00,0x18,0x3C,0x5A,0x99,0x18,0x18,0x18, 0x00,0x18,0x3C,0x5A,0x99,0x18,0x18,0x18, 0x00,0x18,0x3C,0x5A,0x99,0x18,0x18,0x18, 0x00,0x18,0x3C,0x5A,0x99,0x18,0x18,0x18 };//下 uchar flag=16,aa;//flag滚屏位 uchar a,b,c,d,e,f,g,h;//a,b,c,d,e,g楼层按键标志位,f楼层号标志
15、位,h电梯方向标志位; void jianpan();//键盘检测函数 void init()//定时器0 初始化 { f=flag;//让电梯停在当前3楼 TMOD=0x01; TH0=0x3c; TL0=0xb0; EA=1; ET0=1; TR0=1;//定时器T0开关位 } void delay(uint time)//延时us { while(time) time--; } void delay1(uint z)//延时ms,且显示点阵且检测键盘;用于让电梯在某楼暂留等待人们出去 { uint j,i;
16、for(j=z;j>0;j--) { for(i=110;i>0;i--); jianpan(); for(i=0;i<8;i++) { P3=i; {if(h==1||h==0) P0=tab2[i+flag]; if(h==2) P0=tab1[i+flag]; P1=tab[i+flag]; delay(20); } } } } void main() { uchar i; init();//初始化T0 whi
17、le(1) { for(i=0;i<8;i++)//显示点阵 { P3=i;//行扫描 { if(h==1||h==0)//检测电梯方向,上 P0=tab2[i+flag];//向上滚箭头 if(h==2)//检测电梯方向,下 P0=tab1[i+flag];//向下滚箭头 P1=tab[i+flag];//滚数字 delay(20);//延时us } } if(h==2)//检测电梯向下 { if(a==1&&flag==0)//检测
18、楼层2键盘按下,是否到达楼1 { TR0=0;//关闭定时器 delay1(n);//延时让电梯暂留 TR0=1; //翻开T0 a=0;//重置键盘 } if(b==1&&flag==8)//检测楼层2键盘按下,是否到达楼1 { TR0=0;//关闭定时器 delay1(n);//延时让电梯暂留 TR0=1; //翻开T0 b=0;//重置键盘 } if(c==1&&flag==16)
19、 { TR0=0; delay1(n); TR0=1; c=0; } if(d==1&&flag==24) { TR0=0; delay1(n); TR0=1; d=0; } if(e==1&&flag==32) { TR0=0; delay1(n); TR0=1; e=0;
20、 } if(g==1&&flag==40) { TR0=0; delay1(n); TR0=1; g=0; } } if(h==1)//检测电梯向上 { if(a==1&&flag==0)//检测楼层1键盘按下,是否到达楼1 { TR0=0;//关闭定时器 delay1(n);//延时让电梯暂留; TR0=1;//翻开T0 a=0;//重置键盘 }
21、 if(b==1&&flag==8)//检测楼层1键盘按下,是否到达楼1 { TR0=0;//关闭定时器 delay1(n);//延时让电梯暂留; TR0=1;//翻开T0 b=0;//重置键盘 } if(c==1&&flag==16) { TR0=0; delay1(n); TR0=1; c=0; } if(d==1&&flag==24) {
22、 TR0=0; delay1(n); TR0=1; d=0; } if(e==1&&flag==32) { TR0=0; delay1(n); TR0=1; e=0; } if(g==1&&flag==40) { TR0=0; delay1(n); TR0=1; g=0; } } } }
23、 void time0() interrupt 1 { TH0=0x3c; TL0=0xb0; jianpan();//键盘检测 aa++; if(aa==6) { aa=0; if(h==1)//检测电梯向上 flag++;//向上滚屏 if(h==2)//检测电梯向下 flag--;//向下滚屏 if(flag==f&&h==1)//到达最高 { h=0;//重置电梯方向位h if(g==1)f=40;//检测低楼层键 if(e==1)f=32; if(d==1)f=24; if(c==1
24、)f=16; if(b==1)f=8; if(a==1)f=0; } if(flag==f&&h==2)//到达最低楼层 { h=0;//重置电梯方向位h if(a==1)f=0;//检测高楼层键 if(b==1)f=8; if(c==1)f=16; if(d==1)f=24; if(e==1)f=32; if(g==1)f=40; } } } void jianpan() { if(k1==0)//检测楼层1键盘 {a=1;f=0;}//赋楼层1键盘标志位a=1,楼层号标志位
25、f=0
if(k2==0)//检测楼层2键盘
{b=1;f=8;}//赋楼层2键盘标志位b=1,楼层号标志位f=16
if(k3==0) //检测楼层3键盘
{c=1;f=16;}//赋楼层3键盘标志位c=1,楼层号标志位f=24
if(k4==0)
{d=1;f=24;}
if(k5==0)
{e=1;f=32;}
if(k6==0)
{g=1;f=40;}
if(flag 26、1)f=8;
if(c==1)f=16;
if(d==1)f=24;
if(e==1)f=32;
if(g==1)f=40;
}
if(flag>f&&h==0)//检测电梯首次运行方向,向下
h=2;//向下标志位h=2
if(h==2)//检测最低楼层按键重新赋值f
{
if(e==1)f=32;
if(d==1)f=24;
if(c==1)f=16;
if(b==1)f=8;
if(a==1)f=0;
}
八、设计电路:
九、设计心得:
本次单片机课程设计实验由 27、本组四位成员经过两周努力设计得到。软件的编程要我们不断的调试,最终一个能完成课程设计的劳动成果出来了,很快乐它能按着设计的思想与要求运动起来。
当然,这其中也有很多问题,第一、不够细心,由于对课本理论的不熟悉导致编程出现错误。第二,是在学习态度上,这次课设是对我们的学习态度的一次检验。对于这次单片机综合课程实习,我们的第一大心得体会就是作为一名工程技术人员,要求具备的首要素质绝对应该是严谨。我们这次实习所遇到的多半问题多数都是由于我们不够严谨。第三,在做人上,我们认识到,无论做什么事情,只要你足够坚强,有足够的毅力与决心,有足够的挑战困难的勇气,就没有什么办不到的。
在这次难得的课程设计过 28、程中我们锻炼了自己的思考能力和动手能力。通过设计电路的过程中,加强了我们思考问题的完整性和实际生活联系的可行性。在方案设计选择和芯片的选择上,培养了我们综合应用单片机的能力,对单片机的各个管脚的功能也有了进一步的认识。还锻炼我们个人的查阅技术资料的能力,动手能力,发现问题,解决问题的能力。并且我们熟练掌握了有关器件的性能及测试方法。
再次感教师的辅导以及同学的帮助,是他们让我们有了一个更好的认识,无论是学习还是生活,生活是实在的,要踏实走路。课程设计时间虽然很短,但我们学习了很多的东西,使我们眼界翻开,感受颇深。
- word.zl






