51单片机:用查表法求y=5sin(x)(0<=x<=360度,分20档)

求大神教
汇编的,不是c

第1个回答  2014-11-14
float code tab[]={0,//sin(0)
0.01745240643728351281941897851632,//sin(1)只保留需要的精度就可以了
0.03489949670250097164599518162533,//sin(2)
//.............

0,//sin(360)
};

float sin(uint x)
{
if((x<=360)&&(x>0))//0-360度取表
{
return tab[x];
}
return 0;//否则返回0
}追问

请问汇编的怎么弄

请问汇编的怎么弄

追答

x equ 0x30
t equ 0x32
y equ 0x34

org 0
jmp main
main:

mov x,#HIGH(1)
mov x+1,#LOW(1)
call sinx5
jmp $

sinx5:
mov t,#0
mov t+1,#0
mov r2,#4
cheng:
mov a,t+1
add a,x+1
mov t+1,a
mov a,t
addc a,x
mov t,a
djnz r2,cheng

mov a,t+1
mov dptr,#tab
add a,dpl
mov dpl,a
mov a,t
addc a,dph
mov dph,a

clr a
movc a,@a+dptr
mov y,a

clr a
inc dptr
movc a,@a+dptr
mov y+1,a

clr a
inc dptr
movc a,@a+dptr
mov y+2,a

clr a
inc dptr
movc a,@a+dptr
mov y+3,a
ret

tab:
//由于浮点型数据太难存了,所以存储的数据为 5*sinx*1000 000
//也就是将结果扩大了1000 000倍来存储
//dw型只能存2字节,所以一个数据要分开存储
dw 0,0//sin0
dw 0x01,0x54de//sin(1)*5*1000 000
dw 0x02,0xa9a1//sin(2)*5*1000 000
..............
dw 0,0//sin(360)

end

相似回答