#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();
}
}
『本文转载自网络,版权归原作者所有,如有侵权请联系删除』