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

📄 b11_v3.3.3(f72).c

📁 基于pic16f72单片机的直流伺服电机控制
💻 C
📖 第 1 页 / 共 2 页
字号:
/*****PIC16F72引脚分配************************
PORTA:
	0:模拟输入,用于AD,混合风门反馈输入
    1:模拟输入,用于AD,蒸发器温度
    2: MODE电位器输入(分五档)
    3:混合风门电位器输入(分9档)
    4:A/C控制端(输出)
    5:风量电位器输入(分9档)

PORTB:
         0:SPD 车速信号输入(自动)
         1:AN10 (空)
         2:AN8 内气温度传感器输入 混合风门伺服电机控制1
         3:AN9 外气温度传感器输入 混合风门伺服电机控制2
         4:按键RDEF
         5:按键 AC
         6:用于调试
         7:用于调试
PORTC:
         0:4094_STR(风量控制、模式及继电器控制)
         1:4094_CLK(风量控制、模式及继电器控制)
         2:4094_D(风量控制、模式及继电器控制)
         3:SCL(24C01)
         4:SDA(24C01)
         5:SDO(空)
         6:ahm  
         7:ahc  
 ***********************************************/
 #include <pic.h>
 void Key_AC();
 void Key_RDEF();


void Delayms(int ms);
void AD_Init();
void Time1_Init();
void Set4094();
signed char Cal_T_in(unsigned int);
//////////////////////////////////////
#define Face    0x01
#define BL      0x02
#define Foot    0x03
#define DF      0x04
#define Def     0x05
#define Rear    0x06
unsigned char F_Mode=BL,Old_Mode;

//以下定义用于风量 Level0最大 ,Level9最小关闭鼓风机
#define Level0	0x09		//Largest
#define Level1	0x08
#define Level2	0x07
#define Level3	0x06
#define Level4	0x05
#define Level5	0x04
#define Level6	0x03
#define Level7	0x02
#define Level8	0x01
#define Level9	0x0			//Off

#define Low     0x01
#define Low1    0x02
#define Mid     0x03
#define HI_M    0x04
#define Hi      0x05
#define OFF     0x0
#define ON      0x01

#define AC_LED_ON	U5_595|=0x80		
#define AC_LED_OFF	U5_595&=~0x80
#define Intake_LED_ON	U5_595|=0x40
#define Intake_LED_OFF	U5_595&=~0x40
#define REC_Mode	U4_595&=0x3f;U4_595|=0x80
#define FRS_Mode	U4_595&=0x3f;U4_595|=0x40

unsigned char Fan=OFF,Fan_Old=OFF;
unsigned char Compress_State=OFF,Compress_Old;
unsigned char Intake=0;
unsigned char Rear_State=OFF;
int  Rear_Time;
unsigned char T_position=4;
unsigned char mix_pos=103,des_mix_pos=103;
unsigned char Count_am=0;
unsigned char U4_595 ;//q1--q5风量控制 q7:外气模式 q8:内气模式
unsigned char U5_595; //q1--q6模式 q7:a/c LED指示灯 q8:intake LED指示灯
unsigned char U13_595,U12_595,Col=0;
unsigned char U13_C1=0,U13_C2=0,U13_C3=0,U13_C4=0,U13_C5=0;
unsigned char act_blwr;		//实际出风量
unsigned char N_Key_U14=0,N_Key_U15=0;
unsigned char NN_Key_U14=0;
unsigned int NN_Key_U15=0;
 

int Index;
signed char Tin;			//内气温度
unsigned int TTin=0;		//内气温度计数和
char Tin_N=0;				//内气温度计数次数
unsigned char AD_TR;
unsigned char AD_Mode;
unsigned char AD_Fan;
unsigned char AD_Temp;
unsigned char AD_N=0;
unsigned char evap_front_flt=40;
unsigned char Flag_Tr=0;
unsigned char U14,U15;
//////////////////////////////////////
#define bitset(var, bitno) ((var) |= (1 << (bitno)))
#define bitclr(var, bitno) ((var) &= ~(1 << (bitno)))

void Key_AC()
{
     if(Compress_State==ON)
     {
     	Compress_State=OFF;
        U13_C5|=0x01;
     }
     else 
     {
     	if(Fan>0)
		{
        	Compress_State=ON;
            U13_C5&=~0x01;
         }
         else
		 {
			Fan=Fan_Old;
			if(Fan==OFF)
				Fan=Low;
			Compress_State=ON;
            U13_C5&=~0x01;
		  }
	}     
}

