搜索
bottom↓
回复: 7

宋翰单片机,,,RC测温,技术讨论。

[复制链接]

出0入0汤圆

发表于 2013-5-6 23:34:57 | 显示全部楼层 |阅读模式
谁写过RC测温的程序,可发来相互学习。本人最近在研究。假以时日搞定,献上给需要的人。参考。谢谢

出0入0汤圆

发表于 2013-5-7 12:45:33 | 显示全部楼层
http://www.amobbs.com/forum.php? ... 26&highlight=RC
这里有个例子

出0入0汤圆

 楼主| 发表于 2013-5-7 20:21:37 | 显示全部楼层
嗯。谢谢啊。我看到了,我今天写得程序,有些进展了,不过。数据还不是很稳定。明天继续。

出0入0汤圆

发表于 2013-5-8 10:48:38 | 显示全部楼层
学习一下
mark

出0入0汤圆

 楼主| 发表于 2013-5-10 22:57:39 | 显示全部楼层
CHIP        SN8P2705A
//{{SONIX_CODE_OPTION
        .Code_Option        Noise_Filter        Enable
        .Code_Option        Watch_Dog        Disable                ; Disable Watchdog
        .Code_Option        High_Clk        12M_X'tal        ; Crystal/Resonator: 10Mhz~16Mhz
        .Code_Option        Fcpu                #2     ; Fcpu = Fosc/4
        .Code_Option        Security        Enable
//}}SONIX_CODE_OPTION

;*******************包含系统自定义宏文件***************
.NOLIST       
        INCLUDESTD        MACRO1.H
        INCLUDESTD        MACRO2.H
        INCLUDESTD        MACRO3.H
;********************常量定义**************************
.CONST

        pledsegm        EQU        P4M                ;p4.0-p4.7接到数码管段选
        pledseg                EQU        P4                ;数码管段选
        pledseg7        EQU        P4.7                ;数码管dp段
        wei0m                EQU        FP20M                ;第一位数码管引脚方向
        wei0p                EQU        FP20                ;第一位数码管选通引脚
        wei1m                EQU        FP00M                ;第二位数码管引脚方向
        wei1p                EQU        FP00                ;第二位数码管选通引脚
       
        pm_trd                EQU        fP55M                ;标准电阻引脚方向
        pm_nsr                EQU        fP56M                ;热敏电阻引脚方向
        Pm_rc                EQU        fp57M                ;检测引脚方向
          p_trd                EQU        fP55                ;标准电阻充电引脚
        p_nsr                EQU        fP56                ;热敏电阻充电引脚
        P_rc                EQU        fp57                ;检测引脚输入引脚
//*/


/*        pm_trd                EQU        fP15M                ;标准电阻引脚方向
        pm_nsr                EQU        fP14M                ;热敏电阻引脚方向
        Pm_rc                EQU        fp13M                ;检测引脚方向
          p_trd                EQU        fP15                ;标准电阻充电引脚
        p_nsr                EQU        fP14                ;热敏电阻充电引脚
        P_rc                EQU        fp13                ;检测引脚输入引脚
//        pur_d                EQU        P5UR*/
;        lkuptab中数据个数定义
        lkupnum                EQU        41
;*********************变量宏定义***********************               
.DATA
        ledbuf                ds        1
        sysflag                ds        1
        time0                ds        1                ;时间标志位1
        time1                ds        1                ;时间标志位2
        gewei                ds        1
        shiwei                ds        1
        time2                ds        1
        num1                ds        1
        xiaoshu                ds        1
        baiwei                ds        1
        time3                ds        1
        fbtmint                EQU        sysflag.0        ;系统最小时间标志
        key_short        EQU        sysflag.1        ;短按时间标志位

        rcflat                ds        1
        frout                EQU        rcflat.0        ;开始放电标志位
        frcend                EQU        rcflat.1        ;充电结束标志位
        trdtmh                ds        1                ;标准电阻充电时间记录高字节
        trdtml                ds        1                ;标志电阻充电时间记录低字节
        nsrtmh                ds        1                ;热敏电阻充电时间记录高字节
        nsrtml                ds        1                ;热敏电阻充电时间记录低字节
        lowp                ds        1                ;
        highp                ds        1
        middlehp        ds        1
        middlep                ds        1                ;拆半查法指针变量定义
        subflag                ds        1
        subflag1        equ        subflag.0        ;测温请求
        frcout                equ        subflag.1
        rcmdode                ds        1                ;RC模式
        rcntvvv                ds        1
        rcnt                ds        1

        wk00                ds        1                ;乘法
        wk02                ds        1
        wk03                ds        1
        wk04                ds        1
        wk05                ds        1
        wk06                ds        1
        wk07                ds        1





        wk01                ds        1               
        wk08                ds        1
        wk09                ds        1
        wk10                ds        1
