⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 数字测温仪.asm

📁 使用 AT89C2051 控制的数字温度测量仪表。
💻 ASM
字号:
;数字测温仪程序编制说明
;本程序工作过程如下:
;1、开机后首先进行初始化,初始化后显示“P”1秒,提示系统进入测试工作状态,显
;   示完成后,进行温度测试。
;2、温度测试的过程是这样的:
;   *  T0置为计数方式,对T0脚(即P3.5)的脉冲计数,工作方式2,初值为255
;   *  将T1置为定时方式,工作方式2,初值为0
;   *  从P3.4口送单稳触发脉冲,使555输出单稳脉冲(正脉冲),该脉冲宽度随热敏
;      电阻阻值而变化。
;   *  开T0、T1中断,启动T0、T1。此时T1自动对内部机器周期计数,当TL1溢
;      出时,产生T1中断。在T1中断处理程序中,将RAM 21H单元加1(即21H单
;      元存放脉冲宽计数值高位)后返回主程序。
;   *  当来自P3.5的单稳脉冲结束(即下降沿到来)时,TL0计数器加1并溢出,产
;      生T0中断。在T0中断处理程序中,关T0、T1中断,并将TL1中的的内容读
;      到RAM 20H单元(20H单元存放脉宽计数值的低位)。
;   *  查表求温度值
;      NTTAB是脉宽计数值与温度的对照表,按低温到高温的次序存放,即第一、第
;      二单元存放-100C时的脉宽计数值,依此类推,第121和122单元则存放+500C
;      时的脉宽计数值。
;      将20H、21H中的计数值与NTTAB中的计数值依次进行比较,直至20H、21H
;      中的值小于NTTAB中的计数值为止。而比较的次数就对应温度的整数值,二计
;      数值之差与对照表相邻两计数值的商即为小数位。
;3、程序中除了对-100C到+500C进行测试外,还有开路(计数值过大)、短路检测(计
;   数值过小)、负超温检测、正超温检测,并有相应的显示。
;4、将检测值(温度值或其他结果)显示1秒,然后再重复温度检测。
;需要说明的是:本程序虽包括了测温的全过程,但未考虑软硬件的自检,软件滤波等部
;分。
;关于电路图中元件参数说明
;1、C5为0.1μ。
;2、电容C4、热敏电阻RT的参数决定单稳脉冲的宽度,而最终的计数值除了与单稳
;   脉冲的宽度有关外,还与晶振频率有关,因而在RT的型号确定后要根据系统对精
;   度和分辨率等的要求选择C4的值。本程序中NTTAB脉宽计数值与温度对照表是在
;   热敏电阻为MF53-1型负温热敏电阻加12K精密电阻与之并联,C4为1μ,晶振为
;   4MHz的条件下得到的。数据不十分准,仅做参考。读者在元件参数定了后,可在
;   调试程序时用可变电阻箱代替热敏电阻,在程序测出计数值处设断点,读出每个标
;   准阻值所对应的计数值(即20H、21H中的内容),自己将NTTAB建立起来。
;       * * * * * * * * * * * * * * * * * * * * * * * * * *
;       *     用89C2051控制的数字测温仪     *
;       *            源程序清单              *
;       * * * * * * * * * * * * * * * * * * * * * * * * * *
           ORG  0000H
           AJMP  MAIN          ;转主程序
           ORG  000BH
           AJMP  WT0           ;T0中断入口
           ORG  001BH
           AJMP  WT1           ;T1中断入口



;主程序
         ORG  030H
MAIN:  MOV  IE,#00H       ;关中断
         MOV  SP,#40H       ;设堆栈指针SP为40H
         SETB  P3.5           ;将P3.5口置”1”
         MOV  30H,#0CH       ;“P3  ”送显示缓冲区30H~33H
         MOV  31H,#0EH
         MOV  32H,#0EH
         MOV  33H,#0EH
