|
#include
__CONFIG(0X3F84); //设置配置位
#define delay2 100 //上升或者下降后一秒内不不响应按键或者光藕信号延时1秒(100乘10ms)
#define delay3 500 //按住停止键5秒以上5脚和6脚功能互换(500乘10ms)
unsigned long number; //10MS计数器 (timer0的中断周期是10MS)
unsigned long number44=0; //无人操作延时计数器(用于无人操作后自动停止电机)
unsigned int numb; //上电闪烁3次计数器
unsigned int number_1miao=delay2; //上升或者下降后一秒内不不响应按键或者光藕信号 1秒计数器
unsigned int sign=0; //按键起作用后输出起作用标志位
unsigned int sign2=0; //停止按键按下5秒起作用标志位
unsigned int sign3; //
unsigned int number1; //上升按键按下计数器(用于防止抖动)
unsigned int number2; //停止按键按下计数器(用于防止抖动)
unsigned int number3; //下降按键按下计数器(用于防止抖动)
unsigned int number11; //光藕上升起作用计数器(用于防止抖动)
unsigned int number22; //光藕停止起作用计数器(用于防止抖动)
unsigned int number33; //光藕下降起作用计数器(用于防止抖动)
unsigned int number00; //上电闪烁频率计数器(闪烁周期计数器)
unsigned int number55=0; //上升和下降之间切换延时计数器(用于电反转过程缓冲)
unsigned int direct=0; //5和6脚切换标准(direct=0的时候5脚是下降;6脚是上升;direct=1的时候6脚是下降;5脚是上升;)
///////////
///////下面是宏定义
#define TIME 62 //设置时间500ms(62乘10ms)
#define dou_dong 10 //设置防抖检测次数(10次)
#define yan_shi 3000 //设置电机停转时间30秒(3000乘10ms)
#define delay 300 //设置上升和下降之间延时3秒(300乘10ms)
void up_on(void) //I/O配置函数
{
RAPU=0; //使能PORTA口弱上拉
CMCON=0XFF; //比较器关闭
PORTA=0;
PORTC=0;
IOCA=0; //禁止电平变化中断
INTCON=0x00; //关闭所有中断
TRISA=0XFB; //设置A2脚(11脚)为输出;设置A3脚(4脚);A4脚(3脚);A5脚(2脚);为输入
TRISC=0XCE; //设置C3脚(7脚);C2脚(8脚);C1脚(9脚)为输入;设置C0脚(10脚);C5脚(5脚);C4脚(6脚)为输出
WPUA4=1; //PORTA4使能弱上拉
WPUA5=1; //PORTA5使能弱上拉
}
///////////////////
////////////
void tmint0(void) //timer0初始化函数
{
T0CS=0; //TMR0工作于定时器方式
PSA=0; //TMR0用分频
PS2=1; //TMR0输入32分频
PS1=0;
PS0=0;
T0IF=0; //清除TMR0 的中断标志
T0IE=1; //TMR0中断允许
}
/////////
//////////
void interrupt AD_timer(void) //timer中断函数
{
if(T0IF) //判断timer0是否发生中断
{
T0IF=0; //清除中断标志
if(number
{
number++;
}
else
{
number=0;
}
}
}
///////////////////////
void shan_suo_3(void) //上电闪烁3次
{
for(numb=0;numb<3;numb++)
{
number=0;
RC0=1;
while(number
number=0;
RC0=0;
while(number
}
}
///////////////////
////////////////////
void main(void)
{
up_on(); //I/O配置函数
tmint0(); //timer0初始化函数
ei(); //打开所有中断
shan_suo_3(); //上电闪烁3次
number=0;
while(1)
{
while(number<1); //等待10MS延时
if(number_1miao
number00++;
number=0;
if((number00>=30)&&(RC4||RC5))
{
RC0=!RC0; //LED闪烁(10脚取反)
number00=0;
}
if(!sign&&!RA3&&RA4&&RA5&&RC1&&RC2&&RC3&&!number55&&(number_1miao>=delay2)) //上升按键按下
{
RC0=1; //LED亮
if(number1
number2=0;
number3=0;
number11=0;
number22=0;
number33=0;
number44=0;
}
else if(!sign&&RA3&&!RA4&&RA5&&RC1&&RC2&&RC3&&!number55) //停止按键按下
{
RC0=1; //LED亮
number1=0;
if(number2
number3=0;
number11=0;
number22=0;
number33=0;
number44=0;
}
else if(!sign&&RA3&&RA4&&!RA5&&RC1&&RC2&&RC3&&!number55&&(number_1miao>=delay2)) //下降按键按下
{
RC0=1; //LED亮
number1=0;
number2=0;
if(number3
number11=0;
number22=0;
number33=0;
number44=0;
}
else if(!sign&&RA3&&RA4&&RA5&&!RC1&&RC2&&RC3&&!number55&&(number_1miao>=delay2)) //光藕上升按键按下
{
RC0=1; //LED亮
number1=0;
number2=0;
number3=0;
if(number11
number22=0;
number33=0;
number44=0;
}
else if(!sign&&RA3&&RA4&&RA5&&RC1&&!RC2&&RC3&&!number55) //光藕停止按键按下
{
RC0=1; //LED亮
number1=0;
number2=0;
number3=0;
number11=0;
if(number22
number33=0;
number44=0;
}
else if(!sign&&RA3&&RA4&&RA5&&RC1&&RC2&&!RC3&&!number55&&(number_1miao>=delay2)) //光藕下降按键按下
{
RC0=1; //LED亮
number1=0;
number2=0;
number3=0;
number11=0;
number22=0;
if(number33
number44=0;
}
else if(RA3&&RA4&&RA5&&RC1&&RC2&&RC3)
{
if(!RC4&&!RC5) RC0=0; //LED熄灭
if(!number55)
{
number1=0;
number2=0;
number3=0;
number11=0;
number22=0;
number33=0;
}
sign=0;
sign2=0;
}
else;
/////////////////////////////////////////////////
//下面是停止按键起作用后5秒计数
if((number2>=dou_dong)&&(number2
number2++;
////////////////////////////////////////////////停止起作用后
if((number2>=delay3)&&!sign2)
{
direct=!direct; //5和6脚切换标志
sign2=1;
}
//////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////
if(((number1>=dou_dong)||(number11>=dou_dong))&&!sign) //上升按键或者光藕上升起作用
{
if(!direct) sign3=!RC5;
else sign3=!RC4;
///////////////////////////
if(sign3&&!number55)
{
if(!direct)
{
RC4=!RC4; //6脚输出取反
RC5=0; //5脚输出0
}
else
{
RC5=!RC5; //5脚输出取反
RC4=0; //6脚输出0
}
sign=1;
number55=0;
number_1miao=0;
}
else if(number55>=delay)
{
if(!direct)
{
RC4=!RC4; //6脚输出取反
RC5=0; //5脚输出0
}
else
{
RC5=!RC5; //5脚输出取反
RC4=0; //6脚输出0
}
sign=1;
number55=0;
number_1miao=0;
}
else
{
RC4=0; //6脚输出0
RC5=0; //5脚输出0
if(number55
}
}
else if(((number2>=dou_dong)||(number22>=dou_dong))&&!sign) //停止按键或者光藕停止起作用
{
RC4=0; //6脚输出0
RC5=0; //5脚输出0
sign=1;
number55=0;
}
else if(((number3>=dou_dong)||(number33>=dou_dong))&&!sign) //下降按键或者光藕下降起作用
{
if(!direct) sign3=!RC4;
else sign3=!RC5;
///////////////////////////
if(sign3&&!number55)
{
if(!direct)
{
RC5=!RC5; //5脚输出取反
RC4=0; //6脚输出0
}
else
{
RC4=!RC4; //6脚输出取反
RC5=0; //5脚输出0
}
sign=1;
number55=0;
number_1miao=0;
}
else if(number55>=delay)
{
if(!direct)
{
RC5=!RC5; //5脚输出取反
RC4=0; //6脚输出0
}
else
{
RC4=!RC4; //6脚输出取反
RC5=0; //5脚输出0
}
sign=1;
number55=0;
number_1miao=0;
}
else
{
RC4=0; //6脚输出0
RC5=0; //5脚输出0
if(number55
}
}
else;
////////////////////////////30秒没人动作电机停止
if(RA3&&RC1&&RA5&&RC3)
{
number44++;
if(number44>=yan_shi)
{
number44=yan_shi;
RC5=0; //5脚输出0
RC4=0; //6脚输出0
}
}
////////////////////////////
}
}
兼职PIC全系列开发 ; 精通PIC16 PIC18 DSPIC ; 精通51 AVR STM32 TI的C2000系列 精通电机控制;伺服电机控制;精通99SE DXP;精通模拟电路与数字电路;精通C 汇编;精通信号处理方面 FIR IIR FFT IFFT;精通MULTISIM 11 ;PROTEUS 7.9;
QQ 122533653
|
|