JMP Exit
InitPCI2: MOV AH,0B1H
MOV AL,02H MOV CX,Device_ID MOV DX,Vendor_ID MOV SI,0 INT 1AH JNC InitPCI3 ;是否存在Star PCI9052板卡
LEA DX,msg1 JMP
InitPCI1
InitPCI3: MOV DI,PCIBAR3
MOV AH,0B1H MOV AL,09H INT 1AH
;读取该卡PCI9052基地址
JNC InitPCI4 LEA DX,msg2 JMP
InitPCI1
InitPCI4: AND
CX,0FFFCH
MOV IO_Bit8_BaseAddress,CX
RET
InitPCI
ENDP
ModifyAddress PROC NEAR ADD CTL_ADDR,CX ADD DATA_ADDR,CX ADD W_8253_T0,CX ADD W_8253_C,CX
RET ModifyAddress ENDP Exit: MOV AH,4CH
INT 21H
END START
20
2、双机通信接收机源程序 .MODEL
TINY
;使用8253的计数器0,外接2Mhz,经26分频后,送给8251,产生4800bps PCIBAR3 EQU 1CH ;8位I/O空间基地址(它就是实验仪的基地址,也为DMA & 32 BIT RAM板卡上的8237提供基地址) Vendor_ID EQU Device_ID EQU
.STACK 100 .DATA
;控制字或状态字 ;读写数据
10EBH ;厂商ID号 8376
;设备ID号
Receive_Buffer EQU 3000H
CTL_ADDR DW 00F1H W_8253_T0 DW 00B0H W_8253_C DW 00B3H
IO_Bit8_BaseAddress DW msg0 msg1 msg2
?
DATA_ADDR DW 00F0H
;计数器0地址 ;控制字
DB 'BIOS不支持访问PCI $' DB '找不到Star PCI9052板卡 $' DB '读8位I/O空间基地址时出错$'
//Receive_Buffer DB 10 DUP(0) ;接受缓冲器
.CODE
MOV DS,AX MOV ES,AX NOP
CALL InitPCI
START: MOV AX,@DATA
CALL ModifyAddress ;根据PCI提供的基地址,将偏移地址转化为实地址
CALL INIT_8253 CALL INIT_8251
MOV CX,10
;OUT1输出频率为1S的方波
CALL Receive_Group CALL IfExit JZ START1
21
START1:
JMP Exit
INIT_8253 PROC NEAR MOV DX,W_8253_C MOV AL,37H
;定时器0,方式3
OUT DX,AL
MOV DX,W_8253_T0 MOV AL,26H
;BCD码26(2000000/26)=16*4800 OUT DX,AL MOV AL,0 OUT DX,AL
RET
INIT_8253 ENDP INIT_8251 PROC NEAR CALL RESET_8251 MOV DX,CTL_ADDR MOV AL,7EH ;波特率系数为16,8个数据位 OUT DX,AL ;一个停止位,偶校验 CALL DLTIME
;延时
MOV AL,14H
;只允许接收数据,清错误标志,
OUT DX,AL CALL DLTIME
RET
INIT_8251 ENDP
;8251的复位,对8251的控制口进行一次写入后须有恢复时间 Reset_8251 PROC NEAR
MOV DX,CTL_ADDR
MOV AL,0 OUT DX,AL
;向控制口写入\ CALL DLTIME ;延时,等待写操作完成 OUT DX,AL ;向控制口写入\ CALL DLTIME ;延时 OUT DX,AL ;向控制口写入\
CALL DLTIME
;延时
MOV AL,40H
;向控制口写入复位字40H
OUT DX,AL
22
CALL DLTIME
RET
Reset_8251 ENDP
;接受一组数据,CX--接受数目 Receive_Group PROC NEAR MOV DI,Receive_Buffer
Receive_Group1:
CALL Receive_Byte
STOSB
MOV AH,06H
MOV BX,3000H
INT 10H ;显示中断调用 LOOP Receive_Group1
RET
Receive_Group ENDP ;接受一个字节 Receive_Byte PROC NEAR
MOV DX,CTL_ADDR Receive_Byte1: IN AL,DX
;读入状态
TEST AL,02H JZ Receive_Byte1 ;有数据吗?
MOV DX,DATA_ADDR
;有
IN AL,DX
RET
Receive_Byte ENDP ;延时 DLTIME
PROC NEAR
PUSH AX PUSH DX MOV DX,1 ;延时1ms MOV AH,0FFH
;星研公司提供的软中断
INT 21H POP DX POP AX
RET
DLTIME
ENDP
23
相关推荐: