.MODEL TINY
PCIBAR3 EQU 1CH ;8位I/O空间基地址(它就是实验仪的基地址,也为DMA & 32 BIT RAM板卡上的
8237提供基地址)
Vendor_ID EQU 10EBH ;厂商ID号
Device_ID EQU 8376 ;设备ID号
.STACK 300
.DATA
IO_Bit8_BaseAddress DW ?
msg0 DB 'BIOS不支持访问PCI $'
msg1 DB '找不到Star PCI9052板卡 $'
msg2 DB '读8位I/O空间基地址时出错$'
Con_8255 DW 00F3H
PB_8255 DW 00F1H
PC_8255 DW 00F2H
PA_8255 DW 00F0H
buffer DB 8 DUP(0) ;温度临时存放区
.CODE
START:
MOV AX,@DATA
MOV DS,AX
MOV ES,AX
NOP
CALL InitPCI
CALL ModifyAddress ;根据PCI提供的基地址,将偏移地址转化为实地址
CALL Init8255 ;初始化8255
MAIN:
CALL START_Temperature ;向DS18B20发送读温度指令
JB MAIN
CALL RD_Temperature ;读出温度值
call displayNumber ;调用显示子程序
JMP MAIN
;DS18B20复位初始化子程序
INIT_18B20 PROC NEAR
CALL W_L ;调用0->PC0子程序
CALL Delay501us ;主机发出501us复位低脉冲
MOV DX,Con_8255 ;8255控制口地址->DX
MOV AX,89H ;设置控制字10001001
OUT DX,AL ;PC输入状态
DEC DX ;DX-1
MOV CX,15 ;15->CX
INIT_18B20_1:
IN AL,DX ;[DX]->AL
TEST AL,01H ; AL.0=1?
JZ INIT_18B20_2
LOOP INIT_18B20_1
STC ;置位标志位,表示DS18B20存在
RET
INIT_18B20_2:
CALL Delay501us
CLC ;复位标志位,表示DS18B20不存在
RET
INIT_18B20 ENDP
Delay501us PROC NEAR
PUSH AX
PUSH CX
PUSH DX
MOV CX,136
MOV DX,PA_8255
Delay501us_1:
IN AL,DX
LOOP Delay501us_1
POP DX