汇编语言问题
时间:10-02
整理:3721RD
点击:
最近学汇编语言,能看懂语句的意思,但看不懂下面这段程序是实现什么功能
求教temp1_reg为什么不直接输入da_reg进行da转换,而个运算的目的是什么,谢谢
程序如下:
其实我想把上面的程序移植到cpld中,完全用硬件处理,但解决不了va抖动(20个棱镜面不同)带来的影响,da转换不稳,上面这段程序可能有去抖功能,帮我分析下
求教temp1_reg为什么不直接输入da_reg进行da转换,而个运算的目的是什么,谢谢
- mov temp_hreg,temp1_hreg
- mov temp_lreg,temp1_lreg
- mov a,temp_hreg
- swap a
- anl a,#11110000b
- mov temp_hreg,a
- mov a,temp_lreg
- swap a
- anl a,#00001111b
- add a,temp_hreg
- mov da_hreg,a
- mov a,temp_lreg
- swap a
- anl a,#11110000b
- mov da_lreg,a
- lcall da76
- ljmp loop<font style="font-size: 12px">
- </font>
这段程序应该是给DA转换数据做准备工作,DA转换为12位精度,temp1_hreg、temp1_lreg 包含需要转换的数据,最低位处于 temp1_lreg 的 BIT0,但是DA转换器需要的数据为最高的12位,也就是说【bit15-bit8】,所以,需要将temp1_hreg、temp1_lreg 这两个字节组成的整数左移4位;
这段程序做的就是这个工作,将转换后的结果保存在da_hreg和da_lreg中,供后面的程序使用。
下面是我帮你修改过的程序,省掉两个临时变量,效果一样,并且不影响标志位,稍微要简短一点
- mov da_hreg, temp1_hreg
- mov da_lreg,temp1_lreg
- MOV A, da_lreg
-
- XCHD A, da_hreg
- SWAP A
- XCH A, da_hreg
- ANL A, #0Fh
- SWAP A
- MOV da_lreg, A
- lcall da76
- 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信号:
程序如下:
- org 0000h
- ljmp main
- org 0013h ;外部中断INT1
- ljmp start
- org 001bh
- ljmp time ;定时中断T1
- org 0100h
- time_hreg equ 30h
- time_lreg equ 31h
- da_hreg equ 32h
- da_lreg equ 33h
- temp_hreg equ 34h
- temp_lreg equ 35h
- temp1_hreg equ 36h
- temp1_lreg equ 37h
- time_hcopy equ 38h
- time_lcopy equ 39h
- csd bit P3.7 ;P2.4 ;ADS7611的I/O
- clk0 bit P1.2 ;P2.5
- sdi bit P1.3 ;P2.6
- ld bit P1.4 ;P2.7
- csx bit P3.1 ;P2.3;P2.3 X25045的I/O
- so bit P3.0 ;P2.2
- si bit P3.4 ;P2.0
- sck bit P3.5 ;P2.1
- rise bit P1.7 ;in signal is h,or down
- sethigh bit P1.6 ;in signal is h
- y_n bit P1.5 ;out y/n metal
- main: mov sp,#5fh
- setb y_n
- mov ie,#8ch ;允许中断INT1 T1
- mov tmod,#19h ;T1由TR1启动16位定时,T0由TR0+INT0启动16位定时
- mov th1,#0f7h
- mov tl1,#0c3h
- setb it1 ;外部INT1为边沿触发方式(下降沿)
- mov th0,#00h
- mov tl0,#00h
- setb tr0
- lcall ini45
- ;mov ie,#87h
- ;setb ea
- setb sethigh
- jb sethigh,w1
- mov time_hreg,#00h
- mov time_lreg,#00h
- ljmp loop
- w1: mov time_hreg,#08h
- mov time_lreg,#3ch
- loop:lcall comp
- cpl csx
- clr c
- mov a,time_lcopy
- mov temp1_lreg,a
- mov a,time_hcopy
- mov temp1_hreg,a
- setb rise
- jb rise,up
- clr c
- mov a,#3ch
- subb a,temp1_lreg
- mov temp_lreg,a
- mov a,#08h
- subb a,temp1_hreg
- mov temp_hreg,a
- mov a,temp_hreg
- swap a
- anl a,#11110000b
- mov temp_hreg,a
- mov a,temp_lreg
- swap a
- anl a,#00001111b
- add a,temp_hreg
- mov da_hreg,a
- mov a,temp_lreg
- swap a
- anl a,#11110000b
- mov da_lreg,a
- lcall da76
- ljmp loop
- up: mov temp_hreg,temp1_hreg
- mov temp_lreg,temp1_lreg
- mov a,temp_hreg
- swap a
- anl a,#11110000b
- mov temp_hreg,a
- mov a,temp_lreg
- swap a
- anl a,#00001111b
- add a,temp_hreg
- mov da_hreg,a
- mov a,temp_lreg
- swap a
- anl a,#11110000b
- mov da_lreg,a
- lcall da76
- ljmp loop
- ini45: clr sck
- clr csx
- mov a,#06h
- lcall out
- setb csx
- clr csx
- mov a,#01h
- lcall out
- mov a,#00h
- lcall out
- clr sck
- setb csx
- ret
- out: clr sck;将A输出至X25045
- rlc a
- mov si,c
- setb sck
- clr sck
- rlc a
- mov si,c
- setb sck
- clr sck
- rlc a
- mov si,c
- setb sck
- clr sck
- rlc a
- mov si,c
- setb sck
- clr sck
- rlc a
- mov si,c
- setb sck
- clr sck
- rlc a
- mov si,c
- setb sck
- clr sck
- rlc a
- mov si,c
- setb sck
- clr sck
- rlc a
- mov si,c
- setb sck
- clr si
- ret
- da76:clr sdi
- setb clk0
- setb csd
- clr ld
- nop
- nop
- setb ld
- nop
- clr csd
- mov a,da_hreg
- clr clk0
- rlc a
- mov sdi,c
- nop
- setb clk0 ;1
- clr clk0
- rlc a
- mov sdi,c
- nop
- setb clk0 ;2
- clr clk0
- rlc a
- mov sdi,c
- nop
- setb clk0 ;3
- clr clk0
- rlc a
- mov sdi,c
- nop
- setb clk0 ;4
- clr clk0
- rlc a
- mov sdi,c
- nop
- setb clk0 ;5
- clr clk0
- rlc a
- mov sdi,c
- nop
- setb clk0 ;6
- clr clk0
- rlc a
- mov sdi,c
- nop
- setb clk0 ;7
- clr clk0
- rlc a
- mov sdi,c
- nop
- setb clk0 ;8
- ;DA7611_VALUE送入DAC7611高八位
- mov a,da_lreg
- clr clk0
- rlc a
- mov sdi,c
- nop
- setb clk0 ;1
- clr clk0
- rlc a
- mov sdi,c
- nop
- setb clk0 ;2
- clr clk0
- rlc a
- mov sdi,c
- nop
- setb clk0 ;3
- clr clk0
- rlc a
- mov sdi,c
- nop
- setb clk0 ;4
- nop
- setb csd
- clr ld
- nop
- setb ld
- ret
- start:push acc
- push psw
- mov th1,#0f7h
- mov tl1,#0c3h
- setb tr1
- pop psw
- pop acc
- reti
- time:push acc
- push psw
- clr tr0
- mov time_hreg,th0
- mov time_lreg,tl0
- mov th0,#00h
- mov tl0,#00h
- setb tr0
- pop psw
- pop acc
- reti
- x2_y:clr y_n
- mov time_hcopy,time_hreg
- mov time_lcopy,time_lreg
- ret
- comp:mov a,time_hreg
- cjne a,#08h,x1
- ljmp x2
- x1: jc x2_y;no object
- ljmp comp_end
- x2: mov a,time_lreg
- cjne a,#3ch,x3
- ljmp x2_y
- x3: jc x2_y
- comp_end: setb y_n
- setb sethigh
- jb sethigh,ww1
- mov time_hcopy,#00h
- mov time_lcopy,#00h
- ret
- ww1:mov time_hcopy,#08h
- mov time_lcopy,#3ch
- ret
- end
其实我想把上面的程序移植到cpld中,完全用硬件处理,但解决不了va抖动(20个棱镜面不同)带来的影响,da转换不稳,上面这段程序可能有去抖功能,帮我分析下