基于EMP78P156單片機(jī)的RC測(cè)溫的實(shí)現(xiàn)
一、總體控制電路:
本文引用地址:http://www.ex-cimer.com/article/201611/316077.htm圖 1
二、RC測(cè)溫原理:
利用單片機(jī)I/O口來實(shí)現(xiàn)RC測(cè)溫,電路很簡(jiǎn)單,而且也不難實(shí)現(xiàn),最主要的是要有個(gè)概念,如何實(shí)RC測(cè)溫,也就是RC測(cè)溫的原理。這里具體的介紹一下,可以在這個(gè)原理基礎(chǔ)上進(jìn)行修改很擴(kuò)展為多路的測(cè)溫。如下圖(2)
圖中:
P1.0、P1.1和P1.2是單片機(jī)的3個(gè)I/O口;
RK為100K精密電阻;
RT為100K—精度為1%的熱敏電阻;
R1為100 的普通電阻;
C1為瓷介電容。
工作原理:
1. 先將P1.0、P1.1和P1.2設(shè)為低電平輸出,延時(shí)0.5s ,使C1放電完。
2. 將P1.1和P1.2設(shè)置為輸入狀態(tài),P1.0輸出高電平,通過RK電阻給C1充電,單片機(jī)內(nèi)部的計(jì)數(shù)器開始計(jì)時(shí),并且不斷的檢測(cè)P1.2狀態(tài),當(dāng)P1.2為高電平時(shí),即當(dāng)C1的電壓達(dá)到了單片機(jī)高電平輸入的門限電壓時(shí),根據(jù)計(jì)數(shù)的值來確定從開始充電到P1.2轉(zhuǎn)變?yōu)楦唠娖降臅r(shí)間T1。
3. 將P1.0、P1.1和P1.2設(shè)為低電平輸出,延時(shí)0.5s ,使C1放電完。
4. 再將P1.0和P1.2設(shè)置為輸入狀態(tài),P1.1輸出高電平,通過RT電阻給C1充電,單片機(jī)內(nèi)部的計(jì)數(shù)器開始計(jì)時(shí),并且不斷的檢測(cè)P1.2狀態(tài),當(dāng)P1.2為高電平時(shí),即當(dāng)C1的電壓達(dá)到了單片機(jī)高電平輸入的門限電壓時(shí),根據(jù)計(jì)數(shù)的值來確定從開始充電到P1.2轉(zhuǎn)變?yōu)楦唠娖降臅r(shí)間T2。
5. 電容電壓計(jì)算公式:
所以 ,這樣我們可以通過計(jì)算來得到熱敏電阻的阻值,通過查表來得到測(cè)量的溫度值。
注:我們可以根據(jù)需要把R1也換成熱敏電阻,來實(shí)現(xiàn)兩路溫度的檢測(cè),理論上N個(gè)I/O口可以測(cè)量N-1個(gè)溫度。也可以把電容一端接VCC,那么當(dāng)C1充滿的時(shí)候檢測(cè)端口電壓就是低電平。
三、實(shí)際程序舉例
/******RC測(cè)溫程序********/
/*單片機(jī):EM78P156*/
/*晶振:4MHZ*/
/*編者:鄭文*/
/*日期:2007.01.31*/
/*功能:RC測(cè)溫*/
/************************/
/*說明:精密電阻充電時(shí)間計(jì)數(shù)值存放地址:RF_DA
/*熱敏電阻充電時(shí)間計(jì)數(shù)值存放地址:RS_DA
/*寄存器及變量定義*/
R0EQU 0X00
TCCEQU 0X01
CONTEQU 0X01
PCEQU 0X02
STATUSEQU 0X03
CEQU 0
DCEQU 1
ZEQU 2
R4EQU 0X04
RSREQU 0X04
IOC5EQU 0X05
PORT5EQU 0x05
IOC6EQU 0X06
PORT6EQU 0x06
;***************************
;***************************
IOCAEQU 0X0A
IOCBEQU 0X0B
IOCCEQU 0X0C
IOCDEQU 0X0D
IOCEEQU 0X0E
RFEQU 0X0F
IOCFEQU 0X0F
;**************************
;**************************
T_SETEQU 0X1F;溫度設(shè)置值寄存器
T_MEASEQU 0X20;當(dāng)前測(cè)得溫度值
AD_DA
AD_DA
RF_DA
RF_DA
RS_DA
RS_DA
XSWEQU 0X2A;顯示位,判斷哪位可以正在點(diǎn)亮
BACCEQU 0X2D;ACC備份寄存器
BSTATUSEQU 0X2E;STATUS備份寄存器
LA_CNT1EQU 0X2F
FLAG1EQU 0X30
LPEQU 0;LP放電標(biāo)志位
HAVEDISEQU 1;放電時(shí)間計(jì)數(shù)標(biāo)志位
RS_OVEREQU 4
REF_OVEREQU 5
AD_EEQU 6;采樣正在進(jìn)行標(biāo)志位
AD_TYPEEQU 7;采樣類型,是參考電阻采樣還是傳感器電阻采樣
/********************************************/
ORG00H
JMPSTART
ORG08H
JMPINT_TCC ;進(jìn)入中斷程序
;*******************************************
;=================================================
START:
CALL INITAITE ;程序初始化
MAIN:
MAIN2:
CALL ADCONVER ;RC測(cè)溫RC時(shí)間測(cè)量
JMPMAIN
;**************************************************
INITAITE:
MOVA,@0B00000000;BIT6特殊,預(yù)分頻器分給計(jì)數(shù)器,分頻比為1:2,
CONTW;上升沿觸發(fā),內(nèi)部時(shí)鐘源,中斷屏蔽。
MOVA,@0B00000000;5口定義為輸出口
IOWIOC5
MOVA,@0B00000000;6口定義為輸出口
IOWIOC6
MOVA,@0B00000000
IOWIOCE;WITE=0禁止WDT,EIS=0定義P60口為雙向IO口而不是中斷口;
MOVA,@0B00000001
IOWIOCF;定時(shí)器中斷允許
ENI;開中斷,整個(gè)程序執(zhí)行過程,中斷一直是起用的
RET
/**********************************************************
*程序名稱:AD程序
************************************************************/
;---------
;|P6.3|----------P5.1
;||____|
;|P6.5|--|____|--|P5.2
;||___/|
;|P5.4|--|__/_|--|P5.0
;||/---
;||--- c
;|||
;---------+5v
;***********************************************************
;;;;;;;;;;;;;;;;;;;RC轉(zhuǎn)換測(cè)量;;;;;;;;;;;;;;;;;;;;;;;;;
ADCONVER:
JBCFLAG1,AD_E;是否正在進(jìn)行AD采樣,1 EN, 0 DIS
JMPADQUIT
JBCFLAG1,HAVEDIS;放電時(shí)間是否到
JMPREF_SENSOR
;;;;;;;;;;;;;;;;;;;;;;;;
IORIOC6;置P6.3,P6.4,P6.5輸出,為AD采樣做好準(zhǔn)備
ANDA,@0B11000111
IOWIOC6
BSPORT6,3;P5.0,P5.1,P5.2輸出為1,對(duì)電容進(jìn)行放電
BSPORT6,4
BSPORT6,5
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
CLRLA_CNT1;清放電時(shí)間計(jì)數(shù)
BSFLAG1,LP; LP置高表示放電結(jié)束
BSFLAG1,AD_E;使能AD采樣
RET
REF_SENSOR:
BCFLAG1,HAVEDIS
BCFLAG1,AD_TYPE;正在采樣的是參考電阻還是傳感器:1 REF REGISTER, 0 SENSOR
MPAD_1;正在對(duì)參考電阻進(jìn)行采樣
;對(duì)傳感器電阻進(jìn)行采樣
MOVA,AD_DA
MOVRS_DA
MOVA,AD_DA
MOVRS_DA
BSFLAG1,RS_OVER
BSFLAG1,AD_TYPE
IORIOC6;SET port6.3,port6.4 INPORT,port6.5 EXPORT
ORA,@0B00011000
ANDA,@0B11011111
IOWIOC6
MOVA,@231;REF START COUNT
MOVTCC,A
MOVA,@0
MOVAD_DA
MOVAD_DA
BCPORT6,5
BSFLAG1,AD_E;置正在采樣標(biāo)志位
JMPADQUIT
AD_1:;對(duì)參考電阻進(jìn)行采樣
MOVA,AD_DA
MOVRF_DA
MOVA,AD_DA
MOVRF_DA
BSFLAG1,REF_OVER
BCFLAG1,AD_TYPE;清零AD_TYPE
IORIOC6
ORA,@0B00101000
ANDA,@0b11101111;port6.3,port6.5 INPORT,port6.4 EXPORT
IOWIOC6
MOVA,@231;SENSOR START COUNT
MOVTCC,A
MOVA,@0
MOVAD_DA
MOVAD_DA
BCPORT6,4
BSFLAG1,AD_E
ADQUIT:
RET
;******************************************************
INT_TCC:
MOVBACC,A;保護(hù)ACC和STATUS
SWAPASTATUS
MOVBSTATUS,A
JBSRF,0;判斷是否為計(jì)數(shù)器中斷,如果是得話進(jìn)入
;計(jì)數(shù)器中斷服務(wù)程序,不是則退出
JMPINTQUIT
MOVA,@231;賦初始值給TCC
MOVTCC,A
BCRF,0;RF可以指令清零,但不能置1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
LAPSE_TIMER:
JBSFLAG1,LP;放電0.1S計(jì)時(shí)(LP放電標(biāo)志位)
JMPTCC_1;如果放電沒結(jié)束則跳轉(zhuǎn)到TCC_1
INCLA_CNT1;如果放電結(jié)束了,執(zhí)行
MOVA,@255
XORA,LA_CNT1
JBSSTATUS,Z
MPTCC_1;如果不等于255則跳轉(zhuǎn)到TCC_1
BCFLAG1,AD_E;采樣正在進(jìn)行的標(biāo)志位清0(AD采樣不使能)
BSFLAG1,HAVEDIS ;放電時(shí)間標(biāo)志位為1(表示已經(jīng)計(jì)時(shí)0.5秒,足夠放完電)
BCFLAG1,LP;放電結(jié)束,放電標(biāo)志位清零
TCC_1:
JBSFLAG1,AD_E;判斷AD采樣使能?
JMPINTQUIT;不使能就跳出中斷
JBCFLAG1,LP;判斷放電標(biāo)志位使能?
JMPINTQUIT;不使能就跳出中斷
INCAD_DA
JBSSTATUS,Z
JMPTCC_0
INCAD_DA
MOVA,AD_DA
XORA,@120
JBSSTATUS,Z
JMPTCC_0
BCFLAG1,AD_E;AD采樣不使能
JMPINTQUIT
TCC_0:
JBCPORT6,3;檢測(cè)P51口電平是否變化
JMPINTQUIT;沒有變化就跳出中斷
BCFLAG1,AD_E;如果P51為0則停止采樣
INTQUIT:
SWAPABSTATUS;恢復(fù)寄存器
MOVSTATUS,A
SWAPBACC
SWAPABACC
RETI
END
評(píng)論