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

📄 main.c

📁 基于PIC16F877 温湿度控制器原代码及原理图PCB图
💻 C
📖 第 1 页 / 共 2 页
字号:
#include <pic.h>
#include "Pindefine.h"

#define uint unsigned int
#define uchar unsigned char
void Systemyinit(void);
#define  Timer10ms    240  //10ms中断
void interrupt ISR(void);
unsigned char AD_Change(unsigned char ch_num);
void TaskLoop(void);
void StartHumidityMeasure(void);
void start_Capture(void);
void CCP_value(void);
void calcu_sidu(unsigned char ch_Num);	
extern void display(void);
const unsigned char dispcod[] ={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x00};
extern  Disdata  bank1  DisData;
void charg_change(void);
void  Pro_Key(void);
void ReadKey(void);
void TO_Setdata(unsigned char serial_num,unsigned char set_num);
extern void TO_Displaydata(unsigned int data,unsigned int Dis_floatnum,unsigned char line);
 Key_para  Key_press;
unsigned char  bank2 back_Data = 0x00;
 unsigned char bank1   Count10ms;
 unsigned char bank1  Count100ms;
 unsigned char  bank1  Count1s;
// unsigned char   Para[21];
 unsigned char bank1   Count500ms;
 unsigned char  bank1  T10mscount;
 unsigned int bank1  AD_result[2];
 char bank2  HumidityData[2];
 Capture bank1 Capture_Byte;
void  watchDOG(void)
{
    if(WDOG)   WDOG = 0;                   
    else       WDOG = 1;
}
void main(void)
{   
 Systemyinit();
 watchDOG();
 HEA1 = 0;
 HEA2 = 0;
 GWBJ = 0;
  while(1)
    {
     
    TaskLoop();
    //FANA=1;
    HEA1=1;
    HEA2=1;
    //GWBJ=1;
  
    }
}
void interrupt ISR(void) //中断服务程序
{
   unsigned int Cycle_L,Cycle_H;
  if (T0IE && T0IF)
	{
	    T0IF = 0; 
        TMR0 = Timer10ms;
        T10mscount++;
        display();   //显示
        if(T10mscount>=10)
        {
	        Count10ms++;
            T10mscount = 0;
            if(Count10ms%10==0)	Count100ms=1;		                
	        if((Count10ms%50)==0) Count500ms = 1;
	        if(Count10ms>=100)   
	         {
	            Count10ms = 0;
                Count1s = 1;
	         }
         }
       if(Capture_Byte.Dely)   
        {
           Capture_Byte.Dely++;
           charg_change();
         
        }
       ReadKey();				
	} 

   
    if((CCP1IE&&CCP1IF)|(CCP2IE&&CCP2IF==1)) 
    {
            if(CCP1IF==1)
            {
            Cycle_H = CCPR1H;
            Cycle_L = CCPR1L;
            }     
            else
             {Cycle_H = CCPR2H;
              Cycle_L = CCPR2L;
             }
             CCP1IF=0;
             CCP2IF=0;
            Capture_Byte.Cycle_Byte[Capture_Byte.Cap_sampleNum++] = Cycle_H*256 + Cycle_L;  
            if(Capture_Byte.Cap_sampleNum>=CAP_NUM) 
            {
               Capture_Byte.Dely = 0;
               CCP2IE= 0;//关中断
               CCP1IE= 0;
               CCP_value();
               Capture_Byte.Cap_chNum++; 
               if(Capture_Byte.Cap_chNum<CAP_CH)
                {
	             
	               Capture_Byte.Cap_sampleNum = 0;
	               Capture_Byte.Dely = 1;
	               CCP2IE = 1;//开中断中断
                }
               else  
                { 
                   CCP2IE = 0;//开中断 
                   Capture_Byte.Dely =0;
                } 
            }
    }
 
} 

void charg_change(void)
{
  if(Capture_Byte.Dely>=CAP_DELY)
    {
      CCP1IE=0;//关中断
      CCP1IF = 0;
      CCP2IE=0;//关中断
      CCP2IF = 0;
      Capture_Byte.Dely = 0;
      Capture_Byte.Cycle_value[Capture_Byte.Cap_chNum] = 0;
      Capture_Byte.Cap_chNum++; 
      if(Capture_Byte.Cap_chNum<CAP_CH)
       {
	     
	     Capture_Byte.Cap_sampleNum = 0;
          Capture_Byte.Dely = 1;
	      CCP2IE = 1; 
       }
       else
       {
           Capture_Byte.Dely = 0;
           CCP1IE = 0; 
           CCP2IE = 0; 
      }
    }
}

/***************************************************************************
函数名称:void Systemyinit()
函数功能:系统初始化
入口参数:无
备注: 
***************************************************************************/
   
