微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 汇编语言问题

汇编语言问题

时间:10-02 整理:3721RD 点击:
最近学汇编语言,能看懂语句的意思,但看不懂下面这段程序是实现什么功能
求教temp1_reg为什么不直接输入da_reg进行da转换,而个运算的目的是什么,谢谢

  1.      mov temp_hreg,temp1_hreg
  2.      mov temp_lreg,temp1_lreg
  3.      mov a,temp_hreg
  4.      swap a
  5.      anl a,#11110000b
  6.      mov temp_hreg,a

  7.      mov a,temp_lreg
  8.      swap a
  9.      anl a,#00001111b
  10.      add a,temp_hreg
  11.      mov da_hreg,a

  12.      mov a,temp_lreg
  13.      swap a
  14.      anl a,#11110000b
  15.      mov da_lreg,a
  16.      lcall da76
  17.      ljmp loop<font style="font-size: 12px">
  18. </font>

复制代码



这段程序应该是给DA转换数据做准备工作,DA转换为12位精度,temp1_hreg、temp1_lreg 包含需要转换的数据,最低位处于 temp1_lreg 的 BIT0,但是DA转换器需要的数据为最高的12位,也就是说【bit15-bit8】,所以,需要将temp1_hreg、temp1_lreg 这两个字节组成的整数左移4位;
这段程序做的就是这个工作,将转换后的结果保存在da_hreg和da_lreg中,供后面的程序使用。
下面是我帮你修改过的程序,省掉两个临时变量,效果一样,并且不影响标志位,稍微要简短一点

  1.       mov da_hreg, temp1_hreg
  2.       mov da_lreg,temp1_lreg

  3.       MOV    A, da_lreg
  4.       
  5.       XCHD   A, da_hreg
  6.       SWAP   A
  7.       XCH    A, da_hreg
  8.       ANL    A, #0Fh
  9.       SWAP   A
  10.       MOV    da_lreg, A
  11.       lcall da76
  12.       ljmp loop

复制代码



  

谢谢woodmice,解释的很清楚,现在我可以理解,有个问题还要向您请教
我做的系统是:有一个20个面的反射棱镜,旁边装接收管接收棱镜反射,每转一圈产生一个基准脉冲tg,接收20个信号va,基准脉冲tg通过20倍频和va信号一一对应,通过测量相位差就可以判别被测物的位置信号,输出0-10v的模拟电压信号,相位差我用16位定时器实现。现在的问题是:由于棱镜20个面不可能做得完全相同,转速也有误差,所以被测物在同一位置时,va信号周期不完全相同,造成定时器的读数不一样,da转换后模拟电压比较毛糙,成阶梯型,每一转中20个面都不一样,tg来时又重复。现在我把整段程序贴出来,请您帮我分析下,其中有消除棱镜20个面不同带来的误差的程序段吗?棱镜转速30hz,va信号600hz,该转速下20个面的误差有50us,下面是tg20倍频后和va信号:


