课程设计自动电梯模拟系统1文档格式.docx
- 文档编号:16939459
- 上传时间:2022-11-27
- 格式:DOCX
- 页数:15
- 大小:244.40KB
课程设计自动电梯模拟系统1文档格式.docx
《课程设计自动电梯模拟系统1文档格式.docx》由会员分享,可在线阅读,更多相关《课程设计自动电梯模拟系统1文档格式.docx(15页珍藏版)》请在冰豆网上搜索。
2.模块设计3
2.1电源设计3
2.1.1电源相关元件的选取3
(1)电容3
(2)稳压芯片3
2.2电梯升降状态指示灯4
3.硬件电路设计5
3.1原理图5
3.2PCB图5
4.软件程序代码6
4.1相关头文件6
4.2主程序代码9
5.设计总结14
6.参考文献15
前言
随着经济的发展,人们对住房的需求量越来越多,很多家庭都不止一套住房。
其中设计到按键中断模块、LCD人机交互显示界面模块、LED流水灯控制模块、PWM步进电机模拟控制模块。
首先,通过按键和LCD1602设置电梯运行环境,比如说总共楼层设置、报警设置等(还可以新增其他功能,即是对系统进行升级)。
然后,电梯开始运动,电梯每隔20秒上(或下)一层楼,每到一层楼,停留20秒。
通过流水灯方向,可以判断电梯的上下情况,通过LCD1602的显示内容,可以得到电梯当前所到的楼层。
本次设计没有使用任何已被别人写好的程序或者电路模块,所有工程文件都是从开始创建到最终定稿的步骤完成的,也许有很多不足之处,但通过不断升级、改进,相信会做到更好的。
1.总体设计方案
1.1硬件设计框图
图1硬件结构框图
硬件结构相对简单,除最小系统外,其他外设包括:
LCD1602显示(负责设置电梯工作环境时人机交互界面和当前楼层的显示)、带方向箭头的LED灯群(一流水灯得形式负责指示电梯升降状态)、电机模拟灯(两个灯分别模拟PWM控制电梯电机的正反转)以及一个简单的按键电路(负责电机的工作环境的初始化设置。
1.2软件设计流程图
图2程序流程图
2.模块设计
2.1电源设计
2.1.1电源相关元件的选取
(1)电容
电路设计中,在电源的设计部分时,都要考虑到电源的稳定性。
在一般与电网相连的情况下,都会有各种各样的干扰信号,为了保证电路能够正常工作,我们需要对电源的输入输出部分进行滤波、整流。
因而会用到旁路、去耦电容。
通过计算,选取104或者105电容,效果较好。
另外,为了使输出端的信号更平滑,可以加上22UF~220UF的电容。
(2)稳压芯片
在很多简单的电源电路,使用5V稳压芯片7805的居多,但这块芯片有很多不足之处,很重要的一个因素就是它的输入端要求比输出端高3V以上的电压才能正常工作。
在实际电路中,要满足8V的电压输入,似乎有些繁琐。
所以本次设计采用了三端可调稳压管LM317作为电源部分的稳压芯片。
可以通过一个10K的变阻器调节输出端的电压,如图3。
图3稳压模块电路图
输出电压可通过公式进行运算。
因为控制在小于100uA时,这一项的误差可以忽略不计。
因此,调节R2与R1的关系就可得到我们在应用中需要的输出电压。
加上滤波电容,就是我们的电源模块,如图4。
图4电源电路图
2.2电梯升降状态指示灯
图5升降状态指示灯群
当电梯向上或者向下运动的时候,都会有对应的带方向的箭头LED灯群像流水灯一样动态显示。
如上图,竖直一列的6个LED灯两旁的箭头灯都是由另外的IO口控制共同控制的。
这个效果在实物工作的时候,就很容易观赏到。
再看每个箭头部分,其限流保护电阻的阻值略有不同,这是因为同样的IO口,驱动的LED的数量却不同,为了尽量是每只LED发光强度一样,所以选择的电阻有所差异。
3.硬件电路设计
3.1电路原理图
图6电路原理图
3.2电路PCB图
图7电路PCB图
4.软件程序代码
4.1头文件程序
软件代码部分自己写的头文件代码只包含一个与LCD1602显示的H文件-“1602C51.h”。
详细代码内容如下:
//使用该1602驱动库文件时,须调用包含文件<
reg51.h>
或<
regx52.h>
#definedataportP0//定义相关端口和引脚
sbitRS=P2^3;
sbitRW=P2^4;
sbitEN=P2^5;
sbitbusy_flag=P0^7;
voiddelay(void)
{
unsignedchari;
for(i=0;
i<
140;
i++);
}
/*voidcheck_busy(void)//查忙信号函数
{
do{
dataport=0xff;
RS=0;
RW=1;
EN=1;
EN=0;
delay();
}while(busy_flag);
}*/
voidcommand(unsignedchardat)//指令操作函数
RS=0;
RW=0;
dataport=dat;
EN=1;
EN=0;
voidinit(void)//LCD1602初始化
{
command(0x38);
command(0x18);
command(0x06);
command(0x0c);
command(0x01);
voiddisplay_addr(unsignedcharx,unsignedchary)//显示字符时须//调用显示地址初始值、设置函数
if(x<
16)
{
if(y==0)x=0x80+x;
elsex=0xc0+x;
command(x);
}
}
voidw_char(unsignedchardat)//显示字符
//check_busy();
RS=1;
voidw_str(unsignedcharx,unsignedchary,unsignedchar*s)//显示字
//符串
display_addr(x,y);
while(*s!
='
\0'
)
w_char(*(s++));
4.2主程序代码
#include"
regx52.h"
1602C51.h"
#defineU8unsignedchar
#defineU16unsignedint
#definefloor_init50//Defaultthenumbersoffloors
#defineLEDS_PORTP1//definedfordescribingelevator'
sstatus
sbitsw_up=P2^7;
//definedfordescribingelevator'
sdirectionandlowleveliseffective
sbitsw_down=P2^6;
sbitLED1=P2^0;
//definedfordescribingmotortostepforward
sbitLED2=P2^1;
//definedfordescribingmotortostepbackward
U8*str="
0123456789"
;
//definestringstrforLCD1602'
sdisplaying
U8key_1;
//recordthevalueofkeys
bitkey_2=0;
U8floors=floor_init;
//maxvalueisfloor_init
U8floors_counter=1;
//maxvalueisfloors
U8LED_flow=0;
//maxvalueis7forthereare7statusLEDS
U8clock_counter=80*floor_init;
//within20secondspastafloorandpausefor20seconds
bitclock_flag=0;
bitmotor_PWM_flag=0;
bitup_down_flag=0;
//‘0’forup,'
1'
fordown
bitmotor_pause=0;
voiddelay_nms(U8i)
U8j;
U16k;
for(j=0;
j<
i;
j++)
for(k=0;
k<
1000;
k++);
voidlcd_disp(void)
switch(key_1)
{
case(0):
{
w_str(0,0,"
currentflooris"
);
display_addr(0,1);
w_char('
~'
w_char(str[floors_counter/10]);
w_char(str[floors_counter%10]);
w_str(4,1,"
key1toset"
break;
}
case
(1):
if(key_2!
=key_2)floors++;
if(floors==(floor_init+1))floors=1;
setfloors'
No."
w_str(0,1,"
floorsNo.is:
"
display_addr(15,1);
w_char(str[floors/10]);
w_char(str[floors%10]);
}
main(void)
IT0=1;
IT1=1;
TMOD=0x01;
TH0=(65536-500)/256;
TL0=(65536-500)%256;
TMOD=0x10;
TH1=(65536-200)/256;
TL1=(65536-200)%256;
ET1=1;
ET0=1;
TR1=1;
EX0=1;
EX1=1;
EA=1;
init();
//LCD1602initialized
key_1=key_2=0;
while
(1)
lcd_disp();
if(motor_pause==1)
{
if(up_down_flag==0)//up
{
sw_down=1;
sw_up=0;
LEDS_PORT=0xff<
<
LED_flow;
LED2=0;
LED1=motor_PWM_flag;
}
else//down
{
sw_up=1;
sw_down=0;
LEDS_PORT=0x3f>
>
(8-LED_flow);
LED1=0;
LED2=motor_PWM_flag;
}
else
LED1=1;
LED2=1;
}
voidt0(void)interrupt1
TF0=0;
clock_flag=~clock_flag;
//5mssignalusedwhenitisnessary
LED_flow++;
if(LED_flow==7)LED_flow=0;
clock_counter++;
if(clock_counter==80*floors)
clock_counter=0;
if((clock_counter%80)/40)//
motor_pause=0;
elsemotor_pause=1;
if(!
(clock_counter%80))floors_counter++;
if(floors_counter==(floors+1))
floors_counter=1;
up_down_flag=~up_down_flag;
}
voidt1(void)interrupt3
TF1=0;
motor_PWM_flag=~motor_PWM_flag;
voidkey1(void)interrupt0
delay_nms(15);
IE0=0;
if(key_1<
1)
key_1++;
elsekey_1=0;
voidkey2(void)interrupt2
IE1=0;
key_2=~key_2;
5.设计总结
本次课程设计的时间并不充裕,因为之前四级考试花费了大量时间,而且各科考试也即将来临,所以用在课程设计上的时间并不多。
因此这次能够顺利完成课程设计归功于×
教授以及实验指导老师×
提供的大量的帮助与指导显得尤为的重要。
在这次课程设计中,我学到了很多以前未能学到的东西,比如说团队精神。
作为组员,我还需要完成自己的任务。
在这次课程设计中,我负责的是为系统设计原理图,编写源程序代码。
如何提高硬件与软件之间的兼容性,如何保证硬件与软件的稳定性,也是我面临的问题。
其次,作为一个组长,我时时刻刻都在为如何调度组员任务已经搜集他们的意见而努力着。
当我们遇到新的问题时,我必须要第一时间搜集起来,然后及时地上网搜索相关答案,或者寻求老师帮助以解决问题。
对于各组员所做的任务,我还需要审核与协助修改,尤其是负责书写报告的同学,他所给出的理论解释、功能描述是否合理,是否清楚,这些问题都需要认真的审核。
最后,再次感谢×
老师和×
教授提供的帮助,感谢各位组员的积极配合和热心参与。
6.参考文献
[1]康华光,张林等.电子技术基础模拟部分[M].高等教育出版社,2003.5.120-135.
[2]阎石,张林等.电子技术基础数字部分[M].高等教育出版社,2004.5.89-95.
[3]李晓林,牛力光等.单片机原理与接口技术[M].电子工业出版社,2006.8.156-162.
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 课程设计 自动 电梯 模拟 系统