標(biāo)題:
多功能檢測(cè)儀程序(4路溫度控制)
[打印本頁(yè)]
作者:
daniu
時(shí)間:
2014-12-26 23:39
標(biāo)題:
多功能檢測(cè)儀程序(4路溫度控制)
;*******************************************************************
;*溫度控制程序,在LCD屏幕上顯示4路溫度(車內(nèi)外溫度、水溫、油溫)
;分兩頁(yè)顯示,每頁(yè)顯示2路溫度,溫度傳感器開(kāi)路時(shí)語(yǔ)音報(bào)警和顯示故障
;水溫、油溫超溫報(bào)警
;*LCD12864顯示,晶振11.0592M
;*******************************************************************
;-----------------------------------------------------------
;以下參數(shù)可以修改
;-----------------------------------------------------------
XSYSSJ DATA 40 ;顯示延時(shí)時(shí)間
XSGZSJ DATA 40 ;故障顯示延時(shí)時(shí)間
CNBJCS DATA 2 ;車內(nèi)溫度傳感器出故障報(bào)警次數(shù)
CWBJCS DATA 2 ;車外溫度傳感器出故障報(bào)警次數(shù)
SWBJCS DATA 2 ;水溫傳感器故出障報(bào)警次數(shù)
YWBJCS DATA 2 ;油溫度傳感器出故障報(bào)警次數(shù)
SWGWSD DATA 50 ;水溫超高報(bào)警值(單位℃)
SWDWSD DATA 23 ;水溫超低報(bào)警值(單位℃)
YWGWSD DATA 40 ;油溫超高報(bào)警值(單位℃)
YWDWSD DATA 25 ;油溫超低報(bào)警值(單位℃)
;-----------------------------------------------------------
;以下參數(shù)不宜修改
;-----------------------------------------------------------
FLAG0 BIT 20H.0 ;車內(nèi)溫度傳感器標(biāo)志
FLAG1 BIT 20H.1 ;車外溫度傳感器標(biāo)志
FLAG2 BIT 20H.2 ;水溫傳感器標(biāo)志
FLAG3 BIT 20H.3 ;油溫傳感器標(biāo)志
FLAG4 BIT 20H.4 ;車內(nèi)溫度傳感器故障標(biāo)志位,1為故障0為正常
FLAG5 BIT 20H.5 ;車外溫度傳感器故障標(biāo)志位,1為故障0為正常
FLAG6 BIT 20H.6 ;水溫傳感器故障標(biāo)志位,1為故障0為正常
FLAG7 BIT 20H.7 ;油溫傳感器故障標(biāo)志位,1為故障0為正常
FLAH0 BIT 21H.0 ;溫度正負(fù)標(biāo)志,1為負(fù)0為正,正不顯示
FLAH1 BIT 21H.1 ;水溫過(guò)高標(biāo)志,1為過(guò)高
FLAH2 BIT 21H.2 ;油溫過(guò)高標(biāo)志,1為過(guò)高
;-----------------------------------------------------------
XSYS DATA 22H ;顯示延時(shí)時(shí)間存放單元
LCD_X EQU 23H ;LCD 地址變量
TEMP_ZH DATA 24H ;實(shí)時(shí)溫度值存放單元
TEMPL DATA 25H ;溫度低位值存放單元
TEMPH DATA 26H ;溫度高位值存放單元
TEMP_TH DATA 27H ;高溫報(bào)警值存放單元
TEMP_TL DATA 28H ;低溫報(bào)警值存放單元
YY_DAT DATA 29H ;語(yǔ)音地址存放單元
CNBJ DATA 2AH ;車內(nèi)溫度傳感器故障報(bào)警次數(shù)存放單元
CWBJ DATA 2BH ;車外溫度傳感器故障報(bào)警次數(shù)存放單元
SWBJ DATA 2CH ;水溫傳感器故障報(bào)警次數(shù)存放單元
YWBJ DATA 2DH ;油溫傳感器故障報(bào)警次數(shù)存放單元
YYDAT DATA 2EH ;語(yǔ)音發(fā)碼值暫存地址
;-----------------------------------------------------------
CNCGBJ DATA 30 ;“車內(nèi)溫度傳感器出故障,請(qǐng)檢查”語(yǔ)音地址
CWCGBJ DATA 31 ;“車外溫度傳感器出故障,請(qǐng)檢查”語(yǔ)音地址
SWCGBJ DATA 32 ;“水溫傳感器出故障,請(qǐng)檢查”語(yǔ)音地址
YWCGBJ DATA 33 ;“油溫傳感器出故障,請(qǐng)檢查”語(yǔ)音地址
;-----------------------------------------------------------
;以下參數(shù)是固定的,不要修改
;-----------------------------------------------------------
YYRST EQU P3.3 ;語(yǔ)音模塊復(fù)位信號(hào)引腳
BUSY EQU P1.0 ;語(yǔ)音忙控制端,0為正在播放1為沒(méi)有播放
YYSDA EQU P1.1 ;語(yǔ)音模塊數(shù)據(jù)引腳
CG_CHENEI EQU P1.4 ;車內(nèi)溫度傳感器數(shù)據(jù)線
CG_CHEWAI EQU P1.5 ;車外溫度傳感器數(shù)據(jù)線
CG_SHUIWE EQU P1.6 ;水溫傳感器數(shù)據(jù)線
CG_YOUWEN EQU P1.7 ;油溫傳感器數(shù)據(jù)線
;-----------------------------------------------------------
LCD_RS EQU P4.0 ;LCD 數(shù)據(jù)/命令選擇端
LCD_RW EQU P4.1 ;LCD 讀/寫(xiě)選擇端
LCD_EN EQU P4.2 ;LCD 使能信號(hào)
LCD_BG EQU P4.3 ;LCD 背光控制端
LCD_SJ EQU P0 ;LCD 數(shù)據(jù)
;===========================================================
ORG 0000H
AJMP MAIN
ORG 0100H
;===========================================================
MAIN: MOV SP,#60H
MOV A,#00H
MOV R0,#20H ;將 20H-2FH 單元清零
MOV R1,#10H
CLEAR: MOV @R0,A
INC R0
DJNZ R1,CLEAR
CLR LCD_BG ;打開(kāi)LCD背光
CALL SET_LCD ;初始化 LCD
MOV CNBJ,#CNBJCS ;設(shè)置車內(nèi)溫度傳感器故障報(bào)警次數(shù)
MOV CWBJ,#CWBJCS ;設(shè)置車外溫度傳感器故障報(bào)警次數(shù)
MOV SWBJ,#SWBJCS ;設(shè)置水溫傳感器故障報(bào)警次數(shù)
MOV YWBJ,#YWBJCS ;設(shè)置油溫傳感器故障報(bào)警次數(shù)
;LCALL TEMP
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
;##########################################################
;以下溫度顯示程序(車內(nèi)外溫度、水溫、油溫)
;-----------------------------------------------------------
;用到的資源:R0~R7,A、B、C,20H~2EH,P4,P3.3,P1.0,P1.4~P1.7
;-----------------------------------------------------------
;##########################################################
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;**************顯示第一頁(yè)溫度(車內(nèi)外溫度)
TEMP: CALL MENU_OK1 ;顯示溫度菜單1
MOV TEMP_TH,#00H ;溫度低位值存放單元
MOV TEMP_TL,#00H ;溫度低位值存放單元
SETB FLAG0 ;開(kāi)始讀取車內(nèi)溫度傳感器,設(shè)標(biāo)志為1
CLR FLAG1
CLR FLAG2
CLR FLAG3
MOV XSYS,#XSYSSJ ;每頁(yè)顯示時(shí)間
;讀取和顯示車內(nèi)溫度
L1: CALL RESET ;18B20復(fù)位子程序
JB FLAG4,L2 ;檢查車外溫度傳感器是否正常
CALL BJ1 ;調(diào)用報(bào)警程序
MOV XSYS,#XSGZSJ ;重新設(shè)每頁(yè)顯示時(shí)間
SJMP L3 ;傳感器出故障不再顯示該溫度
L2: CALL READ_TEMP ;讀出溫度與報(bào)警數(shù)據(jù)
CALL CONVTEMP ;轉(zhuǎn)換處理溫度為BCD碼
CALL CONV01 ;顯示車內(nèi)溫度
L3: CLR FLAG0
SETB FLAG1
CLR FLAG2
CLR FLAG3
;讀取和顯示車外溫度
CALL RESET ;18B20復(fù)位子程序
JB FLAG5,L4 ;檢查車內(nèi)溫度傳感器是否正常
CALL BJ2 ;調(diào)用報(bào)警程序
SJMP L5 ;傳感器出故障不再顯示該溫度
L4: CALL READ_TEMP ;讀出溫度與報(bào)警數(shù)據(jù)
CALL CONVTEMP ;轉(zhuǎn)換處理溫度為BCD碼
CALL CONV02 ;顯示車外溫度
L5: SETB FLAG0
CLR FLAG1
CLR FLAG2
CLR FLAG3
JB FLAG4,L71
JB FLAG5,L71
MOV R0,#XSGZSJ
L70: ACALL DELAY
DJNZ R0,L70
SJMP L6
L71: ACALL DELAY ;延時(shí)
DEC XSYS ;車內(nèi)外溫度顯示頁(yè)顯示一段時(shí)間,以便觀察
MOV A,XSYS
JZ L6
SJMP L1
;**************顯示第二頁(yè)溫度(水溫和油溫)
L6: CALL MENU_OK2 ;顯示溫度菜單2
MOV XSYS,#XSYSSJ ;重新設(shè)每頁(yè)顯示時(shí)間
CLR FLAG0
CLR FLAG1
SETB FLAG2
CLR FLAG3
;讀取和顯示水溫
L7: CALL RESET ;傳感器復(fù)位子程序
JB FLAG6,L8 ;檢查水溫傳感器是否正常
CALL BJ3 ;調(diào)用報(bào)警程序
SJMP L9
L8: CALL READ_TEMP ;讀出溫度與報(bào)警數(shù)據(jù)
CALL CONVTEMP ;轉(zhuǎn)換處理溫度為BCD碼
CALL TEMP_COMP ;溫度比較子程序
CALL CONV01 ;顯示水溫
L9: CLR FLAG0
CLR FLAG1
CLR FLAG2
SETB FLAG3
;讀取和顯示油溫
CALL RESET ;傳感器復(fù)位子程序
JB FLAG7,L10 ;檢查油溫傳感器是否正常
CALL BJ4 ;調(diào)用報(bào)警程序
SJMP L11
L10: CALL READ_TEMP ;讀出溫度與報(bào)警數(shù)據(jù)
CALL CONVTEMP ;轉(zhuǎn)換處理溫度為BCD碼
CALL TEMP_COMP ;溫度比較子程序
CALL CONV02 ;顯示油溫
L11: CLR FLAG0
CLR FLAG1
SETB FLAG2
CLR FLAG3
JB FLAG6,L81
JB FLAG7,L81
MOV R0,#XSGZSJ
L80: ACALL DELAY
DJNZ R0,L80
SJMP L82
L81: ACALL DELAY
DEC XSYS ;水溫、油溫顯示頁(yè)顯示一段時(shí)間,以便觀察
MOV A,XSYS
JZ L82
AJMP L7
L82: AJMP MAIN
RET
;------------------------------------------------------
;報(bào)警程序,傳感器故障聲音報(bào)警和LCD顯示
;------------------------------------------------------
BJ1: MOV A,CNBJ ;車內(nèi)溫度故障報(bào)警和顯示
JZ L13 ;聲音報(bào)警N次后不再報(bào)警,只顯示故障
MOV YY_DAT,#CNCGBJ;報(bào)出“車內(nèi)溫度傳感器出故障,請(qǐng)檢查”
JNB BUSY,L13 ;如果正在播放語(yǔ)音則跳過(guò),只顯示故障
DEC CNBJ ;車內(nèi)溫度傳感器語(yǔ)音報(bào)警次數(shù)倒計(jì)數(shù)
SJMP L12 ;故障語(yǔ)音報(bào)警
BJ2: MOV A,CWBJ ;車外溫度故障報(bào)警和顯示
JZ L15 ;聲音報(bào)警N次后不再報(bào)警,只顯示故障
MOV YY_DAT,#CWCGBJ;報(bào)出“車外溫度傳感器出故障,請(qǐng)檢查”
JNB BUSY,L15 ;如果正在播放語(yǔ)音則跳過(guò),只顯示故障
DEC CWBJ ;車外溫度傳感器語(yǔ)音報(bào)警次數(shù)倒計(jì)數(shù)
SJMP L14 ;故障顯示
BJ3: MOV A,SWBJ ;水溫故障報(bào)警和顯示
JZ L13 ;聲音報(bào)警N次后不再報(bào)警,只顯示故障
MOV YY_DAT,#SWCGBJ;報(bào)出“水溫傳感器出故障,請(qǐng)檢查”
JNB BUSY,L13 ;如果正在播放語(yǔ)音則跳過(guò),只顯示故障
DEC SWBJ ;水溫傳感器語(yǔ)音報(bào)警次數(shù)倒計(jì)數(shù)
L12: ACALL YUYIN ;語(yǔ)音播放
L13: MOV A,#90H ;顯示在第二行
SJMP L16 ;故障顯示
BJ4: MOV A,YWBJ ;油溫故障報(bào)警和顯示
JZ L15 ;聲音報(bào)警N次后不再報(bào)警,只顯示故障
MOV YY_DAT,#YWCGBJ;報(bào)出“油溫傳感器出故障,請(qǐng)檢查”
JNB BUSY,L15 ;如果正在播放語(yǔ)音則跳過(guò),只顯示故障
DEC YWBJ ;油溫傳感器語(yǔ)音報(bào)警次數(shù)倒計(jì)數(shù)
L14: ACALL YUYIN ;語(yǔ)音播放
L15: MOV A,#98H ;顯示在第四行
L16: MOV DPTR,#MUNE1 ;指針指到顯示信息區(qū)
CALL WCOM
L203: CLR A ;填入字符
MOVC A,@A+DPTR ;由信息區(qū)取出字符
CJNE A,#0,L205 ;判斷是否為結(jié)束碼
RET
L205: CALL WDATA ;寫(xiě)入數(shù)據(jù)
INC DPTR ;指針加1
JMP L203 ;繼續(xù)填入字符
MUNE1: DB"探頭故障請(qǐng)檢查!",0 ;溫度探頭不正常報(bào)警程序
;--------------------------------------------------------------------
;傳感器讀溫度子程序
; 將溫度低位、高位、TH、TL從傳感器中讀出
; 分別存入 25H、26H、27H、28H 單元中
;--------------------------------------------------------------------
READ_TEMP:MOV A,#0CCH ; 跳過(guò)ROM匹配
CALL WRITE
MOV A,#44H ; 發(fā)出溫度轉(zhuǎn)換命令
CALL WRITE
CALL RESET
MOV A,#0CCH ; 跳過(guò)ROM匹配
CALL WRITE
MOV A,#0BEH ; 發(fā)出讀溫度命令
CALL WRITE ;先寫(xiě)入命令
MOV R4,#4 ;存入4個(gè)單元中
MOV R1,#TEMPL ;存入單元的首地址送入 R1
RE00: MOV R2,#8 ;8位數(shù)據(jù)長(zhǎng)度
RE01: CLR CY
;***********************
JNB FLAG0,L01
SETB CG_CHENEI
NOP
NOP
CLR CG_CHENEI ;讀前總線保持為低
NOP
NOP
NOP
SETB CG_CHENEI ;開(kāi)始讀總線釋放
MOV R3,#07 ;延時(shí)15微妙
DJNZ R3,$
MOV C,CG_CHENEI ;從傳感器總線讀得一個(gè)BIT
AJMP L5A
L01: JNB FLAG1,L02
SETB CG_CHEWAI
NOP
NOP
CLR CG_CHEWAI ;讀前總線保持為低
NOP
NOP
NOP
SETB CG_CHEWAI ;開(kāi)始讀總線釋放
MOV R3,#07 ;延時(shí)15微妙
DJNZ R3,$
MOV C,CG_CHEWAI ;從傳感器總線讀得一個(gè)BIT
AJMP L5A
L02: JNB FLAG2,L03
SETB CG_SHUIWE
NOP
NOP
CLR CG_SHUIWE ;讀前總線保持為低
NOP
NOP
NOP
SETB CG_SHUIWE ;開(kāi)始讀總線釋放
MOV R3,#07 ;延時(shí)15微妙
DJNZ R3,$
MOV C,CG_SHUIWE ;從傳感器總線讀得一個(gè)BIT
L0: AJMP L5A
L03: JNB FLAG3,L0
SETB CG_YOUWEN
NOP
NOP
CLR CG_YOUWEN ;讀前總線保持為低
NOP
NOP
NOP
SETB CG_YOUWEN ;開(kāi)始讀總線釋放
MOV R3,#07 ;延時(shí)15微妙
DJNZ R3,$
MOV C,CG_YOUWEN ;從傳感器總線讀得一個(gè)BIT
;*****************************
L5A: MOV R3,#3CH
DJNZ R3,$ ;等待100微妙
RRC A ;把讀得的位值環(huán)移給A
DJNZ R2,RE01 ;讀下一個(gè)BIT
MOV @R1,A
INC R1
DJNZ R4,RE00 ;沒(méi)有讀完,繼續(xù)
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; JB FLAG0,L000
; PUSH A
; MOV A,#WENDSD
; CLR C
; SUBB A,TEMPL ;減數(shù)>被減數(shù),則
; JC L00
; SETB FLAH3
;L00: POP A
L000: RET
;*****************************************************
;處理溫度 BCD 碼子程序
;整數(shù)部分:取出 TEMPL 高四位和 TEMPH 低四位進(jìn)行重新組合
;小數(shù)部分:取出 TEMPL 低四位,查小數(shù)碼表
;****************************************************
CONVTEMP:MOV A,TEMPH ;判溫度是否零下
ANL A,#80H
JZ TEMPC1 ;溫度零上轉(zhuǎn)
SETB FLAH0 ;溫度為負(fù)值
CLR C
MOV A,TEMPL ;二進(jìn)制數(shù)求補(bǔ)(雙字節(jié))
CPL A ;取反加1
ADD A,#01H
MOV TEMPL,A
MOV A,TEMPH
CPL A
ADDC A,#00H
MOV TEMPH,A
JMP TEMPC2
TEMPC1: CLR FLAH0 ;溫度為正值
TEMPC2: MOV A,TEMPL
ANL A,#0FH ;取出小數(shù)部分
MOV B,#10 ;將TEMP_L的低四位X10/16得小數(shù)后一位數(shù).
MUL AB
MOV B,#16
DIV AB
MOV 70H,A ;小數(shù)部分 BCD
MOV A,TEMPL ;整數(shù)部分
ANL A,#0F0H ;取出高四位
SWAP A
MOV TEMPL,A
MOV A,TEMPH ;取出低四位
ANL A,#0FH
SWAP A
ORL A,TEMPL ;重新組合溫度數(shù)據(jù)
MOV TEMP_ZH,A ;重新組合的溫度數(shù)據(jù)存入TEMP_ZH
LCALL HEX2BCD1
MOV TEMPL,A ;(A)=十位數(shù)和個(gè)位數(shù)
ANL A,#0F0H
SWAP A
MOV 72H,A ;十位數(shù) BCD
MOV A,TEMPL
ANL A,#0FH
MOV 71H,A ;個(gè)位數(shù) BCD
MOV A,R4 ;(R4)= 百位數(shù)
MOV 73H,A
TEMPC3: RET
;====================================================
;單字節(jié)十六進(jìn)制轉(zhuǎn)BCD
;入口:(A)=單字節(jié)十六進(jìn)制的溫度值
;出口:(R4)= 百位數(shù),(A)=十位數(shù)和個(gè)位數(shù)
;====================================================
HEX2BCD1:MOV B,#64H
DIV AB
MOV R4,A ;(R4)=百位數(shù)
MOV A,#0AH
XCH A,B
DIV AB
SWAP A
ORL A,B ;(A)=十位數(shù)和個(gè)位數(shù)
RET
;==========================================================
; LCD 溫度值顯示子程序
;73H-70H 分別存放百位、十位、個(gè)位、小數(shù)位的數(shù)據(jù)
;==========================================================
CONV01: MOV A,73H ;加載百位數(shù)據(jù)
MOV LCD_X,#1 ;設(shè)置顯示位置
JNB FLAH0,CONV0 ;
MOV A,#"-" ;顯示"-"
MOV B,LCD_X
CALL LCDP2
MOV A,72H ;十位
CJNE A,#00H,CONV3
INC LCD_X ;調(diào)整顯示地址
MOV A,#" " ;十位數(shù)等于0顯示空格
MOV B,LCD_X
CALL LCDP2
JMP CONV4
CONV0: CJNE A,#00H,CONV2
CONV1: MOV A,#" " ;百位數(shù)等于0顯示空格
MOV B,LCD_X
CALL LCDP2
MOV A,72H ;十位
CJNE A,#00H,CONV3
INC LCD_X ;調(diào)整顯示地址
MOV A,#" " ;十位數(shù)等于0顯示空格
MOV B,LCD_X
CALL LCDP2
JMP CONV4
CONV2: CALL SHOW_DIG2 ;顯示數(shù)據(jù)
CONV3: INC LCD_X ;調(diào)整顯示地址
MOV A,72H ;十位
CALL SHOW_DIG2
CONV4: INC LCD_X ;調(diào)整顯示地址
MOV A,71H ;個(gè)位
CALL SHOW_DIG2
INC LCD_X ;調(diào)整顯示地址
MOV A,#'.'
MOV B,LCD_X
CALL LCDP2
MOV A,70H ;加載小數(shù)位
INC LCD_X ;設(shè)置位置
CALL SHOW_DIG2 ;顯示數(shù)據(jù)
RET
;=============================================
;在LCD的第二行顯示數(shù)據(jù)字符
;A=ASCII 數(shù)據(jù), B=位置變量
;==============================================
LCDP2: PUSH ACC ;在LCD的第二行顯示字符
MOV A,B ;設(shè)置顯示地址
ADD A,#90H ;設(shè)置LCD的第二行地址
CALL WCOM ;寫(xiě)入命令
POP ACC ;由堆棧取出A
CALL WDATA ;寫(xiě)入數(shù)據(jù)
RET
;-------------------------------------------------------
SHOW_DIG2: ;在 LCD 的第二行顯示數(shù)字
ADD A,#30H ;加30H,轉(zhuǎn)換為ASCII碼
MOV B,LCD_X ;確定顯示位置
CALL LCDP2 ;送顯示
RET
;*************************************************************************
;==========================================================
; LCD 溫度值顯示子程序2,顯示在第四行
;73H-70H 分別存放百位、十位、個(gè)位、小數(shù)位的數(shù)據(jù)
;==========================================================
CONV02: MOV A,73H ;加載百位數(shù)據(jù)
MOV LCD_X,#1 ;設(shè)置顯示位置
JNB FLAH0,CONV10 ;
MOV A,#"-" ;顯示"-"
MOV B,LCD_X
CALL LCDP4
MOV A,72H ;十位
CJNE A,#00H,CONV13
INC LCD_X ;調(diào)整顯示地址
MOV A,#" " ;十位數(shù)等于0顯示空格
MOV B,LCD_X
CALL LCDP4
JMP CONV14
CONV10: CJNE A,#00H,CONV12
CONV11: MOV A,#" " ;百位數(shù)等于0顯示空格
MOV B,LCD_X
CALL LCDP4
MOV A,72H ;十位
CJNE A,#00H,CONV13
INC LCD_X ;調(diào)整顯示地址
MOV A,#" " ;十位數(shù)等于0顯示空格
MOV B,LCD_X
CALL LCDP4
JMP CONV14
CONV12: CALL SHOW_DIG4 ;顯示數(shù)據(jù)
CONV13: INC LCD_X ;調(diào)整顯示地址
MOV A,72H ;十位
CALL SHOW_DIG4
CONV14: INC LCD_X ;調(diào)整顯示地址
MOV A,71H ;個(gè)位
CALL SHOW_DIG4
INC LCD_X ;調(diào)整顯示地址
MOV A,#'.'
MOV B,LCD_X
CALL LCDP4
MOV A,70H ;加載小數(shù)位
INC LCD_X ;設(shè)置位置
CALL SHOW_DIG4 ;顯示數(shù)據(jù)
RET
;=============================================
;在LCD的第二行顯示數(shù)據(jù)字符
;A=ASCII 數(shù)據(jù), B=位置變量
;==============================================
LCDP4: PUSH ACC ;在LCD的第二行顯示字符
MOV A,B ;設(shè)置顯示地址
ADD A,#98H ;設(shè)置LCD的第二行地址
CALL WCOM ;寫(xiě)入命令
POP ACC ;由堆棧取出A
CALL WDATA ;寫(xiě)入數(shù)據(jù)
RET
;-------------------------------------------------------
SHOW_DIG4: ;在 LCD 的第二行顯示數(shù)字
ADD A,#30H ;加30H,轉(zhuǎn)換為ASCII碼
MOV B,LCD_X ;確定顯示位置
CALL LCDP4 ;送顯示
RET
;*************************************************************************
;------------------------------------------------------------------
;傳感器 寫(xiě)命令、數(shù)據(jù)子程序
;根據(jù)命令的內(nèi)容,進(jìn)行寫(xiě)操作
;------------------------------------------------------------------
WRITE: MOV R2,#8 ;8位數(shù)據(jù)長(zhǎng)度
CLR C
WR1: JNB FLAG0,L21
CLR CG_CHENEI ;開(kāi)始寫(xiě)入傳感器總線要處于復(fù)位(低)狀態(tài)
MOV R3,#08
DJNZ R3,$ ;總線復(fù)位保持16微妙以上
RRC A ;把一個(gè)字節(jié)DATA 分成8個(gè)BIT環(huán)移給C
MOV CG_CHENEI,C ;寫(xiě)入一個(gè)BIT
MOV R3,#3CH
DJNZ R3,$ ;等待120微妙
SETB CG_CHENEI ;重新釋放總線
NOP
DJNZ R2,WR1 ;寫(xiě)入下一個(gè)BIT
SETB CG_CHENEI
RET
L21: JNB FLAG1,L22
CLR CG_CHEWAI ;開(kāi)始寫(xiě)入傳感器總線要處于復(fù)位(低)狀態(tài)
MOV R3,#08
DJNZ R3,$ ;總線復(fù)位保持16微妙以上
RRC A ;把一個(gè)字節(jié)DATA 分成8個(gè)BIT環(huán)移給C
MOV CG_CHEWAI,C ;寫(xiě)入一個(gè)BIT
MOV R3,#3CH
DJNZ R3,$ ;等待120微妙
SETB CG_CHEWAI ;重新釋放總線
NOP
DJNZ R2,WR1 ;寫(xiě)入下一個(gè)BIT
SETB CG_CHEWAI
RET
L22: JNB FLAG2,L23
CLR CG_SHUIWE ;開(kāi)始寫(xiě)入傳感器總線要處于復(fù)位(低)狀態(tài)
MOV R3,#08
DJNZ R3,$ ;總線復(fù)位保持16微妙以上
RRC A ;把一個(gè)字節(jié)DATA 分成8個(gè)BIT環(huán)移給C
MOV CG_SHUIWE,C ;寫(xiě)入一個(gè)BIT
MOV R3,#3CH
DJNZ R3,$ ;等待120微妙
SETB CG_SHUIWE ;重新釋放總線
NOP
DJNZ R2,WR1 ;寫(xiě)入下一個(gè)BIT
SETB CG_SHUIWE
RET
L23: JNB FLAG3,L24
CLR CG_YOUWEN ;開(kāi)始寫(xiě)入傳感器總線要處于復(fù)位(低)狀態(tài)
MOV R3,#08
DJNZ R3,$ ;總線復(fù)位保持16微妙以上
RRC A ;把一個(gè)字節(jié)DATA 分成8個(gè)BIT環(huán)移給C
MOV CG_YOUWEN,C ;寫(xiě)入一個(gè)BIT
MOV R3,#3CH
DJNZ R3,$ ;等待120微妙
SETB CG_YOUWEN ;重新釋放總線
NOP
DJNZ R2,WR1 ;寫(xiě)入下一個(gè)BIT
SETB CG_YOUWEN
L24: RET
;=================================================
MENU_OK1: MOV DPTR,#M_OK11 ;指針指到顯示信息區(qū)
MOV A,#1 ;顯示在第一行
CALL LCD_PRINT
MOV DPTR,#M_OK12 ;指針指到顯示信息區(qū)
MOV A,#2 ;顯示在第二行
CALL LCD_PRINT
MOV DPTR,#M_OK13 ;指針指到顯示信息區(qū)
MOV A,#3 ;顯示在第二行
CALL LCD_PRINT
MOV DPTR,#M_OK14 ;指針指到顯示信息區(qū)
MOV A,#4 ;顯示在第二行
CALL LCD_PRINT
RET
M_OK11: DB"車內(nèi)溫度: ",0
M_OK12: DB" ℃ ",0
M_OK13: DB"車外溫度: ",0
M_OK14: DB" ℃ ",0
;=================================================
MENU_OK2: MOV DPTR,#M_OK21 ;指針指到顯示信息區(qū)
MOV A,#1 ;顯示在第一行
CALL LCD_PRINT
MOV DPTR,#M_OK22 ;指針指到顯示信息區(qū)
MOV A,#2 ;顯示在第二行
CALL LCD_PRINT
MOV DPTR,#M_OK23 ;指針指到顯示信息區(qū)
MOV A,#3 ;顯示在第二行
CALL LCD_PRINT
MOV DPTR,#M_OK24 ;指針指到顯示信息區(qū)
MOV A,#4 ;顯示在第二行
CALL LCD_PRINT
RET
M_OK21: DB"水溫: ",0
M_OK22: DB" ℃ ",0
M_OK23: DB"油溫: ",0
M_OK24: DB" ℃ ",0
;==================================================
;在LCD的第一行或第二行顯示字符串
;DPTR = 放字符串的地址
;==================================================
LCD_PRINT:CJNE A,#1,LINE2 ;判斷是否為第一行
LINE1: MOV A,#80H ;設(shè)置 LCD 的第一行地址
CALL WCOM ;寫(xiě)入命令
CALL CLR_LINE ;清除該行字符數(shù)據(jù)
MOV A,#80H ;設(shè)置 LCD 的第一行地址
CALL WCOM ;寫(xiě)入命令
JMP FILL
LINE2: CJNE A,#2,LINE3 ;判斷是否為第二行
MOV A,#90H ;設(shè)置 LCD 的第二行地址
CALL WCOM ;寫(xiě)入命令
CALL CLR_LINE ;清除該行字符數(shù)據(jù)
MOV A,#90H ;設(shè)置 LCD 的第二行地址
CALL WCOM
JMP FILL
LINE3: CJNE A,#3,LINE4 ;判斷是否為第三行
MOV A,#88H ;設(shè)置 LCD 的第三行地址
CALL WCOM ;寫(xiě)入命令
CALL CLR_LINE ;清除該行字符數(shù)據(jù)
MOV A,#88H ;設(shè)置 LCD 的第三行地址
CALL WCOM
JMP FILL
LINE4: MOV A,#98H ;設(shè)置 LCD 的第四行地址
CALL WCOM ;寫(xiě)入命令
CALL CLR_LINE ;清除該行字符數(shù)據(jù)
MOV A,#98H ;設(shè)置 LCD 的第四行地址
CALL WCOM
FILL: CLR A ;填入字符
MOVC A,@A+DPTR ;由信息區(qū)取出字符
CJNE A,#0,LC1 ;判斷是否為結(jié)束碼
RET
LC1: CALL WDATA ;寫(xiě)入數(shù)據(jù)
INC DPTR ;指針加1
JMP FILL ;繼續(xù)填入字符
;===============================================
;清除一行 LCD 的字符
;輸入一行空格,來(lái)替代原顯示字符
;===============================================
CLR_LINE: MOV R0,#24 ;清除該行 LCD 的字符
CL1: MOV A,#' '
CALL WDATA
DJNZ R0,CL1
RET
;====================================================
;傳感器 復(fù)位與檢測(cè)子程序
;傳感器 正常 FLAG* 置 1,不正常 FLAG* 置 0。
;====================================================
RESET: JNB FLAG0,L31
SETB CG_CHENEI ;
NOP
CLR CG_CHENEI
MOV R0,#6BH ;主機(jī)發(fā)出延時(shí)復(fù)位低脈沖
MOV R1,#04H
TSR11: DJNZ R0,$ ;延時(shí)
MOV R0,#6BH
DJNZ R1,TSR11
SETB CG_CHENEI ;然后拉高數(shù)據(jù)線
NOP
NOP
NOP
MOV R0,#32H
TSR21: JNB CG_CHENEI,TSR31 ;等待傳感器回應(yīng)
DJNZ R0,TSR21
JMP TSR41 ; 延時(shí)
TSR31: SETB FLAG4 ; 置標(biāo)志位,表示DS1820存在
JMP TSR51
TSR41: CLR FLAG4 ; 清標(biāo)志位,表示DS1820不存在
JMP TSR61
TSR51: MOV R0,#06BH
DJNZ R0,$ ; 時(shí)序要求延時(shí)一段時(shí)間
TSR61: SETB CG_CHENEI
RET
;------------------------
L31: JNB FLAG1,L32
SETB CG_CHEWAI ;
NOP
CLR CG_CHEWAI
MOV R0,#6BH ;主機(jī)發(fā)出延時(shí)復(fù)位低脈沖
MOV R1,#04H
TSR12: DJNZ R0,$ ;延時(shí)
MOV R0,#6BH
DJNZ R1,TSR12
SETB CG_CHEWAI ;然后拉高數(shù)據(jù)線
NOP
NOP
NOP
MOV R0,#32H
TSR22: JNB CG_CHEWAI,TSR32 ;等待傳感器回應(yīng)
DJNZ R0,TSR22
JMP TSR42 ; 延時(shí)
TSR32: SETB FLAG5 ; 置標(biāo)志位,表示DS1820存在
JMP TSR52
TSR42: CLR FLAG5 ; 清標(biāo)志位,表示DS1820不存在
JMP TSR62
TSR52: MOV R0,#06BH
DJNZ R0,$ ; 時(shí)序要求延時(shí)一段時(shí)間
TSR62: SETB CG_CHEWAI
RET
;------------------------
L32: JNB FLAG2,L33
SETB CG_SHUIWE ;
NOP
CLR CG_SHUIWE
MOV R0,#6BH ;主機(jī)發(fā)出延時(shí)復(fù)位低脈沖
MOV R1,#04H
TSR13: DJNZ R0,$ ;延時(shí)
MOV R0,#6BH
DJNZ R1,TSR13
SETB CG_SHUIWE ;然后拉高數(shù)據(jù)線
NOP
NOP
NOP
MOV R0,#32H
TSR23: JNB CG_SHUIWE,TSR33 ;等待傳感器回應(yīng)
DJNZ R0,TSR23
JMP TSR43 ; 延時(shí)
TSR33: SETB FLAG6 ; 置標(biāo)志位,表示DS1820存在
JMP TSR53
TSR43: CLR FLAG6 ; 清標(biāo)志位,表示DS1820不存在
JMP TSR63
TSR53: MOV R0,#06BH
DJNZ R0,$ ; 時(shí)序要求延時(shí)一段時(shí)間
TSR63: SETB CG_SHUIWE
RET
;------------------------
L33: JNB FLAG3,L34
SETB CG_YOUWEN ;
NOP
CLR CG_YOUWEN
MOV R0,#6BH ;主機(jī)發(fā)出延時(shí)復(fù)位低脈沖
MOV R1,#04H
TSR14: DJNZ R0,$ ;延時(shí)
MOV R0,#6BH
DJNZ R1,TSR14
SETB CG_YOUWEN ;然后拉高數(shù)據(jù)線
NOP
NOP
NOP
MOV R0,#32H
TSR24: JNB CG_YOUWEN,TSR34 ;等待傳感器回應(yīng)
DJNZ R0,TSR24
JMP TSR44 ; 延時(shí)
TSR34: SETB FLAG7 ; 置標(biāo)志位,表示DS1820存在
JMP TSR54
TSR44: CLR FLAG7 ; 清標(biāo)志位,表示DS1820不存在
JMP TSR64
TSR54: MOV R0,#06BH
DJNZ R0,$ ; 時(shí)序要求延時(shí)一段時(shí)間
TSR64: SETB CG_YOUWEN
L34: RET
;------------------------
;==========================================================
;=================================================
;對(duì) LCD 做初始化設(shè)置
;=================================================
SET_LCD: MOV A,#34H ;34H--擴(kuò)充指令操作
CALL WCOM ;寫(xiě)入命令
MOV A,#30H ;30H--基本指令操作
CALL WCOM ;寫(xiě)入命令
MOV A,#01H ;清除顯示
CALL WCOM ;寫(xiě)入命令
MOV A,#06H ;指定在資料寫(xiě)入或讀取時(shí),光標(biāo)的移動(dòng)方向
CALL WCOM ;DDRAM 的地址計(jì)數(shù)器(AC)加1
MOV A,#0CH ;開(kāi)顯示,關(guān)光標(biāo),不閃爍
CALL WCOM ;寫(xiě)入命令
RET
;==================================================
;===============================================
;命令寫(xiě)入子程序
;RS=L,RW=L,D0-D7=指令碼,E=高脈沖
;以8位控制方式將命令寫(xiě)至LCD
;===============================================
WCOM: LCALL CHK_BUSY
CLR LCD_RS
CLR LCD_RW
MOV LCD_SJ,A
SETB LCD_EN
NOP
NOP
CLR LCD_EN
RET
;===============================================
;數(shù)據(jù)寫(xiě)入子程序
;RS=H,RW=L,D0-D7=指令碼,E=高脈沖
;以8位控制方式將數(shù)據(jù)寫(xiě)至LCD
;===============================================
WDATA: MOV LCD_SJ,A ;寫(xiě)入數(shù)據(jù)
SETB LCD_RS
CLR LCD_RW
SETB LCD_EN
CALL DE
CLR LCD_EN
CALL DE
RET
;**********************************************************
;測(cè)忙碌子程序
;RS=0,RW=1,E=H,D0-D7=狀態(tài)字
;**********************************************************
CHK_BUSY: MOV LCD_SJ,#0FFH ;測(cè)忙碌子程序
CLR LCD_RS
SETB LCD_RW
SETB LCD_EN
JB LCD_SJ.7,$
CLR LCD_EN
RET
;====================================================
;實(shí)時(shí)溫度值與設(shè)定報(bào)警溫度值 TH、TL 比較子程序
;當(dāng)實(shí)際溫度大于 TH 的設(shè)定值時(shí),顯示“過(guò)高”并閃動(dòng)顯示
;當(dāng)實(shí)際溫度小于 TH 的設(shè)定值時(shí),顯示“正!
;當(dāng)實(shí)際溫度小于 TL 的設(shè)定值時(shí),顯示“過(guò)低”
;====================================================
TEMP_COMP:JNB FLAG2,L101
MOV TEMP_TH,#SWGWSD
MOV TEMP_TL,#SWDWSD ;設(shè)置 LCD 的第一行地址
SJMP L102
L101: JNB FLAG3,L103
MOV TEMP_TH,#YWGWSD
MOV TEMP_TL,#YWDWSD
L102: MOV A,TEMP_ZH
CJNE A,TEMP_TH,T_COMP0
T_COMP0: JNC CHULI1
MOV A,TEMP_ZH
SUBB A,TEMP_TL ;減數(shù)>被減數(shù),則
JC CHULI2 ;借位標(biāo)志位C=1,轉(zhuǎn)
MOV DPTR,#BJ50 ;顯示"正常"
CALL TEMP_BJ3
CLR FLAG1 ;清除報(bào)警標(biāo)志
L103: RET
CHULI1: MOV DPTR,#BJ60 ;形成閃爍效果
CALL TEMP_BJ3
MOV R5,#10 ;延時(shí)10MS
ACALL DELAY1
MOV DPTR,#BJ30 ;顯示"過(guò)高"
CALL TEMP_BJ3
SETB FLAG1 ;設(shè)置報(bào)警標(biāo)志
RET
CHULI2: MOV DPTR,#BJ40 ;顯示"過(guò)低"
CALL TEMP_BJ3
CLR FLAG1 ;清除報(bào)警標(biāo)志
RET
;=========================================
;標(biāo)記字符寫(xiě)入子程序
;=========================================
TEMP_BJ3: JNB FLAG2,L001
MOV A,#86H ;設(shè)置 LCD 的第一行地址
SJMP L002
L001: JNB FLAG3,L004
MOV A,#8EH ;設(shè)置 LCD 的第三行地址
L002: CALL WCOM
L003: CLR A ;填入字符
MOVC A,@A+DPTR ;由信息區(qū)取出字符
CJNE A,#0,L005 ;判斷是否為結(jié)束碼
L004: RET
L005: CALL WDATA ;寫(xiě)入數(shù)據(jù)
INC DPTR ;指針加1
JMP L003 ;繼續(xù)填入字符
BJ30: DB "過(guò)高",0 ;過(guò)高標(biāo)記
BJ40: DB "過(guò)低",0 ;正常標(biāo)記
BJ50: DB "正常",0 ;過(guò)低標(biāo)記
BJ60: DB " ",0 ;過(guò)低標(biāo)記
;**********************************************************
;語(yǔ)音驅(qū)動(dòng)和播放程序
;**********************************************************
;50H為語(yǔ)音段地址暫存器,1到210段,實(shí)際用到40
;50H為E0H~E7H時(shí)分別代表自低往高的8級(jí)音量
;在語(yǔ)音播放過(guò)程中發(fā)送F2H至50H可循環(huán)播放當(dāng)前地址語(yǔ)音
;發(fā)送FEH至50H停止播放語(yǔ)音
;****************************************************
YUYIN: RET ;$$$$$$$$$$$$$
MOV TMOD,#00000001B ;定時(shí)/計(jì)數(shù)器0工作于方式1
MOV R6,#08H ;發(fā)碼8位循環(huán)數(shù)據(jù)
LCALL ONE_LINE ;調(diào)用一線發(fā)碼子程序
RET
ONE_LINE: ;////一線發(fā)碼子程序
SETB YYRST ;復(fù)位
MOV R7,#2 ;延時(shí)2MS
LCALL DELAY1MS
CLR YYRST ;延時(shí)使系統(tǒng)穩(wěn)定
MOV R7,#6 ;延時(shí)6MS
LCALL DELAY1MS
CLR YYSDA ;喚醒語(yǔ)音芯片
MOV R7,#17 ;延時(shí)17MS
LCALL DELAY1MS
MOV A,YY_DAT
LP1: SETB YYSDA
RRC A ;分辨50H內(nèi)的數(shù)據(jù)各位是高電平還是低電平
JNC DIDIANPIN ;高電平用高:低=2:1的脈寬表示
LCALL DELAY200US
LCALL DELAY200US
LCALL DELAY200US
CLR YYSDA
LCALL DELAY200US
LP2: DJNZ R6,LP1 ;查看數(shù)據(jù)是否發(fā)完,未發(fā)完繼續(xù)發(fā)
MOV R6,#08H
SETB YYSDA
RET
DIDIANPIN: ;低電平用高:低=1:2的脈寬表示
LCALL DELAY200US
CLR YYSDA
LCALL DELAY200US
LCALL DELAY200US
LCALL DELAY200US
SJMP LP2
;以下為延時(shí)子程序
DELAY200US: ;延時(shí)200US子程序,晶振11.0592MHz,方式1
MOV TH0,#0FFH
MOV TL0,#47H
SETB TR0
LOP1: JBC TF0,NEXT1
SJMP LOP1
NEXT1: CLR TR0
RET
DELAY1MS: ;延時(shí)1ms子程序
MOV TH0,#0FCH
MOV TL0,#66H
SETB TR0
LOP2: JBC TF0,NEXT2
SJMP LOP2
NEXT2: DJNZ R7,DELAY1MS
CLR TR0
RET
;**********************************************************
;延時(shí)子程序
;**********************************************************
DE: MOV R7,#250 ;延時(shí) 500 微秒
DJNZ R7,$
RET
;===============================================
DELAY: MOV R5,#20 ;延時(shí)20MS
DELAY1: MOV R6,#48 ;50
DL1: MOV R7,#96 ;100
DJNZ R7,$
DJNZ R6,DL1
DJNZ R5,DELAY1
RET ;96*2*48*(12/11.0592)+2*(12/11.0592)≈10000uS=10mS
END
復(fù)制代碼
作者:
barons
時(shí)間:
2015-1-28 11:46
我測(cè)試下,感謝分享
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1