- 壹零零单片机©版权所有 2008-2025 粤ICP备17151077号
1、RC 充放电的原理和硬体:
RC 测温的实现方法是利用电阻R 给电容C 充放电时间来测量温度的(此处的温度感测器为热敏电阻)。
用不同的电阻给电容充放电时间不一样,对RC 测量温度的精度与电阻R 和电容C 的选取有关。我们通常是选用一
个标准电阻(随温度变化其阻值变化很小,可忽略不计,通常为高精度的金属膜电阻),它的阻值Rs 与温度传感器在
标准大气压下、25℃时的阻值相同。当温度发生变化时,热敏电阻的阻值Rt 发生变化,那么热敏电阻Rt 给电容C 的充
放电时间也发生变化。而标准电阻Rs 给电容C 的充放电时间则不发生变化。
[b]注意:电容放电一定要放完,这是RC测温准确关键之一。
2:公式:在这里我就不列出这个公式是怎么来的了,因为我们不是搞数学研究的。我们只要知道这个就可以了:
Rt=(Rs*Tt)/Ts
注:Rs 为标准电阻Rt 为热敏电阻
硬件处理完了,我们就开始做软件处理了,下面是RC充放电处理程序,供大家参考有什么好的处理方法望大家提提:
;;********************************
;;文件名:rc.asm
;;
;;********************************
.const
f_chargem equ fp10m ;;标准电阻引脚方向
f_charge equ fp10
f_ntcm equ fp54m ;;热敏电阻引脚方向
f_ntc equ fp54
;;----------------------------------------------
.data
flag3 ds 1
f_rcirq equ flag3.0
f_rcout equ flag3.1
f_rcend equ flag3.2
f_rc_ok equ flag3.3
b_rcnt ds 1
b_temp ds 1
b_stand ds 1
b_ntc ds 1
b_rcmode ds 1
;;---------------------------------------------
;;---------------------------------------
.code
;;---------------------------------------
;;*****************************************
;;RC充电测温程序
;;程序说明:有测温请求时f_rcirq=1,并将温度数据存放在b_temp中
;;输入参数:f_rcirq
;;输出参数:b_temp
;;程序功能:RC充放测温
;;******************************************
mn_rc:
bts1 f_rcirq ;;是否有测温请求
jmp mn_rc90 ;;无
mov a,b_rcmode
@jmp_a 5
jmp mn_rc10 ;;放电
jmp mn_rc20 ;;标准电阻充电
jmp mn_rc10 ;;放电
jmp mn_rc30 ;;热敏电阻充电
jmp mn_rc40 ;;计算温度值
;;*****************************************
mn_rc10:
bts0 f_rcout
jmp mn_rc60
bset f_rcout ;;开始放电
bclr f_charge
bset f_chargem ;;标准电阻输出0
bclr f_ntc
bset f_ntcm ;;热敏电阻输出0
mov a,#255 ;;
mov b_rcnt,a ;;放电时间为5xTb
jmp mn_rc90
;;--------------------------------------------
mn_rc20:
clr b_stand ;;标准电阻清0
bset f_charge
bset f_chargem
;;开始标准电阻充电
bclr f_ntcm
;;----------------------------------------
mn_rc21:
bts0 f_ntc ;;f_check=1充满
jmp mn_rc80
incms b_stand ;;标准电阻计时
jmp mn_rc21
decms b_stand
jmp mn_rc80
;;----------------------------------------
mn_rc30:
clr b_ntc ;;热敏电阻时间清0
bset f_ntc
bset f_ntcm
bclr f_chargem
; bclr f_checkm ;;热敏电阻充电计时
;;--------------------------------------
mn_rc31:
bts0 f_charge
jmp mn_rc80
incms b_ntc
jmp mn_rc31
decms b_ntc
jmp mn_rc80
;;-------------------------------------
;;--------------------------------------
mn_rc40:
mov a,#100
mov y,a
mov a,b_stand
mov b_text,a
call mn_mul //乘法
call mn_div //除法
;;------------------------------------------------------------
;;---------------------------------------
mn_rc60:
mov a,b_rcnt
bts1 fz
jmp mn_rc90
bclr f_rcout
jmp mn_rc80
;;--------------------------------------
mn_rc80:
incms b_rcmode ;;模式加1
mov a,b_rcmode
sub a,#5
jnc mn_rc90
clr b_rcmode
bclr f_rcirq ;;清除测温标志
;;--------------------------------------
mn_rc90:
ret
;;**************************************
;;程序功能:放电计时
;;输入参数:rcnt
;;输出参数:无
;;*************************************
drcnt:
bts1 f_rcout
jmp drcnt90
mov a,b_rcnt ;;是否已放电完成
bts0 fz
jmp drcnt90
decms b_rcnt
nop
drcnt90:
ret
;;******************************************************;;
;;Function :乘法 8位乘8位 ;;
;;Input :乘数--;被乘数--data_ntc;循环次数(被乘数位数)--z
;;Output :乘积--dividend_high、dividend_Low ;;
;;******************************************************;;
mn_mul: ;;
b0mov z,#08h ;;
clr dividend_Low ;;
clr dividend_high ;;
mn_mul10: ;;
rrcm y ;;
b0bts1 fc ;;
jmp mn_mul20 ;;
mov a,b_ntc ;;
add dividend_high,a ;;
b0bts0 fc ;;
incms dividend_low ;;
nop ;;
mn_mul20: ;;
rrcm dividend_high ;;
rrcm dividend_low ;;
decms z ;;
jmp mn_mul10 ;;
ret ;;
;;**********************************************;;
;;******************************************************;;
;;Function :除法 16位除8位 ;;
;;Input :被除数--dividend_high、dividend_low ; 除数--data_ref ; 循环次数(被除数位数)--z
;;Output :商quotient_high、quotient_low ;;
;;******************************************************;;
;;******************************************************;;
;;Function :除法 16位除8位 ;;
;;Input :被除数--dividend_high、dividend_low ; 除数--data_ref ; 循环次数(被除数位数)--z
;;Output :商quotient_high、quotient_low ;;
;;余数 :div_few_high,div_few_low
;;******************************************************;;
mn_div:
b0mov z,#10h
clr quotient_high
clr quotient_low
clr div_few_high
clr div_few_low
;;-----------------------------------------------------
mn_div10:
b0bclr fc
rlcm dividend_low
rlcm dividend_high
rlcm div_few_low
; rlcm div_few_high
b0bts0 fc
jmp $+5
; b0bts1 fz
; jmp mn_div20
mov a,div_few_low
sub a,b_stand
;;--------------------------------------------------------
mn_div20:
b0bts1 fc
jmp mn_div30
;;B>=A
mov a,div_few_low
sub a,b_stand
mov div_few_low,a
; bts1 fc
; decms div_few_high
; nop
bset fc
mn_div30:
rlcm quotient_low ;;
rlcm quotient_high ;;
decms z ;;
jmp mn_div10 ;;
ret
//-----------------------------------------------------------------------
下面就是做平均处理我这里就不在列出了