//        wk07                ds        1*/


/*        wk00c                ds        1                ;除法
        wk01c                ds        1
        wk02c                ds        1
        wk03c                ds        1
        wk04c                ds        1
        wk05c                ds        1
        wk06c                ds        1
        wk07c                ds        1
        wk08c                ds        1
        wk09c                ds        1
        wk10c                ds        1

        wk00d                ds        1
        wk01d                ds        1
        wk02d                ds        1
        wk03d                ds        1
        wk04d                ds        1
//*/
.CODE   
;*****************程序上电/复位入口地址*****************

        org        00h
        jmp        reset

;*********************中断入口地址**********************

        ORG        008H
        jmp        intrrupter


;*********************程序代码开始地址******************

        org        10h

/*******************************************************
子函数名称:reset
子程序功能:I/O,变量、中断等系统初始化
*******************************************************/
reset:
;端口初始化       
        mov_        pledsegm,#0xff        ;设置数码管I/O口,为输出
        mov_        pledseg,#0x7f        ;初始化数码管显示8
        bset        wei0m                ;初始化第一个数码管
        bset        wei1m
        bclr        wei0p                ;初始化第二个数码管
        bclr        wei1p
        bclr        pm_trd
        bclr        pm_nsr
        bclr        pm_rc
//        mov        a,#0x00                ;不设置为上拉
//        mov        pur_d,a
;变量初始化
        mov_        time0,#0x00        ;时间计数位清零
        mov_        time1,#0x00        ;时间计数位清零                               
        bclr        key_short        ;短按键标志清零
        bclr        fbtmint                ;防抖动标志位清零
        clr        ledbuf                ;数码管显示位值清零
        clr        gewei                ;各位清零
        clr        shiwei                ;十位清零
        clr        subflag                ;请求标志位清零
        clr        rcmdode                ;模式初始化为0
        bclr        frcout                ;充电标志清零
        clr        time3                ;检测温度快慢变量清零
        bset        subflag1
        clr        middlep
        clr        num1
;中断初始化处理
        clr        intrq                ;清所有的中断请求标志位
        bclr        fgie                ;关闭总中断
        mov_        tc1m,#0x00        ;设置TC1定时器为64分频
        mov_        tc1c,#0xc2        ;装入初值,FCPU=1MHZ,64分频,定时10ms
        mov_        tc1r,#0xc2        ;装入初值,FCPU=1MHZ,64分频,定时10ms
        bset        faload1                ;自动装初值
        bset        ftc1ien                ;使能中断
        bset        ftc1enb                ;开始计时
        bset        fgie                ;开总中断

;主函数循环扫描
  
main:   

        jmp        display0
main10:
        mov        a,time3
        cmprs        a,#200        ;每个1s检测一次温度
        jmp        mnrc
        //mov_        pledseg,#0x7f        ;把数据送到数码管显示
        bset        subflag1
        clr        time3
//main10:
        jmp        mnrc
/******************************************************
程序名称:mnrc
程序说明:有测温请求时,subflag1=1
          测温完成时,subflag=0,并将数据存放在TMpintl和Tmpadecl中
输入参数:测温请求标志subflag1
输出参数:具体的温度为tmpintl(整数部分)、tmpdecl(小数部分)
程序功能:rc充放电测温               
******************************************************/       
mnrc:

        jmp        drcnt
mm0:
        bts1        subflag1        ;是否有测温请求
        jmp        mnrc90
        mov        a,rcmdode
        @jmp_a        5
        jmp        mnrc10                ;放电
        jmp        mnrc20                ;标准电阻充电
        jmp        mnrc10                ;放电
        jmp        mnrc30                ;热敏电阻充电
        jmp        mnrc40                ;计算温度值
;放电
mnrc10:

        bts0        frcout
        jmp        mnrc60
        bset        frcout
        bclr        p_trd
        bset        pm_trd
        bclr        p_nsr
        bset        pm_nsr
        bclr        p_rc
        bset        pm_rc
        mov        a,#6
        mov        rcnt,a
        jmp        mnrc90
;标准电阻充电
mnrc20:
        clr        trdtmh
        clr        trdtml
        bset        p_trd
        bset        pm_trd
        bclr        pm_rc
        bclr        pm_nsr
mnrc21:
        incms        trdtml
        jmp        $+2
        incms        trdtmh
        bts1        p_rc       
        jmp        mnrc21
        nop
        jmp        mnrc80
;热敏电阻充电
mnrc30:
        clr        nsrtmh
        clr        nsrtml
        bset        p_nsr
        bset        pm_nsr
        bclr        pm_rc
        bclr        pm_trd
