微机原理与接口技术课程设计---数字式温度计
来源:互联网 发布:国外订机票软件 编辑:程序博客网 时间:2024/05/01 08:20
.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
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
- 微机原理与接口技术课程设计---数字式温度计
- 微机原理与接口技术
- 微机原理与接口技术
- 微机原理与接口技术
- 微机原理与接口技术01-绪论
- 微机原理与接口技术02-基础
- 微机原理与接口技术一
- 微机原理与接口技术一
- 微机原理与接口技术-基本概念
- 微机原理课程设计-接口芯片编程记录
- 微机原理及接口技术
- 2010年微机原理与接口技术考试试
- 微机原理与接口技术多媒体教学课件 -- 太原理工大学
- 微机原理与接口技术之“MOV指令”
- 微机原理与接口技术-02 微型计算机基础
- 微机原理与接口技术-03微型计算机基础
- 微机原理与接口技术之8086的编程结构
- 微机原理与接口技术学习笔记 -1
- C#反射Reflection学习随笔(完结篇)_AX
- axis 传输 简单对象,复杂对象,List,Map等收藏
- csdn第一次写东西!
- javascript贪吃蛇完整版
- select详解及代码释义
- 微机原理与接口技术课程设计---数字式温度计
- DLL和LIB加载方式的区分
- 5-14
- MySql5.0常用命令
- 今天学到的常用Eclipse快捷键
- C++ sizeof 使用规则及陷阱分析
- 收藏:中国3G市场用户调研报告2009
- SQL2005CLR函数扩展-天气服务
- Ubuntu安装新字体