1、4、风速:风速的弱、中、强对应于电扇的转动由慢到快。5、风速类型的不同选择分别为:(1) 正常 电扇连续运转;(2) 自然 电扇模拟自然风,即转4s,停8s;(3) 睡眠 电扇慢转,产生轻柔的微风,运转 8s,停转8s;6、按照风速与类型的设置输出相应的控制信号。三、总体设计 电扇模拟自然风,即本次课程设计任务主要基于8086以及各种接口芯片结合汇编语言实现对家用风扇的控制器的模拟。我主要运用8086CPU结合汇编语言编写的软件来实现各种信号的处理与变换,以得到想要的控制信号,并用接口芯片8255A实现信号的输出与接收。在模拟中通过开关来实现各种控制信号的输入,再通过8255的端口进行读取,再
2、由8086通过软件的对采入的信号进行辨别进而转入到相应的功能子程序中以实现各种功能。在各种功能的背后,通过8086驱动相应功能的硬件设备实现各种功能的切换。具体设计设计,我想采用8255A来接收开关信号,驱动风扇的转动信号输出,输出LED灯的亮灭信号,并接收8253产生的控制信号。8253主要来实现各种风种的控制信号,以得到自然、睡眠的类型风。在风扇控制的停止后,当且仅当有风速键按下后,控制器可恢复继续控制风扇的运行,实现控制器的循环控制。 硬件设计框图如图1所示。图1 硬件整体设计框图四、硬件设计 4.1 硬件设计基本概要根据设计要求和内容,用可编程并行接口芯片8255A低四位接收3个按键(
3、分别表示风速、类型、停止)的状态以启动电扇或设置相应的工作状态。这样就需要3个按键,因此可以用三个按钮接到8255口。这样可以直接从8255的口读取按键的状态,从而执行相应的操作。要通过一个按键来控制2个以上的状态,可以通过按键的次数来控制第几种状态,比如风速有三种状态(弱、中、强),可以用按键1次控制弱,按键2次控制中,按键3次控制强,这样就可以实现一键控制多钟状态了。控制器的指示灯,我想使用六个LED灯进行显示,分别显示不同风速、类型等6个指示信号。用四相步进电动机作为电风扇,其转速可通过改变其驱动电平的频率来改变步进电机的速度。利用8255A的PC口低四位对步进电机进行四相四拍驱动。风种
4、时间控制可由可编程计数器/定时器 8253来实现。可选用由8253工作方式3,在这种方式下,当CPU输入控制字后,输出将为高,在写入计数值后计数器将立即自动对输入时钟CLK计数,计数器减为1时,输出将变低,方式2时8253不可用重新设置计数值就能连续工作,保证了定时的精确。 4.2 8255A设计 8255A的PA工作在方式0的基本输入方式作为控制信号的输入,接收8253的信号来控制步进电机的转动与停止。PC低四位工作在方式0的基本输入方式,用来接收四个开关的开关信号,高四位工作在方式0的基本输出方式作为四相步进电机的四相线路输出电路用来驱动步进电机的转动。PB口工作在方式0的基本输出方式,用
5、低六位来控制六个LED灯的亮和灭。 4.3 8253设计首先利用通道0对时钟进行分频,已获得可较好利用的时钟,得到周期为四秒的方波为后面能自然和睡眠的状态产生八秒高电平四秒低电平以及周期为十六秒的方波做准备。使用通道2用来产生类型风的状态信号,在自然风类型时,让其工作在方式2产生八秒高电平四秒低电平,当高电平时驱动步进电机转动,低电平则返回继续检测,以实现自然风的模拟;在睡眠的类型时,通道2工作在方式3产生周期为十六秒的方波,当高电平时驱动步进电机转动,低电平则返回继续检测,以实现睡眠风的模拟。 4.4 步进电机设计步进电机可接受数字控制信号(电脉冲信号)并转化成与之相对应的角位移或直线位移,
6、因而本身就是一个完成数字模拟转化的执行元件。而且它能进行开环位置控制,输入一个脉冲信 号就得到一个规定的位置增量。本次课程设计使用的电机为四相步进电机,采用单极性直流电源供电。只要对步进电机的各相绕组按合适的时序通电,就能使步进电机步进转动。步进电机的转速取决于脉冲频率、转子齿数和拍数。其角速度与脉冲频率成正比,而且在时间上与脉冲同步。因而在转子齿数和运行拍数一定的情况下,只要控制脉冲频率即可获得所需速度。 4.5风扇控制器系统硬件原理图 图2 风扇控制器系统硬件原理图五、软件设计硬件的设计完成后,运用汇编语言编写软件部分通过8086CPU实现各种信号的输入/输出以及相关信号的处理,从而控制步
7、进电机的各种转态的转换控制。主程序流程图如图3所示:图3:主程序流程图注:该段流程图对应程序中main函数及check函数 5.1按键判断控制模块三个按钮接在PC口的低三位,PC3接地,若风速键按下时,开关信号为1H,类型按下时,开关信号为2H,停止键按下时,开关信号为4H。 5.2 风速模块切换流程 在风速切换中,在主函数中定义一个变量FLAGL,初始化为0并将其地址放入SI中,在弱风和中风模块中将SI加1,在强风模块置为零。进入风速模块后判断其大小,若为零则转入弱风模块,否则进入中风模块,以此类推。图4:风速切换模块在弱风模块中先点亮表示弱风的灯“弱”,SI加一,改变驱动电平频率即置DI为
8、0FFFFH,调用run函数使步进电机弱速转一圈,然后检测开关信号,若开关无新信号,则循环弱风模块。中风模块与强风模块类似,中风时,SI加一,置DI为0AFFFH,强风时,SI置0,置DI为05FFFH。 在类型控制中,切换流程与风速控制类似,在此不做赘述,下面进介绍类型控制子模块。 5.3 类型控制子模块图5:类型控制子模块 进入类型控制子程序后,先判断PA的PA0是否为高电平,即8253输出是否为1,若为高电平,则执行执行点亮灯,变量加一或置一,调用电机run函数等操作,然后检测PA口此时是否为高电平,若为高电平则循环上述操作,若为低电平,则判断开关信号,开关无新信号,返回执行类型控制子模
9、块。所以,仅仅在PA口为低电平是才检测开关,即在自然风或睡眠风时,当电机停下来时,按开关才有效。正常风需要电机一直转动,所以正常风模块不需检测PA口,程序类似风速转动子模块。 5.4 停止控制模块图6:停止控制模块停止状态主要实现风扇暂时性的停止运行,只有在风速键按下才能继续运行。此模块结束后返回start,在start会对已运行的风扇停止后所有状态进行重新赋值,以保证再次运行后能按初始状态运行。六、程序清单;8253端口地址IO08253 EQU IOY1+00H*4IO18253 EQU IOY1+01H*4IO28253 EQU IOY1+02H*4IOCON8253 EQU IOY1+
10、03H*48255端口地址IOA8255 EQU IOY0+00H*4IOB8255 EQU IOY0+01H*4IOC8255 EQU IOY0+02H*4IOCON8255 EQU IOY0+03H*4IOY0 EQU 0C400HIOY1 EQU 0C440HCHECK PROC NEARMOV DX,IOC8255IN AL,DXAND AL,0FHCMP AL,1JE SPEED_RJMP CHECKRETENDPSPEED_R: CALL SPEEDJMP CHECK_RSTYPE_R: CALL STYPE风速控制子程序SPEED PROC NEAR PUSH AXCOM:CMP
11、 BYTE PTR SI,0JE L0CMP BYTE PTR SI,1JE L1CMP BYTE PTRSI,2JE L2L0:MOV DX,IOB8255MOV AL,01HOUT DX,AL L0亮 LL0: LOOP L0MOV BX,SIADD BX,1MOV SI,BXRUN_1:MOV DI,0FFFFHCALL RUN ;电机弱转CHECK_0:JE COMCMP AL,2JE STYPE_RCMP AL,4JE ZTJMP RUN_1ZT: JMP TINGDATA SEGMENTFLAGL DB ?FLAGT DB ?FLAGD DB ?LEIXING DB 0DATA E
12、NDSCODES SEGMENTMAIN PROC NEARASSUME CS:CODES,DS:DATASTART:MOV AX,DATAMOV DX,AXMOV SI, OFFSET FLAGLMOV BL,0MOV SI,BLMOV DI, OFFSET FLAGTMOV DI,BLMOV FLAGD,BL8255初始化MOV DX,IOCON8255MOV AL,90HOUT DX,AL8253通道0初始化LING8253: MOV AL,00110111B MOV DX,IOCON8253MOV AL,00HMOV DX,IO08253MOV AL,04H判断是否是风速按键按下QD:
13、JE CHECK_RJMP QDCHECK_R:CALL CHECKMAIN ENDPSTYPE PROC NEAR 类型控制子程序PAR: CMP FLAGD,0JE L3CMP FLAGD,1JE L4CMP FLAGD,2JE ZFZF: JMP L5L3: MOV LEIXING,0MOV AL,08HOUT DX,AL ;L3亮LL3: LOOP L3MOV AL,FLAGDADD AL,1MOV FLAGD,ALRUN_Z:JE YRZ ;正常风YRZ:MOV DI,0FFFFH JE YZZYZZ: MOV DI,0AFFFHCMP BYTE PTR SI,2JE YQZYQZ:
14、 MOV DI,05FFFHCALL RUNCHECK_3:JE Z1JE ZBJMP RUN_ZZ1: JMP SPEED_RZB: JMP ZTL4: MOV DX,IOB8255MOV AL,10H ;L4亮L1:MOV AL,02H ;L1亮LL1: LOOP L1RUN_2:MOV DI,0AFFFH电机中转CHECK_1: MOV DX,IOC8255JMP RUN_2L2:MOV AL,04H ;L2亮LL2: LOOP LL2RUN_3:MOV DI,05FFFH电机强转CHECK_2:JE ZCJE ZSJMP RUN_3ZC: JMP COMZS: JMP STYPE_RP
15、OP AXSPEED ENDPL5: MOV DX,IOB8255 ;自然风MOV AL,20H ;L5亮LL5: LOOP LL5MOV AL,0MOV AL,10110101B 自然通道2初始化MOV AL,02HMOV DX,IO28253RUN_I:MOV DX,IOA8255AND AL,1JE RUN_R2JMP CHECK_N2RUN_R2:CHECK_N2:MOV DX,IOC8255 ;检查有无新键JE Z3JE Z4LL4: LOOP LL4MOV AL,10110111B 睡眠通道2初始化RUN_S:JE RUN_RJMP CHECK_NUN_R:CHECK_N:JE L
16、5JE ZUJMP RUN_SZU:Z4:JE ZDJMP RUN_IZ3: JMP L3ZD: JMP ZSSTYPE ENDP电机转动程序RUN PROC NEAR PUSH CXMOV AL,30HCALL DELAYMOV AL,60HMOV AL,0C0HJMP LLDELAY: MOV CX,DIDALA: LOOP DALALL: POP CXRUN ENDP判断停止键是否按下PCHECK:JE TINGTING:MOV AX,0OUT DX,AXCALL RUNTJMP STARTRUNT PROC NEAR ;电机停止子程序PUSH DIMOV AL,0HJMP LLPDEL
17、AYP:DALAP: LOOP DALAPLLP: POP DIPOP CXRUNT ENDPCODES ENDSEND START七、遇到的问题及解决方法 在这次课程设计中,遇到了各种问题。因为以前的基本太薄弱,刚开始设计写程序的两天,遇到问题后往往是瞪着屏幕毫无办法,常常在一个小问题上一卡就是三四个小时,到后来渐渐学会了一些解决问题的思路和办法,节奏才渐渐加快。 首先应该是步进电机的驱动问题,刚开始完全不懂电机的驱动原理,看了很多相关的资料却只知道一些理论性的东西,完全不知道如何使用,很多资料上面的驱动电路也是一大堆与非门构成的。后来在proteus的SAMPLES里面找到了关于驱动的一个
18、简单电路,研究了一下,对照着proteus和网上的步进电机芯片资料,终于弄明白的它的使用方法。所以proteus里面附带的参考资料其实是很实用的,善于利用能比在其他地方漫无目的的搜资料学到更多东西。 其次逻辑问题。写类型控制子模块的时候,已经根据流程图把程序写好,里面的子模块也以测试过没有问题,流程图逻辑也应该没问题,但每次运行在睡眠风状态下时,电机转八秒,停两秒后自动转到自然风模块。想过很多种可能,开关问题,LED灯问题等等,最后一条一条照着程序写流程图的时候,终于发现可能是最后RET没起作用,导致程序执行完无法返回check,直接执行下一条指令。 还有就是刚刚开始写的时候,写一个灯亮,就直
19、接置一,然后看不到任何效果,就很奇怪,后来才想出来CPU运行速度很快,也许亮一下肉眼根本看不出来,需要延迟一段时间,同理按钮开关也需要延时检测。 还有就是很多新手都会遇到的问题,我第一次写的时候,一开始就写了一大段程序,然后什么结果都出不来,调试的时候根本无从调起,经过同学指点才开始从一个小功能开始写程序,先写一个灯亮然后两个然后循环,再往进添加其他功能。并且这样写会不停的给自己成就感,让自己坚持做完,否则很容易在遇到无从下手的问题时放弃。所以再大的程序也是要脑子里先有个大框架然后一个个小功能实现的。在后来遇到错误时,我一般都会先过一遍程序查一下有没有能看出来的错误,然后该段程序的开头开始检测
20、,通过加LED检测程序运行到了哪一行,从哪一行开始出错,有些直接看不出错误的地方通过加DELAY使运行变慢,方便看到仿真结果,也可以使用proteus里面的帧进,一步一步看效果。另外仿真出错的各种怪问题多半能在网上搜到答案,只要坚信一定有人比我先遇上这些问题就行了八、心得体会通过此次的课程设计任务,我加深理解了汇编语言以及各接口芯片的使用方法,在实践中体会到各芯片的工作的状态及使用方法。以前学习过8255,8253芯片的相关内容,通过这次课程设计,通过设计,看书,终于有了比较深刻地了解,并且加深对汇编程序结构,指令,调用等基础知识的认识。在实践中充分利用所学知识结合实际情况作出符合要求的设计。
21、在具体的调试过程中遇到了很多问题,自己通过查找各方面资料解决了这些问题。在这我学到了部分proteus仿真中及硬件调试方面常出现的问题及解决方法。而在软件设计方面我也学到常见逻辑错误及其解决方法。能在实践中磨砺自己的意志以及锻炼自己的动手操作能力,提升自己独立完成小型系统的设计任务能力。为以后在大型系统设计中能奠定一定的基础知识及实际操作能力,并为自己积累了许多宝贵的经验教训。下面简要的介绍一下我在这次课程设计中主通过这次短暂的课程设计,不仅使我加深了对接口程序设计的认识,对接口各部件的工作原理也有了进一步的了解,也增强了分析故障以及独立处理问题的能力.八、元件清单.元件数量8255A1825374LS138741174LS32 ULN2003ALED-RED6RES374LS273NOTMOTOR-STEPPER8086九、参考文献
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1