mnrc31:
        incms        nsrtml
        jmp        $+2
        incms        nsrtmh
        bts1        p_rc
        jmp        mnrc31
        nop
        jmp        mnrc80
;计算温度值(计算热敏电阻值)
mnrc40:
               
//        mov_        nsrtmh,#0x00
//        mov_        nsrtml,#0xfe
//        mov_        nsrtmh,#0x20
//        mov_        nsrtmh,#0x20
        mov_        wk01,nsrtmh        ;双字节乘法入口参数数据准备
        mov_        wk02,nsrtml        ;被乘数(热敏电阻充电时间)
        mov_        wk06,#0x27       
        mov_        wk07,#0x10        ;标准电阻为12KΩ

        jmp        mul_hex2b        ;调用双字节乘法子函数

mm1:
        mov_        wk03,wk04        ;4字节除法入口参数数据准备
        mov_        wk04,wk05
        mov_        wk05,wk06
        mov_        wk06,wk07


//        mov_        trdtmh,#0x00
//        mov_        trdtml,#0xdf

        mov_        wk01,trdtmh        ;4字节除法入口参数数据准备
        mov_        wk02,trdtml        ;除数(标准电阻充电时间)

        jmp        div_hex4bt02b        ;调用除法指令*/
       
mm2:
        mov_        h,wk05
        mov_        l,wk06
       
        jmp        lkuphalf

//        jmp        mnrc80
mnrc60:
//        bts1        frcout
//        jmp        mnrc90
//        decms        rcnt                ;每次减1
        mov        a,rcnt
        bts1        fz
        jmp        mnrc90
        bclr        frcout
        jmp        mnrc80
mnrc80:
        incms        rcmdode                ;模式加1
        mov        a,rcmdode
        sub        a,#5                ;若模式为5,则清零
        jnc        mnrc90
        clr        rcmdode
        bclr        subflag1        ;清除测温请求标志
mnrc90:
        jmp        main

drcnt:
        bts1        frcout
        jmp        drcnt90
        mov        a,rcnt
        bts0        fz
        jmp        drcnt90
        decms        rcnt
        nop
drcnt90:
        jmp        mm0
/*******************************************************
子函数名称:display0
子程序功能:在数码管上显示相应的数字
*******************************************************/
display0:
        cjb_        middlep,#10,yy0
        cjb_        middlep,#20,yy1
        cjb_        middlep,#30,yy2
        cjb_        middlep,#40,yy3
        cjb_        middlep,#50,yy4
        cjb_        middlep,#60,yy5
        nop
        nop
        mov_        shiwei,#4
        mov_        gewei,#0
        jmp        display30
yy0:
        mov_        shiwei,#0
        mov_        gewei,middlep
        jmp        display30
yy1:
        mov_        shiwei,#1
        mov        a,middlep
        sub        a,#10
        mov        gewei,a
        jmp        display30
yy2:
        mov_        shiwei,#2
        mov        a,middlep
        sub        a,#20
        mov        gewei,a
        jmp        display30
yy3:
        mov_        shiwei,#3
        mov        a,middlep
        sub        a,#30
        mov        gewei,a
        jmp        display30
yy4:
        mov_        shiwei,#4
        mov        a,middlep
        sub        a,#40
        mov        gewei,a
        jmp        display30
yy5:
        mov_        shiwei,#5
        mov        a,middlep
        sub        a,#50
        mov        gewei,a
        jmp        display30   
display30:
        cja_        time1,#1,display10
             bclr        wei0p
        bset        wei1p
        mov_        ledbuf,gewei
        jmp        display20
display10:
        cja_        time1,#2,display20
             bset        wei0p
        bclr        wei1p
        mov_        ledbuf,shiwei
        jmp        display20
display20:
        nop
        nop
        b0mov        y,#ledcode$m
        b0mov        z,#ledcode$l        ;显示表首地址
        mov        a,ledbuf
        add        z,a
        bts1        fc
        jmp        display1
        incms        y
        nop
display1:
        movc                        ;查表,地位放在ACC,高位
                                ;放在R寄存器中               
        mov        pledseg,a        ;把数据送到数码管显示
        //jmp        $
//        jmp        mnrc80       
//        ret
        jmp        main10
/*******************************************************
子函数名称:lkuphalf
子程序功能:双字节温度查表
如口条件:被比较的数h,l(高、低位)
          lkuptab时表中的数据个数
出口信息:被寻找数据在lkuptab表中,最近的组号在middlep中
*******************************************************/
lkuphalf:
        clr        lowp
        mov        a,#lkupnum-1
        mov        highp,a
