void da5615(unsigned int da)
{
unsigned char i;
da <<= 6;
SCLK = 0;
CS = 0;
for (i=0;i<12;i++)
{
DIN = (bit)(da & 0x8000);
SCLK = 1;
da <<= 1;
SCLK = 0;
}
SCLK = 0;
CS = 1;
}
主函数main里for循环调用512次。生成的正弦波频率只有10几hz。
void Timer0() interrupt 1
{
TL0=0xFF;
TH0=0xFE;
j++;
j%=512;
da5615(sine_dot[j]);
}
用定时器也是一样的,频率更低了。怎么不减少512采样点的情况下输出大概100hz的频率
想用51 + C + 16位资料运算,我觉得你可以直接死心吧!
100Hz : 512釆样点
代表一点只有 19.5us 处理时间。
可以考虑用组语, 全8bit操作数据。
分两个表用空间换时间,用速度快点的51 。时序再用nop 去调整。
不过你光造 16个clk, 16个 data bits ,2个 cs 不含取资料运算 就34个指令了
这34 个用SETB, CLR都是一个指令周期,
取资料index , (mov A, index)两个指令周期 x2
取 sin码 movc A, @A+DPTR 两个指令周期 x2
资料用左移RLC,C旗标, 一个周期 x16
JC 两个指令周期。 x16
要额外jump 配合 x16
加上 index+1
JNZ 回跳 , 估计最精减,不作任何判断,也要110多个指令周期。
这至少得用 60MHz 8051 (12T), 或更快一些的。
以上纯供参考,实际作可能要再加上DPTR指值, 防呆… 指令会更多。
如果51单纯用来产生正弦波,没其它事,可以直接码在
timer 自动载入 ISR 里面, 时序就不用再调。 但是多了 ISR 进出至少 8个指令周期。
如果你不懂组语,那换个16bit/32bit MCU吧!