资源描述
- -
单片机课程设计
一、设计名称:电梯控制系统设计
二、设计人员:周海峰、柳、吴晶晶、邹敏
三、指导教师:王宪菊
四、设计要求:
楼层:共六层设计名称:电梯控制系统设计
六个按键:用来输入要去的楼层
点阵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位微处理器,俗称单片机。单片机的可擦除只读存储器可以反复擦除100次。该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的89C51是一种高效微控制器,89C2051是它的一种精简版本。89C单片机为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。
构造特点:
8位CPU;
片振荡器和时钟电路;
32根I/O线;
外部存贮器寻址围ROM、RAM64K;
2个16位的定时器/计数器;
5个中断源,两个中断优先级;
全双工串行口;
布尔处理器;
管脚说明:
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口被外部下拉为低电平时,将输出电流,这是由于部上拉的缘故。在FLASH编程和校验时,P1口作为第八位地址接收。
P2口:P2口为一个部上拉电阻的8位双向I/O口,P2口缓冲器可接收,输出4个TTL门电流,当P2口被写“1〞时,其管脚被部上拉电阻拉高,且作为输入。并因此作为输入时,P2口的管脚被外部拉低,将输出电流。这是由于部上拉的缘故。P2口当用于外部程序存储器或16位地址外部数据存储器进展存取时,P2口输出地址的高八位。在给出地址“1〞时,它利用部上拉优势,当对外部八位地址数据存储器进展读写时,P2口输出其特殊功能存放器的容。P2口在FLASH编程和校验时接收高八位地址信号和控制信号。
P3口:P3口管脚是8个带部上拉电阻的双向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 /RD〔外部数据存储器读选通〕
P3口同时为闪烁编程和编程校验接收一些控制信号。
RST:复位输入。当振荡器复位器件时,要保持RST脚两个机器周期的高电平时间。
ALE/PROG:当外部存储器时,地址锁存允许的输出电平用于锁存地址的地位字节。在FLASH编程期间,此引脚用于输入编程脉冲。在平时,ALE端以不变的频率周期输出正脉冲信号,此频率为振荡器频率的1/6。因此它可用作对外部输出的脉冲或用于定时目的。然而要注意的是:每当用作外部数据存储器时,将跳过一个ALE脉冲。如想制止ALE的输出可在SFR8EH地址上置0。此时, ALE只有在执行MOVX,MOVC指令是ALE才起作用。另外,该引脚被略微拉高。如果微处理器在外部执行状态ALE制止,置位无效。
/PSEN:外部程序存储器的选通信号。在由外部程序存储器取指期间,每个机器周期两次/PSEN有效。但在外部数据存储器时,这两次有效的/PSEN信号将不出现。
/EA/VPP:当/EA保持低电平时,那么在此期间外部程序存储器
〔0000H-FFFFH〕,不管是否有部程序存储器。注意加密方式1时,/EA将部锁定为RESET;当/EA端保持高电平时,此间部程序存储器。在FLASH编程期间,此引脚也用于施加12V编程电源〔VPP〕。
XTAL1:反向振荡放大器的输入及部时钟工作电路的输入。
XTAL2:来自反向振荡器的输出
8*8点阵显示:
8X8点阵LED构造如下列图所示
从图中可以看出,8X8点阵共需要64个发光二极管组成,且每个发光二极管是放置在行线和列线的穿插点上,当对应的某一列置1电平,某一行置0电平,那么相应的二极管就亮;因此要实现一根柱形的亮法,如下图,对应的一列为一根竖柱,或者对应的一行为一根横柱,因此实现柱的亮的方法如下所述:
一根竖柱:对应的列置1,而行那么采用扫描的方法来实现。
一根横柱:对应的行置0,而列那么采用扫描的方法来实现。
硬件电路连线
(1). 把“单片机系统〞区域中的P1端口用8芯排芯连接到“点阵模块〞区域中的“DR1-DR8〞端口上;
(2). 把“单片机系统〞区域中的P3端口用8芯排芯连接到“点阵模块〞区域中的“DC1-DC8〞端口上;
开场
六、设计流程图:
初始化,显示第3层
是否按键?
是否大于当前楼层?
点阵1显示楼层;
点阵2显示↑。
点阵1显示楼层;
点阵2显示↓。
Y
七、设计程序:
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
#define n 800 //宏定义电梯暂留时间
sbit k1=P2^0;//键盘位定义
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, // -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,0x18,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,
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楼层号标志位,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;
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
while(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)//检测楼层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)
{
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;
}
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;//重置键盘
}
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)
{
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;
}
}
}
}
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)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,楼层号标志位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<f&&h==0)//检测电梯首次运行方向,向上
h=1;//向上标志位h=1
if(h==1)//检测最高楼层按键重新赋值f
{
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;
}
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;
}
八、设计电路:
九、设计心得:
本次单片机课程设计实验由本组四位成员经过两周努力设计得到。软件的编程要我们不断的调试,最终一个能完成课程设计的劳动成果出来了,很快乐它能按着设计的思想与要求运动起来。
当然,这其中也有很多问题,第一、不够细心,由于对课本理论的不熟悉导致编程出现错误。第二,是在学习态度上,这次课设是对我们的学习态度的一次检验。对于这次单片机综合课程实习,我们的第一大心得体会就是作为一名工程技术人员,要求具备的首要素质绝对应该是严谨。我们这次实习所遇到的多半问题多数都是由于我们不够严谨。第三,在做人上,我们认识到,无论做什么事情,只要你足够坚强,有足够的毅力与决心,有足够的挑战困难的勇气,就没有什么办不到的。
在这次难得的课程设计过程中我们锻炼了自己的思考能力和动手能力。通过设计电路的过程中,加强了我们思考问题的完整性和实际生活联系的可行性。在方案设计选择和芯片的选择上,培养了我们综合应用单片机的能力,对单片机的各个管脚的功能也有了进一步的认识。还锻炼我们个人的查阅技术资料的能力,动手能力,发现问题,解决问题的能力。并且我们熟练掌握了有关器件的性能及测试方法。
再次感教师的辅导以及同学的帮助,是他们让我们有了一个更好的认识,无论是学习还是生活,生活是实在的,要踏实走路。课程设计时间虽然很短,但我们学习了很多的东西,使我们眼界翻开,感受颇深。
- word.zl
展开阅读全文