|
這是一段利用單片機(jī)IO口作的溫控程序,感溫元件是NTC。功能是,當(dāng)溫度低過某值時開始加熱,隨著溫度上升。。。當(dāng)高到某值時停止加熱,然后開始冷卻。。。不斷重復(fù)。。。 使用時要注意RC常數(shù),常數(shù)過大會造成16位計(jì)數(shù)溢出,得不到正確結(jié)果。 程序是作產(chǎn)品前的一個試驗(yàn)程序,當(dāng)時調(diào)試已通過,能作到±0.5℃。 ;****************************************************** ;filename: IOTestNTC.asm ; mcu: MDT2005EP ; clock: 4 MHz for EXTXT ; date: 2006/03/17 ; writer: aLin ;****************************************************** ;計(jì)算被測量電阻。只做比較,不作計(jì)算。 ;計(jì)算公式:Rx = Rf * (Tx/Tf) ;Rx為被測電阻 ;Rf為已知電阻,Rf=10K ;Tx為被測電阻對電容C放電的計(jì)數(shù)值,為16位數(shù) ;Tf為被測電阻對電容C放電的計(jì)數(shù)值,為16位數(shù) ;查溫度特性表(NTC型號為:CWF2-473F-3950K,大亞科技制造): ;下限溫度5攝氏度時電阻為121545.44歐,即121.54544K ;換算為:Tx/Tf=Rx/Rf=12.154544 ;擴(kuò)大1000倍后結(jié)果為:12154.544,約為12155,即2F76H ;上限溫度8攝氏度時電阻為104712.92歐,即104.71292K ;換算為:Tx/Tf=Rx/Rf=10.471292 ;擴(kuò)大1000倍后結(jié)果為:10471.292,約為10471,即28E7H
;-------------------------------------------------------------------
list p=pic16c54 #i nclude "p16c5x.inc" ;定義I/O口 #define vt portb,0 #define rf portb,1 #define rx portb,2 #define on portb,4 #define off portb,4 #define f0 user,0 ;RAM 分配 CNT EQU 10H ;計(jì)數(shù)器 SOU1 EQU 11H ;四字節(jié)被除數(shù)最低位和16位商的低8位 SOU2 EQU 12H ;被除數(shù)和16位商高8位 SOU3 EQU 13H ;被除數(shù)和16位余數(shù)的低8位 SOU4 EQU 14H ;四字節(jié)被除數(shù)最高位和16位余數(shù)的高8位 USER EQU 15H ;用戶標(biāo)記位 SOU EQU 16H ;被數(shù)低8位和積(四字節(jié)積的最低位)和RX電阻計(jì)數(shù)器低8位 SOUH EQU 17H ;被乘數(shù)高8位和積和RX電阻計(jì)數(shù)器高8位 RLT EQU 18H ;乘數(shù)低8位和積 RLTH EQU 19H ;乘數(shù)高8位和積(四字節(jié)積的最高位) TEMP1 EQU 1AH ;臨時寄存器1-4 TEMP2 EQU 1BH TEMP3 EQU 1CH TEMP4 EQU 1DH RFCNTL EQU 1EH ;RF電阻計(jì)數(shù)器低8位 RFCNTH EQU 1FH ;RF電阻計(jì)數(shù)器高8位 ;--------------------------------- ORG 0000h start bcf fsr,6 ;選擇bank0 bcf fsr,5 MOVlw b'11101111' ;RB4定義為輸出,其余輸入,PortB4為一直輸出 tris 06h ;--------------------------------------------------- ;停止加熱處理程序 ;等待溫度降到5攝氏度以下是,重新加熱,跳到加熱處理程序 ; ;負(fù)溫度系電阻,阻值越大,溫度越低 ;用5攝氏度時對應(yīng)的電阻減去測出的電阻,為負(fù)數(shù),表明實(shí)際溫度已低過5攝氏度 ;需加熱處理 ; HOT_DOWN bcf off ;停止加熱 ; call d1s ;延時1秒 call io_rm ;調(diào)用測量電阻程序 call DUMUL ;調(diào)用16位無符號乖法程序 call DUDIV ;調(diào)用32位除以16位無符號除法程序 ;比較商大小 ;0E10 對應(yīng)36K電阻,溫度是31度 MOVLW 2FH MOVWF TEMP1 MOVF SOU2,W SUBWF TEMP1,W ;商高8位先減 BTFSS STATUS,C ;檢查是否有借位,有借位時C=0 GOTO HOT_UP ;有借位,被減數(shù)小于減數(shù),跳到加熱程序 BTFSS STATUS,Z ;無借位,查相減結(jié)果是否為0 GOTO HOT_DOWN ;結(jié)果不為0,則被減數(shù)大于減數(shù),跳到停止加熱程序 MOVLW 76H ;商高8位相等,商低8位相減 MOVWF TEMP1 MOVF SOU1,W SUBWF TEMP1,W BTFSS STATUS,C GOTO HOT_UP BTFSS STATUS,Z GOTO HOT_DOWN GOTO HOT_DOWN ;兩數(shù)相等,返回 ;-------------------------------------- ; ;加熱程序處理程序 ; ;當(dāng)溫度大于8攝氏度時跳到停止加熱程序 ; HOT_UP bsf on ;加熱 ; call d1s ;延時1秒 call io_rm ;調(diào)用測量電阻程序 call DUMUL ;調(diào)用16位無符號乖法程序 call DUDIV ;調(diào)用32位除以16位無符號除法程序 ;比較商大小 ;07D0對應(yīng)電阻20K,溫度45度 MOVLW 28H SUBWF SOU2,W ;商高8位先減 BTFSS STATUS,C ;檢查是否有借位,有借位時C=0 GOTO HOT_DOWN ;有借位,被減數(shù)小于減數(shù),跳到停止加熱程序 BTFSS STATUS,Z ;無借位,查相減結(jié)果是否為0 GOTO HOT_UP ;結(jié)果不為0,則被減數(shù)大于減數(shù),跳到加熱程序 MOVLW 0E7H ;商高8位相等,商低8位相減 SUBWF SOU1,W BTFSS STATUS,C GOTO HOT_DOWN BTFSS STATUS,Z GOTO HOT_UP GOTO HOT_UP ;溫度未低過下限溫度,返回繼續(xù)等待 ;---------------------------------------- ; io_rm clrf SOUH clrf SOU clrf RFCNTH clrf RFCNTL call fullcharge ;讓電容充電。 call rxdischarge ;調(diào)用測量rx放電時間子程序 call fullcharge ;讓電容充電 call rfdischarge ;調(diào)用測量rf放電時間子程序。 call fulldischarge ;讓電容完全放電。 retlw 00h ;----------------------------------------- ; ;電容充電子程序 ; fullcharge MOVlw b'11101110' ;vt口轉(zhuǎn)為輸出,rf、rx為輸入,PortB4一直輸出 tris 06h bsf vt ;vt口輸出高電平,讓電容充電 MOVlw .40 ;延時,讓電容有足夠時間充滿電至Voh。 MOVwf CNT decfsz CNT,F goto $-1 retlw 00h ;--------------------------------------- ; ;電容放電 ; fulldischarge MOVlw b'11101110' ;vt口轉(zhuǎn)為輸出,rf、rx為輸入,PortB4一直輸出 tris 06h bcf vt ;vt口輸出低電平,讓電容放電 retlw 00h ;----------------------------------------- ; ;測量rf放電時間子程序 ; rfdischarge MOVlw b'11101101' ;vt口轉(zhuǎn)為輸入,rf口轉(zhuǎn)為輸出,rx口輸入,PortB4一直輸出 tris 06h bcf rf ;rf口輸出低電平,電容對rf電阻放電. _rfdis btfss vt goto _rfdisdone incf RFCNTL,f skpnz incf RFCNTH,f goto _rfdis _rfdisdone MOVlw b'11101111' ;斷開rf電阻,由輸出改為輸入,PortB4一直輸出 tris 06h retlw 00h ;-------------------------- ; ;測量rx放電時間子程序 ; rxdischarge MOVlw b'11101011' ;vt口轉(zhuǎn)為輸入,rx口轉(zhuǎn)為輸出,rf口輸入,PortB4一直輸出 tris 06h bcf rx ;rx口輸出低電平,電容對rx電阻放電. _rxdis btfss vt goto _rxdisdone incf SOU,f skpnz incf SOUH,f goto _rxdis _rxdisdone MOVlw b'11101111' ;斷開rx電阻,由輸出改為輸入,PortB4一直輸出 tris 06h retlw 00h ;--------------------- ; ;本程序?qū)崿F(xiàn)四字節(jié)除以雙字節(jié)無符號數(shù)除法。 ; ;入口參數(shù):被除數(shù)在SOU4~SOU1中,除數(shù)在RLTH、RLT中。 ;出口參數(shù):商在SOU2、SOU1中,余數(shù)在SOU4、SOU3中. DUDIV MOVLW .16 ;循環(huán)16次 MOVWF CNT MOVF RLTH,W ;被除數(shù),32位,最高8位 MOVWF SOU4 MOVF RLT,W MOVWF SOU3 MOVF SOUH,W MOVWF SOU2 MOVF SOU,W MOVWF SOU1 ;被除數(shù),32位,最低8位 MOVF RFCNTH,W ;除數(shù)高8位 MOVWF RLTH MOVF RFCNTL,W ;除數(shù)低8位 MOVWF RLT LOOP BCF STATUS,C ;C清0 RLF SOU1,F RLF SOU2,F RLF SOU3,F RLF SOU4,F BTFSS STATUS,C GOTO CLR_F0 ;C=0, 跳到CLR_F0,清F0 BSF F0 ;C=1, 置F0 SUB_LO BCF STATUS,C MOVF RLT,W SUBWF SOU3,W ;SOU3-RLT -> W MOVWF TEMP1 ;送TEMP1保存 BTFSS STATUS,C ;有借位時C=0 GOTO SUB_HI ;低8位相減時有借位,被減數(shù)高8位要借1,相當(dāng)于減數(shù)加1 MOVF RLTH,W SUBWF SOU4,W THAN BTFSC F0 ;若夠減,跳到SAVE GOTO SAVE BTFSS STATUS,C GOTO NEXT ;若不夠減,跳到NEXT SAVE MOVWF SOU4 ;保存相減結(jié)果 MOVF TEMP1,W MOVWF SOU3 INCF SOU1,F NEXT DECFSZ CNT,F GOTO LOOP RETLW 00H SUB_HI INCF RLTH,W SUBWF SOU4,W GOTO THAN CLR_F0 BCF F0 GOTO SUB_LO ;***************DUMUL*********** ;本程序?qū)崿F(xiàn)雙字節(jié)無符號數(shù)乘法。 ;入口參數(shù):被乘數(shù)在SOUH、SOU中,乘數(shù)在RLTH、RLT中。 ;出口參數(shù):結(jié)果在RLTH、RLT、SOUH、SOU中。 DUMUL MOVLW .16 MOVWF CNT ;設(shè)乘數(shù)RLTH、RLT=03E8H=1000D,即將SOUH、SOU擴(kuò)大1000倍 MOVLW 03H MOVWF RLTH MOVLW 0E8H MOVWF RLT MOVF SOU,W MOVWF TEMP3 MOVF SOUH,W MOVWF TEMP4 CLRF SOU ;用于暫 CLRF SOUH ;存 CLRF TEMP1 ;結(jié) CLRF TEMP2 ;果 BCF STATUS,C LOOP3 RRF TEMP4,F RRF TEMP3,F ;將被乘數(shù)的某一位送到C中 BTFSC STATUS,C GOTO DUADD ;將RLTH:RLT中的被乘數(shù)加上 BACK RRF SOUH,F RRF SOU,F RRF TEMP2,F RRF TEMP1,F ;被乘數(shù)右移 DECFSZ CNT,F GOTO LOOP3 MOVF SOUH,W ;保存結(jié)果 MOVWF RLTH MOVF SOU,W MOVWF RLT MOVF TEMP2,W MOVWF SOUH MOVF TEMP1,W MOVWF SOU RETLW 00H DUADD MOVF RLT,W ADDWF SOU,F MOVF RLTH,W BTFSC STATUS,C INCFSZ RLTH,W ADDWF SOUH,F GOTO BACK ;--------------------------- ;延時1S ; ; d1s MOVlw .16 ; .16時為1.000069S ; MOVwf temp1 ; MOVlw .100 ; MOVwf temp2 ; MOVlw .207 ; MOVwf temp3 ; decfsz temp3,f ; goto $-1 ; decfsz temp2,f ; goto $-5 ; decfsz temp1,f ; goto $-9 ; retlw 00h ;-------------------------------- END |