这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » MCU » 关于波形频率为什么不是加1?该怎么设置?

共5条 1/1 1 跳转至

关于波形频率为什么不是加1?该怎么设置?

菜鸟
2014-04-04 22:00:19     打赏
#include <reg52.h>
#include<absacc.h>
#define uchar unsigned char //预定义
#define uint  unsigned int


/**********按键声明*******/
sbit s0=P1^4;//波形选择
sbit s1=P1^5;//方波占空比+1
//sbit s2=P1^6;//方波占空比—1
sbit s3=P1^7;//频率+1
sbit s4=P1^6;//频率-1
uint d1,d2; //d1=低电平   ;d2=高电平
uint s,p,m;   //p=频率
uint n;


uchar code sintab[256]= /***正弦波查表****/
{
0x80,0x83,0x86,0x89,0x8d,0x90,0x93,0x96,
0x99,0x9c,0x9f,0xa2,0xa5,0xa8,0xab,0xae,
0xb1,0xb4,0xb7,0xba,0xbc,0xbf,0xc2,0xc5,
0xc7,0xca,0xcc,0xcf,0xd1,0xd4,0xd6,0xd8,
0xda,0xdd,0xdf,0xe1,0xe3,0xe5,0xe7,0xe9,
0xea,0xec,0xee,0xef,0xf1,0xf2,0xf4,0xf5,
0xf6,0xf7,0xf8,0xf9,0xfa,0xfb,0xfc,0xfd,
0xfd,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xfd,
0xfd,0xfc,0xfb,0xfa,0xf9,0xf8,0xf7,0xf6,
0xf5,0xf4,0xf2,0xf1,0xef,0xee,0xec,0xea,
0xe9,0xe7,0xe5,0xe3,0xe1,0xde,0xdd,0xda,
0xd8,0xd6,0xd4,0xd1,0xcf,0xcc,0xca,0xc7,
0xc5,0xc2,0xbf,0xbc,0xba,0xb7,0xb4,0xb1,
0xae,0xab,0xa8,0xa5,0xa2,0x9f,0x9c,0x99,
0x96,0x93,0x90,0x8d,0x89,0x86,0x83,0x80,


0x80,0x7c,0x79,0x76,0x72,0x6f,0x6c,0x69,
0x66,0x63,0x60,0x5d,0x5a,0x57,0x55,0x51,
0x4e,0x4c,0x48,0x45,0x43,0x40,0x3d,0x3a,
0x38,0x35,0x33,0x30,0x2e,0x2b,0x29,0x27,
0x25,0x22,0x20,0x1e,0x1c,0x1a,0x18,0x16,
0x15,0x13,0x11,0x10,0x0e,0x0d,0x0b,0x0a,
0x09,0x08,0x07,0x06,0x05,0x04,0x03,0x02,
0x02,0x01,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x02,
0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,
0x0a,0x0b,0x0d,0x0e,0x10,0x11,0x13,0x15,
0x16,0x18,0x1a,0x1c,0x1e,0x20,0x22,0x25,
0x27,0x29,0x2b,0x2e,0x30,0x33,0x35,0x38,
0x3a,0x3d,0x40,0x43,0x45,0x48,0x4c,0x4e,
0x51,0x55,0x57,0x5a,0x5d,0x60,0x63,0x66,
0x69,0x6c,0x6f,0x72,0x76,0x79,0x7c,0x80
};




uchar code jctab[128]= /***锯齿波查表****/
{
0x00,0x02,0x04,0x06,0x08,0x0a,0x0c,0x0e,
0x10,0x12,0x14,0x16,0x18,0x1a,0x1c,0x1e,
0x20,0x22,0x24,0x26,0x28,0x2a,0x2c,0x2e,
0x30,0x32,0x34,0x36,0x38,0x3a,0x3c,0x3e,
0x40,0x42,0x44,0x46,0x48,0x4a,0x4c,0x4e,
0x50,0x52,0x54,0x56,0x58,0x5a,0x5c,0x5e,
0x60,0x62,0x64,0x66,0x68,0x6a,0x6c,0x6e,
0x70,0x72,0x74,0x76,0x78,0x7a,0x7c,0x7e,
0x80,0x82,0x84,0x86,0x88,0x8a,0x8c,0x8e,
0x90,0x92,0x94,0x96,0x98,0x9a,0x9c,0x9e,
0xa0,0xa2,0xa4,0xa6,0xa8,0xaa,0xac,0xae,
0xb0,0xb2,0xb4,0xb6,0xb8,0xba,0xbc,0xbe,
0xc0,0xc2,0xc4,0xc6,0xc8,0xca,0xcc,0xce,
0xd0,0xd2,0xd4,0xd6,0xd8,0xda,0xdc,0xde,
0xe0,0xe2,0xe4,0xe6,0xe8,0xea,0xec,0xee,
0xf0,0xf2,0xf4,0xf6,0xf8,0xfa,0xfc,0xfe
};




