找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4072|回复: 3
收起左侧

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

[复制链接]
ID:66086 发表于 2018-8-25 12:14 | 显示全部楼层 |阅读模式
基于pic16f616单片机  可以手动控制  也可自动控制(开启感应开关)  

单片机源程序如下:
  1. #include<pic.h>
  2. #define u16 unsigned int
  3. #define u8 unsigned char
  4. u8 second,fen=0,miao=0,key=0,mode;
  5. u16 adval;  //3v/5v*1024=614
  6. u16 x1=512;
  7. bit loop1,yy1;
  8. int pwm;
  9. __CONFIG(0xfd94);   //fdd5 RA4可以输出主频率的4分频
  10. //const u8 table[]={160,130,101,90,80};
  11. const u8 tab[]={150,100,60,30};

  12. void init()
  13. {//OSCTUNE=0x0f;      //修改主频率
  14.   ADCON0=0x9d;
  15.   ADCON1=0x20;

  16.   INTCON=0xd0;   //开启总中断 外部中断 外设中断
  17.   INTEDG=1;  // 设置触发中断的条件为电平从低到高触发
  18.    PIE1=0x41;             //允许Time1中断
  19.         TMR1L=(65536-1000)%256;
  20.         TMR1H=(65536-1000)/256;
  21.         T1CON=0x01;            //使能Time1
  22.   
  23.   PR2=160;               //周期计数
  24.   CCP1CON=0x3c;     //0011 1100单输出 P1A被调制    1011 1100半桥输出 P1A P1B被调制
  25.   CCPR1L=40;       //脉冲宽度计数
  26.   
  27. }

  28. void delay500us(u16 x)
  29. {
  30.   u16 a,b;
  31.   for(a=x;a>0;a--)
  32.    for(b=20;b>0;b--);
  33. }

  34. void delayms(u16 x)
  35. {
  36.   u16 a,b;
  37.   for(a=x;a>0;a--)
  38.    for(b=220;b>0;b--);
  39. }

  40. void beep()
  41. {  
  42.    u8 i;

  43.    for(i=255;i>0;i--)
  44.    {
  45.      delay500us(8);
  46.      
  47.      RA1=!RA1;
  48.    }
  49.     RA1=0;
  50. }

  51. void ledstate()
  52. { u8 i;
  53.   RC0=0;
  54.   loop1=1;
  55.    
  56.   while(loop1)
  57.   {
  58.           for(i=3;i>0;i--)
  59.       {  beep();
  60.         RC0=!RC0;
  61.         delayms(1000);
  62.         }  
  63.           loop1=0;
  64. }

  65.   }

  66. void KEY_Scan(void)              //键值扫描
  67. {       
  68.           if((RC2==1) || (RC1=1) || (RA4==1) || (RA5==1))
  69.           {
  70.             delayms(50);//去抖动
  71.             if(RC2==1)        //A  led模式与开关
  72.             {
  73.               delayms(200);
  74.           delayms(200);
  75.           delayms(200);
  76.           delayms(200);
  77.           if(RC2==1) key=!key;   //0 on 1 off
  78.           else mode=!mode;      //0 手动模式  1 自动模式
  79.           while(RC2);               
  80.             }
  81.                   else if(RC1==1)   //B 音频开关
  82.             {
  83.               RC4=!RC4;
  84.           while(RC1!=0);             
  85.             }
  86.                 else if(RA4==1)   //C  亮度加
  87.             {
  88.                  if(mode==0)
  89.                          {  
  90.                    pwm++;
  91.                   if(pwm>=3){pwm=3;beep();}
  92.                   while(RA4);
  93.                          }               
  94.             }
  95.             else if(RA5==1)   //D 亮度减
  96.             {
  97.                   if(mode==0)
  98.                          {
  99.                     pwm--;
  100.                   if(pwm<1){pwm=0;beep();}
  101.                   while(RA5);       
  102.                          }      
  103.             }
  104.      }       
  105. }

  106. void pwm_out()
  107. {
  108.   T2CON=0x04;
  109.   CCP1CON=0x3c;
  110.   RC0=1;
  111.   RA0=0;
  112.   delayms(5);
  113.              
  114.          CCPR1L=tab[pwm];
  115.          delayms(4);       
  116. }

  117. void pwm_out1()
  118. {
  119.   T2CON=0x04;
  120.   CCP1CON=0x3c;
  121.   RC0=1;
  122.   RA0=1;
  123.   delayms(5);
  124.         if(yy1)
  125.     {
  126.       CCPR1L=tab[3];
  127.              delayms(4);
  128.     }
  129.     else
  130.     {
  131.       CCPR1L=tab[0];
  132.              delayms(4);
  133.     }   
  134.                     
  135. }

  136. void stopstate()  //  pwm 停止输出
  137. {
  138.     T2CON=0x00;
  139.           CCP1CON=0x00;
  140.     RC0=0;
  141.     RA0=0;
  142.     RC5=1;
  143. }

  144. void interrupt time1(void)
  145. {
  146.           if(TMR1IE&&TMR1IF)          //定时器1用于产生秒信号  定时时间为25ms
  147.                  {
  148.                     TMR1IF=0;
  149.                         TMR1L=(65536-50000)%256;
  150.                         TMR1H=(65536-50000)/256;
  151.                            second++;
  152.                         if(second>=40)                  //40*25ms =1000ms
  153.                         { second=0;
  154.                  
  155.                        if(miao++>=60)
  156.                        {  miao=0;
  157.                            fen++;
  158.                           if(fen>=60)
  159.                            fen=0;
  160.                         }
  161.                          }
  162.                   }

  163.       if(INTE&&INTF)         ////外部中断
  164.            {
  165.              while(RA2==1)
  166.              {
  167.                   
  168.                KEY_Scan();
  169.            
  170.              }
  171.              INTF=0;
  172.            }

  173.      if(ADIE && ADIF)
  174.   {
  175.     ADIF=0; // A/D标志位清零
  176.     adval=ADRESH;//00000000 00000011
  177.         adval=adval<<8|ADRESL;//00000011 11111111
  178.     if(adval>x1) yy1=1;
  179.        else yy1=0;
  180.     GODONE=1;
  181.   }

  182. }

  183. void main()
  184. {  
  185.   TRISC=0x00;
  186.   TRISC|=0x0e;
  187.   TRISA=0x00;
  188.   TRISA|=0x34;
  189.   ANSEL=0x80;
  190.    RC0=0;  //电源指示
  191.    RC4=0;  //继电器
  192.    RC5=0;  //PWM
  193.    RA0=0;  //手动自动指示
  194.    RA1=0;  //警告音
  195.          ledstate();
  196.           init();
  197.         GODONE=1;
  198.          delayms(100);  
  199.           while(1)
  200.           {  
  201.              if(key==0)
  202.           {
  203.           switch(mode)
  204.             {
  205.               case 0:pwm_out();
  206.                     break;
  207.               case 1:pwm_out1();
  208.                     break;
  209.             }
  210.           }  
  211.          else stopstate();         
  212.           }

  213. }
复制代码

所有资料51hei提供下载:
xyd.rar (52.5 KB, 下载次数: 68)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:221675 发表于 2018-8-31 14:47 | 显示全部楼层
谢谢分享,很给力。
回复

使用道具 举报

ID:556500 发表于 2019-6-6 14:30 | 显示全部楼层
正是需要的
回复

使用道具 举报

ID:71535 发表于 2019-6-22 23:02 | 显示全部楼层
谢谢老司机分享!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表