4.2 程序流程图
主程序 开始 初始化8255 调用启动DS18B20子程序 Y CF=1 N 延时1s 调用读温度子程序 转换后数据->3、2、1号数码管 4、5、6、7、8号数码管消隐 读18B20子程序 开始 8->CX 8255控制口地址->DX 80H->AL AL->[DX](0->PC0) 89H->AL AL->[DX](PC口输入) NOP NOP NOP 8255PC口地址->DX [DX]->AL ROR AL,1 RCR BL,1 开始 8->CX 调用0->PC0子程序 ROR AL,1 N CF=0 N 调用1->PC0子程序 Y 保存CX,恢复CX 返回 保存CX 12->CX CX-1=0 Y 恢复CX 调用1->PC0子程序 N CX-1=0 Y 返回 N CX-1=0 Y BL->AL 8255控制口地址->DX 80H->AL AL->[DX](0->PC0) 1->AL AL->[DX](1->PC0) 写18B20子程序 10
复位DS18B20子程序 开始 调用0->PC0子程序 (主机发出501us复位低脉冲) 136->CX N 启动DS18B20子程序 开始 调用复位DS18B20子程序 Y CF=1 N 0CCH->AL CX-1=0 Y 调用写DS18B20子程序(跳过ROM匹配) 0BEH->AL 调用写DS18B20子程序(发出温度转换指令) 0->CF 8255控制口地址->DX 89H->AX AL->[DX](PC输入状态) DX-1 15->CX 返回 读温度子程序 [DX]->AL N 136->CX 开始 调用复位DS18B20子程序 0CCH->AL CX-1=1 Y 0->CF N 调用写DS18B20子程序(跳过ROM匹配) 44H->AL 调用写DS18B20子程序(发出温度转换指令) 调用读18B20子程序 AL.0=1 Y N CX-1=0 Y 1->CF(18B20部不存在) 返回 AL->AH 调用读18B20子程序 AL与AH交换 返回 0->8255的PC0口子程序 开始 保存AX 8255的控制口-> DX 80H->AL AL->[DX](0->PC0口) 恢复AX 1->8255的PC0口子程序 开始 保存AX 8255的控制口-> DX 01H->AL AL->[DX](0->PC0口) 恢复AX 返回 返回 11
显示子程序 开始 存放字节子程序 开始 调用存放字节子程序 (AX内容->buffer) LEA DI,buffer CLD 100->CX PUSH CX 0FEH->AH STOSB STOSB STOSB STOSB 3->cx 返回 N [SI]->AL PA_8255->DX Y 换码 AL->DX PB_8255->DX AH->AL AL->DX ROL AH,1 INC SI N Cx= =0 Y POP CX cx= =0 Y 返回 N 12
4.3 程序代码
表 5-1转换表
0 1 3f60h h 2 5Bh
3 4Fh 4 66h
5 6dh
6 7dh
7 07h
8 7fh
9 6fh
A 77h
B 7ch
C 39h
D 5eh
E 79h
F 71h
.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 PA_8255 DW 00F0H PB_8255
DW 00F1H
PC_8255 DW 00F2H
buffer
DB 8 DUP(0)
;温度临时存放区 TAB db
3fh,06h,5bh,4fh,66h,6dh,7dh,07h,7fh,6fh,77h,7ch,39h,5eh,79h,71h
;七段显示器TAB db
3eh,05h,5ah,4eh,65h,6ch,7ch,06h,7eh,6eh,76h,7bh,38h,5dh,78h,70h
TAB1 db
0bfh,086h,0dbh,0cfh,0e6h,0edh,0fdh,087h,0ffh,0efh,0f7h,0fch,0b9h,0ceh,0f9h,0f1h .CODE START:
MOV AX,@DATA
MOV DS,AX MOV ES,AX
NOP
;DELAY?
CALL
InitPCI
13
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
;1;置位标
志位,表示DS18B2bu0存在
RET
INIT_18B20_2:
CALL Delay501us
CLC
;0;复位标
志位,表示DS18B存在
RET
INIT_18B20 ENDP
Delay501us PROC NEAR
PUSH AX PUSH CX
PUSH
DX
MOV CX,167
;?????
MOV DX,PA_8255
Delay501us_1:
IN AL,DX
LOOP
Delay501us_1
14