基于pic16f616单片机 可以手动控制 也可自动控制(开启感应开关)
单片机源程序如下:
- #include<pic.h>
- #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();
- }
- }
复制代码
所有资料51hei提供下载:
xyd.rar
(52.5 KB, 下载次数: 70)
|