;--------------------------------------------------------------------------; 课程设计: 数据采集控制与数字电压表;--------------------------------------------------------------------------A8255 EQU 0600H ;8255端口地址:PA0~PA7-->L0~L7B8255 EQU 0602H ;PB0~PB7-->A~G.DP 段码口C8255 EQU 0604H ;PC0~PC3-->X1~X4,PC4.PC5-->EOCCON8255 EQU 0606H ;PC6-->K6电压表,PC7-->K7开机A8254 EQU 0640H ;8254端口地址B8254 EQU 0642HC8254 EQU 0644HCON8254 EQU 0646HADC0809 EQU 06C0H ;ADC0809端口地址;--------------------------------------------------------------------------DATA SEGMENTVRBUF DB 10 DUP(0) ;AD转换结果缓冲区数据段VR DB ? ;AD转换结果数据段V ALUE DB 3 DUP(0) ;电压值数据段000LED DB 3FH,06H,5BH,4FH ;数码管段码表0-15DB 66H,6DH,7DH,07HDB 7FH,6FH,77H,7CHDB 39H,5EH,79H,71HDATA ENDS;--------------------------------------------------------------------------SSTACK SEGMENT STACKDW 64 DUP(?)SSTACK ENDS;--------------------------------------------------------------------------CODE SEGMENTASSUME CS:CODE,DS:DA TA,SS:SSTACKSTART: MOV AX,DATA ;当前数据段址送DSMOV DS,AX;--------------------------------------------------------------------------; 系统初始化及启动程序;--------------------------------------------------------------------------MOV DX,CON8255 ;8255控制字:PA7~PA0显示AD转换值MOV AL,10001000B ;A口输出,B口输出,PC0~PC3输出,PC4~PC7输入!OUT DX,AL;--------------------------------------------------------------------------BEGIN: MOV DX,B8255 ;L0~L7灯全灭!MOV AL,00HOUT DX,ALMOV DX,A8255 ;LED数码管全灭!MOV AL,00HOUT DX,ALMOV DX,CON8254 ;启动秒计数MOV AL,00100111B ;计数器0,读写高8位,方式3,十进制OUT DX,AL;--------------------------------------------------------------------------K7: MOV DX,C8255IN AL,DX ;读C口TEST AL,10000000B ;测试C口最高位!JZ BEGIN ;PC7=1开机!;--------------------------------------------------------------------------; 数据采集程序;--------------------------------------------------------------------------MOV SI,OFFSET VRBUF ;将VRBUF的偏移地址放入SI,SI指向VRBUF MOV CX,10 ;设置循环次数ALEST: MOV DX,ADC0809 ;选择通道,启动转换MOV AL,00H ;选择端口IN0OUT DX,ALEOC: MOV DX,C8255 ;检测EOC状态,判断转换是否结束IN AL,DXTEST AL,00110000B ;判断PC4,PC5是否为1!JZ EOC ;转换未结束MOV DX,ADC0809 ;转换结束,取AD转换结果IN AL,DXMOV [SI],AL ;AD转换结果存入VRBUFINC SILOOP ALEST;-------------------------------------------------------------------------;--------------------------------------------------------------------------MOV BX,0000 ;数据和清零MOV DH,00 ;最大值MOV DL,0FFH ;最小值MOV SI,OFFSET VRBUFMOV CX,10NEXT: MOV AL,[SI]CMP AL,DH ;比较最大值-->DHJBE NEXT1 ;不高于跳MOV DH,ALNEXT1: CMP AL,DL ;比较最小值-->DLJAE NEXT2 ;不低于跳MOV DL,ALNEXT2: MOV AH,00 ;求数据和ADD BX,AXINC SI ;指向下一单元LOOP NEXTMOV AX,BXMOV BH,0MOV BL,DH ;减去最大值SUB A X,BXMOV BH,0MOV BL,DL ;减去最小值SUB A X,BXMOV CL,8 ;求出平均值-->VRDIV CLMOV VR,AL;-------------------------------------------------------------------------MOV DX,A8255 ;显示AD转换结果OUT DX,AL;-------------------------------------------------------------------------MOV DX,C8255 ;判别K6状态:K6=0为数据控制IN AL,DXTEST AL,01000000BJZ KZ ;K6=0为数据控制JMP DYB ;K6=1为数字电压表;--------------------------------------------------------------------------; 数据控制程序;-------------------------------------------------------------------------- KZ: MOV AL,VR ;数据采集控制CMP AL,33HJBE DDZT ;<=1V,转单灯左跳程序CMP AL,66HJBE SDYT ;<=2V,转双灯右跳程序CMP AL,99HJBE SZJL ;<=3V,转向左渐亮程序CMP AL,0CCHJBE SYJM ;<=4V,转向右渐灭程序JMP BJ ;>4V,转闪动显示A/D值.报警处理程序;------------------------------------------------------------------------- DDZT: MOV AL,1 ;显示"1"CALL DISPMOV CX,8 ;循环次数MOV DX,B8255 ;单灯左跳程序MOV AL,01HDDZT1: OUT DX,ALCALL DELAYCALL DELAYROL AL,1 ;循环左移LOOP DDZT1JMP K7;------------------------------------------------------------------------- SDYT: MOV AL,2 ;显示"2"CALL DISPMOV CX,8MOV DX,B8255 ;双灯右跳程序MOV AL,0C0HSDYT1: OUT DX,ALCALL DELAYCALL DELAYROR AL,1 ;循环右移LOOP SDYT1JMP K7;-------------------------------------------------------------------------- SZJL: MOV AL,3 ;显示"3"CALL DISPMOV CX,9 ;MOV CX,8 ?MOV DX,B8255 ;向左渐亮程序MOV AL,00HSZJL1: OUT DX,ALCALL DELAYCALL DELAYSTC ;置进位标志RCL AL,1 ;带进位循环左移LOOP SZJL1JMP K7;-------------------------------------------------------------------------- SYJM: MOV AL,4 ;显示"4"CALL DISPMOV CX,9 ;?MOV DX,B8255 ;向右渐灭程序MOV AL,0FFHSYJM1: OUT DX,ALCALL DELAYCALL DELAYSHR AL,1 ;逻辑右移LOOP SYJM1JMP K7;--------------------------------------------------------------------------BJ: MOV AL,5 ;显示"5"CALL DISPMOV DX,CON8254 ;启动秒计数MOV AL,00100111B ;计数器0,读写高8位,方式3,十进制OUT DX,ALMOV DX,A8254MOV AL,10H ;计数初值OUT DX,ALMOV DX,CON8254MOV AL,01100111B ;计数器1,读写高8位,方式3,十进制OUT DX,ALMOV DX,B8254MOV AL,10HOUT DX,ALMOV CX,10 ;L0~L7闪动显示A/D值MOV AL,VRMOV AH,00HSD: MOV DX,B8255 ;!OUT DX,ALCALL DELAYXCHG AL,AH ;AL,AH数据互换LOOP SDMOV DX,CON8254 ;关报警MOV AL,01100111B ;计数器1,读写高8位,方式3,十进制OUT DX,ALJMP K7;-------------------------------------------------------------------------DISP: MOV DX,A8255 ;数码管显示程序MOV BX,OFFSET LED ;BX指向数码管七段显示码缓冲区首址XLAT ;换码指令OUT DX,AL ;A口输出显示MOV DX,C8255MOV AL,11110111B ;第三个数码管显示OUT DX,ALRET;-------------------------------------------------------------------------DELAY: PUSH CX ;延时程序1MOV CX,0FFFFHDELAY1: LOOP DELAY1POP CXRET;-------------------------------------------------------------------------DYB: CALL CLEARMOV SI,OFFSET V ALUE ;指向电压值MOV AL,VR ;将2进制数转化成十进制电压值??MOV AH,00 ;!MOV CL,51 ;33H??DIV CLMOV [SI],AL ;电压值个位数INC SIMOV AL,AHMOV CL,10MUL CLMOV CL,51DIV CLMOV [SI],AL ;电压值小数点后第一位数INC SIMOV AL,AHMOV CL,10MUL CLMOV CL,51DIV CLMOV [SI],AL ;电压值小数点后第二位数CALL DISCALL CLEARJMP K7;--------------------------------------------------------------------------CLEAR: MOV DX,A8255 ;清屏子程序MOV AL,00H ;将段码置为全0输出到A口OUT DX,ALRET;--------------------------------------------------------------------------DIS: ;显示子程序MOV SI,OFFSET V ALUE ;SI指向电压值个位数MOV BX,OFFSET LED ;BX指向数码管七段显示码缓冲区首址MOV DX,C8255MOV AL,11111101B ;AL为显示11111101(X2选中)OUT DX,AL ;选中显示位MOV AL,[SI] ;取出电压值个位数XLAT ;根据数值取得对应的数码管七段显示码OR AL,80H ;加上小数点MOV DX,A8255 ;!OUT DX,AL ;输出七段显示码CALL DALLY ;延时,数码管显示INC SI ;SI指向电压值十分位数MOV DX,C8255MOV AL,11111011B ;AL为显示11111011(X3选中)OUT DX,AL ;选中显示位MOV AL,[SI] ;取出电压值十分位数XLAT ;根据数值取得对应的数码管七段显示码MOV DX,A8255OUT DX,AL ;输出七段显示码CALL DALLY ;延时,数码管显示INC SI ;SI指向电压值百分位数MOV DX,C8255MOV AL,11110111B ;AL为显示11110111(X4选中) OUT DX,AL ;选中显示位MOV AL,[SI] ;取出电压值百分位数XLAT ;根据数值取得对应的数码管七段显示码MOV DX,A8255OUT DX,AL ;输出七段显示码CALL DALLY ;延时,数码管显示RET ;返回;--------------------------------------------------------------------------DALLY: PUSH CX ;延时子程序2MOV CX,000FHT1: MOV AX,009FHT2: DEC AXJNZ T2 ;不等于0跳LOOP T1POP CXRET;-------------------------------------------------------------------------CODE ENDSEND START;-------------------------------------------------------------------------。