军用卷图机的设计实现Word文档格式.docx
《军用卷图机的设计实现Word文档格式.docx》由会员分享,可在线阅读,更多相关《军用卷图机的设计实现Word文档格式.docx(38页珍藏版)》请在冰豆网上搜索。
在图纸的左边缘设计了四个光电对管,在相应的页上按照,零打孔,一不打孔的方式,顺序由上到下,页码由大到小依次排布。
左边的光电对管的输出为外中断0,如果中断一次,将从左边读码,程序的设计中设置一些寄存器,存储最后操作时的原页码,当前页码等,方便更多功能的扩展实现。
定时器0中断,用于控制七段数码管在不同的状态下闪动显示而不采用延时的方式,以节省CPU的资源。
外中断1用于红外感应的读码实现,遇中断将调用相应的读码中断程序。
89S51的p0口p2口将直接接连个数码管,显示码值;
p1口用于接16键键盘。
由此89S51的资源基本用完。
5.3主要涉及器件介绍
AT89S52/52键盘七段数码管光电对管交流减速电机
5.3.1键盘
图5.3少于四个键的键盘设计
单片机系统中的键盘,如果在键的个数小于4个时只用如下的键盘设置,左边的那个,是先给I/O口赋高电平,然后程序将不断去扫描I/O口判断是否为低电平,哪个是低电平,哪个就被按下。
右图正好相反,先给I/O口赋低电平,当哪个按键被按下,就会使相应的键变成高电平,程序设计正好相反。
图5.44*4键盘设计
当要使用的按键达到5个以上时,为了节省I/0口,会采用矩阵接法,所以相应的扫描方法也发生了改变,如图5.4。
我们可以从左向右定义键盘的各个键为1-4,第二行为5-8,依次类推,首先键盘的接法如左图,现在先给1、2、3、4位输出高电平,5、6、7、8位输出低电平,现在将读取I/0口的返回值,当没有键被按下时,可以预见,键盘的返回值将不会变化,仍旧是低4位高电平,高4位为低电平。
当有键被按下时,例如第一个键被按下时,可以观察得8位将与1线相连,则第一位的高电平将被拉到低电平返回值将是00001110,可以看出第一行的任何一个键按下都会得到相同的返回值,所以这样的依次扫描得到的返回值仍不足于判断得哪个键被按下。
确定矩阵式键盘上何键被按下,介绍一种“行扫描法”。
行扫描法行扫描法又称为逐行(或列)扫描查询法,是一种最常用的按键识别方法.
判断键盘中有无键按下:
将全部行线置低电平,然后检测列线的状态。
只要有一列的电平为低,则表示键盘中有键被按下,而且闭合的键位于低电平线与4根行线相交叉的4个按键之中。
若所有列线均为高电平,则键盘中无键按下。
判断闭合键所在的位置:
在确认有键按下后,即可进入确定具体闭合键的过程。
其方法是:
依次将行线置为低电平,即在置某根行线为低电平时,其它线为高电平。
在确定某根行线位置为低电平后,再逐行检测各列线的电平状态。
若某列为低,则该列线与置为低电平的行线交叉处的按键就是闭合的按键。
在设计键盘扫描程序时还要考虑到对于键盘防抖动的处理,键开关在按下和释放时,通常伴随着一定时间的触点抖动,接着才能稳定下来,在触点抖动期间,检测按键的通与断状态,可能导致判断出错。
即一次按下或释放被错误地认为多次操作,这种情况是不允许出现的。
为了克服按键触点机械抖动所致的检测误判,可采用双稳触发器硬件来抑制其逻辑信号的抖动,双稳触发器一旦翻转,触点抖动的浮空对他不会有任何影响。
硬件防抖动如图5.5。
图5.5键盘硬件防抖动
硬件去抖动的方法是采用一个R-S触发器,由R-S触发器的特性阻止抖动信号传到CPU中去。
图中所用的是一个单刀双掷开关,这种开关有一个常
开触点和常闭触点,它总是处于两种状态之一。
当开关从常闭向常开方向打时,NC一端产生后沿抖动,而NO一端则产生前沿抖动,RS触发器Q端原为“1”,由于开关从NC打到NO,使得Q端从“1”变为“0”,这样无论NO端怎样抖动,总使Q端为低,这样就达到了去抖动的目的。
另外,当检测到按键被按下或释放时,也可利用软件延时避开触点机械抖动的影响,通常只要延时大于20ms都能避开抖动持续时间,然后确认按键的通或断状态。
软件防抖动:
经测试,各种不同键开关的抖动时间大约在几~十几毫秒范围内,如图5.6所示。
软件方法就是在检测到有键按下以后,CPU用软件产生约20ms的延时,然后再
图5.6按键按下松开的抖动
进入扫描检测程序。
因为20ms后键开关已经进入稳定状态,只要键仍被按着就一定会被检测出来。
所以在程序设计时,在监测到键盘的键值的返回值被改变时,就调用延时程序大概为20ms,然后再去读取是否仍旧改变,如果仍旧不同于输出值时,就确定已经被按下,然后继续扫描键盘,监测是否松开键了。
当判断到已经有高电平出现时,就调用延时程序延时一段时间然后去判断是否放开,如果确认放开,才确定扫描结束,然后进行第二次扫描。
程序中键盘扫描流程图如图5.7。
图5.74*4键盘扫描流程图
5.3.2光电对管
图5.8光电对管外观图5.9光电对管内部结构和外部电路
光电对管是将红外发射管和光敏三极管组装在一起的一个整体,当接入电路时,发光管一直工作,发射肉眼不能看见的红外光,当上下两个器件之间没有东西阻隔时,光直接照射到光敏三极管上,发光三级管集电极和发射极导通;
当东西阻隔时,光敏三级管集电极和发射极断路。
此设计中,我引入这个器件用来读码,在图片上打上好多代表当前页码的孔,在图片的右端打上代表一幅图定位准确的定位孔。
具体电路接线方法如图5.9。
这里发光管端的电阻470欧姆到1k不限,在左端测试20K欧姆是十分严格的。
此处当东西没有阻隔时,光敏三级管导通,右边的回路直接接地,I/O口直接接地,返回电平为低,当东西阻隔时,三极管相当于断路,I/O口通过一个20k欧姆的电阻接到5v电源上,返回的值为高电平1。
以此来区分当前页码。
在这个设计中,我设计了右边的定位孔一个,左边的页码孔4个,所以最多可以循环展示16幅画。
途中在四个读码处打了四个孔,表示当定位准确时将使得得到的为0000四个码值,在我的事先考虑设计时,将0000为第一幅图的返回码值。
依次类推,16幅图为1111。
设计中考虑到定位孔的准确性将决定设计的卷图机器定位的准确性,考虑后决定将定位孔做成窄于读码孔,应为定位孔作为外中断0,来低电平触发一次中断,读取码值,所以要使在读码时最好使得读码头处于所在的码值编码的中间位置。
图5.10俯视图如下:
5.3.3固态继电器(SSR)
5.11固态继电器外围电路连接
在本次设计中采用了固态继电器。
固态继电器(SolidStateRelay,简称SSR)是用现代微电子技术与电力电子技术发展起来的一种新型无触点开关器件,也是一种能将电子控制电路和电气执行电路进行良好的电隔离的功率开关器件。
固态继电器一般为四端有源器件,其中有两个输入控制端,两个输出端,输入和输出之间有一个隔离器件,只要在输入端加上直流或脉冲信号,输出端就可以进行开关的通断转换,实现了相当于电磁继电器的功能。
固态继电器没有触点,无火花,工作可靠,开关速度快,无噪声,无电磁干扰,抗干扰能力强,且寿命长,体积小,耐振动,防爆,防潮,防腐蚀,能与TTL,DTL,HTL等逻辑电路兼容,以微小的控制信号直接驱动大电流负载。
固态继电器目前已广泛应用于极端及外围接口装置、电炉加热装置、恒温系统、数控机械、遥控装置、工业自动化装置、信号灯光控制、仪器仪表、医疗器械、保安系统以及军事武器电控系统等领域。
在这节的所给电路中就是典型的单片机驱动固态继电器的电路,R2为单片机的上拉电阻,由于单片机的输出电流过于小,所以难于驱动三极管放大,所以加上这个电阻,当单片机端口输出0时,电源通过1K的R2向单片机的端口灌电流,由于三极管的基极被拉到0电平,所以三极管不导通,固态继电器的控制端没有电流流过,所以电机不转动。
当单片机的端口输出1时,端口电压和VCC电平相等,所以电源用过R1和R2直接给三极管的基极加高电平,三极管导通,固态继电器的控制端有电流通过,被控制端导通,电机运转。
5.3.4交流减速电机
该电机,为三输入端的交流电机,主体电机转速为1350r/m,由于在卷动图幅的过程中不能速度过快导致定位时惯性产生跑过现象,所以在电机输出后端加减速齿轮箱,减速至20r/m左右。
而且在加入齿轮箱后,断电的那刻的制动变得更加地迅速。
三端的接线如下:
图5.12接线柱排布
C端为公共端,当开关接通A向时,电机如果设为正转,则当开关接通B则为反转。
5.4软件设计
5.4.1主体程序设计
在程序中,我设置了now这样一个内存单元用来存放当前所在页面;
his
单元用来存放在此次操作前的页码值;
sum单元用来存放当前的页码总数;
Level单元用来标记是否输入完页码后按下过Enter键,已经按下过Enter键为#0ffh,输入完页码没有按下过为#0;
upordown内存单元,表示当前的卷图机状态,当卷图及出于上卷动状态该单元的值为#0ffh,当出于下卷画幅状态,该单元为#0,当出于静止状态,单元内容为#0f0h。
预留了irnot内存单元用作,判断是否有红外线中断过,#0代表没有中断过,#0ffh代表在程序执行过程中有红外遥控中断过。
图5.13主体程序设计
按照人机界面和涉及器件的控制方法,开始编制软件。
军用卷图机的总体程序流程图如图5.13。
按照上述的流程图进行细分各个模块程序编制:
5.4.2闪动显示程序设计
由于在运动过程中要产生闪动的页码的效果,在节省CPU资源的大前提下,我决定占用定时器0作为闪动显示的定时中断定时器。
程序设计结构的构想如下,由于要求显示两位的闪动的页码,我计划显示0.5s显示页码,0.5s不显示这样的效果。
两个七段数码管分别接在P0口和P2口,只要0.5s去刷新一次显示值,就可以闪动显示。
出于对程序运行时间能够循环显示所以,在程序设计中,我在内存单元中队各个数码管设置了2个寄存器单元ledtemp01、ledtemp11、ledtemp02、ledtemp12。
在程序运行计时过程中,定时器中断程序的执行动作是,
图5.14闪动显示子程序流程图图5.15读页码中断子程序流程图
当时间相隔0.5s,便将了ledtemp01的值和ledtemp02的值相互交换,再调用显示子程序将ledtemp01的值输出到led0上显示,同样的方法实现led1上的现实,所以在程序中,要在ledtemp01中一开始放入当前页码值的BCD码,在ledtemp02中放入0ffh(采用的是共阳数码管)。
所以在执行一次中断后,数码管将切换一次显示。
子程序流程图如图3.24。
程序见附录3,子程序标号dispmo。
5.4.3读码判断中断自程序
在读码程序中,当产生外中断0,即在画幅的右边的定位端出现开口时,下降沿触发中断执行,中断程序中,将对左边的页码进行读入,然后去跟目标寄存器进行比较,如果二者相等停止卷动卷图机,然后静态显示当前页码。
如果二者不同,则继续卷动卷图机,闪动显示当前页码。
图5.16Enter子程序流程图
5.4.4Enter功能键对应自程序
Enter这个键是程序中一个重要的键,担负着相当多的功能,首先它作为确定输入键,当输入完页码后,按下它将先判断是否输入合法,超出卷图机的页码总数或者没有输入页码值被视为不合法,程序不会将输入的dest页码值传输给最终的目的页面寄存器finaldes,操作视为无效。
当输入页码合法,则先将输入的页码传递给目标寄存器finaldes,将比较当前的页码和目标页码,如果目标页码大于当前页码则上卷画幅;
小于当前页码,将下放卷图机画幅;
如果等于画幅所在页码,则判断当前的卷图机的状态,如果卷图机出于上卷状态,则反转卷图工作状态,改为下放画幅,如果时间下放状态则变为上卷,如果是静止则视此次操作无效。
程序流程图如图3.27。
5.4调试过程
在确定军用卷图机的各个环节后,现在是对各个模块的制作与调试,设计中我秉求尽量少的添加额外的器件成本完成本设计,所以对资源较大,从而对将来的系统扩展造成一定的不便。
资源分配如下:
P2与P0口分别接两个数码管来显示当前的页码,P2显示高位,P0显示低位。
P1口用来作键盘接口。
P3口中,P3.5,P3.4,P3.1,P3.0(由高到低位)分别依次作为读码的输入端,P3.2(INT0)作为读码外中断,P3.3(INT1)作为红外读码外中断预留口。
在设计过程中贯彻模块化设计流程,对各个模块分别制作调试,旨在作到各个模块在整合到一起时将时切实可行能实现单独各自功能的模块,方便调试。
硬件调试中我先焊制了一块51单片机最小的系统。
然后编制了如下的简单测试程序直观地显示系统的工作情况。
测试程序是一个P0口驱动8个发光二极管流水显示花色。
org0000h
ajmpstart
org0100h
start:
mova,#0ffh;
给a赋#0ffh
clrc;
将C清零
movr0,#8;
设置r0为8,作为循环计数寄存器
loop:
rlca;
将A带进位循环左移
movp0,a;
将结果赋给P0
acalldelay;
调用延时0.2m
djnzr0,loop;
判断r0是否是0,如果不是零说一周期没有完成
ajmpstart;
如果等于0则跳转到重新赋值进入循环
delay:
movr1,#10;
延时子程序
d0:
movr2,#100
d1:
movr7,#100
d2:
djnzr7,d2
djnzr2,d1
djnzr1,d0
ret
end;
结束程序
在最小系统成功实现后,制作显示页码电路,我在设计过程中,将显示部分和按键设置在同一块板子上,然后对显示部分编制测试程序进行测试,由于在总结了交通灯制作过程中的显示不足点,所以此次在应用共阳数码管上,在各个笔画上串入了470欧电阻,然后公共端接到高电平。
编制的测试程序如下,程序实现功能是使得P0口和P2口循环显示0~9:
movr0,#10
movdptr,#tab;
将七段数码管显示值对应码表赋给DPTR
clra;
A清零
movca,@a+dptr;
将对应偏移A的码值赋给A
movp0,a;
将A赋给P0
movp2,a;
将A赋给P2
incdptr;
将DPTR自增1
acalldelay;
调用延时子程序
djnzr0,loop;
判断是否显示了10个数值
ajmpstart;
如果显示了10个则跳转到开始重新执行
delayl:
movr5,#50;
延时1S程序
d2:
movr6,#100
d3:
movr7,#100
d4:
djnzr7,d4
djnzr6,d3
djnzr5,d2
ret;
子程序结束
tab:
db0C0H,0F9H,0A4H,0B0H,099H,092H,082H,0F8H,080H,090H
end
在编制程序调试后,我找到了电路在显示部分的多个虚焊点,排除了显示异常后,继续做键盘模块调试工作。
键盘的布局设计见相应的章节,由于测试程序的程序过于冗长,所以在此处不添加,详细见附录3所带程序。
在测试完交流电机可以正常运转后,搭建继电器控制电路对电动机的转向进行控制,但在测试中,发现机械式继电器在切换过程中的干扰对单片机的影响很大,在切换的过程中,单片机会出现跑飞。
首先考虑到空间的传播干扰,遂将一个铁壳将继电器与外界隔离,测试出错率,粗略统计出错率没有明显下降。
所以确定并非空间传播干扰占主要原因,电气将是主要传播途径。
在不对现有搭建的电路产生很大改动的前提下,决定采用固态继电器作为替代器件。
改善后的效果是相当明显的,几乎没有出错的情况发生。
读码部分,在单元调试过程中,由于在硬件上的连接并不是连续地搭接(P3.5,P3.4,P3.1,P3.0),所以在设计程序时只能对位布尔操作,将各位先传递给C然后带进位循环左移,然后传递给一个now寄存器,程序如下:
codein:
pushpsw
pushacc;
保护现场
clra;
清A寄存器
movc,p3.5;
由于硬件的连接不是连续的,所以p3.5,p3.4,p3.1,p3.0
rlca;
带进位循环左移
movc,p3.4;
将P3.4传递个C寄存器
movc,p3.1;
将P3.1传递个C寄存器
movc,p3.0;
将P3.0传递个C寄存器
movnow,a;
通过循环右移得到当前得到当前的图纸页码
popacc
poppsw
ret
各个单元调试通过后,再开始整合各个模块组成一个完整的系统,进行整个系统的程序编制和调试。
[1]王继昌,电子元器件应应用手册,北京:
人民邮电出版,2004年
[2]李伯承,基于MCS-51单片机的嵌入式系统设计,北京:
电子工业出版,2004
军用卷图机源程序
;
图片增图片减
;
@@@
上拉下放公共端
P3.6
P3.7控制电机的通电与否,常闭端为断电状态,常开端为通电状态
读图纸叶码P3.0,P3.1,P3.4,P3.5为码值的低位到高位
P0口为LED1输出,P2口为LED2输出
键盘输入为P1口
int1为
占用r0,r4,r5,r6,r1
sumEQU30h;
图纸总页码
nowEQU31h;
现在所在页码寄存器
hisEQU32h;
历史记录寄存器
inputEQU33h;
键盘及红外遥控输入的输入页码寄存器
ledtemp01EQU34h
ledtemp11EQU35h
ledtemp02EQU36h
ledtemp12EQU37h
bcd0EQU38h
bcd1EQU39h
in0EQU3ah
in1EQU3bh
stateEQU3ch
levelEQU3dh
hadEQU3eh
destEQU3fh
finaldesEQU40h
inputproEQU41h
upordownEQU42h;
up0ffhdown0h,still0f0h
lastEQU43h;
暂存上一次的页码
irsouEQU44h
irnumEQU45h
irnotEQU46h;
用来标志是否红外中断过,0为未中断过,0ffh为中断过
led0EQUP0
led1EQUP2
org0003h
ljmppicnum;
读图纸页码中断
org000bh
ljmpflash;
LED闪烁中断
org0013h
ljmpir;
红外读码中断
clrp3.6
clrp3.7;
使得继电器12断开
movinputpro,#0ffh;
输入的是sum还是页码值寄存器
movlevel,#0ffh;
设置level寄存器为输入状态寄存器,ENTER后表示输入完全为0ffh
movstate,#0ffh;
设置状态寄存器,当在滚动中,寄存器为0ffh,;
静止中为0h
movhad,#0ffh;
输出否寄存器,当返回已经输出则为0ffh,未输出则为0h
movsum,#16
movirnot,#0
movr3,#10;
设置R1为中断次数寄存器
movdptr,#tab
setbet0;
开定时器0中断
movtmod,#00000001b
movth0,#00111100b;
设置初值
movtl0,#10110000b
setbtr0;
开始计数
setbea;
允许中断中断
movledtemp01,#80h
movledtemp11,#80h
movledtemp02,#0ffh
movledtemp12,#0ffh;
给各个单元赋值
movled0,ledtemp01
movled1,ledtemp11
初试化卷图机
initi:
jbp3.2,upward;
判断是否定位准确,即是否使得定位光电对管导通
sjmpwork;
进入正常工作状态
upward:
acallrollup;
使得电机带动图画向上卷动
sjmpiniti;
继续循环判断是否定位准确
work:
acallpoweroff;
停止卷图机工作
movupordown,#0f0h
movstate,#0
clrtr0;
停止计数,使得卷图机的LED不再闪动显示88
setbit0;
使得外中断下降沿有效
acallcodein;
读取页码
mova,now
movhis,a;
将当前的码值存入历史寄存器
movr0,now
incr0
acalldivi;
调用除法子程序来做十进制调整
movled1,bcd1
movled0,bcd0;
输出显示当前的页码
#########################进入正常工作状态
movr