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

📄 main.c

📁 基于PIC16F877 温湿度控制器原代码及原理图PCB图
💻 C
📖 第 1 页 / 共 2 页
字号:
/***************************************************************************************
**函数名称:void start_Capture(void)
**函数功能:开启捕获,测输入频率
**函数入口: 
**输    出:
**备    注:算法:每次启动CCP功能后,自动顺序测量2路的频率信号。在主循环中判断是否有超时
                  和测量完毕,测量完毕后查表,找出频率实际对应的值。
****************************************************************************************/
void start_Capture(void)
{
    TMR1ON = 0; 
    T1CON=0x00; 
    TMR1H=0;
    TMR1L=0;      
    TMR1ON = 1; 
    RHAPort =1;       
    RHBPort =1;     
    Capture_Byte.Dely = 0;
    CCP1CON = 0x05;                   //设置CCP1为捕捉工作方式,上升沿触发
	CCP1IE=0;              //关中断
	CCP1IF=0;              //
    CCP2CON = 0x05; 
    CCP2IE=0;              //关中断
	CCP2IF=0;
    Capture_Byte.Cap_chNum =  0;
    Capture_Byte.Cap_sampleNum = 0;
    Capture_Byte.Dely = 1;
    CCP1IE = 1;            //开ccp的中断   
}

/*********************************************************
函数名称:函数功能:
入口参数:       
出口参数:        
**********************************************************/
void CCP_value(void)
{
  unsigned char j,i;
  unsigned int k,*p;
  //将采样值从小道大排列
  if(Capture_Byte.Cap_chNum>=CAP_CH)  return;
  for(i=0;i<(CAP_NUM-1);i++)
  {
     if(Capture_Byte.Cycle_Byte[i+1]>=Capture_Byte.Cycle_Byte[i])
            Capture_Byte.Cycle_Byte[i] = Capture_Byte.Cycle_Byte[i+1] - Capture_Byte.Cycle_Byte[i];
     else   Capture_Byte.Cycle_Byte[i] = (65535 - Capture_Byte.Cycle_Byte[i]) + Capture_Byte.Cycle_Byte[i+1]+1;
  }
  p = Capture_Byte.Cycle_Byte;
  for(i = 1;i < (CAP_NUM-1); i++)
  {                                 
     for(j = 0;j < (CAP_NUM-2);j++)
     {
        if(p[j]>p[j+1])  
        { 
            k = p[j];
            p[j] =  p[j+1];
            p[j+1] = k;
        }    
     }
   } 
   Capture_Byte.Cycle_value[Capture_Byte.Cap_chNum] = Capture_Byte.Cycle_Byte[((CAP_NUM-1)/2)-1];
}

 const unsigned int bank1 shidutemp[21]={399,404,408,412,417,421,424,428,432,436, 440,444,448,452,457,462,467,472,478,485,491};

void calcu_sidu(unsigned char ch_Num)
{
  	char i; 
  	unsigned int k,j;
    unsigned int sumvalue;
    if(ch_Num>1)                return;
               //过滤不正常数据////
    Capture_Byte.All_Cycle_value[ch_Num] = Capture_Byte.All_Cycle_value[ch_Num]/3;
  	sumvalue =  (unsigned long)Capture_Byte.All_Cycle_value[ch_Num];	
    if(sumvalue >900)    sumvalue  = 900;
        sumvalue = (sumvalue*100);
        sumvalue = sumvalue/100;
    if(sumvalue>0xffff)  sumvalue = 1000;
   // else  sum =( unsigned int)(sumvalue);
  	for(i=0;i<11;i++)
	{
    	if ((sumvalue<=shidutemp[i+1]) && (sumvalue>=shidutemp[i]))
		{
            k = shidutemp[i+1]-shidutemp[i];
            j = (sumvalue-shidutemp[i]);
            sumvalue = i*10 + 10*(j/k);
      		if(sumvalue>=100)  sumvalue = 99;
            break;
    	}
  	}
    if(i==11) 
    {        
        if(sumvalue<shidutemp[0])   sumvalue = 0;
        else                        sumvalue = 99;
    }
    HumidityData[ch_Num] = (unsigned char)sumvalue;
    Capture_Byte.All_Cycle_value[ch_Num] = 0;
}



/**********************************************/
	               