MAIN0: ACALL D1S            ;调显示1秒子程序
         MOV  P1,#0FFH       ;关显示
         CLR  20H              ;清脉宽计数值存放区20H~21H
         CLR  21H
         CLR  22H              ;清单稳脉冲结束标志22H
         MOV  TH0,#0FFH     ;置T0计数初值255
         MOV  TL0,#0FFH
         MOV  TH1,#00H      ;置T1的计数初值0
         MOV  TL1,#00H
         MOV  TMOD,#26H    ;置T0为计数方式,方式2;T1为定时方式。方式2
         SETB  EA              ;允许T0、T1中断
         SETB  ET0
         SETB  ET1
         SETB  TR0             ;开T0中断
         CLR  P3.5              ;送单稳触发脉冲
         NOP
         NOP
         NOP
         NOP
         SETB  P3.5
         SETB  TR1             ;开T1中断
MAIN1: CJNE  22H,#01H,MAIN2  ;单稳脉冲未结束,转检查是否超时
         AJMP  MAIN3              ;单稳脉冲结束,转取脉宽计数值
MAIN2: CJINE  21H,#08H,MAIN1  ;未超时,转等待单稳脉冲结束
         CLR  EA
         CLR  ET0
         CLR  ET1
         CLR  TR0
         CLR  TR1
         MOV  30H,#0DH           ;开路提示“E1”送显示缓冲区,转显示
         MOV  31H,#01H
         MOV  32H,#0EH
         MOV  33H,#0EH
         AJMP  MAIN0
MAIN3: CJNE  21H,#00H,MAIN4  ;单稳脉冲结束,先判断是否短路。不是,转查表程序。
         MOV  30H,#0DH          ;短路,短路提示“E2”送显示缓冲区,转显示
         MOV  31H,#02H
         MOV  32H,#0EH
         MOV  33H,#0EH
         AJMP  MAIN0


MAIN4: ACALL  NTTR             ;调查表子程序
         AJMP  MAIN0
;查表求温度值子程序
NTTR: MOV  R2,#00H             ;清计数与温度对照表偏移量寄存器R2
         MOV  DPTR,NTTAB        ;DPTR指向计数与温度对照表首址
NTTR1: CLR  C                     ;20H、21H中的内容与NTTRB相减,并将差值存23H、24H
         MOV  R3,#02H
         MOV  R0,#20H
         MOV  R1,#23H
NTTR2: MOV  A,R2
         MOVC  A,@A+DPTR
         SUBB  A,@R0
         MOV  @R1,A
         INC  R0
         INC  R1
         INC  R2
         CJNE  R2,#122,NTTR3   ;若未到NTAB表尾,继续比较
POVER:JC  NTTR30               ;到表尾,查到对应温度,转求温度值
         MOV  30,#0EH           ;到表尾,查到对应温度,正超温提示“UUU”送显缓区
         MOV  31H,#0BH
         MOV  32H,#0BH
         MOV  33H,#0BH
         RET                       ;返回主程序
NTTR3: DJNZ  R3,NTTR2
         JNC  NTTR1               ;未查到对应温度值,继续查表
NTTR30:MOV  A,R2              ;已查到对应温度,由偏移量求出整数部分,暂存R4
         CLR  C
         SUBB  A,#02H
         RR  A
         MOV  R4,A
         MOV  R1,#23H            ;求温度值的小数部分:+X/2送B
         MOV  A,@R1
         CPL  A
         INC  A
         RR  A
         MOV  B,A
NTTR4: DEC  R2                   ;Ni+1送20H、21H
         MOV  R0,#21H
         MOV  A,R2
         MOVC  A,@A+DPTR
         MOV  @R0,  A
         DEC  R0
         DEC  R2
         MOV  A,  R2
         MOVC  A,@A+DPTR
         MOV  @R0,  A
         DEC  R2                    ;求+i/2从A
         DEC  R2
         MOV  R3,#02H


         CLR  C
NTTR5: MOV  A,R2
         MOVC  A,@A+DPTR
         SUBB  A,@R0
         JNC  NTTR50
         CLP  A
         INC  A
