微机原理与接口技术课程设计---数字式温度计

来源:互联网 发布:国外订机票软件 编辑:程序博客网 时间:2024/05/01 08:20

 

.MODEL   TINY

PCIBAR3      EQU 1CH ;8I/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  '8I/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

      POP CX

      POP AX

      RET

Delay501us   ENDP

 

Delay50us PROC   NEAR

      PUSH   AX

      PUSH   CX

      PUSH   DX

      MOV CX,12

      MOV DX,PA_8255

Delay50us_1:

     IN  AL,DX

      LOOP   Delay50us_1

      POP DX

      POP CX

      POP AX

      RET

Delay50us ENDP

 

;写操作

WRITE_18B20  PROC   NEAR

      MOV CX,8       ;一共8位数据

WRI:     CALL   W_L    ;0->PC0

      CALL   Delay501us

      ROR AL,1

      JNB WRI1

      CALL   W_H

WRI2: CALL   Delay50us

      CALL   W_H

      LOOP   WRI

      RET

WRI1: PUSH   CX

      POP CX

      JMP WRI2

WRITE_18B20  ENDP

 

;读操作

READ_18B20   PROC   NEAR

          MOV    CX,8       ;数据一共有8

Read:   CALL Delay50us

      MOV DX,Con_8255

      MOV AL,80H

      OUT DX,AL      ;0->PC0

      MOV AL,89H

      OUT DX,AL      ;输入状态

      CALL   Delay8us

      MOV DX,PC_8255

      IN  AL,DX

      ROR AL,1

      RCR BL,1

      LOOP   Read

      MOV AL,BL

      RET

READ_18B20   ENDP      

 

;******************************

; 判断DS18B20是否存在,启动DS18B20     ;CY为判断标志

;******************************

START_Temperature proc near

      CALL   INIT_18B20 ;先复位DS18B20

      JB GET_T     ;判断DS1820是否存在?DS18B20不存在则返回

      MOV    AL,0CCH       ;跳过ROM匹配

      CALL   WRITE_18B20    

      MOV    AL,44H     ;发出温度转换命令

      CALL   WRITE_18B20    

      CLC

GET_T:       RET

START_Temperature endp

;******************************

; 读出转换后的温度值,存在AX

;******************************

RD_Temperature proc    near

      CALL INIT_18B20      ;准备读温度前先复位

      MOV    AL,0CCH       ;跳过ROM匹配

      CALL   WRITE_18B20 

      MOV    AL,0BEH    ;发出读温度命令

      CALL   WRITE_18B20 

      CALL   READ_18B20 ;调用读18B20子程序,读出温度

      MOV AH,AL      ;存放到AX

      CALL   READ_18B20      ;调用读18B20子程序

      XCHG   AL,AH      ;先读低8位再读高8   

      RET

RD_Temperature endp

 

Init8255 PROC   NEAR

      MOV DX,Con_8255   ;8255的控制口-> DX

      MOV AL,89H

      OUT DX,AL

  ;   DEC DX

      RET

Init8255 ENDP

 

;C口置为输出

W_L      PROC   NEAR

      PUSH   AX

      MOV DX,Con_8255

      MOV AL,80H

      OUT DX,AL

      POP AX

      RET

W_L      ENDP

 

; 1

W_H      PROC   NEAR

      PUSH   AX

      MOV DX,Con_8255

      MOV AL,0EH

      OUT DX,AL

      POP AX

      RET

W_H      ENDP

;***************************

displayNumber   proc   near;8255写入显示的数

 

  PUSH   BX

  MOV BL,AL

  AND BL,0FH

  push   ax

  mov al,bl

  call   convertem

  mov buffer,al

  pop ax

  PUSH   CX

  MOV CL,4

  SHR AX,CL

  CALL   PRINTNUM

  SHL AX,CL

  POP CX

  OR  AL,BL

  POP BX

  mov     si,ax    