void ReadKey(void)
{
   unsigned char keysigned;
   CANCEL_KeyPort =1;
   DOWN_KeyPort   =1; 
   UP_KeyPort     =1;
   ENTER_KeyPort  =1;
   keysigned = 0;
   if(Key_press.Key_value)   return;
   if(Key_press.Key_state == KEY_DOWN)
    {
        switch(Key_press.Key_down)
           {
              case  UP_KEY:
                    if(UP_Key==0)
                     {  
                       Key_press.dely++;
                       keysigned++;
                     }
                 break;
              case  DOWN_KEY: 
                    if(DOWN_Key==0) 
                     {  
                       Key_press.dely++;
                       keysigned++;
                     }
                 break;
              case  ENTER_KEY:
                    if(ENTER_Key==0) 
                    {  
                       Key_press.dely++;
                       keysigned++;
                    }
                 break;
              case  CANCEL_KEY:
                    if(CANCEL_Key==0)
                     {  
                       Key_press.dely++;
                       keysigned++;
                     }
                 break;
              default:
                    Key_press.Key_state = KEY_UP;
                    Key_press.Key_value = NO_KEY;
                    Key_press.dely = 0;
                    Key_press.Key_down = NO_KEY; 
                 break;
           }
           if(keysigned==0)
              {
                     Key_press.Key_state = KEY_UP;
                    Key_press.Key_value = NO_KEY;
                    Key_press.dely = 0;
                    Key_press.Key_down = NO_KEY; 
              }
           else if(Key_press.dely>=KEY_DELY) 
             {
                Key_press.Key_value = Key_press.Key_down;
                Key_press.Key_down = NO_KEY;
                Key_press.Key_state = KEY_UP; 
                Key_press.dely = 0;
             }
    }
   else 
    {
           Key_press.Key_down = NO_KEY;
           Key_press.dely = 0;
           if(UP_Key==0)
            {
              Key_press.Key_state = KEY_DOWN;
              Key_press.Key_down = UP_KEY;
            }
           else if(DOWN_Key==0)
            {
              Key_press.Key_state = KEY_DOWN;
              Key_press.Key_down = DOWN_KEY;
            }
           else if(ENTER_Key==0)
            {
              Key_press.Key_state = KEY_DOWN;
              Key_press.Key_down = ENTER_KEY;
            }
           else if(CANCEL_Key==0)
            {
              Key_press.Key_state = KEY_DOWN;
              Key_press.Key_down = CANCEL_KEY;
            }
    }
}
/*************************************************************/
void  Pro_Key(void)
{  
    if(Key_press.Key_value == NO_KEY)
      {
            Key_press.No_keydely++;
            if(Key_press.No_keydely<DELYTIME)
                TO_Setdata(Key_press.set_key,Key_press.set_line); 
           if(Key_press.No_keydely>=DELYTIME)
            { 
             TO_Displaydata(AD_result[1],10,0);
             TO_Displaydata(HumidityData[1],10,1);
              Key_press.bits  = 0;
              Key_press.set_key = 0;
              Key_press.No_keydely = DELYTIME;
            } 
           return;
      }
    else   Key_press.No_keydely = 0;
   switch(Key_press.Key_value) //处理翻屏
     {
         case  UP_KEY: 
               if(Key_press.bits != 0)
                {
	               Key_press.dis_buff[Key_press.set_line]++;
	               if(Key_press.dis_buff[Key_press.set_line]>9) 
	                 Key_press.dis_buff[Key_press.set_line] = 0;
	               
                 }
               else 
               {
                     Key_press.Key_value = NO_KEY; 
                     Key_press.No_keydely = DELYTIME;
                     return;
                }
           break;
         case  DOWN_KEY:   
               if(Key_press.bits != 0)
                {
	               if(Key_press.dis_buff[Key_press.set_line]>0)  Key_press.dis_buff[Key_press.set_line]--;
	               else   Key_press.dis_buff[Key_press.set_line] = 9;
	              
                 }
               else 
               {
                     Key_press.No_keydely = DELYTIME;
                     Key_press.Key_value = NO_KEY; 
                     return;
                }
           break;
         case  ENTER_KEY:
               Key_press.bits  = 1;
               if(Key_press.set_key==0)
                 {
                    Key_press.set_line = 0;
                    Key_press.dis_buff[0] = 0;
                    Key_press.dis_buff[1] = 0;
                    Key_press.dis_buff[2] = 0;
                    Key_press.dis_buff[3] = 0;
                 }
               else 
                 {
                    Key_press.set_key++;
                    if( Key_press.set_key>3)
                      {
                          Key_press.dis_data  = Key_press.dis_buff[0]*1000 + Key_press.dis_buff[1]*100 + Key_press.dis_buff[2]*10 +Key_press.dis_buff[3];
                          //WriteParameter();
                          Key_press.set_key = 0;
                          Key_press.bits = 0;
                          Key_press.No_keydely = DELYTIME;
                          Key_press.Key_value = NO_KEY;
                          return;
                      }
                    Key_press.set_line = 0;
                    if(Key_press.set_key==1)
                      {   Key_press.dis_buff[0]=0;
                          Key_press.dis_buff[1]=0;
                          Key_press.dis_buff[2]=4;
                          Key_press.dis_buff[3]=0; 
                      }
                    else if(Key_press.set_key==2)
                     {
                         Key_press.set_line = 0;
                         Key_press.dis_data  = Key_press.dis_buff[0]*1000 + Key_press.dis_buff[1]*100 +
                                               Key_press.dis_buff[2]*10 +Key_press.dis_buff[3];
  
                         //Para.CT_Data[0] =  Key_press.dis_data/256;
                         //Para.CT_Data[1] =  Key_press.dis_data%256;
                        // WriteParameter();
                          Key_press.set_line = 1;
                         // BINtoBCD(Para.Addr,&Key_press.dis_buff[0]);
                          Key_press.dis_buff[0]=0;
                          Key_press.dis_buff[1]=0;
                          Key_press.dis_buff[2] = 7;
                          Key_press.dis_buff[3] = 0;
                     }
                   else if(Key_press.set_key==3)
                     {
                         Key_press.set_line = 0;
                        // Para.Addr = Key_press.dis_buff[1]*100 + Key_press.dis_buff[2]*10 +Key_press.dis_buff[3];
                         //WriteParameter();
                       Key_press.dis_buff[0]=0;
                        Key_press.dis_buff[1]=0; 
                       Key_press.dis_buff[2]=5;
                       Key_press.dis_buff[3]=0;
                   
                       
                     }
                 }
               break;
         case  CANCEL_KEY:
                if(Key_press.bits == 0) 
               {
                     Key_press.No_keydely = DELYTIME;
                     Key_press.Key_value = NO_KEY; 
                     return;
                }
                Key_press.set_line++;
                   if(Key_press.set_line>=4)
                     {   
                         Key_press.set_line = 0;
                         if(Key_press.set_key == 0)
                          { 
                             if((Key_press.dis_buff[0]==8)&&(Key_press.dis_buff[1]==8)
                                      &&(Key_press.dis_buff[2]==8)&&(Key_press.dis_buff[3]==8))
                                 {
                                    Key_press.set_key = 1;
                                    Key_press.dis_buff[0]=0;
                                    Key_press.dis_buff[1]=0;
                                    Key_press.dis_buff[2]=4;
                                    Key_press.dis_buff[3]=0;                               
                                 }
                              else
				                 {
				                    Key_press.set_line = 0;
				                    Key_press.dis_data = 0;
				                    Key_press.dis_buff[0] = 0;
				                    Key_press.dis_buff[1] = 0;
				                    Key_press.dis_buff[2] = 0;
				                    Key_press.dis_buff[3] = 0;
				                 }
                           }
                          else
                           {
                              if(Key_press.set_key==2) 
                                { 
                                    Key_press.set_line = 1;
                                    //Para.Addr = Key_press.dis_buff[1]*100 + Key_press.dis_buff[2]*10 +Key_press.dis_buff[3];
                                } 
                              else if(Key_press.set_key==3) 
                                { 
                                    // Key_press.dis_data  = Key_press.dis_buff[0]*1000 + Key_press.dis_buff[1]*100 + Key_press.dis_buff[2]*10 +Key_press.dis_buff[3];
                                    
                                       
                                }
                              //WriteParameter();  
                           }
                     }
             
           break;
         default:break;
       } 
      TO_Setdata(Key_press.set_key,Key_press.set_line); 
      Key_press.Key_value = NO_KEY; 
  }  
/***************************************/
void TO_Setdata(unsigned char serial_num,unsigned char set_num)
{
    unsigned char  i;
    DisData.data[0][0] = dispcod[12];
    DisData.data[1][0] = dispcod[12];
    for(i = 0;i<3;i++)  DisData.data[0][i] = dispcod[12];
              DisData.data[0][3] = dispcod[serial_num];
    for(i = 0;i<4;i++) 
              DisData.data[1][i] = dispcod[Key_press.dis_buff[i]];
    
    back_Data++;
    if((back_Data>1)&&(back_Data<3))
    {
  
      DisData.data[1][set_num] =dispcod[12]; //DisData.data[0][1+set_num]&(~back_Data);
      back_Data = 0;
     }

 }



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

⌨️ 快捷键说明

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