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

📄 jianxiangqi.asm

📁 利用单片机进行相位的检测,产生两路波形,检测相位的差别.
💻 ASM
字号:
         ORG 0000H
         AJMP HEND
         ORG 0003H
         AJMP FIRST
         ORG 0013H
         AJMP SECOND
         ORG 0030H
  HEND:  MOV SP,#50H
         MOV R1,#40H
         CLR 00H
         MOV TCON,#05H        ;外部中断用负边沿触发
         MOV IE,#80H          ;开中断
         MOV TMOD,#11H        ;T0,T1均为定时器
         MOV TH0,#0           ;T0用来计时信号的周期
         MOV TL0,#0
         MOV TH1,#0           ;T1用来计时信号相位的相差时间
         MOV TL1,#0
         MOV 14H,#0EH         ;动态显示的驱动位在开机时的状态
         MOV 15H,#0FH         ;即只显示个位
         MOV 16H,#0FH
         MOV 17H,#0FH
   LOOP: CLR P1.0             ;  设置行编码"1110"
         SETB P1.1
         SETB P1.2
         SETB P1.3
         JB P1.4,NEXT1         ;判断"1"键是否按下
         ACALL DLY20MS         ; 延时去抖
     K0: JB P1.4,K00           ; 等待"1"键释放
         AJMP K0
    K00:  JB 00H,PUTOFF       ;电压表的开关
          SETB 00H
          CLR IE0
          SETB EX0             ;开关开后,中断INT0便开
   NEXT1: JNB 00H,BACK         ;当00H位为1时,动态显示开
          MOV @R1,14H          ;动态显示数据显示输入时由右向左显示频率
          MOV A,10H
          XCHD A,@R1
          MOV DPTR,#6000H
          MOV A,@R1
          MOVX @DPTR,A
          MOV @R1,15H
          MOV A,11H
          XCHD A,@R1
          MOV DPTR,#6000H
          MOV A,@R1
          MOVX @DPTR,A
          MOV @R1, 16H
          MOV A,12H
          XCHD A,@R1
          MOV DPTR,#6000H
          MOV A,@R1
          MOVX @DPTR,A
          MOV @R1,17H
          MOV A,13H
          XCHD A,@R1
          MOV DPTR,#6000H
          MOV A,@R1
          MOVX @DPTR,A
          MOV A,#0F0H
          MOV DPTR,#6000H
          MOVX @DPTR,A
  BACK:   SJMP LOOP
  PUTOFF: CLR 00H
          CLR EX1                ;开关关后,中断也关
          CLR EX0                ;开关关后,中断也关
          SJMP LOOP



  FIRST:  JB 01H,BESIDE2           ;中断服务,若是第二个下降沿则转移
          SETB TR0                ;在第一个下降沿时T0开始计数
          SETB 01H
          RETI

 BESIDE2:SETB TR1             ;在第二个下降沿到时开T1计数器
         CLR TR0              ;关TR0计数器
         CLR EX0              ;关外中断0
         CLR IE1              ;控制它在中断0执行后第二路波的第一个下降沿中断
         SETB EX1             ;开外中断1
         CLR 01H
         RETI

 SECOND: PUSH A               ;保护数据
         CLR TR1              ;停计数器1的计数
         MOV A,TH0            ;取出信号的周期
         MOV 0CH,A
         MOV A,TL0
         MOV 0DH,A
         MOV A,TH1            ;取出两路信号的时间差
         MOV R2,A
         MOV A,TL1
         MOV R3,A
         MOV R6,#01H          ;将360度送进R6,R7中
         MOV R7,#68H
         MOV A,R3             ;计算R3乘R7
         MOV B,R7
         MUL AB
         MOV R4,B             ; 暂存部分积
         MOV R5,A
         MOV A,R3             ;计算R3乘R6
         MOV B,R6
         MUL AB
         ADD A,R4             ;累加部分积
         MOV R4,A
         CLR A
         ADDC A,B
         MOV R3,A
         MOV A,R2               ;计算R2乘R7
         MOV B,R7
         MUL AB
         ADD A,R4               ;累加部分积
         MOV R4,A
         MOV A,R3
         ADDC A,B
         MOV R3,A
         CLR A
         RLC A
         XCH A,R2              ;计算R2乘R6
         MOV B,R6
         MUL AB
         ADD A,R3               ;累加部分积
         MOV R3,A
         MOV A,R2
         ADDC A,B
         MOV R2,A               ;程序结果存在R2,R3,R4,R5中
         MOV R6,0CH             ;将信号周期进R6,R7中
         MOV R7,0DH
         MOV 08H,#16
         ACALL LOOP0
         MOV 0AH,R5             ;将整数部分数据保护起来
         MOV 0BH,R4
         MOV A,R3               ;余数低位进A
         MOV B,#10
         MUL AB
         MOV R5,A
         MOV R4,B
         MOV A,R2               ;余数高位进A
         MOV B,#10
         MUL AB
         ADD A,R4
         MOV R4,A
         MOV R3,B
         MOV R2,#0
         MOV R6,0CH
         MOV R7,0DH
         MOV 08H,#16
         ACALL LOOP0             ;求出小数部分
         MOV 10H,R5
         MOV R5,0AH              ;求百位
         MOV R4,0BH
         MOV R2,#0
         MOV R3,#0
         MOV 08H,#16
         MOV R7,#64H
         MOV R6,#0
         ACALL LOOP0
         MOV 13H,R5               ;将百位送动态显示的百位上
         MOV A,R3                  ;求十位和个位
         MOV B,#10
         DIV AB
         MOV 12H,A
         MOV 11H,B
         SETB EX0            ;开外中断0,继续跟踪信号,进行下一次的鉴相
         CLR IE0             ;剔除可能产生的中断标志
         CLR IE1
         MOV TH0,#0          ;计数器从新计数
         MOV TL0,#0
         MOV TH1,#0
         MOV TL1,#0
         MOV 15H,#0B0H
         MOV 16H,#70H
         POP A
         RETI

 LOOP0:  CLR C                ;以下为将测量数据转换成数码管可显示的形式
         MOV A,R5
         RLC A
         MOV R5,A
         MOV A,R4
         RLC A
         MOV R4,A
         MOV A,R3
         RLC A
         MOV R3,A
         MOV A,R2
         RLC A
         MOV R2,A
         MOV A,R3
         MOV PSW.5,C
         CLR C
         SUBB A,R7
         MOV 0FH,A            ;余数送0Fh单元保护
         MOV A,R2
         SUBB A,R6
         JB PSW.5,LOOP2
  LOOP2: JC LOOP1
         MOV R2,A              ;余数高字节进r2
         MOV R3,0FH             ;低字节进r3
         INC R5                 ;结果进r5
  LOOP1: DJNZ 08H,LOOP0          ;若没完成数据处理则继续
         RET

DLY20MS: MOV 22H,#70H        ; 延时20毫秒子程序       *******占用资源22h,23h****************
    DY1: MOV 23H,#69H
    DY2: DJNZ 23H,DY2
         DJNZ 22H,DY1
         RET
DELAY200MS: MOV 22H,#25          ;延时0.5秒子程序         *****占用资源22h,23h,24h************
   DL333:   MOV 23H,#100
   DL222:   MOV 24H,#49
   DL111:   DJNZ 24H,DL111
            DJNZ 23H,DL222
            DJNZ 22H,DL333
            RET

⌨️ 快捷键说明

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