标题: 51单片机控制PCF8591输出4种波形周期可调 [打印本页]

作者: 20151107    时间: 2015-11-15 13:01
标题: 51单片机控制PCF8591输出4种波形周期可调
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit  SCL=P2^6;
sbit  SDA=P2^7;
sbit  key1=P3^6;
sbit  key2=P3^7;
uint n=0;                 
uchar code  Sinwave[]={    //正弦波波表
127, 152, 176, 198, 217, 233, 245, 252,
255, 252, 245, 233, 217, 198,176, 152,
127, 102, 78,  56,  37,  21,  9,   2,
0,   2,   9,  21,  37,  56,  78, 102
};
uchar code Triwave[] = {   //三角波波表
0,  16,  32,  48,  64,  80,  96, 112,
128, 144, 160, 176, 192, 208,224, 240,
255, 240, 224, 208, 192, 176, 160, 144,
128, 112,  96,  80,  64,  48,  32,  16
};
uchar code Sawwave[] = {   //锯齿波表
0, 8, 16, 24, 32, 40,  48,  56,
64,72,80,  88,  96, 104, 112,120,
128, 136, 144, 152, 160, 168, 176,184,
192, 200, 208, 216, 224,232, 240, 248,
};
uchar code Squwave[]={   //方波波表
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
255,255,255,255,255,255,255,255,
255,255,255,255,255,255,255,255
};
uint f=30;
void delay()
{ ; ; ;}

void  delay10()
{ uint i,j;
  for(i=0;i<10;i++)
    for(j=0;j<250;j++);
}
  void  delay11()
{ uint i,j;
  for(i=0;i<f;i++)
    for(j=0;j<250;j++);
}
void init()
{  SCL=1;
   delay();
   SDA=1;
   delay();
}

void start()
{   init();
        SDA=0;
        delay();
}
void write(uchar date)
{         uchar i,temp;
     temp=date;
         for(i=0;i<8;i++)
          { temp=temp<<1;
            SCL=0;
            delay();
            SDA=CY;
            delay();
            SCL=1;
            delay();
          }
         SCL=0;
         delay();
         SDA=1;
         delay();
}

void respons()
{         uchar i;
     SCL=1;
         delay();
         while((SDA==1)&&(i<250))
           i++;
         SCL=0;
         delay();
}

void stop()
{
        SDA=0;
        delay();
        SCL=1;
        delay();
        SDA=1;
        delay();
}
  void writewave(uchar xc)
{  
      init();       
      start();
             write(0x90);
          respons();
          write(0x40);
          respons();
          write(xc);
          respons();
          stop();           
}
void keyscan()
{ if(key1==0)
   {
            delay10();
         if(key1==0)
         { f+=10;
           while(!key1);
         }
   }
   if(key2==0)
   {
            delay10();
         if(key2==0)
         { f-=10;
         if(f<=20) f=20;
           while(!key2);
         }
   }  
}
void  main()
{
   while(1)
   {  keyscan();
   for(n=0;n<32;n++)
        { writewave(Sinwave[n]);
     delay11();        }
    for(n=0;n<32;n++)
     { writewave(Triwave[n]);
       delay11();  }
        for(n=0;n<32;n++)
     { writewave(Sawwave[n]);
        delay11();}
         for(n=0;n<32;n++)
   { writewave(Squwave[n]);
      delay11(); }

    }
}







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