#include"reg51.h"
#include"intrins.h"
#define unchar unsigned char
unchar code tab[128]={
64,67,70,73,76,79,82,85,88,91,94,96,99,102,104,106,
109,111,113,115,117,118,120,121,123,124,125,126,126,
127,127,127,127,127,127,127,126,126,125,124,123,121,
120,118,117,115,113,111,109,106,104,102,99,96,94,91,
88,85,82,79,76,73,70,67,64,60,57,54,51,48,45,42,39,
36,33,31,28,25,23,21,18,16,14,12,10,9,7,6,4,3,2,1,
1,0,0,0,0,0,0,0,1,1,2,3,4,6,7,9,10,12,14,16,18,21,23,
25,28,31,33,36,39,42,45,48,51,54,57,60};
unchar mode=0,freq=40,fu=0;
int zk=0;
void delay(int n) //10us延时
{do
{ _nop_();
_nop_();
_nop_();
_nop_();
_nop_();
} while(--n);
}
void df(int n) //延时
{do
{ _nop_();
_nop_();
} while(--n);
}
void key();
void sq() //方波
{while(mode==0)
{P0=fu;
df(10*freq+zk);
P0=0xff-fu;
df(10*freq-zk);}
key();}
void ju() //锯齿波
{unchar i;
while(mode==1)
{for(i=0;i<255-fu;i++)
{P0=i;
delay(freq);}}
key();}
void san() //三角波
{unchar i;
while (mode==3)
{for(i=0;i<255-fu;i++)
{P0=i;
delay(freq);}
for(i=255-fu;i>0;i--)
{P0=i;
delay(freq);}}
key();}
void sin() //正弦波
{unchar i;
while(mode==2)
{if(++i==128)i=0;
P0=tab[i];
delay(freq);}
key();}
void key() //模式识别
{if(mode==0)
sq();
if(mode==1)
ju();
if(mode==2)
sin();
if(mode==3)
san();}
void main()
{IT0=1;
IE=0x81;
sq();}
void zhong() interrupt 0
{unchar i;
i=P1;
if(i==0xfe)
if(mode<3)
mode++;
else mode=0;
if(i==0xfd)
if (freq<75)
freq=freq+5;
else freq==0;
if(i==0xfb)
if(freq>5)
freq=freq-5;
else freq==80;
if(i==0xf7&&mode==0)
if(10*freq-zk>0)
zk=zk+30;
else
zk=-10*freq;
if(i==0xef)
fu=fu-10;
if(i==0xdf)
fu=fu+10;
}