lkuphalf10:
        mov        a,highp
        bset        fc
        sub        a,lowp
        cmprs        a,#01h
        jmp        $+2
        jmp        lkuphalf90
        clr        middlehp
        mov        a,lowp
        add        a,highp
        bts0        fc
        incms        middlehp
        mov        middlep,a
        rrcm        middlehp
        rrcm        middlep
        b0mov        y,#lkuptab$m
        b0mov        z,#lkuptab$l
        mov        a,middlep
        add        z,a
        bts0        fc
        incms        y
        movc
        xch        a,r
        bset        fc
        sub        a,h
        jz        lkuphalf30
        jc        lkuphalf40
lkuphalf20:
        mov        a,middlep
        mov        highp,a
        decms        middlep
        jmp        lkuphalf10
        jmp        lkuphalf10
lkuphalf30:
        xch        a,r
        bset        fc
        sub        a,l
        jz        lkuphalf90
        jnc        lkuphalf20
lkuphalf40:
        mov        a,middlep
        mov        lowp,a
        incms        middlep
        jmp        lkuphalf10
lkuphalf90:
        jmp        mnrc80
/*******************************************************
子函数名称:div_hex1bto1b
子程序功能:一个字节的HEX除以一个字节的HEX
如口条件:被乘数WK02WK03,高位在WK02,地位在WK03;
          乘数WK06WK07,高位在WK06,地位在WK07
出口信息:积在WK04/WK05/WK06/WK07中,高位在WK04,地位在WK07
*******************************************************/



/*******************************************************
子函数名称:mul_hex2b
子程序功能:二个字节的HEX相乘
如口条件:被乘数WK02WK03,高位在WK02,地位在WK03;
          乘数WK06WK07,高位在WK06,地位在WK07
出口信息:积在WK04/WK05/WK06/WK07中,高位在WK04,地位在WK07
*******************************************************/
mul_hex2b:
        clr        wk03
        clr        wk04
        mov        a,#10h
        b0mov        wk00,a
        b0bclr        fc
mul_mlp:
        rrcm        wk03
        rrcm        wk04
        rrcm        wk05
        rrcm        wk06
        b0bts1        fc
        jmp        mul_mln
        b0mov        a,wk02
        add        wk04,a
        b0mov        a,wk01
        adc        wk03,a
mul_mln:
        decms        wk00
        jmp        mul_mlp
        rrcm        wk03
        rrcm        wk04
        rrcm        wk05
        rrcm        wk06
        jmp        mm1
/*******************************************************
子函数名称:div_hex4bt02b
子程序功能:四个字节的HEX除以二个字节的HEX
如口条件:被除数(BYDIVID)WK03WK04WK05WK06,高位在WK03
          除数(DIVID)WK01WK02,高位在WK01
出口信息:商(RESULT)WK03WK04WK05WK06,高位在WK03
          余数(REST)WK07WK08,高位在WK07
*******************************************************/
div_hex4bt02b:
        mov        a,#32
        b0mov        wk00,a
        clr        wk08
        clr        wk07
div_hex4bt02b0:
        b0bclr        fc
        rlcm        wk06
        rlcm        wk05
        rlcm        wk04
        rlcm        wk03
        rlcm        wk08
        rlcm        wk07
        b0bts0        fc
        jmp        save_fc_1
        b0bclr        wk09.7
        jmp        save_next
save_fc_1:
        b0bset        wk09.7
save_next:
        b0mov        a,wk08
        sub        a,wk02
        b0mov        y,a
        b0mov        a,wk07
        sbc        a,wk01
        b0mov        z,a
        b0bts1        fc
        jmp        div_hex4bt02b11
div_hex4bt02b11:
        b0mov        a,y
        b0mov        wk08,a
        b0mov        a,z
        b0mov        wk07,a
        incms        wk06
div_hex4bt02b1:
        decms        wk00
        jmp        div_hex4bt02b0
        jmp        mm2
div_hex4bt02b1_1:
        b0bts1        wk09.7
        jmp        div_hex4bt02b1
        jmp        div_hex4bt02b11
/*******************************************************
子函数名称:intrrupter
子程序功能:中断服务子程序,检测是否为按键有效区别长短按
之分
*******************************************************/                                          
intrrupter:
        push                        ;保护数据
        bts1        ftc1ien
        jmp        int_exit
        bts0        ftc1irq
        jmp        int_tc0hk
        jmp        int_exit
/*******************************************************
子函数名称:int_tc0hk
子程序功能:TC0中断服务子程序,检测是否为按键有效区别长短
            按之分。
*******************************************************/
int_tc0hk:
       
       
        incms        time1
        mov        a,time1
        cmprs        a,#3
        jmp        kkk
        mov_        time1,#0
kkk:
        incms        time3
        mov        a,time3
        cmprs        a,#201
        jmp        int_exit
        mov_        time3,#0
        jmp        int_exit