void Systemyinit(void)
{  
   ADCON1=0X04;
   OPTION = 0x07;       //256分频
   HEA2Port   =0;          HEA1Port   =0;    
   LEDWX3Port =0;   
   LEDWX2Port =0;    
   LEDWX1Port =0;    

   FANAPort   =0; 
   TEMBPort   =1;  
   TEMAPort   =1;

   GWBJPort   =0;
   CANCEL_KeyPort =1;
   DOWN_KeyPort   =1; 
   UP_KeyPort     =1;
   ENTER_KeyPort  =1;
   AD_result[0]=0;						//温度
   AD_result[1]=0;						//温度 
   HumidityData[0] = 0;
   HumidityData[1] = 0;
   Key_press.Key_value == NO_KEY;
   
   LEDWX8Port  =0;   
   LEDWX7Port  =0;
   LEDWX6Port  =0; 
   LEDWX5Port  =0;

   WDOGPort   = 0;    
   RHAPort    = 1;  
   RHBPort    = 1;    
   LEDWX4Port = 0;
    TRISD = 0;
   LEDWX1=1;
   LEDWX2=1;
   LEDWX3=1;
   LEDWX4=1;
   LEDWX5=1;
   LEDWX6=1;
   LEDWX7=1;
   LEDWX8=1;
   FANA=0;
   HEA1=0;
   HEA2=0;
   GWBJ=0;
   TMR0 = Timer10ms;        //
   T0IE = 1;  //开定时器0中断
   PEIE = 1; //开外设中断
   GIE = 1;  //开CPU中断
  }
  
void TaskLoop(void)								//主循环任务
{    unsigned char i;
     if(Count100ms==1)
      { 
   
      }
     if(Count500ms==1)
     {   
         i++;
        watchDOG();
        Count500ms = 0;
        Pro_Key();
        //watchDOG();
       /* if(i>=6)
        {
         if(i>=12) i=0;
        TO_Displaydata(AD_result[0],10,0);
        TO_Displaydata(HumidityData[0],10,1);
        
        }
        else
        {
        TO_Displaydata(AD_result[1],10,0);
        TO_Displaydata(HumidityData[1],10,1);
        }*/
      }

        
     if(Count1s==1)
      { 
        Count1s = 0;
        AD_Change(0);								
	    AD_Change(1);
        StartHumidityMeasure();
       }
     
    //Task500ms();
	//Task1S();
}

/*********************************************************
函数名称:void  Analog_Digital(unsigned char ch_num)
函数功能:AD采样
入口参数:ch_num:采样的通道
          AD_data:转换的结果
出口参数:TRUE___成功完成AD转换
          FALSE—AD转换失败
**********************************************************/
unsigned char Analog_Digital(unsigned char ch_num,unsigned int  *AD_data)
{
    unsigned char i,j;
    TEMBPort   =1;  
    TEMAPort   =1;
    if(ch_num) {ADCON0=0x4d;}
    else {ADCON0=0x45;}
    ADCON1 = 0x84;
    j = 0;
   for(;;)                
   {       
     if(ADIF == 1)  break;
     j++;
     if(j>230)  
     return FALSE;
   }
   i =  ADRESL;
   j =  ADRESH;
   ADIF=0;
   *AD_data=j*256+i;
   return  TRUE;

 

}
/*********************************************************
函数名称:void AD_Change(unsigned char ch_num))
函数功能:AD采样(默认采样5次取中间值作为本次采样的结果)
入口参数:ch_num:采样的通道
备注:    将最终采样的结果放在AD_result区中
          因干扰等原因本次采样失败后不更新AD_result区的值
**********************************************************/
unsigned char AD_Change(unsigned char ch_num)
{
  unsigned char i,j;
  unsigned long  k=0;
  unsigned int AD_buff[21];
  if(ch_num>1)
  return FALSE;
  //watchDOG();
  for(i = 0; i < 21; i++) 
  {
     if(Analog_Digital(ch_num,&AD_buff[i])==FALSE)
     {      
           return FALSE;
      }
  }
  for(i = 1;i < 21; i++)
  {                                 
     for(j = 0;j < 20;j++)
     {
        if(AD_buff[j]>AD_buff[j+1])  
        { 
            k = AD_buff[j];
            AD_buff[j] =  AD_buff[j+1];
            AD_buff[j+1] = k;
        }    
     }
   } 
  
   k= AD_buff[11];
 /*  if(ch_num == 0)
      k = (k*Para[ParaTemp1])/100;  
   else
      k = (k*Para[ParaTemp2])/100;
*/
   k=k*5000;
   k = k/1024;
   if(k>=500)  
     { 
        k = (k -500); 
        if(k>1000)   k = 1000;
        AD_result[ch_num] = k;
        if(AD_result[ch_num]>=1000)
        {
             AD_result[ch_num] = 999;
             return FALSE;
        }
        
     }
   else    
     {
             AD_result[ch_num] = 0;
     }   
      
     return TRUE;
}

/**************************************/

void StartHumidityMeasure(void)		//启动测湿,每秒1次
{   
    static unsigned char Test_Hum_num; 
    if((Capture_Byte.Cap_chNum==0)&&(Capture_Byte.Dely==0))
    {
 	  start_Capture();				//开启捕获通道
    }
    if(Capture_Byte.Cap_chNum>=CAP_CH)
     {
        if(Capture_Byte.Cycle_value[0]>700)   Capture_Byte.Cycle_value[0] = 700;
        if(Capture_Byte.Cycle_value[1]>700)   Capture_Byte.Cycle_value[1] = 700;
        Capture_Byte.All_Cycle_value[0] += Capture_Byte.Cycle_value[0];
        Capture_Byte.All_Cycle_value[1] += Capture_Byte.Cycle_value[1];
       Test_Hum_num++;   
        if(Test_Hum_num>=3)
          {
            calcu_sidu(0);
            calcu_sidu(1);
            Capture_Byte.All_Cycle_value[0] = 0;
            Capture_Byte.All_Cycle_value[1] = 0;
            Test_Hum_num = 0;
           }
         //这里加合闸电压计算
         Capture_Byte.Dely = 0;
         Capture_Byte.Cap_chNum = 0;
         Capture_Byte.Cap_sampleNum = 0;
     }
}



/*************************************/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -