2019年10月26日 星期六

pwm v2

#include <reg51.h>
sbit  wled  = P2^7;
sbit  spk   = P3^4;
sbit  k1    = P3^2;
sbit  k2    = P3^3;
sbit  op    = P3^0;
//共陽 target >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
char code DATA_7SEG[16]={0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90};
char code act[4]={0xfe, 0xfd, 0xfb, 0xf7};    /* p2.0--p2.3 2.5*/
char data disp[4]={0,0,0,0};
char di=0;
//============================================
void delay(int d)
{
int i, j;
 for(i=0; i<d; i++)
    for(j=0; j<100; j++)  ;
}
/*----------------------------*/
void led_bl()
{
int i;
 for(i=0; i<1; i++)
  {
   wled=0;  delay(50);
   wled=1;  delay(50);
  }
}
/*----------------*/

void t0isr(void) interrupt 1
{
 TH0=(65536-2000)/256;
 TL0=(65536-2000)%256;
 P0=DATA_7SEG[disp[di]];
  P1=act[di];
  di++;
  if(di==4) di=0;
}

void init_t1()
{
 TH0=(65536-2000)/256;
 TL0=(65536-2000)%256;
 TMOD=0x01;
 IE=0x82;
 TR0=1;
}

void show_data(char c)
{
 disp[0]=c;
 disp[1]=c;
 disp[2]=c;
 disp[3]=c;
}
/*------------------*/
void test_seg()
{
int i;
  for(i=0; i<10; i++)
   {
    show_data(i); 
    delay(500);
   }
}
//------------------------
void bz()
{
int i;
 for(i=0; i<100; i++)
  {
   spk=0;  delay(1);
   spk=1;  delay(1);
  }
 delay(50);
}
//-----------------------------------
void del() /* 100 uS  0.1 mS delay */
{
char  i;
 for(i=0; i<25; i++) ; //需微調
}

//-----------------------------
test_kx()
{
int c, i,j;

//wait k1 .......
//長按下 ---0   短按 2 下 pause
//
 show_data(0); TR0=1;
 c=0;
 while(1)
  {
go:
   show_data(c); c++; if(c==9) c=0;
//短按 2 下 pause  test 5000 次 k1==1 表示放開 在次按下)  pause / clear

   for(i=0; i<5000; i++)  //5000
     {
      del();

      if(k1==0) //表示放開 K=1  K=0 K=1 在次按下?
         {
           delay(100);
//         while(1) if(k1==1) { delay(100); break;}
           while(1) //loop count delay  5000
            { for(j=0; j<8000; j++) if(k1==1) { delay(100); goto next;}
              if(k1==0) { delay(300);  c=0; show_data(c);
                          while(1) if(k1==1) { delay(100); break;}
                          goto go;  }
            }
next:
// --------------------------------------------------
           while(1) if(k1==0) { delay(100); break;}

           while(1) if(k1==1)
            { //短按 2 下 pause.....get it!!!!!!!!!....
              bz(); delay(500); //key to go.......
              while(1) if(k1==0) { delay(300); goto go;}
              break;   //last state k1==1;放開
            }
         }

     }//test t times key off

//一直案注 k1=0
//     if(k1==0) {  delay(300);  if(k1==0) c=0;    }
  }//loop
}
//-------------------------------------
// 250HZ---4 ms =10x0.4 ms
// PWM 10~90% 切成 10 等分來控制
void del4() /* 400 uS  0.4 mS delay */
{
char  i;
 for(i=0; i<110; i++) ; //25x4=100 需微調>
}
//-------------------------------------------
void pwm(char du) //1~9
{
char i;
//wait k2 next
 while(1)
  {
   if(k1==0) { delay(300); break; }
   op=1; for(i=0; i<du; i++)      del4();
   op=0; for(i=0; i<(10-du); i++) del4();
  }
}
//---------------------------
test_pwm()
{
//pwm1 seg=1 op=10% 250HZ LED8=10B
 while (1)
 {
  show_data(1); TR0=1;   pwm(1);
  show_data(2); TR0=1;   pwm(2);
  show_data(3); TR0=1;   pwm(3);
  show_data(4); TR0=1;   pwm(4);
  show_data(5); TR0=1;   pwm(5);
show_data(6); TR0=1;   pwm(6);
 }
}
//--------------------------------------------
main()
{
  bz();
 led_bl();
 init_t1();
// test_seg();
// test_kx();   //測試按鍵按下 等基本功能,理解才容易記憶
 test_pwm();    //測試 PWM 輸出 250HZ 如圖,k1 切換5組
 while (1) {}
}



沒有留言:

張貼留言

algorithm

 #include <iostream> #include <string.h> using namespace std; int main(int argc, char** argv)  { for(int j=2;j<=100;j++)//j...