int_exit:
        bclr        ftc1irq                ;执行完毕之后,清除所有中断请求
        pop                        ;还原数据
        reti       

;********************七段显示码表(共阴极)**********************               
ledcode:
        ;        0        1        2        3
        dw        0x3F        0x06        0x5B        0x4F
        ;        4        5        6        7
        dw        0x66        0x6D        0x7D        0x07
        ;        8        9        A        B
        dw        0x7F        0x6F        0X77        0X7C
        ;        C        D        E        F
        dw        0x39        0x5e        0x79        0x71       
;********************温度和热敏电阻的阻值的对应关系***************
lkuptab:
        dw        6bd6h,673bh,62dch,5each,5ab2h,56f3h,5353h,4fe2h,4ca5h,4983h;0--9℃
        dw        4662h,43aah,4101h,3e60h,3be9h,399eh,3775h,3571h,3319h,3125h;10--19℃
        dw        2f4eh,2d7fh,2bcah,2a22h,2892h,2710h,259fh,243dh,22e9h,21a5h;20--39℃
        dw        206eh,1f43h,1e26h,1d15h,1c0eh,1b11h,1a20h,1939h,1859h,1783h;30--49℃
        dw        16b5h                                                           ;40℃
               
        ENDP

出0入0汤圆

 楼主| 发表于 2013-5-10 22:58:09 | 显示全部楼层
CHIP        SN8P2708A
//{{SONIX_CODE_OPTION
        .Code_Option        Noise_Filter        Enable
        .Code_Option        Watch_Dog        Disable                ; Disable Watchdog
        .Code_Option        High_Clk        12M_X'tal        ; Crystal/Resonator: 10Mhz~16Mhz
        .Code_Option        Fcpu                #4     ; Fcpu = Fosc/16
        .Code_Option        Security        Enable
//}}SONIX_CODE_OPTION

;*******************包含系统自定义宏文件***************
.NOLIST       
        INCLUDESTD        MACRO1.H
        INCLUDESTD        MACRO2.H
        INCLUDESTD        MACRO3.H
;********************常量定义*************************
.CONST
;显示模块宏定义
        pledsegm        EQU        P4M                ;p4.0-p4.7接到数码管段选
        pledseg                EQU        P4                ;数码管段选
        pledseg7        EQU        P4.7                ;数码管dp段
        wei0m                EQU        FP20M                ;第一位数码管引脚方向
        wei0p                EQU        FP20                ;第一位数码管选通引脚
        wei1m                EQU        FP00M                ;第二位数码管引脚方向
        wei1p                EQU        FP00                ;第二位数码管选通引脚
;RC测温模块宏定义
        pm_trd                EQU        FP55M                ;标准电阻引脚方向
        pm_nsr                EQU        FP56M                ;热敏电阻引脚方向
        Pm_rc                EQU        Fp57M                ;检测引脚方向
          p_trd                EQU        FP55                ;标准电阻充电引脚
        p_nsr                EQU        FP56                ;热敏电阻充电引脚
        P_rc                EQU        Fp57                ;检测引脚输入引脚

;        lkuptab中数据个数定义
        lkupnum                EQU        41
;*********************变量宏定义***********************               
.DATA
        ledbuf                ds        1
        sysflag                ds        1       
        time1                ds        1                ;时间标志位1
        time2                ds        1        ;时间标志位2
        gewei                ds        1
        shiwei                ds        1

        rcflat                ds        1
        frout                EQU        rcflat.0        ;开始放电标志位
        frcend                EQU        rcflat.1        ;充电结束标志位
        trdtmh                ds        1                ;标准电阻充电时间记录高字节
        trdtml                ds        1                ;标志电阻充电时间记录低字节
        nsrtmh                ds        1                ;热敏电阻充电时间记录高字节
        nsrtml                ds        1                ;热敏电阻充电时间记录低字节
        lowp                ds        1                ;
        highp                ds        1
        middlehp        ds        1
        middlep                ds        1                ;拆半查法指针变量定义
        subflag                ds        1
        subflag1        equ        subflag.0        ;测温请求
        frcout                equ        subflag.1
        rcmdode                ds        1                ;RC模式
        rcnt                ds        1

        wk00                ds        1                ;乘法                                       
        wk01                ds        1                ;除法
        wk02                ds        1
        wk03                ds        1
        wk04                ds        1
        wk05                ds        1
        wk07                ds        1
        wk06                ds        1
        wk08                ds        1
        wk09                ds        1
        wk10                ds        1
       
.CODE   
;*****************程序上电/复位入口地址*****************

        org        00h
        jmp        reset

;*********************中断入口地址**********************

        ORG        008H
        jmp        intrrupter

;*********************程序代码开始地址******************

        org        10h