NTTR50:RR  A
         MOV  R5,A
         MOV  A,B                   ;+x/2*10/+i得到温度值的小数部分
         JZ  NTTR6
         MOV  B,  #05H
         MUL  AB
         MOV  B,R5
         DIV  AB
         MOV  20H,A                 ;小数部分送20H
         AJMP  NTTR7
NTTR6: MOV  20H,#00H
NTTR7: MOV  A,#0AH               ;判整数部分为正还是负
         CLR  C
         SUBB  A,R4
         JC  PTEMP
NTEMP:CJNE  A,#0AH,NTEMP1      ;为负
         MOV  30H,#0EH              ;“-X”送显示缓冲区高三位
         MOV  31H,#0AH
         MOV  32H,A
         AJMP  NTEMP2
NTEMP1:MOV  30H,#0AH         ;“-10” 送显示缓冲区高三位
          MOV  31H,#01H
          MOV  32H,#00H
NTEMP2:MOV  A,#0AH           ;修正小数部分后,将小数部分送显缓低三位
          CLR  C
          SUBB  A,20H
          MOV  33H,A
          RET                      ;返回主程序
PTEMP: MOV  30H,#0EH         ;为正。“ ”送显缓最高位
          MOV  A,R4             ;温度值整数部分送显缓中间两位
          MOV  B,#0AH
          DIV  AB
          JNZ  PTEMP1
]          MOV  31H,#0EH
          JMP  PTEMP2
PTEMP1:MOV  31H,A
PTEMP2:MOV  32H,B
          MOV  33H,20H           ;小数部分送显缓最低位
          RET                       ;返回主程序
;显示子程序(将显缓区的内容循环显示一遍,每位显示1ms后,关显示返回主程序)
DSP:    MOV  R2,#01H
          MOV  R0,#30H


          MOV  DPTR,#TAB
DSP1:   MOV  A,@R0
          MOVC  A,@A+DPTR
          MOV  P1,A
          ORL  P3,R2
          ACALL  D1MS
          MOV  A,R2
          RL  A
          MOV  R2,A
          CJNE  R2,#10H,DSP2
          ANL  P3,#0F0H
          RET
DSP2:   INC  R0
          AJMP  DSP1
;延时1ms子程序
D1MS:   MOV  R7,#166
D1MS1:  DJNZ  R7,D1MS1
          RET
;显示1秒子程序
D1S:     MOV  R6,#04H
D1S1:    MOV  R5,#250
D1S2:    ACALL  DSP
          DJNZ  R5,D1S2
          DJNZ  R6,D1S1
          RET
;段码表
TAB:    DB  40H,79H,24H,30H,19H   :0.,1.,2.,3.,4.
          DB  12H,02H,78H,00H,10H   :5.,6.,7.,8.,9.
          DB  3FH,41H,0CH,06H,0FFH  :-.,U.,P.,E.,灭
;T0中断处理程序
WT0:    MOV  A,TL1             ;将T1计数值送20H
          MOV  20H,A
          CLR  EA                  ;关中断
          CLR  TR0                  ;T0停止计数
          CLR  TR1                  ;T1停止计数
          MOV  22H,#01H           ;置单稳脉冲结束标志
          RETI                       ;返回主程序
;T1中断处理程序
WT1:    INC  21H                   ;脉宽计数值高位加1
          RETI                       ;返回主程序
;脉宽计数与温度对照表
NTTBL:  DB  0D0H,05H,0B2H,05H,96H,05H,72H,05H
           DB  52H,05H,35H,05H,15H,05H,0F6H,04H
           DB  0D8H,04H,0B9H,04H,9CH,04H,81H,04H
           DB  65H,04H,4AH,04H,30H,04H,14H,04H
           DB  0FAH,03H,0E0H,03H,0C6H,03H,0ADH,03H
           DB  95H,03H,7CH,03H,64H,03H,4CH,03H

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -