资源描述
单片机原理与应用技术
课程设计报告
基于C51单片机控制的电梯自动控制系统
专业班级: _____计算机xx_____
姓 名: ___xxx__
时 间: ______2012年6月 __
指导教师: ______xxx _____
一、设计要求
1.基本功能:
(1)显示:本设计要求实现5层控制,实时显示电梯所在楼层位置。
(2)升降控制:采用一台步进电机的正反转来实现电梯的升降。
(3)具备不可逆响应的功能:
电梯上升途中只响应上升呼叫,下降途中只响应下降呼叫,任何反方向呼叫均无效。
2.设计内容:
(1)基于功能进行初步设计;
(2)编写代码,实现功能;
(3)完成课程设计报告。
二、电梯控制系统原理
1.系统总体实现原理:
本电梯模拟系统是基于C51单片机、4*4矩阵式键盘、步进电机和LED数码管来实现的。通过4*4矩阵式键盘输入控制信息,C51单片机程序处理后来直接控制步进电机转动、LED数码管显示。
电梯运行基本过程是:电梯默认初始停在一楼,LED数码管显示1,当按键按下1~5中的数时,通过程序进行判断是否升降(即步进电机正转反转)、升降几层(转几圈)。与此同时,LED数码管显示当前所在楼层(1~5)。电梯在升降过程中,按其他键无效,即只有在电梯停下后,才可以进行下一轮的升降。另外,站在电梯外边的人可以通过按上下键(一层只有上键,五层只有下键)来控制电梯到人所在楼层,例如,你站在3层,你按了上键,电梯不论在1~5层的哪一层都会先升降到3层,然后你进电梯,向前面所说的进行控制电梯升降。
图1 设计电路总框图
图2 单片机最小系统电路
2.各组成部分原理:
(1)信号输入电路
现以呼叫信号的输入为例,来说明信号输入及单片机识别原理。如图3所示,采用P0口外接上拉电阻的并行输入形式,来输入外呼叫信号,本电路采用4×4矩阵键盘,列扫描法识别键值的原理,具体原理如下:
a) 判断键盘中有无键按下:将全部行线P0.0-P0.3置低电平,列线P0.4-P0.7置高电平,然后检测列线的状态。只要有一列的电平为低,则表示键盘中有键被按下,而且闭合的键位于低电平线与4根行线相交叉的4个按键之中。若所有列线均为高电平,则键盘中无键按下。
b) 判断闭合键所在的位置:在确认有键按下后,即可进入确定具体闭合键的过程。其方法是:依次将列线置0,此时再将行线依次置1,看行线是否被拉为低电平。若该行被拉为低电平,则该列线与置为高电平的行线交叉处的按键就是闭合的按键。
SOO-S05为一到六楼的电梯内部呼叫请求按键,S08-S15为电梯外部请求按键。
图3 内外请求呼叫电路
(2)信号模拟输出电路
在实际中,厢外五个显示和厢内一个共六个数码管显示厢体位置楼层数,由于显示的数据是一致的,所以本设计中只用一个LED数码管显示代替。由于C51的串行口RXD和TXD为一个全双工串行通信口,工作在方式0下可作同步移位寄存器,其数据由RXD(P3.0)串行输出或输入,而同步移位时钟由TXD(P3.1)端串行输出。具体电路如下图5所示:
图4 数码显示楼层电路
三、系统软件设计
图5 软件流程图
全部代码:
org 0000h
ajmp main0
org 0030h
;初始化电梯为第一层,r3记录当前所在楼层
main0:mov r3,#01h
acall judge
main:
mov p1,#11110000B;矩阵键盘所有列置1
comp:;实时查询按键
mov r1,p1
CJNE r1,#0f0h,tab1
ajmp comp
tab1:第一列
cjne r1,#0e0h,tab2
c11:;s00键
mov p1,#11100001b;第一行置1
mov r2,p1;若第一行仍为0,则按键为第一行第一列即s00键
cjne r2,#11100000b,c12
acall l11
ajmp main
c12:;s04键
mov p1,#11100010b;第二行置1
mov r2,p1
cjne r2,#11100000b,c13;若第二行仍为0,则按键为第二行第一列即s04键
acall l12
ajmp main
c13:;s08键
mov p1,#11100100b;第三行置1
mov r2,p1
cjne r2,#11100000b,c14;若第三行仍为0,则按键为第三行第一列即s08键
acall l13
ajmp main
c14:;s12键
mov p1,#11101000b;第四行置1
mov r2,p1
cjne r2,#11100000b,main;若第四行仍为0,则按键为第四行第一列即s12键
acall l14
ajmp main
tab2:;第二列
cjne r1,#0d0h,tab3
c21:;s01键
mov p1,#11010001b
mov r2,p1
cjne r2,#11010000b,c22
acall l21
ajmp main
c22: ;s05键
mov p1,#11010010b
mov r2,p1
cjne r2,#11010000b,c23
acall l22
ajmp main
c23: ;s09键
mov p1,#11010100b
mov r2,p1
cjne r2,#11010000b,c24
acall l23
ajmp main
c24: ;s13键
mov p1,#11011000b
mov r2,p1
cjne r2,#11010000b,main
acall l24
ajmp main
tab3:;第三列
cjne r1,#0b0h,tab4
c31: ;s02键
mov p1,#10110001b
mov r2,p1
cjne r2,#10110000b,c32
acall l31
ajmp main
c32: ;s06键
mov p1,#10110010b
mov r2,p1
cjne r2,#10110000b,c33
acall l32
ajmp main
c33: ;s10键
mov p1,#10110100b
mov r2,p1
cjne r2,#10110000b,c34
acall l33
ajmp main
c34: ;s14键
mov p1,#10111000b
mov r2,p1
cjne r2,#10110000b,retc34
acall l34
retc34:ajmp main
tab4:;第四列
c41: ;s03键
mov p1,#01110001b
mov r2,p1
cjne r2,#01110000b,c42
acall l41
ajmp main
c42: ;s07键
mov p1,#01110010b
mov r2,p1
cjne r2,#01110000b,c43
acall l42
ajmp main
c43: ;s11键
mov p1,#01110100b
mov r2,p1
cjne r2,#01110000b,c44
acall l43
ajmp main
c44: ;s15键
mov p1,#01111000b
mov r2,p1
cjne r2,#01110000b,retc44
acall l44
retc44:ajmp main
l11: ;按键s00时的处理
clr c;清进位位
mov a,#01h
subb a,r3;按键与当前楼层做差
jnc lx1;进位位为0,跳到正转
acall fz;进位位为1,说明有借位,调用反转
ajmp ret1;反转完调用延迟
lx1:acall zz;调用正转
ret1:
acall delay;调用延时
ret;返回
l21: ;按键s01时的处理
clr c
mov a,#02h
subb a,r3
jnc lx2
acall fz
ajmp ret2
lx2:acall zz
ret2:
acall delay
ret
l31: ;按键s02时的处理
clr c
mov a,#03h
subb a,r3
jnc lx3
acall fz
ajmp ret3
lx3:acall zz
ret3:
acall delay
ret
l41: ;按键s03时的处理
clr c
mov a,#04h
subb a,r3
jnc lx4
acall fz
ajmp ret4
lx4:acall zz
ret4:
acall delay
ret
l12: ;按键s04时的处理
clr c
mov a,#05h
subb a,r3
jnc lx5
acall fz
ajmp ret5
lx5:acall zz
ret5:
acall delay
ret
l22: ;按键s05时的处理
acall delay
ret
l32: ;按键s06时的处理
acall delay
ret
l42: ;按键s07时的处理
acall delay
ret
l13: ;按键s08时的处理
clr c
mov a,#02h
subb a,r3
jnc lx9
acall fz
ajmp ret9
lx9:acall zz
ret9:
acall delay
ret
l23: ;按键s09时的处理
clr c
mov a,#03h
subb a,r3
jnc lx10
acall fz
ajmp ret10
lx10:acall zz
ret10:
acall delay
ret
l33: ;按键s10时的处理
clr c
mov a,#04h
subb a,r3
jnc lx11
acall fz
ajmp ret11
lx11:acall zz
ret11:
acall delay
ret
l43: ;按键s11时的处理
clr c
mov a,#01h
subb a,r3
jnc lx12
acall fz
ajmp ret12
lx12:acall zz
ret12:
acall delay
ret
l14: ;按键s12时的处理
clr c
mov a,#02h
subb a,r3
jnc lx13
acall fz
ajmp ret13
lx13:acall zz
ret13:
acall delay
ret
l24: ;按键s13时的处理
clr c
mov a,#03h
subb a,r3
jnc lx14
acall fz
ajmp ret14
lx14:acall zz
ret14:
acall delay
ret
l34: ;按键s14时的处理
clr c
mov a,#04h
subb a,r3
jnc lx15
acall fz
ajmp ret15
lx15:acall zz
ret15:
acall delay
ret
l44: ;按键s15时的处理
clr c
mov a,#05h
subb a,r3
jnc lx16
acall fz
ajmp ret16
lx16:acall zz
ret16:
acall delay
ret
zz:
jz z2;a-r2的差值如果为0则直接返回,不转
z0:mov r0,#0ch;一圈
z1:
clr p3.2
setb p3.3
setb p3.4
setb p3.5
acall delay
setb p3.2
clr p3.3
setb p3.4
setb p3.5
acall delay
setb p3.2
setb p3.3
clr p3.4
setb p3.5
acall delay
setb p3.2
setb p3.3
setb p3.4
clr p3.5
acall delay
djnz r0,z1
dec a;每转一圈,a--
inc r3;每转一圈,r3++
acall judge
jnz z0;a不为0,则继续转,否则返回
z2:
ret
fz:
clr c;清进位位
mov r4,a
mov a,#00h
subb a,r4;用0减补码求出正的差值
clr c
fz0:
mov r0,#0ch
f1:
setb p3.2
setb p3.3
setb p3.4
clr p3.5
acall delay
setb p3.2
setb p3.3
clr p3.4
setb p3.5
acall delay
setb p3.2
clr p3.3
setb p3.4
setb p3.5
acall delay
clr p3.2
setb p3.3
setb p3.4
setb p3.5
acall delay
djnz r0,f1
dec a;转数自减
dec r3;楼层自减
acall judge;LED显示当前楼层
jnz fz0;转数没到0继续转,否则返回
ret
judge:;根据当前所在楼层(r3的值),来控制LED显示
cjne r3,#01h,j1
mov scon,#00h;
mov b,#09fh
mov sbuf,b
ajmp return
j1:
cjne r3,#02h,j2
mov scon,#00h
mov b,#025h
mov sbuf,b
ajmp return
j2:
cjne r3,#03h,j3
mov scon,#00h
mov b,#0dh
mov sbuf,b
ajmp return
j3:
cjne r3,#04h,j4
mov scon,#00h
mov b,#099h
mov sbuf,b
ajmp return
j4:
cjne r3,#05h,return
mov scon,#00h
mov b,#049h
mov sbuf,b
return:;返回
ret
delay:mov r7,#060h;延时
round1:mov r6,#0ffh
round2:djnz r6,round2
djnz r7,round1
ret
END
四、结束语
在这次实习中,我们对电路所实现的功能通过查找资料分析,首先根据所实现的功能画出了流程图,然后根据流程图来进行部分小程序及主程序的设计,最后进行拼合,通过设计程序,提高了逻辑的思维能力和动手能力。在调试的过程中,也学到了许多以前在课本上所未曾学到的知识。
参考文献
[1] 谢维成,杨家国.单片机原理与应用及C51程序设计(第2版)[M].北京:清华大学出版社,2009.
展开阅读全文