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

📄 sl.c

📁 PIC16F 系列制作的空调控制器 全部资料 软件硬件
💻 C
字号:
#include"pic.h"

#define bitset(var, bitno) ((var) |=  (1<<(bitno)))
#define bitclr(var, bitno) ((var) &= ~(1<<(bitno)))
#define CLK RC3
#define DATA RC5
#define STB RD4
#define PS_4021 RD6
#define DATA_INPUT RD7
#define CLK_4021 RD5

#define MODE_P RC0
#define MODE_N RC1
#define RF_P RD0
#define RF_N RD1
#define MIX_P RD2
#define MIX_N RD3

#define ad0  0b01000001
#define ad1  0b01001001
#define ad2  0b01010001
#define ad3  0b01011001
#define ad4  0b01100001
#define ad5  0b01101001
#define ad6  0b01110001
#define ad7  0b01111001
#define ad8  0b01000011
#define ad9  0b01001011
#define ad10 0b01010011
#define ad11 0b01011011
#define ad12 0b01100011
#define ad13 0b01101011

union var
{
	unsigned char byte; 
	struct
	{
    	unsigned bit0: 1;
    	unsigned bit1: 1;
    	unsigned bit2: 1;
    	unsigned bit3: 1;
    	unsigned bit4: 1;
    	unsigned bit5: 1;
    	unsigned bit6: 1;
    	unsigned bit7: 1;
	}bits;
};
union adres
{
	unsigned int ad;
	unsigned char res[2];
}adresult;
static union var KEY_VALUE;
unsigned char PWM[7]={0x00,0X33,0X66,0X99,0XCC,0XFF,0xFF};
unsigned int Vol_H[6]={1080,810,550,260,70,40};	
unsigned int Vol_L[6]={1020,750,490,200,10,5};
static unsigned char led[4]={0,0,0,0};
unsigned char mode_count;
unsigned char	Ad_count;
unsigned int fb_voltage;
unsigned int cur_voltage;
unsigned char mode_counter=0;
unsigned char rf_counter=0;
unsigned char mix_counter=0;
unsigned blo_counter=0;
unsigned char gear=1;
unsigned char autostep=1;
unsigned char step=1;
unsigned char count_10s=0;
unsigned int max_cur;
unsigned int ad_value;
bit modemotor_flag=0;
bit rfmotor_flag=0;
bit mixmotor_flag=0;
bit mode_flag=0;
bit rf_flag=0;
bit mix_flag=0;
bit blo_flag=0;
bit blo_over=0;
bit cur_flag=0;
bit test_flag=0;
bit auto_flag=0;
bit over_flag=0;
bit open_ok;
void delay(unsigned char t)
{
	unsigned int i;
    for(;t>0;t--)
    	for(i=1000;i>0;i--)
        	NOP();
}

unsigned char key_input()
{
	unsigned char i;
	PS_4021=1;
	NOP();
	PS_4021=0;
	NOP();
	CLK_4021=0;
	NOP();
	CLK_4021=1;
	NOP();
	CLK_4021=0;
	NOP();
	CLK_4021=1;
	NOP();
	CLK_4021=0;
	NOP();
	CLK_4021=1;
	NOP();
	CLK_4021=0;
	NOP();
	CLK_4021=1;
	NOP();
	CLK_4021=0;
	NOP();
	CLK_4021=1;
	NOP();
	CLK_4021=0;
	NOP();
	CLK_4021=1;
	NOP();
	CLK_4021=0;
	NOP();
	CLK_4021=1;
	NOP();
	CLK_4021=0;
	NOP();
	CLK_4021=1;
	NOP();
  	for(i=0;i<8;i++)
	{
		KEY_VALUE.byte<<=1;
		KEY_VALUE.bits.bit0=RD7;
		NOP();
 		CLK_4021=0;
		NOP();
		CLK_4021=1;
		NOP();
	}
	return KEY_VALUE.byte;
}
void led_out()
{
	unsigned char i,j;
	STB=0;
    for(i=0;i<4;i++)
	{
		for(j=0;j<8;j++)
		{
		  	CLK=0;
			NOP();
			DATA=led[i]&0x01;
			NOP();
   			CLK=1;
           	led[i]>>=1;
		}
	}
	STB=1;
}
void ad_sampling(unsigned char ch)
{   
        //unsigned int temp;
		//ADCON0=0x41;
		//ADCON1=0x80;
		ADCON1=0x80;
		ADCON0=ch;
		//bitset(ADCON0,0);
      	bitset(ADCON0,2);	//启动A/D转换
        while(!ADIF);
        ADIF=0;
		//bitclr(ADCON0,0);         
        adresult.res[0]=ADRESL;
		adresult.res[1]=ADRESH;
		ad_value=adresult.ad;  
        ad_value=ad_value*50/1024;
}