void Key_OFF()
{
	Fan_Old=Fan;
    Fan=OFF;
    Compress_Old=Compress_State;
    Compress_State=OFF;
}
void Key_REAR()
{
 	if(Rear_State==ON)
    {
    	Rear_State=OFF;
        Rear_Time=0;
        bitclr(U5_595,5);
        bitclr(U13_C5,1);
     }
     else
     {
        Rear_State=ON;
        Rear_Time=900;
        bitset(U5_595,5);
        bitset(U13_C5,1);
     }
 }
void Key_REC()		//内气模式
{
	if(F_Mode!=Def)
    {
    	Intake=1;
       	U13_C1|=0x01;
		U13_C1&=~0x02;
		bitclr(PORTB,0);	
        bitset(PORTB,1); 
    }
}
void Key_FRS()		//外气模式
{
	Intake=0;
    U13_C1&=~0x01;
	U13_C1|=0x02;
    bitclr(PORTB,1);		
    bitset(PORTB,0);
}
/***************************************
功能:
U4(4094) :输出风量控制值
U5(4094) :输出模式控制和风量继电器等	
PORTC.2:HC4094数据口(输出)
PORTC.0:HC4094 STR
PORTC.1:HC4094 SCK(输出)
*/
#define STR_0	bitclr(PORTC,0)
#define STR_1	bitset(PORTC,0)
#define CLK_0	bitclr(PORTC,2)
#define CLK_1	bitset(PORTC,2)
#define Dout_0	bitclr(PORTC,1)
#define Dout_1	bitset(PORTC,1)
void Set4094()
{
	unsigned char j;
	unsigned char V;
    CLK_0;//Clk595_0;
    STR_0;//Str595_0;
   	V=U5_595;
    for(j=8;j>0;j--)
    {
         if(V&0x80)
                Dout_1;
        else
                Dout_0;
		V=V<<1;
        CLK_1;
		NOP();
        CLK_0;//Clk595_0;
    }
    V=U4_595;
    for(j=8;j>0;j--)
    {
        if(V&0x80)
        	Dout_1;
        else
        	Dout_0;
		V=V<<1;
        CLK_1;//Clk595_1;
        NOP();
        CLK_0;//Clk595_0;
    }
    STR_1;
    STR_0;//Str595_0;
 }
 void Delayms(int ms)
 {
	int i,j;
    for(i=0;i<ms;i++)
    for(j=0;j<100;j++)
                ;
 }
 void AD_Init()
 {
	ADCON0=0x81;    //ADCLK=Fosc/(32*DIV) ADCS2=1 :DIV=2 else DIV=1 
                    //当前通道=AN0  
                    //AD转换有效
	ADCON1=0;    
//ADCON1=0x45;    //数据左对齐高8位在ADRESH,低2位在ADRESL
                    //ADCS2=1
                    //AD转换的模拟通道为AN0。。AN9 
//    ADCON2=0x0;  
    bitclr(PIR1,6);         //clear ADIF bit        
    bitset(PIE1,6);         //set ADIE bit
    bitset(INTCON,6);       //set PEIE bit
    bitset(INTCON,7);       //set GIE bit
}

