×
单片机 > 单片机程序设计 > 详情

带感应的小夜灯的PIC单片机源码(可手动控制or自动控制)

发布时间:2020-08-21 发布时间:
|

#include

#define u16 unsigned int

#define u8 unsigned char

u8 second,fen=0,miao=0,key=0,mode;

u16 adval;  //3v/5v*1024=614

u16 x1=512;

bit loop1,yy1;

int pwm;

__CONFIG(0xfd94);   //fdd5 RA4可以输出主频率的4分频

//const u8 table[]={160,130,101,90,80};

const u8 tab[]={150,100,60,30};


void init()

{//OSCTUNE=0x0f;      //修改主频率

  ADCON0=0x9d;

  ADCON1=0x20; 


  INTCON=0xd0;   //开启总中断 外部中断 外设中断 

  INTEDG=1;  // 设置触发中断的条件为电平从低到高触发

   PIE1=0x41;             //允许Time1中断

        TMR1L=(65536-1000)%256;

        TMR1H=(65536-1000)/256;

        T1CON=0x01;            //使能Time1

  

  PR2=160;               //周期计数

  CCP1CON=0x3c;     //0011 1100单输出 P1A被调制    1011 1100半桥输出 P1A P1B被调制 

  CCPR1L=40;       //脉冲宽度计数 

  

}


void delay500us(u16 x)

{

  u16 a,b;

  for(a=x;a>0;a--)

   for(b=20;b>0;b--);

}


void delayms(u16 x)

{

  u16 a,b;

  for(a=x;a>0;a--)

   for(b=220;b>0;b--);

}


void beep()

{  

   u8 i;


   for(i=255;i>0;i--)

   {

     delay500us(8);

     

     RA1=!RA1;

   }

    RA1=0;

}


void ledstate()

{ u8 i;

  RC0=0;

  loop1=1;

   

  while(loop1)

  {

          for(i=3;i>0;i--)

      {  beep();

        RC0=!RC0;

        delayms(1000); 

        }  

          loop1=0;

}


  }


void KEY_Scan(void)              //键值扫描

{        

          if((RC2==1) || (RC1=1) || (RA4==1) || (RA5==1))

          {

            delayms(50);//去抖动 

            if(RC2==1)        //A  led模式与开关

            {

              delayms(200);

          delayms(200);

          delayms(200);

          delayms(200);

          if(RC2==1) key=!key;   //0 on 1 off

          else mode=!mode;      //0 手动模式  1 自动模式

          while(RC2);                

            }

                  else if(RC1==1)   //B 音频开关

            {

              RC4=!RC4;

          while(RC1!=0);              

            }

                else if(RA4==1)   //C  亮度加

            {

                 if(mode==0)

                         {  

                   pwm++;

                  if(pwm>=3){pwm=3;beep();} 

                  while(RA4);

                         }                

            }

            else if(RA5==1)   //D 亮度减

            {

                  if(mode==0)

                         {

                    pwm--;

                  if(pwm<1){pwm=0;beep();} 

                  while(RA5);        

                         }       

            }

     }        

}


void pwm_out()

  T2CON=0x04;

  CCP1CON=0x3c;

  RC0=1;

  RA0=0;

  delayms(5); 

             

         CCPR1L=tab[pwm];

         delayms(4);        

}


void pwm_out1()

  T2CON=0x04;

  CCP1CON=0x3c;

  RC0=1;

  RA0=1;

  delayms(5); 

        if(yy1)

    {

      CCPR1L=tab[3];

             delayms(4);

    } 

    else

    {

      CCPR1L=tab[0];

             delayms(4);

    }   

                     

}


void stopstate()  //  pwm 停止输出

{

    T2CON=0x00;

          CCP1CON=0x00;

    RC0=0;

    RA0=0;

    RC5=1;

}


void interrupt time1(void)

{

          if(TMR1IE&&TMR1IF)          //定时器1用于产生秒信号  定时时间为25ms

                 {

                    TMR1IF=0;

                        TMR1L=(65536-50000)%256;

                        TMR1H=(65536-50000)/256;

                           second++;

                        if(second>=40)                  //40*25ms =1000ms

                        { second=0;

                 

                       if(miao++>=60)

                       {  miao=0; 

                           fen++;

                          if(fen>=60)

                           fen=0;

                        } 

                         }

                  }


      if(INTE&&INTF)         ////外部中断

           { 

             while(RA2==1)

             {

                  

               KEY_Scan();

           

             }

             INTF=0;

           }


     if(ADIE && ADIF)

  {

    ADIF=0; // A/D标志位清零

    adval=ADRESH;//00000000 00000011

        adval=adval<<8|ADRESL;//00000011 11111111 

    if(adval>x1) yy1=1;

       else yy1=0; 

    GODONE=1;

  }


}


void main()

{  

  TRISC=0x00;

  TRISC|=0x0e;

  TRISA=0x00;

  TRISA|=0x34;

  ANSEL=0x80; 

   RC0=0;  //电源指示

   RC4=0;  //继电器

   RC5=0;  //PWM

   RA0=0;  //手动自动指示

   RA1=0;  //警告音

         ledstate();

          init();

        GODONE=1; 

         delayms(100);  

          while(1)

          {  

             if(key==0)

          {

          switch(mode)

            {

              case 0:pwm_out();

                    break;

              case 1:pwm_out1();

                    break;

            }

          }  

         else stopstate();          

          }


}


关键字:感应  小夜灯  PIC单片机  手动控制  自动控制 

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
TQ210天嵌开发板S5PV210 LED闪烁程序C语言代码记录