|
我的正弦信号发生器怎么变频率啊!急求。。。在线等
[复制链接]
想要变换频率,但是不会写变频函数 求求大虾帮我写下撒 汇编不会啊
.mmregs
.def _c_int00
.def d_xs,d_sinx,d_xc,d_cosx,sinx,cosx
sin_x: .usect "sin_x",360
STACK: .usect "STACk",10H
k_theta .set 286 ;theta=pi/360(索引值)
_c_int00:
.text
STM #STACK+10H,sp ;设置堆栈
STM k_theta,AR0 ;设置增量
STM #0,AR1 ;AR1=x=0
STM #sin_x,AR6 ;AR6指向sin_x
STM #90,BRC ;产生sin0(deg.)至sin90(deg.)
RPTB loop1-1
LDM AR1,A ;取x
LD #d_xs,DP ;设置页指针
STL A,@d_xs ;x-->d_xs
STL A,@d_xc ;x-->d_xc
CALL sinx ;计算某一角度的正弦值
CALL cosx ;计算某一角度的余弦值
LD #d_sinx,DP ;切换到正弦指数数据区
LD @d_sinx,16,A ;AH=sinx
MPYA @d_cosx ;B=sinx*cosx
STH B,1,*AR6+ ;*AR6=2sinx*cosx
MAR *AR1+0 ;AR1=AR1+AR0
loop1: STM #sin_x+89,AR7 ;产生sin91(deg.)至sin179(deg.)
STM #88,BRC ;重复的次数
RPTB loop2-1
LD *AR7-,A
STL A,*AR6+
loop2: STM #179,BRC ;产生sin180(deg.)至sin360(deg.)
STM #sin_x,AR7 ;AR7指向sin_x
RPTB loop3-1
LD *AR7+,A
NEG A ;取反
STL A,*AR6+
loop3: STM #sin_x,AR6 ;AR6指向sin_x
STM #1,AR1 ;AR1=1
STM #360,BK ;设置缓冲区长度
B loop3 ;循环输出,产生正弦波
sinx:
.def d_xs,d_sinx
.data
table_s .word 01C7H
.word 030BH
.word 0666H
.word 1556H
d_coef_s .usect "coef_s",4 ;为存放c1,c2,c3,c4的地址保留4个存储空间
d_xs .usect "sin_vars",1 ;为存放x保留一个存储空间
d_squr_xs .usect "sin_vars",1 ;为存放x^2保留一个存储空间
d_temp_s .usect "sin_vars",1 ;保留一个暂存空间
d_sinx .usect "sin_vars",1 ;为存放结果保留一个存储空间
d_1_s .usect "sin_vars",1 ;为存放"1"保留一个存储空间
.text
SSBX FRCT ;设置小数运算
STM #d_coef_s,AR5 ;系数表
RPT #3 ;重复4次
MVPD #table_s,*AR5+ ;向系数表传送泰勒系数
STM #d_coef_s,AR3 ;c1=1/72,c2=1/42,c3=1/20,c4=1/6
STM #d_xs,AR2 ;x单元地址-->AR2
STM #d_1_s,AR4 ;"1"地址-->AR4
ST #7FFFH,d_1_s ;数1-->d_1_s
SQUR *AR2+,A ;A=x^2
ST A,*AR2 ;(AR2)=x^2
||LD *AR4,B ;B=1
MASR *AR2+,*AR3+,B,A ;A=(1-x^2x)/72,T=x^2
MPYA A ;A=x^2(1-x^2)/72
STH A,*AR2 ;(d_temp)=x^2(x^2x/72)
MASR *AR2-,*AR3+,B,A ;A=1-x^2/42(1-x^2/72),T=x^2(1-x^2/72)
MPYA *AR2+ ;B=x^2(1-x^2/42(1-x^2/72))
St B,*AR2 ;(d_temp)=x^2(1-x^2/42(1-x^2/72))
||LD *AR4,B ;B=1
MASR *AR2-,*AR3+,B,A ;A=1-x^2/20(1-x^2/42(1-x^2/72))
MPYA *AR2+ ;B=x^2(1-x^2/20(1-x^2/42(1-x^2/72)))
ST B,*AR2 ;(d_temp)=B
||LD *AR4,B ;B=1
MASR *AR2-,*AR3+,B,A ;A=1-x^2/6(1-x^2/20(1-x^2/42(1-x^2/72)))
MPYA d_xs ;B=x(1-x^2/6(1-x^2/20(1-x^2/42(1-x^2/72))))
STH B,d_sinx ;计算sinx的值存入d_sinx
RET
cosx:
.def d_xc,d_cosx
.data
table_c .word 0249H
.word 0444H
.word 0AABH
.word 4000H
d_coef_c .usect "coef_c",4 ;为存放c1,c2,c3,c4的地址保留4个存储空间
d_xc .usect "cos_vars",1 ;为x保留一个存储空间
d_squr_xc .usect "cos_vars",1 ;为x^2保留一个存储空间
d_temp_c .usect "cos_vars",1 ;保留一个暂存空间
d_cosx .usect "cos_vars",1 ;为存放结果保留一个存储空间
c_1_c .usect "cos_vars",1 ;为存放"1"保留一个存储空间
.text
SSBX FRCT ;设置小数运算
STM #d_coef_c,AR5 ;系数表
RPT #3 ;重复4次
MVPD #table_c,*AR5+ ;向系数表传送泰勒系数
STM #d_coef_c,AR3 ;c1=1/56,c1=1/30,c3=1/12
STM #d_xc,AR2 ;x单元地址-->AR2
STM #c_1_c,AR4 ;"1"地址-->AR4
ST #7FFFH,c_1_c ;数1-->c_1_c
SQUR *AR2+,A ;A=x^2
ST A,*AR2 ;(AR2)=x^2
||LD *AR4,B ;B=1
MASR *AR2+,*AR3+,B,A ;A=1-x^1/56,T=x^2
MPYA A ;A=T*A=x^2(1-x^2/56)
STH A,*AR2 ;(d_temp)=x^2(1-x^2/56)
MASR *AR2-,*AR3+,B,A ;A=1-x^2/30(1-x^2/56),T=x^2(1-x^2/56
MPYA *AR2+ ;B=x^2(1-x^2/30(1-x^2/56))
ST B,*AR2 ;(d_temp)=x^2(1-x^2/30(1-x^2/56))
||LD *AR4,B ;B=1
MASR *AR2-,*AR3+,B,A ;A=1-x^2(1-x^2/30(1-x^2/56))
SFTA A,-1,A ;-1/2
NEG A ;取反
MPYA *AR2+ ;B=-x^2/2(1-x^2/12(1-x^2/30(1-x^2/56)))
MAR *AR2+ ;修改AR2
RETD
ADD *AR4,16,B ;B=1-x^2/2(1-x^2/12(1-x^2/30(1-x^2/56)))
STH B,*AR2 ;计算cosx的值存入d_cosx
RET
.end
|
|