/***********************************************
	16位定时器,定时时间为10ms
***********************************************/
void Time1_Init()		
{
	TMR1H=0xfc;		//定时常数=1024,时钟=Fosc/4=4MHz/4=1MHz
	TMR1L=0x00;		//定时时间=1024/1000000=1/1000=1MS
	T1CON=0x00;
	bitclr(PIR1,0);
	bitset(PIE1,0);
}
void interrupt  Pic_ISR(void)
{
	unsigned char Index;
	if((PIR1&0x40)==0x40)
    {
		if((ADCON0&0x38)==0)		//混合风门
		{
			if(AD_N>1)
			{
    			mix_pos=(mix_pos+(unsigned int)ADRES)/2;
				ADCON0|=0x08;
				AD_N=0;
			}
			else
				AD_N++;
		}
		else if((ADCON0&0x38)==0x08)//蒸发器温度
		{
			if(AD_N>1)
			{
				AD_N=0;
				AD_TR=ADRES;
				ADCON0=0x81;
				ADCON0|=0x10;
				Flag_Tr=1;
			}
			else
				AD_N++;
				
		}
		else if((ADCON0&0x38)==0x10)//
		{
			if(AD_N>1)
			{
				AD_N=0;
				AD_Temp=ADRES;
				ADCON0=0x81;
				ADCON0|=0x18;
			}
			else
				AD_N++;	
			
			
		}
        else if((ADCON0&0x38)==0x18)//
		{
			if(AD_N>1)
			{
				AD_N=0;
				AD_Mode=ADRES;
				ADCON0=0x81;
				ADCON0|=0x20;
			}
			else
				AD_N++;	
		}
		else if((ADCON0&0x38)==0x20)
		{
			if(AD_N>1)
			{
				AD_N=0;
				AD_Fan=ADRES;
				ADCON0=0x81;
			}
			else
				AD_N++;
		}
		else
			ADCON0=0x81;
        bitclr(PIR1,6);         //clear ADIF bit
	}
    ///////////混合风门控制  start
    if(des_mix_pos>mix_pos)
    {
       	if(des_mix_pos-mix_pos>=5)
        {
           	bitclr(PORTC,6);
            bitset(PORTC,7);
        }  
		else
        {
        	bitclr(PORTC,6);
            bitclr(PORTC,7);
        }
	}        
    else if(des_mix_pos<mix_pos)
    {
    	if(mix_pos-des_mix_pos>=5)
        {
                bitclr(PORTC,7);
                bitset(PORTC,6);
        }
        else
        {
        		bitclr(PORTC,7);
                bitclr(PORTC,6);
        }
    } 
    if((PORTC&0xc0)==0xc0)
		PORTC&=~0xc0;
//	Set4094();
    ///////////混合风门控制  end/////////////////////  
	bitset(ADCON0,2);
	
}
#define Din	90
#define Dfe	0
unsigned  char Cal_T_evap(unsigned int mad_Fevapo)
{

	unsigned char  Temp_FEvapo;
   if(mad_Fevapo>2700 )
      {
            Temp_FEvapo=0;
      }
      else if(mad_Fevapo<1000)
      {
            Temp_FEvapo=250;
      }
      else 
      {
            if(mad_Fevapo>2350-Dfe)
               Temp_FEvapo=0;
            else if(mad_Fevapo<1100)
               Temp_FEvapo=250;
            else
            {
               if(mad_Fevapo>2007-Dfe)
                  Temp_FEvapo=0;
               else if(mad_Fevapo>1982-Dfe)
                  Temp_FEvapo=10;   
               else if(mad_Fevapo>1976-Dfe)
                  Temp_FEvapo=15; 
               else if(mad_Fevapo>1964-Dfe)
                  Temp_FEvapo=20; 
               else if(mad_Fevapo>1951-Dfe)
                  Temp_FEvapo=25;  
               else if(mad_Fevapo>1939-Dfe)
                  Temp_FEvapo=30;  
               else if(mad_Fevapo>1927-Dfe)
                  Temp_FEvapo=35;  
               else if(mad_Fevapo>1914-Dfe)
                  Temp_FEvapo=40;  
               else if(mad_Fevapo>1902-Dfe)
                  Temp_FEvapo=45;  
               else if(mad_Fevapo>1889-Dfe)
                  Temp_FEvapo=50; 
               else if(mad_Fevapo>1877-Dfe)
                  Temp_FEvapo=55;  
               else if(mad_Fevapo>1864-Dfe)
                  Temp_FEvapo=60;  
               else if(mad_Fevapo>1852-Dfe)
                  Temp_FEvapo=65;  
               else if(mad_Fevapo>1839-Dfe)
                  Temp_FEvapo=70;  
               else if(mad_Fevapo>1827-Dfe)
                  Temp_FEvapo=75;  
               else if(mad_Fevapo>1814-Dfe)
                  Temp_FEvapo=80;  
               else if(mad_Fevapo>1801-Dfe)
                  Temp_FEvapo=85;  
               else if(mad_Fevapo>1789-Dfe)
                  Temp_FEvapo=90;  
               else if(mad_Fevapo>1776-Dfe)
                  Temp_FEvapo=95;  
               else if(mad_Fevapo>1764-Dfe)
                  Temp_FEvapo=100;  

⌨️ 快捷键说明

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