/*******************************************************
子函数名称:reset
子程序功能:I/O,变量、中断等系统初始化
*******************************************************/
reset:
;端口初始化       
        mov_        pledsegm,#0xff        ;设置数码管I/O口,为输出
        mov_        pledseg,#0x7f        ;初始化数码管显示8
        bset        wei0m                ;初始化第一个数码管
        bset        wei1m
        bclr        wei0p                ;初始化第二个数码管
        bclr        wei1p
;变量初始化
        clr        time1                ;时间计数位清零
        clr        time2                ;检测温度快慢变量清零
        clr        ledbuf                ;数码管显示位值清零
        clr        gewei                ;各位清零
        clr        shiwei                ;十位清零
        clr        subflag                ;请求标志位清零
        clr        rcmdode                ;模式初始化为0
        bclr        frcout                ;充电标志清零
;中断初始化处理
        clr        intrq                ;清所有的中断请求标志位
        bclr        fgie                ;关闭总中断
        mov_        tc0m,#0x20        ;设置TC0定时器为64分频
        mov_        tc0c,#0xef        ;装入初值,FCPU=1MHZ,64分频,定时10ms
        mov_        tc0r,#0xef        ;装入初值,FCPU=1MHZ,64分频,定时10ms
        bset        faload0                ;自动装初值
        bset        ftc0ien                ;使能中断
        bset        ftc0enb                ;开始计时
        bset        fgie                ;开总中断


;主函数循环扫描
  
main:         
        jmp        mnrc                ;调用测温子函数               
        jmp        display0        ;调用显示子函数
        jmp        main

/******************************************************
子程序名称:mnrc
子程序说明:有测温请求时,subflag1=1
            测温完成时,subflag=0,并将数据存放在TMpintl和Tmpadecl中
输入参数:测温请求标志subflag1
输出参数:具体的温度为tmpintl(整数部分)、tmpdecl(小数部分)
程序功能:rc充放电测温               
******************************************************/       
mnrc:
        bts1        subflag1        ;是否有测温请求
        jmp        mnrc90
        mov        a,rcmdode
        @jmp_a        5
        jmp        mnrc10                ;放电
        jmp        mnrc20                ;标准电阻充电
        jmp        mnrc10                ;放电
        jmp        mnrc30                ;热敏电阻充电
        jmp        mnrc40                ;计算温度值
;放电
mnrc10:
        bts0        frcout                ;frcout=1,表示正在放电
        jmp        mnrc60                ;frcout=0,表示放电完成
        bset        frcout                ;置RC开始放电标志
        bclr        p_trd
        bset        pm_trd
        bclr        p_nsr
        bset        pm_nsr
        bclr        p_rc
        bset        pm_rc                ;低电平输出(放电)
        mov        a,#5                ;放电时间为5*TB(tb为时间基数)
        mov        rcnt,a
        jmp        mnrc90
;标准电阻充电
mnrc20:
        clr        trdtmh
        clr        trdtml                ;标准电阻充电计时单元清零
        bset        p_trd
        bset        pm_trd
        bclr        pm_rc
        bclr        pm_nsr                ;标准电阻充电
mnrc21:
        incms        trdtml                ;充电时间+1
        jmp        $+2
        incms        trdtmh
        bts1        p_rc
        jmp        mnrc21                ;标准电阻充电时间(软件计时)
        jmp        mnrc80       
;热敏电阻充电
mnrc30:
        clr        nsrtmh
        clr        nsrtml                ;热敏电阻充电计时单元清零
        bset        p_nsr
        bset        pm_nsr
        bclr        pm_rc
        bclr        pm_trd
mnrc31:
        incms        nsrtml
        jmp        $+2
        incms        nsrtmh                ;充电计时时间+1
        bts1        p_rc
        jmp        mnrc31                ;热敏电阻充电时间(软件计时)
        jmp        mnrc80
;计算温度值(计算热敏电阻值)
mnrc40:
        mov_        wk02,nsrtmh        ;双字节乘法入口参数数据准备
        mov_        wk03,nsrtml        ;被乘数(热敏电阻充电时间)
        mov_        wk06,#0x27       
        mov_        wk07,#0x10        ;标准电阻为12KΩ

        call        mul_hex2b        ;调用双字节乘法子函数

        mov_        wk03,wk04        ;4字节除法入口参数数据准备
        mov_        wk04,wk05
        mov_        wk05,wk06
        mov_        wk06,wk07
        mov_        wk01,trdtmh        ;4字节除法入口参数数据准备
        mov_        wk02,trdtml        ;除数(标准电阻充电时间)

        call        div_hex4bt02b        ;调用除法指令
       
        mov_        h,wk05
        mov_        l,wk06
       
        call        lkuphalf

        jmp        mnrc80
