📄 873.c
字号:
//外部舵机驱动
#include<pic.h>
/////////////////////////////////////////
//--------------端口定义---------------//
/////////////////////////////////////////
#define LEDSW RA0
#define KEY RB0
#define RELLYFUNCON RB1
#define RELLYELECON RB2
#define CIGAR RB4
#define PWM RC2
#define SPEAKER RC5
#define ON 0
#define OFF 1
#define ONFLAG 1
#define OFFFLAG 0
///////////////////////////////////////
//--------------函数定义-------------//
///////////////////////////////////////
void delay();
void delay1();
void initt1(); //T1初试化
void initport(); //端口初试化
void initvar(); //数据初试值初试化
///////////////////////////////////////
//-------------数据定义--------------//
///////////////////////////////////////
static char clktemp,PWM_NUMBER1,PWM_NUMBER2,PWM_NUMBER3,TIMECONTROL;
static char CIGAROVER,CIGARhave;
static char SWCONTROL,LEFT_LIMIT,RIGHT_LIMIT,MID_LOCALL;
static char Rflag,Mflag,Lflag,R,M,L;
static int TIMENUMBER;
/******************************************
//-------------------主函数----------------
******************************************/
main()
{
initvar(); //数据初试值初试化
initport(); //端口初试化
initt1(); //T1初试化
TMR1ON=1;
// TMR1ON=0;
while(1)
{
// RIGHT_LIMIT=0; //清楚右极限运动标志位
LEDSW=ON;
////////////////////////////////////////////////////////////////////////////////////////
while(CIGAR==1)
{
CIGARhave=1;
//全局有烟出现标志位置1,服务于时间舵机中断角度调整
CIGAROVER=1;
//烟燃烧完毕标志位,服务于烟燃烧完毕的后续处理,防止没有烟出现却运行已经燃烧完的动作
delay1();
RIGHT_LIMIT=0;
//清舵机运行到左极限位置标志位
MID_LOCALL=1;
//置舵机运转中部标志位为1,舵机转动到中间位置,以达到旋转90度
PWM=0;
//TMR1H=0xfa;
//TMR1L+=0x24;
// TMR1ON=1;
// TMR1ON=0;
while(KEY==1) //在此等待用户按键
{
LEDSW=OFF; //LED显示,完成闪烁功能
delay();
LEDSW=ON;
delay();
}
if(SWCONTROL==1) //在此使用按键开关是为了防止用户第二次按键
{
RELLYELECON=ONFLAG; //
delay();
RELLYFUNCON=ONFLAG; //
delay1();
delay1();
delay1();
delay1();
delay1();
RELLYELECON=OFFFLAG;
}
SWCONTROL=0;
while(KEY==1) //让程序死在这里,等待烟燃烧完毕
{
LEDSW=OFF;
delay1();
LEDSW=ON;
delay1();
if(CIGAR==0) break; ///当烟燃烧完毕则跳出死循环
}
}
////////////////////////////////////////////////////////////////////////////////////
while((CIGAR==0)&&(CIGARhave==1))
{
CIGAROVER=0;
MID_LOCALL=0;
RIGHT_LIMIT=0;
LEFT_LIMIT=1;
PWM=0;
TMR1H=0xF8;
TMR1L+=0x24;
delay1();
delay1();
delay1();
delay1();
// CIGARhave=0;
}
////////////////////////////////////////////////////////////////////////////////////
if((CIGAROVER==0)&&(CIGARhave==1))
{
LEFT_LIMIT=0;
RIGHT_LIMIT=1;
PWM=0;
//TMR1H=0xFd;
//TMR1L+=0x17;
TIMECONTROL=1;
if(clktemp==1)
{
RELLYFUNCON=OFF;
CIGARhave=0;
TIMECONTROL=0;
}
}
}
}
/*****************************************
//----------------中断函数----------------
*****************************************/
void interrupt ISR()
{
if(TMR1IF&&TMR1IE)
{
TMR1IF=0;
if(RIGHT_LIMIT==1)
{
TMR1H=0xF8;
TMR1L+=0x17;
PWM_NUMBER1=PWM_NUMBER1+1;
if(PWM_NUMBER1==2)
PWM=1;
if(PWM_NUMBER1==3)
PWM=0;
if(PWM_NUMBER1==16)
{
PWM=1;
PWM_NUMBER1=0;
// RIGHT_LIMIT=0;
}
}
if((CIGARhave==1)&&(MID_LOCALL==1))
{
TMR1H=0xfb;
TMR1L+=0x24;
PWM_NUMBER2=PWM_NUMBER2+1;
if(PWM_NUMBER2==2)
PWM=1;
if(PWM_NUMBER2==3)
PWM=0;
if(PWM_NUMBER2==16)
{
PWM=1;
PWM_NUMBER2=0;
}
}
if((CIGARhave==1)&&(LEFT_LIMIT==1))
{
// MID_LOCALL=0;
TMR1H=0xF8;
TMR1L+=0x24;
RIGHT_LIMIT=0;
PWM_NUMBER3=PWM_NUMBER3+1;
if(PWM_NUMBER3==2)
PWM=1;
if(PWM_NUMBER3==3)
PWM=0;
if(PWM_NUMBER3==10)
{
PWM=1;
PWM_NUMBER3=0;
}
}
if(TIMECONTROL==1)
{
TIMENUMBER=TIMENUMBER+1;
if(TIMENUMBER==3000)
{
TIMENUMBER=0;
clktemp=1;
}
}
}
}
/*****************************************
//函数名称:void initvar()
//函数功能:为系统调用值赋初值
//函数调用:主函数调用
*****************************************/
void initvar()
{
TIMENUMBER=0;
clktemp=0;
SWCONTROL=1; //电风扇开关控制位
PWM_NUMBER1=1; //脉冲数量计数值
PWM_NUMBER2=1; //脉冲数量计数值
PWM_NUMBER3=1; //脉冲数量计数值
PWM=0; //脉冲置低电平
LEFT_LIMIT=0; //舵机左极限标志位
RIGHT_LIMIT=1; //舵机右极限标志位
MID_LOCALL=0; //舵机运行至中间位置
////////////////port/////////////////////
RELLYFUNCON=OFFFLAG; //关闭风扇
RELLYELECON=OFFFLAG; //关闭电磁阀
}
/*****************************************
//函数名称:void initport()
//函数功能:端口初试化
//函数调用:主函数调用
*****************************************/
void initport()
{
TRISA=0xf0; //RA0抽烟状态显示灯控制位,RA1控制蜂明器
TRISB=0X19; //1111 1001 RB0读键;RB1,RB2控制继电器开关。
TRISC=0x00; //RC2脉冲提供给舵机
RA1=0; //关闭蜂明器
RA0=1; //关闭LED
// PORTB=0X01; //关闭继电器
}
/*****************************************
//函数名称:void initport()
//函数功能:T1初试化
//函数调用:主函数调用
*****************************************/
void initt1()
{
INTCON=0xC0; //打开总中断和外围中断
PIE1=0x01;
T1CON=0x80; //0000 0001做内部定时器
TMR1IF=0;
TMR1H=0xFd;//初试值为右极限,最高位置
TMR1L+=0x17;
}
/*****************************************
//函数名称:void delay() void delay1()
//函数功能:延时函数
//函数调用:服务于LED显示延时
*****************************************/
void delay()
{
int i;
for(i=2000;i>10;i--);
}
void delay1()
{
int i;
for(i=6000;i>10;i--);
}
/*
void initccp()
{
CCPR1L=0x19;
CCP1CON=0X3C;
PR2=0Xc0;
T2CON=0X0e;
}
*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -