?? 873.c
字號:
//外部舵機驅(qū)動
#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
///////////////////////////////////////
//--------------函數(shù)定義-------------//
///////////////////////////////////////
void delay();
void delay1();
void initt1(); //T1初試化
void initport(); //端口初試化
void initvar(); //數(shù)據(jù)初試值初試化
///////////////////////////////////////
//-------------數(shù)據(jù)定義--------------//
///////////////////////////////////////
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;
/******************************************
//-------------------主函數(shù)----------------
******************************************/
main()
{
initvar(); //數(shù)據(jù)初試值初試化
initport(); //端口初試化
initt1(); //T1初試化
TMR1ON=1;
// TMR1ON=0;
while(1)
{
// RIGHT_LIMIT=0; //清楚右極限運動標志位
LEDSW=ON;
////////////////////////////////////////////////////////////////////////////////////////
while(CIGAR==1)
{
CIGARhave=1;
//全局有煙出現(xiàn)標志位置1,服務于時間舵機中斷角度調(diào)整
CIGAROVER=1;
//煙燃燒完畢標志位,服務于煙燃燒完畢的后續(xù)處理,防止沒有煙出現(xiàn)卻運行已經(jīng)燃燒完的動作
delay1();
RIGHT_LIMIT=0;
//清舵機運行到左極限位置標志位
MID_LOCALL=1;
//置舵機運轉(zhuǎn)中部標志位為1,舵機轉(zhuǎn)動到中間位置,以達到旋轉(zhuǎn)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; ///當煙燃燒完畢則跳出死循環(huán)
}
}
////////////////////////////////////////////////////////////////////////////////////
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;
}
}
}
}
/*****************************************
//----------------中斷函數(shù)----------------
*****************************************/
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;
}
}
}
}
/*****************************************
//函數(shù)名稱:void initvar()
//函數(shù)功能:為系統(tǒng)調(diào)用值賦初值
//函數(shù)調(diào)用:主函數(shù)調(diào)用
*****************************************/
void initvar()
{
TIMENUMBER=0;
clktemp=0;
SWCONTROL=1; //電風扇開關控制位
PWM_NUMBER1=1; //脈沖數(shù)量計數(shù)值
PWM_NUMBER2=1; //脈沖數(shù)量計數(shù)值
PWM_NUMBER3=1; //脈沖數(shù)量計數(shù)值
PWM=0; //脈沖置低電平
LEFT_LIMIT=0; //舵機左極限標志位
RIGHT_LIMIT=1; //舵機右極限標志位
MID_LOCALL=0; //舵機運行至中間位置
////////////////port/////////////////////
RELLYFUNCON=OFFFLAG; //關閉風扇
RELLYELECON=OFFFLAG; //關閉電磁閥
}
/*****************************************
//函數(shù)名稱:void initport()
//函數(shù)功能:端口初試化
//函數(shù)調(diào)用:主函數(shù)調(diào)用
*****************************************/
void initport()
{
TRISA=0xf0; //RA0抽煙狀態(tài)顯示燈控制位,RA1控制蜂明器
TRISB=0X19; //1111 1001 RB0讀鍵;RB1,RB2控制繼電器開關。
TRISC=0x00; //RC2脈沖提供給舵機
RA1=0; //關閉蜂明器
RA0=1; //關閉LED
// PORTB=0X01; //關閉繼電器
}
/*****************************************
//函數(shù)名稱:void initport()
//函數(shù)功能:T1初試化
//函數(shù)調(diào)用:主函數(shù)調(diào)用
*****************************************/
void initt1()
{
INTCON=0xC0; //打開總中斷和外圍中斷
PIE1=0x01;
T1CON=0x80; //0000 0001做內(nèi)部定時器
TMR1IF=0;
TMR1H=0xFd;//初試值為右極限,最高位置
TMR1L+=0x17;
}
/*****************************************
//函數(shù)名稱:void delay() void delay1()
//函數(shù)功能:延時函數(shù)
//函數(shù)調(diào)用:服務于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 + -