设计原理及单元模块
3.1设计原理及方法根据层次化设计理论,该设计问题自顶向下 可分为单片机最小系统模块、显示模块、开关控制模块、电机驱动模块、报警模块,其系统框图如图所示。
图3.1 电梯控制系统框图 本次设计是采用开关控制实现上下到指定楼层,通过电机转动带动电梯箱上下运动,到达指定楼层。显示模块是显示此时的楼层,报警模块具有错误操作报警以及楼层到达的提示功能。 3.2单元模块设计
3.2.1单片机最小系统模块图3.2.1单片机最小系统 单片机最小系统包括主芯片,复位电路和晶振脉冲产生电路。X1为12MHz晶振,与30Pf电容并联,产生1us的脉冲信号作为单片机的“心脏”部分。复位电路是开关与10uf电容并联组成的上电自动复位电路,在RST端为高电平时单片机清零,也即开关按下会产生清零信号。RP1为排阻,作为P0端的上拉电阻,接此原因是P0端口是由OC门组成。U1为数据输入端口,通过电脑编程能将程序通过此接口烧录入单片机中。
3.2.2 开关控制模块图3.2.2 开关控制模块 开关控制模块采用4*4矩阵形式电路可以减少单片机接口的使用。写键盘代码时运用的是逐行扫描判断键值按下与否。编程如下: uchar key_scan(void) { uchar scode,recode; P1=0xf0; if((P1&0xf0)!=0xf0) { delay1(2); if((P1&0xf0)!=0xf0)//有键按下 { scode=0xfe;//辅助变量,设定行 while((scode&0x10)!=0) { P1=scode;//将某一行设为0,从而判断是否为该行 if((P1&0xf0)!=0xf0) { recode=P1&0xf0;//列码 scode=scode&0xf0;//行码 return(scode+recode);//按键坐标} else scode=(scode<<1)|0x01;//下一行判断 }}} return 0;} 3.2.3电机驱动模块图3.2.3电机驱动模块 电机驱动采用L297环形计数分配器和L298大功率步进电机驱动器完成。本次设计采用步进电机,目的是方便智能控制,可实现调速功能。电机使用的是二相步进电机,由于仅用来实验,所以电机采用5V电源供电即可,实际中必须使用大电压来供电方能带动重物(人等)。 环形分配器L297引脚图如图3.2.3-1: 图3.2.3-1 L97引脚图 L297功能介绍: SYNC为斩波器输出端,多个L297一起用时用此端口连接在一起共用一组时钟振荡; HPME端为集电极开路输出端; A~D为四相输入端; INIH1,INIH2为控制A~D相驱动,此引脚为低电平时A~D相禁止输入; ENABLE端为使能输入端,低电平阻止电机驱动; RESET为复位端; HALF/FULL为半角全角控制端,高电平时选择半步输入; CLOCK为时钟输入端,控制电机速度; CW/CCW为方向控制端; OSC为斩波器频率输入端; SEN1和SEN2为电流检测端。 大功率步进电机驱动器L298引脚图如图3.2.3-2: 图3.2.3-2 L298引脚图 L298功能介绍: SENA和SENB为电流检测端; IN1~IN4为A~D相输入控制端; ENA和ENB为使能输入端,低电平禁止输入; OUT1~OUT4为输出端。 3.2.4显示模块图3.2.4显示模块 由于点阵和双位数码管耗电流较大,不能直接连接单片机IO口驱动其正常工作,所以加上锁存器74HC573和显示译码器CD4511驱动。其中利用CD4511模块的另一作用是节省接口,因为本次设计外围电路较多,单片机接口不够,使用此驱动是必要的。 锁存器74HC573引脚图如图3.2.4-1: 图3.2.4-1 74HC573引脚图 74HC573功能介绍: D0~D7为输入端; Q0~Q7为输出端; OEN为输出使能端,当其输入为高电平时输出关断,输入为低电平时输出正常; DEN为输出输入使能端,当此端口为高电平时,输出跟随D0~D7,当此端口为低电平时,输出保持上一时刻的状态; 显示译码器CD4511引脚图如图3.2.4-2: 图3.2.4-2 CD4511引脚图 CD4511功能介绍: A~D为输入端; QA~QG为输出端; LT为试灯输入端,当此端口为低电平时,无论其他的状态如何,始终输出数字8,作为判断数码管的好坏端口使用; LE/STB为灭灯输入端,当此端口输入低电平时数码管灭,输入高电平时数码管正常显示; BI为动态消零信号输入端,当此端口输入低电平时且LT为高电平时,当输入0000时,输出0熄; 点阵的使用介绍: 点阵是8*8位的,相当于由64个LED组成,8个阳极控制端口,8个阴极控制端口; 数码管的使用介绍: 数码管是采用两位共阴极数码管,通过对a~g的编码来显示数字。 3.2.5报警模块图3.2.5报警模块 本设计采用8550三极管驱动蜂鸣器。当PO口送高电平时,三极管处于截止状态,三极管Vce电压约为VCC,蜂鸣器只有很少电流流过,没法驱动其发声。当PO口送低电平时,三极管处于饱和导通状态,三极管Vce约为0.3V,蜂鸣器有较大电流流过,能驱动其报警发声。 3.2.6电路总图图3.2.6 电路总图 由于protel99se内部元件不齐全,本次设计全部采用手工绘制元件库以达到训练的最佳效果。
4软件模块
图4 程序流程图 注:详细程序见附录二 5 PCB印刷版图模块
5.1 protel99se功能介绍Protel99SE是应用于Windows9X/2000/NT操作系统下的EDA设计软件,采用设计库管理模式,可以进行联网设计,具有很强的数据交换能力和开放性及3D模拟功能,是一个32位的设计软件,可以完成电路原理图设计,印制电路板设计和可编程逻辑器件设计等工作,可以设计32个信号层,16个电源--地层和16个机加工层。 5.2 PCB版图图5.2.1非镀铜版图 在生成PCB之前,要进行元件的封装。由于protel99se内部封装不齐全,本次设计全部采用手工绘制封装库以达到最佳训练效果。PCB布线规则是尽量使正面走线和反面走线成90度角,以达到最小干扰。 图5.2.2镀铜顶层图样 图5.2.3 镀铜底层图样 图5.3.4 3D版图正面 图5.3.5 3D版图背面
附录一元件清单 单片机源程序如下:
- #include"reg52.h"
- #define uchar unsigned char
- #define uint unsigned int
- uchar DZ1[]={0x08,0x14,0x2a,0x08,0x08,0x08};
- uchar DZ2[]={0xbf,0xdf,0xef,0xf7,0xfd,0xfb};
- uchar DZ3[]={0x08,0x08,0x08,0x2a,0x14,0x08};
- uchar shuma[]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09};
- uchar LC[]={0xee,0xde,0xbe,0x7e,0xed,0xdd,0xbd,0x7d,0xeb,0xedb,0xbb,0x7b,0xe7,0xd7,0xb7,0x77};//楼层编码
- uchar key,dir,floor,zancun,s,x,p2;
- sbit DA=P0^0;
- sbit DB=P0^1;
- sbit DC=P0^2;
- sbit DD=P0^3;
- sbit w1=P0^4;//数码管位选1
- sbit w2=P0^5;//数码管位选2
- sbit wa=P0^6;//点阵阳极使能
- sbit wb=P0^7;//点阵阴极使能
- sbit EN=P3^0;//电机使能
- sbit CW=P3^1;//方向控制
- sbit CLOCK=P3^2;//速度控制
- sbit red=P3^3;//上键显示
- sbit green=P3^4;//下键显示
- sbit beep=P3^5;//报警
- void delay1(uchar z)
- {
- uchar i,j;
- for(i=z;i>0;i--)
- for(j=110;j>0;j--);
- }
- void delay2(uchar z)
- {
- uchar i,j;
- for(i=z;i>0;i--)
- {
- if(key==0)//减短代码运行时间,使用更多时间扫描键盘
- break;
- else
- for(j=110;j>0;j--);
- }
-
- }
- uchar key_scan(void)
- {
- uchar scode,recode;
- P1=0xf0;
- if((P1&0xf0)!=0xf0)
- {
- delay1(2);
- if((P1&0xf0)!=0xf0)//有键按下
- {
- scode=0xfe;//辅助变量,设定行
- while((scode&0x10)!=0)
- {
- P1=scode;//将某一行设为0,从而判断是否为该行
- if((P1&0xf0)!=0xf0)
- {
- recode=P1&0xf0;//列码
- scode=scode&0x0f;//行码
- return(scode+recode);//按键坐标
- }
- else
- scode=(scode<<1)|0x01;//下一行判断
- }
- }
- }
- return 0;
- }
- void display1(void)//上箭头显示
- {
- uchar i,j;
- for(i=0;i<1;i++)
- {
- wa=1;
- P2=DZ1[i];
- for(j=500;j>0;j--);
- wa=0;
- wb=1;
- P2=DZ2[i];
- for(j=500;j>0;j--);
- wb=0;
- }
- }
- void display2(void)//下箭头显示
- {
- uchar i,j;
- for(i=0;i<1;i++)
- {
- wa=1;
- P2=DZ3[i];
- for(j=500;j>0;j--);
- wa=0;
- wb=1;
- P2=DZ2[i];
- for(j=500;j>0;j--);
- wb=0;
- }
- }
- void shuxian(uchar z)//数码管显示
- {
- uchar temp;
- w1=0;
- p0=shuma[z/10];
- temp=P0;
- P0=p0|temp;
- w1=1;
- w2=0;
- p0=shuma[z%10];
- temp=P0;
- P0=p0|temp;
- w2=1;
- }
- void init(void)//初始化
- {
- dir=0;
- w1=1;
- w2=1;
- wa=0;
- wb=0;
- floor=0;
- zancun=1;
- beep=1;
- EN=0;
- EA=1;
- ET1=1;//T1中断允许
- TMOD=0x10;//T1的8位计数
- TH1=(65536-50000)/256;
- TL1=(65536-50000)%256;
- }
- void main(void)
- {
- init();
- while(1)
- {
- key=key_scan();
- if(key!=0)
- {
- delay2(10);
- if(key!=0)
- {
- TR1=1;
- switch(key)
- {
- case LC[14]:
- dir=1;//按键储存上键值
- break;
- case LC[15]:
- dir=2;//按键储存下键值
- break;
- default break;
- }
- if(dir==1)
- {
- shuxian(s);
- display1();
- if((zancun-floor)>=0)
- {
- switch(key)
- {
- case LC[0]:
- floor=1;
- break;
- case LC[1]:
- floor=2;
- break;
- case LC[2]:
- floor=3;
- break;
- case LC[3]:
- floor=4;
- break;
- case LC[4]:
- floor=5;
- break;
- case LC[5]:
- floor=6;
- break;
- case LC[6]:
- floor=7;
- break;
- case LC[7]:
- floor=8;
- break;
- case LC[8]:
- floor=9;
- break;
- case LC[9]:
- floor=10;
- break;
- case LC[10]:
- floor=11;
- break;
- case LC[11]:
- floor=12;
- break;
- case LC[12]:
- floor=13;
- break;
- case LC[13]:
- floor=14;
- break;
- }
- }
- else //不符逻辑报警停止电机转动
- beep=0;
- EN=0;
- TR1=0;
- }
- if(dir==0)
- {
- shuxian(x);
- display2();
- if((zancun-floor)<=0)
- {
- switch(key)
- {
- case LC[0]:
- floor=1;
- break;
- case LC[1]:
- floor=2;
- break;
- case LC[2]:
- floor=3;
- break;
- case LC[3]:
- floor=4;
- break;
- case LC[4]:
- floor=5;
- break;
- case LC[5]:
- floor=6;
- break;
- case LC[6]:
- floor=7;
- break;
- case LC[7]:
- floor=8;
- break;
- case LC[8]:
- floor=9;
- break;
- case LC[9]:
- floor=10;
- break;
- case LC[10]:
- floor=11;
- break;
- case LC[11]:
- floor=12;
- break;
- case LC[12]:
- floor=13;
- break;
- case LC[13]:
- floor=14;
- break;
- }
- }
- else //不符逻辑报警停止电机转动
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
以上的Word格式文档51黑下载地址:
基于单片机电梯控制系统设计.doc
(1.38 MB, 下载次数: 55)
|