⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 873.c

📁 PIC16f873系列 单片机实现的抽烟系统控制。能完整运行
💻 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 + -