uchar code sjtab[256]= /***三角波查表****/
{
0x00,0x02,0x04,0x06,0x08,0x0a,0x0c,0x0e,
0x10,0x12,0x14,0x16,0x18,0x1a,0x1c,0x1e,
0x20,0x22,0x24,0x26,0x28,0x2a,0x2c,0x2e,
0x30,0x32,0x34,0x36,0x38,0x3a,0x3c,0x3e,
0x40,0x42,0x44,0x46,0x48,0x4a,0x4c,0x4e,
0x50,0x52,0x54,0x56,0x58,0x5a,0x5c,0x5e,
0x60,0x62,0x64,0x66,0x68,0x6a,0x6c,0x6e,
0x70,0x72,0x74,0x76,0x78,0x7a,0x7c,0x7e,
0x80,0x82,0x84,0x86,0x88,0x8a,0x8c,0x8e,
0x90,0x92,0x94,0x96,0x98,0x9a,0x9c,0x9e,
0xa0,0xa2,0xa4,0xa6,0xa8,0xaa,0xac,0xae,
0xb0,0xb2,0xb4,0xb6,0xb8,0xba,0xbc,0xbe,
0xc0,0xc2,0xc4,0xc6,0xc8,0xca,0xcc,0xce,
0xd0,0xd2,0xd4,0xd6,0xd8,0xda,0xdc,0xde,
0xe0,0xe2,0xe4,0xe6,0xe8,0xea,0xec,0xee,
0xf0,0xf2,0xf4,0xf6,0xf8,0xfa,0xfc,0xfe,   //上升


0xfe,0xfc,0xfa,0xf8,0xf6,0xf4,0xf2,0xf0,
0xee,0xec,0xea,0xe8,0xe6,0xe4,0xe2,0xe0,
0xde,0xdc,0xda,0xd8,0xd6,0xd4,0xd2,0xd0,
0xce,0xcc,0xca,0xc8,0xc6,0xc4,0xc2,0xc0,
0xbe,0xbc,0xba,0xb8,0xb6,0xb4,0xb2,0xb0,
0xae,0xac,0xaa,0xa8,0xa6,0xa4,0xa2,0xa0,
0x9e,0x9c,0x9a,0x98,0x96,0x94,0x92,0x90,
0x8e,0x8c,0x8a,0x88,0x86,0x84,0x82,0x80,
0x7e,0x7c,0x7a,0x78,0x76,0x74,0x72,0x70,
0x6e,0x6c,0x6a,0x68,0x66,0x64,0x62,0x60,
0x5e,0x5c,0x5a,0x58,0x56,0x54,0x52,0x50,
0x4e,0x4c,0x4a,0x48,0x46,0x44,0x42,0x40,
0x3e,0x3c,0x3a,0x38,0x36,0x34,0x32,0x30,
0x2e,0x2c,0x2a,0x28,0x26,0x24,0x22,0x20,
0x1e,0x1c,0x1a,0x18,0x16,0x14,0x12,0x10,
0x0e,0x0c,0x0a,0x08,0x06,0x04,0x02,0x00   //下降
};




void delay (uchar k)//延时
{
  uchar j;
  while((k--)!=0)
  {
    for(j=0;j<125;j++);
    // {;}
  }
}




void zhengxian()//正弦波
{
   P2=sintab[n];
   n=n+p;
     if(n>=256)n=0;
}




void fangbo() //方波
{
   P2=0xff; 
   delay(d1-p);
   P2=0;
   delay(d2-p);
}




void juchi() //锯齿波
{
   P2=jctab[n];
   n=n+p;
   if(n>=127)n=0;
}




void sanjiao()//三角波
{
   P2=sjtab[n];
   n=n+p;
   if(n>=255)n=0;
}


 






void boxingkey()//波形选择按钮
{
    if(s0==0)  // 波形按键功能选择

     delay(10);//按键消抖 
     if(s0==0) m++; 
  if(m==4) m=0;
   while(!s0);//松手检测 



  else if(s1==0) //占空比增加
    {   
       delay(10);//延时消抖
       if(s1==0)
       {
        d1--;
        d2++;
       }
    while(!s1);//松手检测,当s5=1(松手)跳出死循环
        delay(10);//消抖
while(!s1);//确定松手了
    }
/*
   else  if(s2==0)//占空比减小
    {  
       delay(10);//延时消抖
       if(s2==0)
        {
        d1++;
        d2--;
        }
while(!s2);//松手检测,当P1_0=1(松手)跳出死循环
delay(10);//消抖
while(!s2);//确定松手了
    }
*/


   else  if(s3==0)//频率+1
    {   
        delay(10);
        if(s3==0)
        {
        p=p+1;
        }
while(!s3);
delay(10);
while(!s3);
    }


 else  if(s4==0)//频率+1
    {   
        delay(10);
        if(s4==0)
        {
        p=p-1;
        }
while(!s4);
delay(10);
while(!s4);
    }
}   


void main()//主程序

    d1=10;
    d2=10;
    n=0;
    p=1; 
    P1=0xff;
    while(1)  
    {     
        boxingkey();
        switch(m)  //按键选择
        {
        case 0:zhengxian();break;
        case 1:fangbo();break;
        case 2:juchi();break;
        case 3:sanjiao();break;
        }
    }   
}




为什么我按下S3波形频率为什么不是加1而是加其他不定的数字?起初频率怎么会是72Hz?如果我要频率每次加1,该怎么设置起初频率和加1设置?



关键词: 波形频率、初值设置    

院士
2014-04-04 22:27:20     打赏
2楼

在开始时 d1 与 d2 是有值的,p也有值。  高低电平的间隔是有一个值的,因此,会有一个频率出现。

代码写的太难读了。排了半天版才看明白。



另 论坛有插入代码功能,在第一排第6个图标。

以后像类似的代码,我是不会看的。


高工
2014-04-05 01:55:28     打赏
3楼
频率+1不是把p+1来实现的。初始情况下有频率的原因楼上已经说了。控制频率每次加1,感觉通过楼主的方法估计是不行,我觉得应该还得加算法来处理表中的值。

高工
2014-04-05 04:17:07     打赏
4楼

一楼正解


高工
2014-04-05 13:33:40     打赏
5楼
算法不对~ 建议核心代码用汇编写~ 想搞好~再建议去参考一下国外一哥们用avr写的信号发生器代码~直接谷歌avrdds可以找到

共5条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]