mnrc60:
        mov        a,rcnt       
        decms        rcnt                ;每次减1                       
        jmp        mnrc90                ;放电时间是否到
        bclr        frout                ;清除RC放电标志,放电完成
        jmp        mnrc80
mnrc80:
        incms        rcmdode                ;模式加1
        mov        a,rcmdode
        sub        a,#5                ;若模式为5,则清零
        jnc        mnrc90
        clr        rcmdode
        bclr        subflag1        ;清除测温请求标志
mnrc90:
        jmp        main
/*
drcnt:
        bts1        frcout
        jmp        drcnt90
        mov        a,rcnt
        bts0        fz
        jmp        drcnt90
        decms        rcnt
        nop
drcnt90:
        ret
*/
/*******************************************************
子函数名称:display0
子程序功能:在数码管上显示相应的数字
*******************************************************/
display0:
        cjb_        middlep,#10,YY0
        cjb_        middlep,#20,YY1
        cjb_        middlep,#30,YY2
        cjb_        middlep,#40,YY3
        cjb_        middlep,#50,YY4
        nop
        nop
        mov_        shiwei,#4
        mov_        gewei,#0
        jmp        display30
YY0:
        mov_        shiwei,#0
        mov_        gewei,middlep
        jmp        display30
YY1:
        mov_        shiwei,#1
        mov        a,middlep
        sub        a,#10
        mov        gewei,a
        jmp        display30
YY2:
        mov_        shiwei,#2
        mov        a,middlep
        sub        a,#20
        mov        gewei,a
        jmp        display30
YY3:
        mov_        shiwei,#3
        mov        a,middlep
        sub        a,#30
        mov        gewei,a
        jmp        display30
YY4:
        mov_        shiwei,#4
        mov        a,middlep
        sub        a,#40
        mov        gewei,a
        jmp        display30  
display30:
        cja_        time1,#1,display10
             bclr        wei0p
        bset        wei1p
        mov_        ledbuf,gewei
        jmp        display20
display10:
        cja_        time1,#2,display20
             bset        wei0p
        bclr        wei1p
        mov_        ledbuf,shiwei
        jmp        display20
display20:
        nop
        nop
        b0mov        y,#ledcode$m
        b0mov        z,#ledcode$l        ;显示表首地址
        mov        a,ledbuf
        add        z,a
        bts1        fc
        jmp        display1
        incms        y
        nop
display1:
        movc                        ;查表,地位放在ACC,高位
                                ;放在R寄存器中               
        mov        pledseg,a        ;把数据送到数码管显示
        ret
/*******************************************************
子函数名称:intrrupter
子程序功能:中断服务子程序,检测是否为按键有效区别长短按
之分
*******************************************************/                                          
intrrupter:
        push                        ;保护数据
        bts1        ftc0ien
        jmp        int_exit
        bts0        ftc0irq
        jmp        int_tc0hk
        jmp        int_exit
/*******************************************************
子函数名称:int_tc0hk
子程序功能:TC0中断服务子程序,检测是否为按键有效区别长短
            按之分。
*******************************************************/
int_tc0hk:               
        incms        time1
        mov        a,time1
        cmprs        a,#3
        jmp        kkk
        mov_        time1,#0
kkk:
        incms        time2
        mov        a,time2
        cmprs        a,#100                ;每个1s检测一次温度
        jmp        int_exit
        mov_        time2,#0
        bset        subflag1
        jmp        int_exit
int_exit:
        bclr        ftc0irq                ;执行完毕之后,清除所有中断请求
        pop                        ;还原数据
        reti       
/*******************************************************
子函数名称:lkuphalf
子程序功能:双字节温度查表
如口条件:被比较的数h,l(高、低位)
          lkuptab时表中的数据个数
出口信息:被寻找数据在lkuptab表中,最近的组号在middlep中
*******************************************************/
lkuphalf:
        clr        lowp                ;低位指针记录单元
        mov        a,#lkupnum-1
        mov        highp,a                ;高位指针记录单元
lkuphalf10:
        mov        a,highp
        bset        fc
        sub        a,lowp
        cmprs        a,#01h
        jmp        $+2
        jmp        lkuphalf90        ;判断查找结束条件
       
        clr        middlehp
        mov        a,lowp
        add        a,highp
        bts0        fc
        incms        middlehp
        mov        middlep,a        ;中间指针记录单元
        rrcm        middlehp
        rrcm        middlep        ;减半       
       
        b0mov        y,#lkuptab$m       
        b0mov        z,#lkuptab$l
        mov        a,middlep
        add        z,a
        bts0        fc
        incms        y                ;指定差数据的地址
        movc                        ;取表中数据               
        xch        a,r                ;取出的高地位数据对调               
        bset        fc       
        sub        a,h
        jz        lkuphalf30
        jc        lkuphalf40