程序如下:

  1. org 0000h
  2. ljmp main

  3. org 0013h     ;外部中断INT1
  4. ljmp start

  5. org 001bh
  6. ljmp time   ;定时中断T1

  7. org 0100h
  8. time_hreg equ 30h
  9. time_lreg equ 31h
  10. da_hreg   equ 32h
  11. da_lreg   equ 33h
  12. temp_hreg equ 34h
  13. temp_lreg equ 35h
  14. temp1_hreg equ 36h
  15. temp1_lreg equ 37h
  16. time_hcopy equ 38h
  17. time_lcopy equ 39h

  18. csd bit P3.7           ;P2.4 ;ADS7611的I/O
  19. clk0 bit P1.2          ;P2.5
  20. sdi bit P1.3           ;P2.6
  21. ld  bit P1.4           ;P2.7

  22. csx bit P3.1           ;P2.3;P2.3  X25045的I/O
  23. so  bit P3.0           ;P2.2
  24. si  bit P3.4           ;P2.0
  25. sck bit P3.5           ;P2.1

  26. rise bit P1.7          ;in signal is h,or down
  27. sethigh bit P1.6       ;in signal is h
  28. y_n bit P1.5           ;out y/n metal

  29. main: mov sp,#5fh
  30.       setb y_n
  31.       mov ie,#8ch      ;允许中断INT1  T1
  32.       mov tmod,#19h    ;T1由TR1启动16位定时,T0由TR0+INT0启动16位定时

  33.       mov th1,#0f7h
  34.       mov tl1,#0c3h
  35.       setb it1         ;外部INT1为边沿触发方式(下降沿)

  36.       mov th0,#00h
  37.       mov tl0,#00h
  38.       setb tr0
  39.       lcall ini45
  40.       ;mov ie,#87h
  41.       ;setb ea
  42.       setb sethigh
  43.       jb sethigh,w1
  44.       mov time_hreg,#00h
  45.       mov time_lreg,#00h
  46.       ljmp loop

  47. w1:   mov time_hreg,#08h
  48.       mov time_lreg,#3ch

  49. loop:lcall comp
  50.      cpl csx
  51.      clr c
  52.      mov a,time_lcopy
  53.      mov temp1_lreg,a
  54.      mov a,time_hcopy
  55.      mov temp1_hreg,a
  56.      setb rise
  57.      jb rise,up
  58.      clr c

  59.      mov a,#3ch
  60.      subb a,temp1_lreg
  61.      mov temp_lreg,a
  62.      mov a,#08h
  63.      subb a,temp1_hreg
  64.      mov temp_hreg,a

  65.      mov a,temp_hreg
  66.      swap a
  67.      anl a,#11110000b
  68.      mov temp_hreg,a

  69.      mov a,temp_lreg
  70.      swap a
  71.      anl a,#00001111b
  72.      add a,temp_hreg
  73.      mov da_hreg,a

  74.      mov a,temp_lreg
  75.      swap a
  76.      anl a,#11110000b
  77.      mov da_lreg,a
  78.      lcall da76
  79.      ljmp loop

  80. up:  mov temp_hreg,temp1_hreg
  81.      mov temp_lreg,temp1_lreg
  82.      mov a,temp_hreg
  83.      swap a
  84.      anl a,#11110000b
  85.      mov temp_hreg,a

  86.      mov a,temp_lreg
  87.      swap a
  88.      anl a,#00001111b
  89.      add a,temp_hreg
  90.      mov da_hreg,a

  91.      mov a,temp_lreg
  92.      swap a
  93.      anl a,#11110000b
  94.      mov da_lreg,a
  95.      lcall da76
  96.      ljmp loop

  97. ini45: clr sck
  98.        clr csx
  99.        mov a,#06h
  100.        lcall out
  101.        setb csx
  102.        clr csx
  103.        mov a,#01h
  104.        lcall out
  105.        mov a,#00h
  106.        lcall out
  107.        clr sck
  108.        setb csx
  109.        ret

  110. out: clr sck;将A输出至X25045
  111.      rlc a
  112.      mov si,c
  113.      setb sck

  114.      clr sck
  115.      rlc a
  116.      mov si,c
  117.      setb sck

  118.      clr sck
  119.      rlc a
  120.      mov si,c
  121.      setb sck

  122.      clr sck
  123.      rlc a
  124.      mov si,c
  125.      setb sck

  126.      clr sck
  127.      rlc a
  128.      mov si,c
  129.      setb sck

  130.      clr sck
  131.      rlc a
  132.      mov si,c
  133.      setb sck

  134.      clr sck
  135.      rlc a
  136.      mov si,c
  137.      setb sck

  138.      clr sck
  139.      rlc a
  140.      mov si,c
  141.      setb sck

  142.      clr si
  143.      ret

  144. da76:clr sdi
  145.      setb clk0
  146.      setb csd
  147.      clr ld
  148.      nop
  149.      nop
  150.      setb ld
  151.      nop
  152.      clr csd

  153.      mov a,da_hreg

  154.      clr clk0
  155.      rlc a
  156.      mov sdi,c
  157.      nop
  158.      setb clk0        ;1

  159.      clr clk0
  160.      rlc a
  161.      mov sdi,c
  162.      nop
  163.      setb clk0        ;2

  164.      clr clk0
  165.      rlc a
  166.      mov sdi,c
  167.      nop
  168.      setb clk0        ;3

  169.      clr clk0
  170.      rlc a
  171.      mov sdi,c
  172.      nop
  173.      setb clk0        ;4

  174.      clr clk0
  175.      rlc a
  176.      mov sdi,c
  177.      nop
  178.      setb clk0        ;5

  179.      clr clk0
  180.      rlc a
  181.      mov sdi,c
  182.      nop
  183.      setb clk0        ;6

  184.      clr clk0
  185.      rlc a
  186.      mov sdi,c
  187.      nop
  188.      setb clk0        ;7

  189.      clr clk0
  190.      rlc a
  191.      mov sdi,c
  192.      nop
  193.      setb clk0        ;8

  194. ;DA7611_VALUE送入DAC7611高八位

  195.      mov a,da_lreg

  196.      clr clk0
  197.      rlc a
  198.      mov sdi,c
  199.      nop
  200.      setb clk0        ;1

  201.      clr clk0
  202.      rlc a
  203.      mov sdi,c
  204.      nop
  205.      setb clk0        ;2

  206.      clr clk0
  207.      rlc a
  208.      mov sdi,c
  209.      nop
  210.      setb clk0        ;3

  211.      clr clk0
  212.      rlc a
  213.      mov sdi,c
  214.      nop
  215.      setb clk0        ;4

  216.      nop

  217.      setb csd
  218.      clr ld
  219.      nop
  220.      setb ld
  221.      ret

  222. start:push acc
  223.       push psw
  224.       mov th1,#0f7h
  225.       mov tl1,#0c3h
  226.       setb tr1
  227.       pop psw
  228.       pop acc
  229.       reti

  230. time:push acc
  231.      push psw
  232.      clr tr0
  233.      mov time_hreg,th0
  234.      mov time_lreg,tl0
  235.      mov th0,#00h
  236.      mov tl0,#00h
  237.      setb tr0
  238.      pop psw
  239.      pop acc
  240.      reti

  241. x2_y:clr y_n
  242.      mov time_hcopy,time_hreg
  243.      mov time_lcopy,time_lreg
  244.      ret


  245. comp:mov a,time_hreg
  246.      cjne a,#08h,x1
  247.      ljmp x2
  248. x1:  jc x2_y;no object
  249.      ljmp comp_end
  250. x2:  mov a,time_lreg
  251.      cjne a,#3ch,x3
  252.      ljmp x2_y
  253. x3:  jc x2_y

  254. comp_end: setb y_n
  255.           setb sethigh
  256.           jb sethigh,ww1
  257.           mov time_hcopy,#00h
  258.           mov time_lcopy,#00h
  259.           ret

  260. ww1:mov time_hcopy,#08h
  261.     mov time_lcopy,#3ch
  262.     ret
  263.    end

复制代码


其实我想把上面的程序移植到cpld中,完全用硬件处理,但解决不了va抖动(20个棱镜面不同)带来的影响,da转换不稳,上面这段程序可能有去抖功能,帮我分析下

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top