标题: 我用51单片机写的波形发生器 可以输出正弦波 但是不能调整频率 难道是我的中断... [打印本页]

作者: happysunshine    时间: 2013-6-18 13:04
标题: 我用51单片机写的波形发生器 可以输出正弦波 但是不能调整频率 难道是我的中断...
#include<reg52.h>
#include<math.h>
#define uchar unsigned char
#define uint unsigned int
#define fosc 12000000
#define all 65535
float sindatar;
sbit hong=P2^3;
sbit lan=P2^5;
sbit huang=P2^7;
uint VM=2500,b=0;
uint FREQ=1,j=0;
void delay(uint z)
{
  uint x,y;
  for(x=z;x>0;x--)
    for(y=1;y>0;y--);
}

/**********************************************
                计算正弦波数据
********************************************/
void getsin(uchar x)
{   
    sindatar=((sin(6.28*x/256)+1)/2.0)*VM*0.051;
P3=(uchar)sindatar;
delay(1);
}
void main()
{
   TH1=(all-fosc/12/256/FREQ)/256;
   TL1=(all-fosc/12/256/FREQ)%256;
   ET1=1;
   EA=1;
   TR1=1;
   while(1)
   {
       n getsin(j);
   }
}
void timer1() interrupt 3 using 3
{
   TH1=(all-fosc/12/256/FREQ)/256;
   TL1=(all-fosc/12/256/FREQ)%256;
   j++;
   if(j==256)
   j=0;
}



这是我的程序,麻烦帮忙解答一下为什么。  此时示波器上的显示的周期是2s,这跟我的设置的频率的FREQ=1有点不对。  求解释一下。

作者: heicad    时间: 2013-6-19 00:51
有高手知道吗
作者: happysunshine    时间: 2013-6-19 01:02
游客 110.205.68.x 发表于 2013-6-19 00:58
我看看

谢谢  我真的调了好多天了  
作者: happysunshine    时间: 2013-6-19 01:04
游客 110.205.68.x 发表于 2013-6-19 00:58
我看看

还是没有调试出来
作者: ahshmj    时间: 2013-6-19 11:00
本帖最后由 ahshmj 于 2013-6-19 11:09 编辑

你有必要搞这么复杂么?你这样,中断函数的运行过程就超过了中断定时,怎能会正常?
不信,你直接将你需要的数值填写进去试一试!
“   TH1=(all-fosc/12/256/FREQ)/256;
   TL1=(all-fosc/12/256/FREQ)%256;

如下改试一试,如果是值不对你自己计算一下:
   TL1=0XBD;
   TH1=0XF0;

正弦波发生器,如果要求严格的话,定时部分最好使用汇编。
作者: ahshmj    时间: 2013-6-19 11:06
本帖最后由 ahshmj 于 2013-6-19 11:10 编辑

定时需要再延长一些,中间的计算过程耗时多。如果不能延长,就要使用更高的晶振。否则这个程序调不正常。
作者: happysunshine    时间: 2013-6-19 13:12
ahshmj 发表于 2013-6-19 11:00
你有必要搞这么复杂么?你这样,中断函数的运行过程就超过了中断定时,怎能会正常?
不信,你直接将你需要 ...

恩恩  谢谢啊   是要开始学学汇编了
因为我是要调这个波形发生器频率的   假如不用这种方法  还可以有其他的方法么?
真的谢谢您啊
作者: happysunshine    时间: 2013-6-19 13:14
ahshmj 发表于 2013-6-19 11:06
定时需要再延长一些,中间的计算过程耗时多。如果不能延长,就要使用更高的晶振。否则这个程序调不正常。

我当时是想通过这种计算来控制频率的  我是不能延时太长了   因为要求波形发生器的频率最高要1k  HZH
作者: ahshmj    时间: 2013-6-19 15:38
忘了告诉你了:
你没有设置定时器的工作模式,就成了默认的13位计数/定时,需要加上一句:   TMOD = 0x10; 当然你不加这一句也行,13位的。但是初装值不一样。
作者: happysunshine    时间: 2013-6-20 13:55
ahshmj 发表于 2013-6-19 15:38
忘了告诉你了:
你没有设置定时器的工作模式,就成了默认的13位计数/定时,需要加上一句:   TMOD = 0x10; ...

好的  好的  谢谢
作者: livingliving    时间: 2015-4-7 19:02
不懂,但是还是要顶,安抚楼主受伤心灵,每一个新手都是痛苦的开始,快乐的结局




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1