登录|立即注册|使用QQ帐号登录
论坛 > MCU综合技术区
发帖|
看2465|回0|收藏
楼主 ID:80101 只看他
2015-5-15 18:21
ORG       1000H
AJUMP     MAIN                           ;转跳到主程序
ORG       00BH                           ;中断地址
AJUMP     SERVER                         ;中断调用
MAIN:     MOV  TMOD ,  40H                 ;初始值
          MOV  TH0 ,  #5BH                ;设置计时值
          MOV  TL0 ,  #20H               
          MOV  TH1 ,  #00H                ;设置计数值
          MOV  TL1 ,  #00H
          MOV  R0 ,   #10                 ;设置1s时间
          MOV  A ,    #00H                ;清空累加器
           MOV 4000H , #05H                ;存放最大值5米
          MOV  4001H , #01H                ;存放最小值1米
MOV 3000H , #00H                ;清空显示数据
DATE1    ACALL   DATE2                 ;调用显示程序
          MOV  A ,    3000H               ;取位数据
          SUBB  A ,    4000H               ;与最大值比较
          JC    MIN              ;当小于最大值,在于最小值比较
          SET   P1.1              ;发送高电平控制水泵
          CLR   P1.0              ;开启发射装置
          ACALL D1MS
CLR  P1.1              ;停止发送
SET  P1.0              ;关闭发射装置
AJUMP      HEAR        ;等待1s中断
MIN:      SUB A       4001H       ;与最小值比较
          JC          HEAR        ;等待采集数据
SET        P1.1        ;关闭水泵
CLR        P1.0        ;开启发射装置
          ACALL       D1MS         
          CLR         P1.1          ;停止发送
          SET         P1.0          ;关闭发射装置
HEAR:     AJMP        HEAR          ;等待1s中断
AJMP      DATE1         ;重新取数据
********TO中断程序(T0计时器,T1计数器)******
SERVER:    PUSH    A
           PUSH    B
           PUSH    DPL              
           PUSH    DPH              ;保护现场
           CLR     TR0
           CLR     ET0             ;关中断
           DEC     R0
   JNZ      R0      T2          ;是否到了1S,否则跳到T2
           CLR     TR1
           CLR     ET1          ;停止计数
           MOV     A ,    TH1      ;将高八位的计数值存放A中
           MOV     B ,    TL1      ;将低八位的计数值存放B中
           MOV     5001H ,B
           CZ      A ,    F0       ;判断是否大于256
           MOV     5000H , #25
F0:        MOV    B ,      #10
           MOV    A ,      5001H
           DIV    AB
ADDC   A,      5000H
MOV   3000H ,  A          ;存放水位值
MOV   TL1 ,    #00H
MOV   TH1 ,    #00H        ;计数值清零
SETB  TR1
SETB  ET1                 ;启动计数
    T2:         MOV     TH0,   #5BH        ;设置计时值
                 MOV     TL0    #20H
                 SETB    TR0
                 SETB    ET0                 ;开计时中断
                 POP     A
                 POP     B
                 POP     DPL
                 POP     DPH                   ;恢复现场
                 RETI                          ;转到显示程序
********显示程序*********
    DATE2:      MOV    A ,   3000H            ;取水位数据
                MOV    B ,  #10              ;分离整数和最小值
                DIV    AB                      ;整数放A,小数放B
          ACALL    CHAIAO                ;调用查表
          ADD     A ,    #80H             ;加小数点代码
          MOV     P2 ,   A                ;显示整数的数值
          MOV     A ,    B                ;取小数值
          ACALL   CHABIAO                ;调用查表
          MOV    P0 ,    A                ;显示小数的数值
RET                             ;返回
TABLE:    DB  3FH,  06H, 5BH,  4FH,  66H    ;0,1,2,3,4,
          DB  6DH,  7DH, 07H,  7FH,  6FH    ;5.6.7.8.9
CHABIAO:  PUSH  DPH                      ;保护现场
          PUSH  DPL
           MOV DPTR ,  #TABLE
MOVC  A,  @A+DPTR
          POP  DPL
          POP  DPH                       ;恢复现场
          RET      
D1MS:     MOV  R7,  #80        ;延时1MS子程序
          DJNZ  R7,  $
          RET
END

51黑电子论坛

Powered by Discuz! X3.1

首页|标准版|触屏版|电脑版