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