完整代码:CODE SEGMENTASSUME CS:CODEIOCONPT EQU 0003HIOAPT E QU 0000HADPORT EQU 0060HDAPORT EQU 0070HCONTPORT EQU 00DFHDATAPORT EQU 00DEHDATA1 EQU 0500HORG 1000HSTART: JMP ADCONTORLDATA2 DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H DB 7FH,6FH,77H,7CH,39h,5EH,79h,71hADCONTORL: CLIMOV AX,0HMOV DS,AXMOV AL,3FHMOV BX,DATA1 MOV DS:[BX],ALADD BX,01HMOV AL,7FHMOV DS:[BX],ALADD BX,01HMOV AL,3FHMOV DS:[BX],ALADD BX,01HMOV AL,6FHMOV DS:[BX],ALADD BX,01HMOV AL,40HMOV DS:[BX],ALADD BX,01HMOV AL,40HMOV DS:[BX],ALADD BX,01HMOV AL,00HMOV DS:[BX],ALADD BX,01HMOV AL,00HMOV DS:[BX],ALADD BX,01HMOV DX,CONTPORTMOV AL,00HOUT DX,AL ;KEYBORD DISPLY MODEMOV AL,2AHOUT DX,AL ;8279 CLOCKMOV AL,0d0hOUT DX,AL ;8279 CLEARMOV AL,90hOUT DX,AL ;READ FIFO RAM COMMANDTEST1: IN AL,DXAND AL,80HJNZ TEST1MOV AX,0HMOV DS,AXADCON: MOV AX,00MOV DX,ADPORTOUT DX,ALMOV CX,0500HDELAY: LOOP DELAYMOV DX,ADPORTIN AL,DXPUSH DXMOV DX,DAPORTOUT DX,ALPOP DXPUSH AX DELAY0:MOV AL,89HMOV DX,IOCONPTOUT DX,ALNOPNOPNOPPOP AX COUNT: CMP AL,0D0HJA TT1CMP AL,30HJB TT2PUSH AXMOV DX,IOAPTMOV AL,02HOUT DX,ALPOP AXJMP CONTINUETT1:PUSH AXMOV DX,IOAPTMOV AL,01HOUT DX,ALPOP AXJMP CONTINUETT2:PUSH AXMOV DX,IOAPTMOV AL,04HOUT DX,ALPOP AXCONTINUE:MOV CL,ALCALL CONVERSCALL LEDDISPJMP ADCONCONVERS:MOV BH,0HAND AL,0FHMOV BL,ALMOV AL,CS:[BX+DATA2]MOV BX,DATA1+7MOV DS:[BX],ALDEC BXPUSH BXMOV AL,CLMOV CL,04HSHR AL,CLMOV BL,ALMOV BH,0HMOV AL,CS:[BX+DATA2]POP BXMOV DS:[BX],ALRETLEDDISP:MOV AL,90HMOV DX,CONTPORTOUT DX,ALMOV BYTE PTR DS:[0600H],00LED1: CMP BYTE PTR DS:[0600H],07H JA LED2MOV BL,DS:[0600H]MOV BH,0HMOV AL,CS:[BX+DATA1]MOV DX,DATAPORTOUT DX,ALADD BYTE PTR DS:[0600H],01HJNZ LED1LED2: RETCODE ENDSEND START设计原理根据试验箱相关配置,取电位器0~5V 可调电压为模拟量输出模块,可线性调节输出。
取芯片ADC 0809 对采集到的模拟信号进行模数转换,将0~5V 的电压信号转为00~FF 的数字信号,并通过8279 键盘扫描输出模块进行相应的显示输出。
得到转换后的数字量之后,使用DAC0832 数模转换芯片进行数模转换,并将所得模拟量输出到直流电机控制端,进行电机驱动。
对于添加的模块,主要通过8255 芯片来实现,取8255 的PA0 口作为输出端口,连接试验箱上的开关量输入显示区的发光二极管。
对A口分别赋值01H (直流电机正向非正常工作)、02H(直流电机正常工作)、04H(直流电机反向非正常工作)并输入给开关量输入显示区的发光二极管,驱动前三个二极管在电机的三种工作状态下分别发光,从而实现指示灯电路。
对于报警电路,只要从开关量输入显示区取得相应电平变化量输送给电子音响驱动控制区的信号输入端,即完成报警电路的设计。
具体模块设计1、概述本系统设计以8088 微处理器作为CPU,用ADC0809 进行模数转换,DAC0832 进行数模转换,8255 进行电机选择及步进电机控制,8279 进行显示输出,即主要包括四大模块:A/D 模块,8255 控制模块,D/A 模块以及显示模块,通过中央8088 全局调制,如下图Fig.1。
每一个模块分别对应着试验箱上的相应的模块化芯片。
2、A/D 转换A/D 模块主要由ADC0809 芯片以及模拟电位器组成。
ADC0809 是一种8 路模拟输入,8 路数字输出的逐次逼近法A/D 器件,转换时间约为100us,转换精度为+1/512,适用于多路数据采集系统。
ADC0809 芯片片选信号接入8088 译码输出Y6,CLK 信号接入500KHz 时钟,IN0 接入0~5V 可调模拟电位器作为模拟信号输入。
具体工作过程中,只需将端口对应赋值,并将转换值输出即可,代码如下:TEST1: IN AL,DX ;初始转换开始的检测AND AL,80HJNZ TEST1ADCON:MOV AX,00MOV DX,ADPORT ;ADPORT 为ADC0809 端口地址0060HOUT DX,ALMOV DX,ADPORT ;将转换好的数据读入8088IN AL,DXMOV CL,AL3、8255 控制模块8255 控制模块主要包含以下功能:首先对8255进行方式控制字的初始化过程,对8255的端口地址进行复制,如下:IOCONPT EQU 0003HIOAPT EQU 0000H写方式控制字,通过8086拓展Y0口对8255写方式控制字89H,使PA0口工作在方式1,用作数据输出。
初始化过程如下:DELAY0:MOV AL,89HMOV DX,IOCONPTOUT DX,ALNOPNOPNOP通过模数转换得到的数字量在数码管上进行显示之后,取出数字量,并与事先设定好的门限电压30H和0D0H做比较,其中30H和0D0H将00H-FFH分成了三段,这三段电压驱动下的直流电机的转动状态分别对应发光二极管指示灯的三个灯的亮与暗,当数字量大于0D0H时,对PA0口写入01H并输出给开关量输入显示区,驱动第一个发光二极管发光;当数字量小于30H时,对PA0口写入04H并输出给开关量输入显示区,驱动第三个二极管发光;当数字量介于30H 和0D0H之间的时候,对PA0口写入02H并输出给开关量输入显示区,驱动第二个二极管发光,实现对电机工作状态的只是,代码如下:POP AXCOUNT: CMP AL,0D0HJA TT1CMP AL,30HJB TT2PUSH AXMOV DX,IOAPTMOV AL,02HOUT DX,ALPOP AXJMP CONTINUETT1:PUSH AXMOV DX,IOAPTMOV AL,01HOUT DX,ALPOP AXJMP CONTINUETT2:PUSH AXMOV DX,IOAPTMOV AL,04HOUT DX,ALPOP AXCONTINUE:MOV CL,AL4、D/A 转换模块D/A 转换模块主要由数模转换芯片DAC0832 组成,0832 片选端接入8088 译码输出Y7,同时将输出端输入直流电机输入端,这样将之前转换所得到的数字量进行二次转换,在转换为模拟量。
由于之前的A/D 模块将0~5V 的电压转换成了00H 到FFH 的数字量,而0832 会将这些数字量当成有符号数进行转换,这也就是直流电机控制过程中会出现反转的原因。
代码如下:PUSH AX ;AL 为之前转换得到的数字量MOV DX,DAPOT ;端口赋值OUT DX,AL ;端口输出POP AX5、输出显示模块输出显示模块主要由8279 以及8 个数码管组成。
对于8279,试验箱上已经将片选,时钟等引脚固化了,因此不许链接太多,只需将8279 对应位与数码管链接即可。
8179控制的数码管初始设定为“0809--00”,在后面接入A/D 信号之后最后两位随着电位器输入大小的变化而相应的从00 变化到FF。
代码中主要涉及ADCONTORL,CONVERS,LEDDISP 等部分(可参见俘虏代码部分)调试结果与分析1调试结果程序正常运行之后,实验板如下图所示:其中,数码管显示当前电压输入量的数字量XX,完整显示为“0809--XX”,其中XX为当前电压模数转换之后的数字量。
显示结果如下图:当电机正常工作时,指示灯区正常显示,如下图:当驱动电压超过0D0H门限电压,直流电机正向非正常工作,指示灯显示如下图:当驱动电压低于门限电压30H时,直流电机反向非正常工作,此时指示灯显示如下图:2结果分析1、本方案设置显示的数字量只有模拟电压模数转换后的数字量,不够人性化,无法通过这数字量直观的反映直流电机的转速等。
2、由于此方案的最后定稿是最后两次实验上机时,因此,时间唐突,没有将定时计数器合理的加入到电路中,因此无法完成对直流电机转速的测定。
3、该电路门限电压设置不十分完美,只有正反向非正常工作的最大电压,当驱动电压在零附近的时候并不能驱动直流电机正常工作,这种情况不能很好的从指示灯上反映出来,还有待完善。