|
;===================================================================================
; Main.asm file generated by New Project wizard
;
; Created: //周四 6 月 7 2018
; Processor: 80C51
; Compiler: ASEM-51 (Proteus)
;===================================================================================
$NOMOD51
$INCLUDE (8051.MCU)
;===================================================================================
; DEFINITIONS
;===================================================================================
;===================================================================================
; VARIABLES
;===================================================================================
;===================================================================================
; RESET and INTERRUPT VECTORS
;===================================================================================
FLAG BIT F0 ; //聲明傳感器復(fù)位返回的標(biāo)志位
DQ BIT P1.7 ; //定義DQ 作為數(shù)據(jù)傳輸端口名
ABIT EQU 35H
BBIT EQU 36H
CBIT EQU 37H ; //固定個(gè),十,百位的存儲(chǔ)位置,名稱
ORG 0000H
AJMP MAIN
ORG 0100H
;//主程序
MAIN: LCALL INIT_1 ; //復(fù)位
LCALL FBLCHANGE ; //改變溫度的初始分辨率為9位
LCALL GET_TEMP ; //得到溫度
AJMP CHANGE ; //跳轉(zhuǎn)到數(shù)據(jù)處理子程序
;//復(fù)位程序
INIT_1:SETB DQ ; //總線釋放
NOP ; //保持高電平,延時(shí)
CLR DQ ; //總線置 0,請(qǐng)求響應(yīng)
MOV R0,#0FBH
TSR1: DJNZ R0,TSR1 ; //延時(shí)
SETB DQ ; //再釋放
MOV R0,#25H
TSR2: JNB DQ,TSR3 ; //改變?yōu)?0,則代表得到對(duì)應(yīng)
DJNZ R0,TSR2 ; //未得到則繼續(xù)等待,判斷
TSR3: SETB FLAG ; //得到相應(yīng)則標(biāo)志位置 1,代表傳感器正常存在
MOV R0,#06BH
TSR4: DJNZ R0,TSR4 ; //延時(shí)
SETB DQ ; //釋放總線,完成復(fù)位
RET
;//改變溫度分辨率
FBLCHANGE:
LCALL INIT_1 ; //復(fù)位
MOV A,#0CCH ; //跳過ROM
LCALL WRITE ; //把A寫入傳感器
MOV A,#1FH ; //改變溫度分辨率為9
LCALL WRITE ; //把A寫入傳感器
RET
://得到溫度并轉(zhuǎn)換
GET_TEMP:
SETB DQ ; //釋放總線
LACALL INIT_1 ; //復(fù)位
JB FLAG,TSS1 ; //若傳感器不存在,則直接返回主程序
RET
TSS2: MOV A,#0CCH
LCALL WRITE ; //執(zhí)行跳過ROM指令
MOV A,#44H
LCALL WRITE ; // 執(zhí)行測(cè)溫指令
LCALL DISPLAY ; //不僅延時(shí),還讓程序完全生效前數(shù)碼管置零
LCALL INIT_1 ; //復(fù)位
MOV A,#0CCH
LCALL WRITE ; //執(zhí)行跳過ROM置零
MOV A,#0BEH
LCALL WRITE ; //執(zhí)行讀取溫度數(shù)據(jù)指令
LCALL READ ; //跳轉(zhuǎn)至通信子程序
RET
;//寫入數(shù)據(jù) ; 注:不可超過120us,否則無法寫入
WRITE:MOV R2,#8 ; //寫入八位二進(jìn)制碼,即循環(huán)次數(shù)
CLR C ; //進(jìn)位標(biāo)志位初始置零
WR1: CLR DQ ; //拉低總線為寫入做準(zhǔn)備
MOV R3,#6
DJNZ R3,$ ; //快速延時(shí)
RRC A
MOV DQ,C ; //將A又循環(huán)寫入C,寫入總線以輸入到傳感器
MOV R3,#23
DJNZ R3,$ ; //快速延時(shí)
SETB DQ ; //釋放,表示此位寫入完畢
NOP
DJNZ R2,WR1 ; //循環(huán)八次,一次寫入八位
SETB DQ ; //釋放總線
RET
;//讀入數(shù)據(jù)
READ: MOV R4,#2 ; //讀取兩個(gè)八位數(shù)據(jù),是外層循環(huán)次數(shù)
MOV R1,#29H ; //立即數(shù)尋址給定存儲(chǔ)位置
REE0: MOV R2,#8 ; //給定數(shù)據(jù)位數(shù),是內(nèi)層循環(huán)次數(shù)
REE1: CLR C ; //進(jìn)位標(biāo)志位初始置零
SETB C
NOP
NOP
CLR DQ
NOP
NOP
NOP
SETB DQ ; //輸入脈沖并持續(xù)2-3個(gè)機(jī)器周期
MOV R3,#7
DJNZ R3,$ ; //快速延時(shí),等待傳感器響應(yīng)
MOV C,DQ ; //按位讀出
MOV R3,#23
DJNZ R3,$ ; //快速延時(shí)
RRC A ; //把C存入A內(nèi)
DJNZ R2,REE1 ; //循環(huán)8次
MOV @R1,A ; //存儲(chǔ)A
DEC R1 ; //更換地址
DJNZ R4,REE0 ; //循環(huán)2次
RET
;//數(shù)據(jù)處理函數(shù)
CHANGE:
MOV A,29H
MOV 26H,29H
MOV 25H,28H
MOV 24H,28H ; //在24H存儲(chǔ)原始數(shù)據(jù)防止丟失
MOV C,25H.7 ; //存儲(chǔ)符號(hào)位進(jìn)C
JNC SN1 ; //判斷溫度的正負(fù),正數(shù)則跳過轉(zhuǎn)補(bǔ)碼程序
MOV A,25H
CPL A ; //取補(bǔ)碼,由于無效位置1,25H不必?fù)?dān)心數(shù)據(jù)溢出
MOV 25H,A
MOV A,26H
CPL A
INC A ; //由于是末位,需要加一
MOV 26H,A
MOV 29H,26H
MOV 28H,25H ; //在26H,25H中操作后放回29H,28H
SN1: MOV C,28H.0 ; //正負(fù)溫度到此均得到整數(shù)部分絕對(duì)值
RRC A
MOV C,28H.1
RRC A
MOV C,28H.2
RRC A
MOV C,28H.3 ; //分別循環(huán),存入A內(nèi),連續(xù)4次濾掉小數(shù)部分
RRC A ; //可分析A內(nèi)八位恰為整數(shù)部分(最高位為0)
JC SL0
MOV 27H,#00H
AJMP SL5
SL0: MOV 27H,#05H
SL5: MOV 29H,A ; //為小數(shù)部分顯示0和5做準(zhǔn)備
LCALL DISPLAY ; //轉(zhuǎn)入顯示函數(shù)
LJMP MAIN ; //返回主函數(shù),程序執(zhí)行完畢
;//顯示函數(shù)
DISPLAY:
MOV A,29H
MOV B,#10
DIV AB
MOV ABIT,B
MOV B,#10
DIV AB
MOV BBIT,B
MOV CBIT,A ; //此時(shí)可知CBA即為百十個(gè)位
MOV R0,#4 ; //循環(huán)顯示
DPL1: MOV R1,#250 ; //長時(shí)間延時(shí)循環(huán)
DPL2: MOV C,24H.7
JNC DPL3
MOV P0,#0BFH
SETB P1.2
LCALL DELAY
CLR P1.2
AJMP DPL4
DPL3: MOV P0,#0FFH
SETB P1.2
LCALL DELAY
CLR P1.2 ; //符號(hào)位判斷顯示
DPL4: MOV DPTR,#TAB
MOV A,27H
MOVC A,@A+DPTR
MOV P0,A
SETB P1.6
LCALL DELAY
CLR P1.6 ; //小數(shù)位判斷顯示
MOV A,ABIT
MOV DPTR,#TAB1
MOVC A,@A+DPTR
MOV P0,A
SETB P1.5
LCALL DELAY
CLR P1.5
MOV A,BBIT
MOV DPTR,#TAB
MOVC A,@A+DPTR
MOV P0,A
SETB P1.4
LCALL DELAY ; //個(gè)十百位顯示
CLR P1.4
MOV A,CBIT
MOVC A,@A+DPTR
MOV P0,A
SETB P1.3
LCALL DELAY
CLR P1.3
DJNZ R1,DPL2
DJNZ R0,DPL1
RET
;//延遲函數(shù)
DELAY:MOV R5,#10
DEL0: MOV R6,#1
DEL1: MOV R7,#20
DEL2: DJNZ R7,DEL2
DJNZ R6,DEL1
DJNZ R5,DEL0
RET
TAB: ; //正常陽極數(shù)碼0-9
DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H
TAB1: ; //帶小數(shù)點(diǎn)的個(gè)位顯示數(shù)碼0-9
DB 40H,79H,24H,30H,19H,12H,02H,78H,00H,10H
LOOP:
JMP LOOP ;====================================================================
END
|
|