;小于
lkuphalf20:
        mov        a,middlep
        mov        highp,a
        decms        middlep
        jmp        lkuphalf10
        jmp        lkuphalf10
;等于
lkuphalf30:
        xch        a,r                ;取低位数据
        bset        fc
        sub        a,l
        jz        lkuphalf90        ;完成查找
        jnc        lkuphalf20
;大于
lkuphalf40:
        mov        a,middlep
        mov        lowp,a
        incms        middlep
        jmp        lkuphalf10
lkuphalf90:
        ret
/*******************************************************
子函数名称:mul_hex2b
子程序功能:二个字节的HEX相乘
如口条件:被乘数WK02WK03,高位在WK02,地位在WK03;
          乘数WK06WK07,高位在WK06,地位在WK07
出口信息:积在WK04/WK05/WK06/WK07中,高位在WK04,地位在WK07
*******************************************************/
mul_hex2b:
        clr        wk04
        clr        wk05
        mov        a,#10h
        b0mov        wk00,a
        b0bclr        fc
mul_mlp:
        rrcm        wk04
        rrcm        wk05
        rrcm        wk06
        rrcm        wk07
        b0bts1        fc
        jmp        mul_mln
        b0mov        a,wk03
        add        wk05,a
        b0mov        a,wk02
        adc        wk04,a
mul_mln:
        decms        wk00
        jmp        mul_mlp
        rrcm        wk04
        rrcm        wk05
        rrcm        wk06
        rrcm        wk07
        ret
/*******************************************************
子函数名称:div_hex4bt02b
子程序功能:四个字节的HEX除以二个字节的HEX
如口条件:被除数(BYDIVID)WK03WK04WK05WK06,高位在WK03
          除数(DIVID)WK01WK02,高位在WK01
出口信息:商(RESULT)WK03WK04WK05WK06,高位在WK03
          余数(REST)WK07WK08,高位在WK07
*******************************************************/
div_hex4bt02b:
        mov        a,#32
        b0mov        wk10,a
        clr        wk08
        clr        wk07
div_hex4bt02b0:
        b0bclr        fc
        rlcm        wk06
        rlcm        wk05
        rlcm        wk04
        rlcm        wk03
        rlcm        wk08
        rlcm        wk07
        b0bts0        fc                ;保护C标志
        jmp        save_fc_1
        b0bclr        wk09.7
        jmp        save_next
save_fc_1:
        b0bset        wk09.7
save_next:
        b0mov        a,wk08
        sub        a,wk02
        b0mov        y,a
        b0mov        a,wk07
        sbc        a,wk01                ;c为0,不够减
        b0mov        z,a
        b0bts1        fc                ;c为1,够减
        jmp        div_hex4bt02b1_1
div_hex4bt02b11:
        b0mov        a,y
        b0mov        wk08,a
        b0mov        a,z
        b0mov        wk07,a
        incms        wk06
div_hex4bt02b1:
        decms        wk10
        jmp        div_hex4bt02b0
        ret
div_hex4bt02b1_1:
        b0bts1        wk09.7
        jmp        div_hex4bt02b1
        jmp        div_hex4bt02b11
       
;********************七段显示码表(共阴极)**********************               
ledcode:
        ;        0        1        2        3
        dw        0x3F        0x06        0x5B        0x4F
        ;        4        5        6        7
        dw        0x66        0x6D        0x7D        0x07
        ;        8        9        A        B
        dw        0x7F        0x6F        0X77        0X7C
        ;        C        D        E        F
        dw        0x39        0x5e        0x79        0x71       
;********************温度和热敏电阻的阻值的对应关系***************
lkuptab:
        dw        0ffffh,673bh,62dch,5each,5ab2h,56f3h,5353h,4fe2h,4ca5h,4983h;0--9℃
        dw        4662h,43aah,4101h,3e60h,3be9h,399eh,3775h,3571h,3319h,3125h;10--19℃
        dw        2f4eh,2d7fh,2bcah,2a22h,2892h,2710h,259fh,243dh,22e9h,21a5h;20--39℃
        dw        206eh,1f43h,1e26h,1d15h,1c0eh,1b11h,1a20h,1939h,1859h,1783h;30--49℃
        dw        0h                                                           ;40℃
               
        ENDP

出0入0汤圆

发表于 2015-2-24 22:35:13 | 显示全部楼层
请问这种方式测温精度怎么样呢?

出0入8汤圆

发表于 2015-2-24 23:37:42 | 显示全部楼层
我怎么感觉受那个标准电容的影响呢?测RC充放电时间的方式,可以精确地测量热敏电阻的阻值。可是问题在于,C的值本身受温度影响也不小。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-9 18:51

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表