void keyscan()
{	
	if(key_input()&0x01==0)
	{	
		delay(10);
		if(key_input()&0x01==0)
		auto_flag=1;
		else
		auto_flag=0;
	}
	if((key_input()&0x02)==0)
	{   
		delay(10);
		if((key_input()&0x02)==0)
		{
			mode_flag=1;
			mode_counter++;
			while(mode_counter>2)
			mode_counter=0;
		}
	}
	if((key_input()&0x04)==0)
	{   
		delay(10);
		if((key_input()&0x04)==0)
		{
			rf_flag=1;
			rf_counter++;
			while(rf_counter>2)
			rf_counter=0;		
		}
	}
	if((key_input()&0x08)==0)
	{   
		delay(10);
		if((key_input()&0x08)==0)
		{
			mix_flag=1;
			mix_counter++;
			while(mix_counter>2)
			mix_counter=0;
		}
	}
	if((key_input()&0x10)==0)
	{   
		delay(10);
		if((key_input()&0x10)==0)
		{	
			blo_flag=1;
			blo_counter++;
			if(blo_counter>6)
			blo_counter=0;	
		}
	}
}
void	interrupt	ISR(void)	//中断处理函数
{	
	if(TMR1IF)	//Timer1中断
	{	
		TMR1IF=0;
		TMR1H=0X3C;	//Timer1=0xC350=50000
		TMR1L=0XAF;
		count_10s++;
	    if(count_10s>40)	//50000*50*4us=6S
		{
			count_10s=0;
			blo_counter++;
			if(blo_counter>6)
				{
					blo_counter=0;
					blo_over=1;
				}
		}
	}
}
void main()
{   
	TRISA=0xFF;
	TRISB=0xFF;
    TRISC=0x00;
	TRISD=0x80;
	TRISE=0x07;

	PORTC=0x00;
    PORTD=0x00;
	ADCON0=0x41;
	ADCON1=0x80;
	
	CCP1CON=0X0F;	//设置PWM模式
	PR2=0XFF;	//Timer2周期(占空比总长度)
   	T2CON=0X7F;
    CCPR1L=0x00;
	
	INTCON=0x00;			/* bit7-bit0:关总中断 */
	PIR1=0X00;	            //清除所有中断
	T1CON=0X01;	//使能Timer1定时器、内部时钟*/
	
	bitset(INTCON,6);       //set PEIE bit
    bitset(INTCON,7);       //set GIE bit
	
	KEY_VALUE.byte=0x00;
	while(1)
	{	
		keyscan();
		if(blo_flag)
		CCPR1L=PWM[blo_counter];
	
		//if(auto_flag)
		//{
			//led[3]=0xff;
			//led_out();
	//	}
        //if(blo_flag)
	//	{
		//	led[3]=0xff;
		//	led_out();
		//	CCPR1L=PWM[blo_counter];
		//}
		/*if(mode_flag)
		{	
			if(mode_counter==1)
			{	
				MODE_P=1;		//启动MODE motor
				NOP();
				MODE_N=0;
				NOP();
				ad_sampling(ad6);
				if(ad_value<15)
				{	
					if(ad_value>10)
					{
						mode_flag=0;
						MODE_P=0;
						NOP();
						MODE_N=0;
						NOP();
						if(max_cur<50)
						{
							led[3]&=0b11011111;
							led[3]|=0x80;
							open_ok=1;
						}
						else
						led[3]|=0x10;
					}
				}
				else
				{	
				
					led[3]|=0x20;
					ad_sampling(ad1);
					if(ad_value>max_cur)
					max_cur=ad_value;
				}
				led_out();
			
			}
			if(mode_counter==2)
			{	
				
				MODE_P=0;
				NOP();
				MODE_N=1;
				NOP();
				ad_sampling(ad6);
				if(ad_value>30)
				{	
					if(ad_value<35)
					{
						mode_flag=0;
						MODE_P=0;
						NOP();
						MODE_N=0;
						NOP();
						if(max_cur<50)
						{
							led[3]&=0b11011111;
							led[3]|=0x40;
						}
						else
						led[3]|=0x10;
					}
				
				}
				else
				{	
					if(open_ok)
					led[3]|=0x80;
					led[3]|=0x20;
					ad_sampling(ad1);
					if(ad_value>max_cur)
					max_cur=ad_value;
				}
				led_out();
			}
		}
		if(rf_flag)
		{	
			if(rf_counter==1)
			{	
				RF_P=1;		//启动MODE motor
				NOP();
				RF_N=0;
				NOP();
				ad_sampling(ad7);
				if(ad_value<15)
				{	
					if(ad_value>10)
					{
						rf_flag=0;
						RF_P=0;
						NOP();
						RF_N=0;
						NOP();
						if(max_cur<50)
						{
							led[3]&=0b11011111;
							led[3]|=0x80;
							open_ok=1;
						}
						else
						led[3]|=0x10;
					}
				}
				else
				{	
				
					led[3]|=0x20;
					ad_sampling(ad2);
					if(ad_value>max_cur)
					max_cur=ad_value;
				}
				led_out();
			
			}
			if(rf_counter==2)
			{	
				
				RF_P=0;
				NOP();
				RF_N=1;
				NOP();
				ad_sampling(ad7);
				if(ad_value>30)
				{	
					if(ad_value<35)
					{
						rf_flag=0;
						MIX_P=0;
						NOP();
						MIX_N=0;
						NOP();
						if(max_cur<50)
						{
							led[3]&=0b11011111;
							led[3]|=0x40;
						}
						else
						led[3]|=0x10;
					}
				
				}
				else
				{	
					if(open_ok)
					led[3]|=0x80;
					led[3]|=0x20;
					ad_sampling(ad2);
					if(ad_value>max_cur)
					max_cur=ad_value;
				}
				led_out();
			}
		}
		if(mix_flag)
		{	
			if(mix_counter==1)
			{	
				MIX_P=1;		//启动MODE motor
				NOP();
				MIX_N=0;
				NOP();
				ad_sampling(ad8);
				if(ad_value<15)
				{	
					if(ad_value>10)
					{
						mix_flag=0;
						MIX_P=0;
						NOP();
						MIX_N=0;
						NOP();
						if(max_cur<50)
						{
							led[3]&=0b11011111;
							led[3]|=0x80;
							open_ok=1;
						}
						else
						led[3]|=0x10;
					}
				}
				else
				{	
				
					led[3]|=0x20;
					ad_sampling(ad3);
					if(ad_value>max_cur)
					max_cur=ad_value;
				}
				led_out();
			
			}
			if(mix_counter==2)
			{	
				
				MIX_P=0;
				NOP();
				MIX_N=1;
				NOP();
				ad_sampling(ad8);
				if(ad_value>30)
				{	
					if(ad_value<35)
					{
						mix_flag=0;
						MIX_P=0;
						NOP();
						MIX_N=0;
						NOP();
						if(max_cur<50)
						{
							led[3]&=0b11011111;
							led[3]|=0x40;
						}
						else
						led[3]|=0x10;
					}
				
				}
				else
				{	
					if(open_ok)
					led[3]|=0x80;
					led[3]|=0x20;
					ad_sampling(ad3);
					if(ad_value>max_cur)
					max_cur=ad_value;
				}
				led_out();
			}
		}*/
	}
}

⌨️ 快捷键说明

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