⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 signal._c

📁 简易信号发生器+Protues仿真,函数波形发生器产生波形表
💻 _C
字号:
//ICC-AVR application builder : 2008-9-7 11:00:08
// Target : M8515
// Crystal: 16.000Mhz

#include <iom8515v.h>
#include <macros.h>


#define uchar unsigned char
#define uint  unsigned int

#define data1 PORTB

uchar h=0,j=0,k=0,func,th1=0xE7,tl1=0;
uchar f1=0x06,f2=0;    //250Hz的步进
uint i=0;
#pragma data:code
const uchar sin_table[256]=
{
0x80,0x83,0x86,0x89,0x8c,0x8f,0x92,0x95,0x98,0x9c,0x9f,0xa2,0xa5,0xa8,0xab,0xae,
0xb0,0xb3,0xb6,0xb9,0xbc,0xbf,0xc1,0xc4,0xc7,0xc9,0xcc,0xce,0xd1,0xd3,0xd5,0xd8,
0xda,0xdc,0xde,0xe0,0xe2,0xe4,0xe6,0xe8,0xea,0xec,0xed,0xef,0xf0,0xf2,0xf3,0xf4,
0xf6,0xf7,0xf8,0xf9,0xfa,0xfb,0xfc,0xfc,0xfd,0xfe,0xfe,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xfe,0xfd,0xfc,0xfc,0xfb,0xfa,0xf9,0xf8,0xf7,
0xf6,0xf5,0xf3,0xf2,0xf0,0xef,0xed,0xec,0xea,0xe8,0xe6,0xe4,0xe3,0xe1,0xde,0xdc,
0xda,0xd8,0xd6,0xd3,0xd1,0xce,0xcc,0xc9,0xc7,0xc4,0xc1,0xbf,0xbc,0xb9,0xb6,0xb4,
0xb1,0xae,0xab,0xa8,0xa5,0xa2,0x9f,0x9c,0x99,0x96,0x92,0x8f,0x8c,0x89,0x86,0x83,
0x80,0x7d,0x79,0x76,0x73,0x70,0x6d,0x6a,0x67,0x64,0x61,0x5e,0x5b,0x58,0x55,0x52,
0x4f,0x4c,0x49,0x46,0x43,0x41,0x3e,0x3b,0x39,0x36,0x33,0x31,0x2e,0x2c,0x2a,0x27,
0x25,0x23,0x21,0x1f,0x1d,0x1b,0x19,0x17,0x15,0x14,0x12,0x10,0xf,0xd,0xc,0xb,0x9,
0x8,0x7,0x6,0x5,0x4,0x3,0x3,0x2,0x1,0x1,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x1,0x1,0x2,0x3,0x3,0x4,0x5,0x6,0x7,0x8,0x9,0xa,0xc,0xd,0xe,0x10,0x12,0x13,
0x15,0x17,0x18,0x1a,0x1c,0x1e,0x20,0x23,0x25,0x27,0x29,0x2c,0x2e,0x30,0x33,0x35,
0x38,0x3b,0x3d,0x40,0x43,0x46,0x48,0x4b,0x4e,0x51,0x54,0x57,0x5a,0x5d,0x60,0x63,
0x66,0x69,0x6c,0x6f,0x73,0x76,0x79,0x7c
};
void delay(uint ms)
{
        uint i,j;
	for(i=0;i<ms;i++)
	   {
	   for(j=0;j<1141;j++);
       }
	   j=0;
}

void port_init(void)
{
 PORTB = 0x00;
 DDRB  = 0xff;
 PORTC = 0x00;
 DDRC  = 0xff;
 PORTD = 0x00;
 DDRD  = 0x01; 
 PORTE = 0x00;
 DDRE  = 0x00; 
}

//TIMER1 initialize - prescale:1
// WGM: 0) Normal, TOP=0xFFFF
// desired value: 400uSec
// actual value: 400.000uSec (0.0%)
void timer1_init(void)
{
 TCCR1B = 0x00; //stop
 TCNT1H = th1; //setup       //th1,tl1用来改变频率
 TCNT1L = tl1;
 OCR1AH = 0x20;
 OCR1AL = 0x00;
 OCR1BH = 0x20;
 OCR1BL = 0x00;
 TCCR1A = 0x00;
 TCCR1B = 0x01; //start Timer
}
#pragma interrupt_handler timer1_ovf_isr:iv_TIM1_OVF
void timer1_ovf_isr(void)
{
  TCCR1B = 0x00; //stop
  TCNT1H = th1; //reload counter high value
  TCNT1L = tl1; //reload counter low value
  //func=1;             //设置调试点,计算时间
  if(func==1)         //正弦波
   {
     data1=sin_table[j++];
   }    
     //func++;             //设置调试点
    if(func==2)    // 锯齿波
   {
     if(h<128)
	   data1=h;
	 else
	   data1=255-h;
	   h++;
   }
   else if(func==3)     // 方波
   { 
      k++;
	  if(k<=127)
	    data1=0x00;
	  else
	    data1=0xff;
   
   }
  
  TCCR1B = 0x01; //start Timer
} 


//call this routine to initialize all peripherals
void init_devices(void)
{
 //stop errant interrupts until set up
 CLI(); //disable all interrupts
 port_init();
 timer1_init();

 MCUCR = 0x02;
 EMCUCR = 0x00;
 GICR = 0x40;
 TIMSK = 0x80;
 SEI(); //re-enable interrupts
 //all peripherals are now initialized
}

void key_read()
{
  uchar num,i;
  DDRA=0xff;     // 都定义为输出
  PORTA=0xf0;   // 高位输出高电平,低位输出低电平
  DDRA=0x0f;  // 有键按下,把相应列(高位)的电平拉低
  asm("nop");
  i=PINA;    //获取列的地址,即
  DDRA=0xff;
  PORTA=0x0f;
  DDRA=0xf0;  //把相应行的电平拉低
  asm("nop");
  i|=PINA;     //获取行的地址 ,行与列的地址决定按键的位置
  switch(i)
  {
	case 0x77 : 
	{
	  func++; 
	  if(func==4) 
	  func=0x00;  break;
	}	
	case 0x7B :       //频率加250Hz
    {
      th1-=f1;
	  tl1-=f2;
	  break;
    } 
	case 0x7D :      ////频率减250Hz
	 {
	   th1+=f1;
	   tl1+=f2;
	   break;
	 }
	/*case 0xEE : 
	{
	  func++; 
	  if(func==4) 
	  func=0x00;  break;
	}
	case 0xDE : 
	{
	  func++; 
	  if(func==4) 
	  func=0x00; break;
	}
	case 0xBE : 
    {
	  func++; 
	  if(func==4) 
	  func=0x00; break;
	}
	case 0x7E : 
    {
	  func++; 
	  if(func==4) 
	  func=0x00; break;
	}
	case 0xED : 
	{
	  func++; 
	  if(func==4) 
	  func=0x00; break;
	}	
	case 0xDD : 
	{
	  func++; 
	  if(func==4) 
	  func=0x00; break;
	}	*/
	case 0xBD : ; break;
	case 0xEB : ; break;
	case 0xDB : ; break;
	case 0xBB : ; break;
	case 0xE7 : ; break;
	case 0xD7 : ; break;
	case 0xB7 : ; break;

	
	default : break;
   }

}


void main()
{
   //set_cw1;
   //set_xwr2;
   init_devices();
   while(1)
    { 
	  key_read();
	  
	}

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -