|
- ;*******************************************************************
- ;*溫度控制程序,在LCD屏幕上顯示4路溫度(車內(nèi)外溫度、水溫、油溫)
- ;分兩頁顯示,每頁顯示2路溫度,溫度傳感器開路時語音報警和顯示故障
- ;水溫、油溫超溫報警
- ;*LCD12864顯示,晶振11.0592M
- ;*******************************************************************
- ;-----------------------------------------------------------
- ;以下參數(shù)可以修改
- ;-----------------------------------------------------------
- XSYSSJ DATA 40 ;顯示延時時間
- XSGZSJ DATA 40 ;故障顯示延時時間
- CNBJCS DATA 2 ;車內(nèi)溫度傳感器出故障報警次數(shù)
- CWBJCS DATA 2 ;車外溫度傳感器出故障報警次數(shù)
- SWBJCS DATA 2 ;水溫傳感器故出障報警次數(shù)
- YWBJCS DATA 2 ;油溫度傳感器出故障報警次數(shù)
- SWGWSD DATA 50 ;水溫超高報警值(單位℃)
- SWDWSD DATA 23 ;水溫超低報警值(單位℃)
- YWGWSD DATA 40 ;油溫超高報警值(單位℃)
- YWDWSD DATA 25 ;油溫超低報警值(單位℃)
-
- ;-----------------------------------------------------------
- ;以下參數(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 ;水溫過高標(biāo)志,1為過高
- FLAH2 BIT 21H.2 ;油溫過高標(biāo)志,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 ;車內(nèi)溫度傳感器故障報警次數(shù)存放單元
- CWBJ DATA 2BH ;車外溫度傳感器故障報警次數(shù)存放單元
- SWBJ DATA 2CH ;水溫傳感器故障報警次數(shù)存放單元
- YWBJ DATA 2DH ;油溫傳感器故障報警次數(shù)存放單元
- YYDAT DATA 2EH ;語音發(fā)碼值暫存地址
- ;-----------------------------------------------------------
- CNCGBJ DATA 30 ;“車內(nèi)溫度傳感器出故障,請檢查”語音地址
- CWCGBJ DATA 31 ;“車外溫度傳感器出故障,請檢查”語音地址
- SWCGBJ DATA 32 ;“水溫傳感器出故障,請檢查”語音地址
- YWCGBJ DATA 33 ;“油溫傳感器出故障,請檢查”語音地址
- ;-----------------------------------------------------------
- ;以下參數(shù)是固定的,不要修改
- ;-----------------------------------------------------------
- YYRST EQU P3.3 ;語音模塊復(fù)位信號引腳
- BUSY EQU P1.0 ;語音忙控制端,0為正在播放1為沒有播放
- YYSDA EQU P1.1 ;語音模塊數(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 讀/寫選擇端
- LCD_EN EQU P4.2 ;LCD 使能信號
- 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 ;打開LCD背光
- CALL SET_LCD ;初始化 LCD
- MOV CNBJ,#CNBJCS ;設(shè)置車內(nèi)溫度傳感器故障報警次數(shù)
- MOV CWBJ,#CWBJCS ;設(shè)置車外溫度傳感器故障報警次數(shù)
- MOV SWBJ,#SWBJCS ;設(shè)置水溫傳感器故障報警次數(shù)
- MOV YWBJ,#YWBJCS ;設(shè)置油溫傳感器故障報警次數(shù)
- ;LCALL TEMP
-
- ;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
- ;##########################################################
- ;以下溫度顯示程序(車內(nèi)外溫度、水溫、油溫)
- ;-----------------------------------------------------------
- ;用到的資源:R0~R7,A、B、C,20H~2EH,P4,P3.3,P1.0,P1.4~P1.7
- ;-----------------------------------------------------------
- ;##########################################################
- ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
- ;**************顯示第一頁溫度(車內(nèi)外溫度)
- TEMP: CALL MENU_OK1 ;顯示溫度菜單1
- MOV TEMP_TH,#00H ;溫度低位值存放單元
- MOV TEMP_TL,#00H ;溫度低位值存放單元
- SETB FLAG0 ;開始讀取車內(nèi)溫度傳感器,設(shè)標(biāo)志為1
- CLR FLAG1
- CLR FLAG2
- CLR FLAG3
- MOV XSYS,#XSYSSJ ;每頁顯示時間
- ;讀取和顯示車內(nèi)溫度
- L1: CALL RESET ;18B20復(fù)位子程序
- JB FLAG4,L2 ;檢查車外溫度傳感器是否正常
- CALL BJ1 ;調(diào)用報警程序
- MOV XSYS,#XSGZSJ ;重新設(shè)每頁顯示時間
- SJMP L3 ;傳感器出故障不再顯示該溫度
- L2: CALL READ_TEMP ;讀出溫度與報警數(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)用報警程序
- SJMP L5 ;傳感器出故障不再顯示該溫度
- L4: CALL READ_TEMP ;讀出溫度與報警數(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 ;延時
- DEC XSYS ;車內(nèi)外溫度顯示頁顯示一段時間,以便觀察
- MOV A,XSYS
- JZ L6
- SJMP L1
- ;**************顯示第二頁溫度(水溫和油溫)
- L6: CALL MENU_OK2 ;顯示溫度菜單2
- MOV XSYS,#XSYSSJ ;重新設(shè)每頁顯示時間
- CLR FLAG0
- CLR FLAG1
- SETB FLAG2
- CLR FLAG3
- ;讀取和顯示水溫
- L7: CALL RESET ;傳感器復(fù)位子程序
- JB FLAG6,L8 ;檢查水溫傳感器是否正常
- CALL BJ3 ;調(diào)用報警程序
- SJMP L9
- L8: CALL READ_TEMP ;讀出溫度與報警數(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)用報警程序
- SJMP L11
- L10: CALL READ_TEMP ;讀出溫度與報警數(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 ;水溫、油溫顯示頁顯示一段時間,以便觀察
- MOV A,XSYS
- JZ L82
- AJMP L7
- L82: AJMP MAIN
- RET
- ;------------------------------------------------------
- ;報警程序,傳感器故障聲音報警和LCD顯示
- ;------------------------------------------------------
- BJ1: MOV A,CNBJ ;車內(nèi)溫度故障報警和顯示
- JZ L13 ;聲音報警N次后不再報警,只顯示故障
- MOV YY_DAT,#CNCGBJ;報出“車內(nèi)溫度傳感器出故障,請檢查”
- JNB BUSY,L13 ;如果正在播放語音則跳過,只顯示故障
- DEC CNBJ ;車內(nèi)溫度傳感器語音報警次數(shù)倒計數(shù)
- SJMP L12 ;故障語音報警
- BJ2: MOV A,CWBJ ;車外溫度故障報警和顯示
- JZ L15 ;聲音報警N次后不再報警,只顯示故障
- MOV YY_DAT,#CWCGBJ;報出“車外溫度傳感器出故障,請檢查”
- JNB BUSY,L15 ;如果正在播放語音則跳過,只顯示故障
- DEC CWBJ ;車外溫度傳感器語音報警次數(shù)倒計數(shù)
- SJMP L14 ;故障顯示
- BJ3: MOV A,SWBJ ;水溫故障報警和顯示
- JZ L13 ;聲音報警N次后不再報警,只顯示故障
- MOV YY_DAT,#SWCGBJ;報出“水溫傳感器出故障,請檢查”
- JNB BUSY,L13 ;如果正在播放語音則跳過,只顯示故障
- DEC SWBJ ;水溫傳感器語音報警次數(shù)倒計數(shù)
- 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 ;油溫傳感器語音報警次數(shù)倒計數(shù)
- L14: ACALL YUYIN ;語音播放
- 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 ;寫入數(shù)據(jù)
- INC DPTR ;指針加1
- JMP L203 ;繼續(xù)填入字符
- MUNE1: DB"探頭故障請檢查!",0 ;溫度探頭不正常報警程序
- ;--------------------------------------------------------------------
- ;傳感器讀溫度子程序
- ; 將溫度低位、高位、TH、TL從傳感器中讀出
- ; 分別存入 25H、26H、27H、28H 單元中
- ;--------------------------------------------------------------------
- READ_TEMP:MOV A,#0CCH ; 跳過ROM匹配
- CALL WRITE
- MOV A,#44H ; 發(fā)出溫度轉(zhuǎn)換命令
- CALL WRITE
- CALL RESET
- MOV A,#0CCH ; 跳過ROM匹配
- CALL WRITE
- MOV A,#0BEH ; 發(fā)出讀溫度命令
- CALL WRITE ;先寫入命令
- MOV R4,#4 ;存入4個單元中
- MOV R1,#TEMPL ;存入單元的首地址送入 R1
- RE00: MOV R2,#8 ;8位數(shù)據(jù)長度
- 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 ;把讀得的位值環(huán)移給A
- DJNZ R2,RE01 ;讀下一個BIT
- MOV @R1,A
- INC R1
- DJNZ R4,RE00 ;沒有讀完,繼續(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ù)和個位數(shù)
- ANL A,#0F0H
- SWAP A
- MOV 72H,A ;十位數(shù) BCD
- MOV A,TEMPL
- ANL A,#0FH
- MOV 71H,A ;個位數(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ù)和個位數(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ù)和個位數(shù)
- RET
- ;==========================================================
- ; LCD 溫度值顯示子程序
- ;73H-70H 分別存放百位、十位、個位、小數(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 ;個位
- 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 ;寫入命令
- POP ACC ;由堆棧取出A
- CALL WDATA ;寫入數(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 分別存放百位、十位、個位、小數(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 ;個位
- 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 ;寫入命令
- POP ACC ;由堆棧取出A
- CALL WDATA ;寫入數(shù)據(jù)
- RET
- ;-------------------------------------------------------
- SHOW_DIG4: ;在 LCD 的第二行顯示數(shù)字
- ADD A,#30H ;加30H,轉(zhuǎn)換為ASCII碼
- MOV B,LCD_X ;確定顯示位置
- CALL LCDP4 ;送顯示
- RET
- ;*************************************************************************
- ;------------------------------------------------------------------
- ;傳感器 寫命令、數(shù)據(jù)子程序
- ;根據(jù)命令的內(nèi)容,進(jìn)行寫操作
- ;------------------------------------------------------------------
- WRITE: MOV R2,#8 ;8位數(shù)據(jù)長度
- CLR C
- WR1: JNB FLAG0,L21
- CLR CG_CHENEI ;開始寫入傳感器總線要處于復(fù)位(低)狀態(tài)
- MOV R3,#08
- DJNZ R3,$ ;總線復(fù)位保持16微妙以上
- RRC A ;把一個字節(jié)DATA 分成8個BIT環(huán)移給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 ;開始寫入傳感器總線要處于復(fù)位(低)狀態(tài)
- MOV R3,#08
- DJNZ R3,$ ;總線復(fù)位保持16微妙以上
- RRC A ;把一個字節(jié)DATA 分成8個BIT環(huán)移給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 ;開始寫入傳感器總線要處于復(fù)位(低)狀態(tài)
- MOV R3,#08
- DJNZ R3,$ ;總線復(fù)位保持16微妙以上
- RRC A ;把一個字節(jié)DATA 分成8個BIT環(huán)移給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 ;開始寫入傳感器總線要處于復(fù)位(低)狀態(tài)
- MOV R3,#08
- DJNZ R3,$ ;總線復(fù)位保持16微妙以上
- RRC A ;把一個字節(jié)DATA 分成8個BIT環(huán)移給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 ;指針指到顯示信息區(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 ;寫入命令
- CALL CLR_LINE ;清除該行字符數(shù)據(jù)
- MOV A,#80H ;設(shè)置 LCD 的第一行地址
- CALL WCOM ;寫入命令
- JMP FILL
- LINE2: CJNE A,#2,LINE3 ;判斷是否為第二行
- MOV A,#90H ;設(shè)置 LCD 的第二行地址
- CALL WCOM ;寫入命令
- 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 ;寫入命令
- CALL CLR_LINE ;清除該行字符數(shù)據(jù)
- MOV A,#88H ;設(shè)置 LCD 的第三行地址
- CALL WCOM
- JMP FILL
- LINE4: MOV A,#98H ;設(shè)置 LCD 的第四行地址
- CALL WCOM ;寫入命令
- 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 ;寫入數(shù)據(jù)
- INC DPTR ;指針加1
- JMP FILL ;繼續(xù)填入字符
- ;===============================================
- ;清除一行 LCD 的字符
- ;輸入一行空格,來替代原顯示字符
- ;===============================================
- CLR_LINE: MOV R0,#24 ;清除該行 LCD 的字符
- CL1: MOV A,#' '
- CALL WDATA
- DJNZ R0,CL1
- RET
- ;====================================================
- ;傳感器 復(fù)位與檢測子程序
- ;傳感器 正常 FLAG* 置 1,不正常 FLAG* 置 0。
- ;====================================================
- RESET: JNB FLAG0,L31
- SETB CG_CHENEI ;
- NOP
- CLR CG_CHENEI
- MOV R0,#6BH ;主機(jī)發(fā)出延時復(fù)位低脈沖
- MOV R1,#04H
- TSR11: DJNZ R0,$ ;延時
- 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 ; 延時
- TSR31: SETB FLAG4 ; 置標(biāo)志位,表示DS1820存在
- JMP TSR51
- TSR41: CLR FLAG4 ; 清標(biāo)志位,表示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 ;主機(jī)發(fā)出延時復(fù)位低脈沖
- MOV R1,#04H
- TSR12: DJNZ R0,$ ;延時
- 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 ; 延時
- TSR32: SETB FLAG5 ; 置標(biāo)志位,表示DS1820存在
- JMP TSR52
- TSR42: CLR FLAG5 ; 清標(biāo)志位,表示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 ;主機(jī)發(fā)出延時復(fù)位低脈沖
- MOV R1,#04H
- TSR13: DJNZ R0,$ ;延時
- 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 ; 延時
- TSR33: SETB FLAG6 ; 置標(biāo)志位,表示DS1820存在
- JMP TSR53
- TSR43: CLR FLAG6 ; 清標(biāo)志位,表示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 ;主機(jī)發(fā)出延時復(fù)位低脈沖
- MOV R1,#04H
- TSR14: DJNZ R0,$ ;延時
- 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 ; 延時
- TSR34: SETB FLAG7 ; 置標(biāo)志位,表示DS1820存在
- JMP TSR54
- TSR44: CLR FLAG7 ; 清標(biāo)志位,表示DS1820不存在
- JMP TSR64
- TSR54: MOV R0,#06BH
- DJNZ R0,$ ; 時序要求延時一段時間
- TSR64: SETB CG_YOUWEN
- L34: RET
- ;------------------------
- ;==========================================================
- ;=================================================
- ;對 LCD 做初始化設(shè)置
- ;=================================================
- SET_LCD: MOV A,#34H ;34H--擴(kuò)充指令操作
- CALL WCOM ;寫入命令
- MOV A,#30H ;30H--基本指令操作
- CALL WCOM ;寫入命令
- MOV A,#01H ;清除顯示
- CALL WCOM ;寫入命令
- MOV A,#06H ;指定在資料寫入或讀取時,光標(biāo)的移動方向
- CALL WCOM ;DDRAM 的地址計數(shù)器(AC)加1
- MOV A,#0CH ;開顯示,關(guān)光標(biāo),不閃爍
- 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
- ;===============================================
- ;數(shù)據(jù)寫入子程序
- ;RS=H,RW=L,D0-D7=指令碼,E=高脈沖
- ;以8位控制方式將數(shù)據(jù)寫至LCD
- ;===============================================
- WDATA: MOV LCD_SJ,A ;寫入數(shù)據(jù)
- 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=狀態(tài)字
- ;**********************************************************
- CHK_BUSY: MOV LCD_SJ,#0FFH ;測忙碌子程序
- CLR LCD_RS
- SETB LCD_RW
- SETB LCD_EN
- JB LCD_SJ.7,$
- CLR LCD_EN
- RET
- ;====================================================
- ;實時溫度值與設(shè)定報警溫度值 TH、TL 比較子程序
- ;當(dāng)實際溫度大于 TH 的設(shè)定值時,顯示“過高”并閃動顯示
- ;當(dāng)實際溫度小于 TH 的設(shè)定值時,顯示“正常”
- ;當(dāng)實際溫度小于 TL 的設(shè)定值時,顯示“過低”
- ;====================================================
- 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 ;清除報警標(biāo)志
- L103: RET
- CHULI1: MOV DPTR,#BJ60 ;形成閃爍效果
- CALL TEMP_BJ3
- MOV R5,#10 ;延時10MS
- ACALL DELAY1
- MOV DPTR,#BJ30 ;顯示"過高"
- CALL TEMP_BJ3
- SETB FLAG1 ;設(shè)置報警標(biāo)志
- RET
- CHULI2: MOV DPTR,#BJ40 ;顯示"過低"
- CALL TEMP_BJ3
- CLR FLAG1 ;清除報警標(biāo)志
- RET
- ;=========================================
- ;標(biāo)記字符寫入子程序
- ;=========================================
- 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 ;寫入數(shù)據(jù)
- INC DPTR ;指針加1
- JMP L003 ;繼續(xù)填入字符
- BJ30: DB "過高",0 ;過高標(biāo)記
- BJ40: DB "過低",0 ;正常標(biāo)記
- BJ50: DB "正常",0 ;過低標(biāo)記
- BJ60: DB " ",0 ;過低標(biāo)記
- ;**********************************************************
- ;語音驅(qū)動和播放程序
- ;**********************************************************
- ;50H為語音段地址暫存器,1到210段,實際用到40
- ;50H為E0H~E7H時分別代表自低往高的8級音量
- ;在語音播放過程中發(fā)送F2H至50H可循環(huán)播放當(dāng)前地址語音
- ;發(fā)送FEH至50H停止播放語音
- ;****************************************************
- YUYIN: RET ;$$$$$$$$$$$$$
- MOV TMOD,#00000001B ;定時/計數(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 ;延時2MS
- LCALL DELAY1MS
- CLR YYRST ;延時使系統(tǒng)穩(wěn)定
- MOV R7,#6 ;延時6MS
- LCALL DELAY1MS
- CLR YYSDA ;喚醒語音芯片
- MOV R7,#17 ;延時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
- ;以下為延時子程序
- 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
復(fù)制代碼
|
|