T1:  

  push   cx

  push   ax

 

  mov dx,PA_8255

  mov al,buffer

  and al,0fh

  call   convert

  out dx,al 

  mov dx,PB_8255

  mov al,11111110b

  out dx,al

     

  call   port

 

  mov al,buffer

  mov cl,4

  shr al,cl

  call   convert

  mov dx,PA_8255

  out dx,al 

  mov dx,PB_8255

  mov al,11111101b

  out dx,al

 

IDIE:                  

  call   port

 

  mov     ax,si

  mov dx,PA_8255

  MOV CL,4      

  shr al,cl

  call   convertp  

  out dx,al

  mov dx,PB_8255

  mov al,11111011b

  out dx,al

IDIE1: 

  call   port         

 

  mov ax,si

  mov dx,PA_8255

  mov al,ah

  and al,0fh

  call   convert   

  out dx,al

  mov dx,PB_8255

  mov al,11110111b

  out dx,al

IDIE2:                

  call   port

  mov dx,PA_8255

  mov cl,12

  ror ax,cl

  and al,0fh

  call   convert

  out dx,al

  mov dx,PB_8255

  mov al,11101111b

  out dx,al 

IDIE3:

  call   port

  pop    ax

  pop    cx

      loop   T1

      ret

displayNumber   endp

 

PRINTNUM PROC    

  PUSH   BX

      PUSH   CX

        MOV   CX,AX

         SUB   AX,AX   

         SUB   BX,BX

COUNT:

  ADD   AL,1H

        PUSH AX

        SUB   AL,0AH   

        JZ     GOTEN

        POP   AX

        JMP   NEXT

GOTEN:   POP   AX

        MOV   AL,0H

        ADD   AH,1H

        PUSH AX

        SUB   AH,0AH  

        JZ     GOHUNDRED

        POP   AX

        JMP   NEXT

GOHUNDRED:

  POP   AX

        MOV   AH,0H

        ADD   BL,1H

        PUSH BX

  SUB BL,0AH

  JZ GOTHOUSAND

  POP BX

  JMP NEXT

GOTHOUSAND:

  POP BX

  MOV BL,0H

  ADD BH,1H

NEXT: LOOP COUNT

  PUSH   CX

  PUSH   BX

 

  MOV CL,4

  SHL AH,CL

  AND AH,0F0H

  AND AL,0FH

  ADD AL,AH

  MOV CL,4

  ROR BH,CL

  AND BH,0F0H

  AND BL,0FH

  OR  BH,BL

  MOV AH,BH

  POP   BX

        POP   CX

OVER:

          POP   CX

          POP   BX

         RET

PRINTNUM ENDP

port  proc   near

  mov dx,PB_8255

  mov al,0ffh

  out dx,al

  ret

port  endp

;==============================

TAB db 3fh,06h,5bh,4fh,66h,6dh,7dh,07h,7fh,6fh,77h,7ch,39h,5eh,79h,71h

TABp DB 0bfh,86H,0DBH,0CFH,0E6H,0EDH,0FDH,87H,0FFH,0EFH;,0F7H,0FCH,0B9H,0DEH,0F9H,0F1H

tem   db  06H,13H,19H,25H,31H,38H,44H,50H,56H,63H,69H,75H,81H,88H,94H

convertem proc   near

      push   bx

      mov bx,offset  tem

      xlat

      pop bx 

      ret

convertem endp

convert  proc near

      push   bx

      mov bx,offset TAB

      xlat

      pop bx

      ret

     

convert      endp

convertp proc near

      push   bx

      mov bx,offset TABp

      xlat

      pop bx

      ret

convertp     endp

;==============================

InitPCI      PROC   NEAR

        MOV AH,00H

        MOV AL,03H

        INT 10H    ;清屏

      MOV AH,0B1H

      MOV AL,01H

      INT 1AH

      CMP AH,0

      JZ  InitPCI2

      LEA DX,msg0

InitPCI1:

      MOV AH,09H

      INT 21H

      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 Con_8255,CX

      ADD PB_8255,CX

      ADD PC_8255,CX

      ADD PA_8255,CX

      RET

ModifyAddress   ENDP

 

Exit:    MOV AH,4CH

      INT 21H   

       END START