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

📄 ws_js000.c

📁 这是一款用EV1527做发射器,用PIC16F630解码的无线电遥控系统,给大家参考,希望可以给大家帮助
💻 C
字号:
#include <htc.h>
#define		fan		    RA0
#define 	led_up		RC2
#define		led_down	RC1
#define 	work_led	RC0
#define		w_on		0
#define		w_off		1
#define     key_up      (key_tmp&(1<<3))
#define     key_stop	(key_tmp&(1<<4))
#define 	key_down	(key_tmp&(1<<5))
	
#define testbit(var, bit) ((var)&(1<<(bit))) 	
#define bitset(var,bitno) ((var)|=1<<(bitno))
#define bitclr(var,bitno) ((var)&=~(1<<(bitno))
unsigned char learn_cnt,l_cnt2,key_tmp,fan_reg;
unsigned int t0_cnt;
extern unsigned char qk_cnt,dk_cnt;
extern unsigned char CSR0,CSR1,CSR2;
extern void recieve(void);
void delay_1ms(unsigned char cnt)
{
	unsigned char i;
	do
	{
		i=249;
		do
			asm("nop");
		while(--i!=0);
	}
	while(--cnt!=0);
	}
void Erase_120(void)
{
	unsigned char i;
	for(i=0;i<120;i++)
		EEPROM_WRITE(i,0xff);
	EEPROM_WRITE(126,0);
	delay_1ms(5);
}
	
//*****************************************************			
// verify 40 SN  if there is a same CF=1,else CF=0
//*****************************************************
bit Verify_120(void)
{
	unsigned char i,addr,tmp;
	addr=0;
	i=40;
	do
	{
		tmp=EEPROM_READ(addr++);
		
		if(qk_cnt!=0)				// recieve a qk signal 
			{
			if((tmp&0x01)==0)
				{addr+=2;continue;};// memory is dk
			if(((tmp&0x80)==0)||((CSR0&0x80)==0))
				{
				if(((tmp^CSR0)&0xf0)!=0)
					{addr=addr+2;continue;};
				}
			}
		else						//recieve a dk signal
			{
			if((tmp&0x01)==1)
				{addr=addr+2;continue;};//memory is qk
			if(((tmp^CSR0)&0xf0)!=0)
			{addr=addr+2;continue;};		
			}
		tmp=EEPROM_READ(addr++);
		if((tmp^CSR1)!=0)
			{addr+=1;continue;}
		tmp=EEPROM_READ(addr++);
		if((tmp^CSR2)!=0)
			{addr=addr+0;continue;}
		return(1);
	}
	while(--i!=0);
	return(0);	
}
bit delay_1s_stop(void)
{
	TMR0=0;
	learn_cnt=15;
	while(1)
	{
		recieve();
		if(CARRY==1)
		{
			Verify_120();
			if((CARRY==1)&&((CSR0&0x0f)==0x04))
			{
				work_led=w_off;
				led_up=0;
				led_down=0;
				return 1;
			}	
		}	
		if(T0IF)
		{
			T0IF=0;
			if(--learn_cnt==0)
				return 0;
		}		
	}		
}
Write_a_sn(void)
{
	unsigned char tmp;
	tmp=EEPROM_READ(126);
	if(tmp>120)
		tmp=0;
	EEPROM_WRITE(tmp++,CSR0);
	EEPROM_WRITE(tmp++,CSR1);
	EEPROM_WRITE(tmp++,CSR2);
	EEPROM_WRITE(126,	tmp);
	delay_1ms(5);
}
void init(void)
{
	TMR0=0;
	T0CS=0;
	PS0=1;PS1=1;PS2=1;	//1/256
	PSA=0;				//TIMER 0
	RAPU=1;
	T1CON=5;
	PORTA=0;
	CM0=1;CM1=1;CM2=1;	//SET CMP AS DIGITAL I/O
	WPUA =0x33;			//RA2 & RA3 NEED NOT PULL UP		
	TRISA=0x3d;			//RA1 OUT 
	PORTC=0;
	TRISC=0x38;	
}	

bit read_s_port(unsigned char cnt)
{
	unsigned char i;
	TRISA2=1;
	while(1)
	{
rrr:		
		i=cnt;
		if(RA2)
		{
			do
			{	
				if(RA2==0)
					goto	rrr;
			}
			while(--i!=0);
			RA2=1;
			TRISA2=0;	
			return 1;
		}
		else
		{
			do
			{
				if(RA2==1)
					goto	rrr;
			}
			while(--i!=0);	
			RA2=1;
			TRISA2=0;
			return 0;	
		}
	}		
}			
void do_up(void)
{
				t0_cnt=3662;
			 	if(led_down==1)
			 	{
				 	led_down=0;
				 	delay_1s_stop();
				 	if(CARRY==0)
				 	{
					 	work_led=w_on;	
			 			led_up=1;
			 		}	
				}
				else
				{
					work_led=w_on;
					led_up=1;
				}			
}
void do_down(void)
{
				t0_cnt=3662;
			 	if(led_up==1)
			 	{
				 	led_up=0;
				 	delay_1s_stop();
				 	if(CARRY==0)
				 	{	
			 			work_led=w_on;
			 			led_down=1;
			 		}	
				}
				else
				{
		 			work_led=w_on;
		 			led_down=1;	
		 		}							
}	
void do_stop(void)
{
	work_led=w_off;
	led_up=0;
	led_down=0;	
}	
/////////////////////////////////////////////////////////////////////
//	
/////////////////////////////////////////////////////////////////////	
main()
{
	volatile unsigned char j;
	OSCCAL=_READ_OSCCAL_DATA();
	init();
	led_up=0;
	led_down=0;
	work_led=w_off;
	TRISA2=1;
	recieve();
	t0_cnt=3662;
	while(1)
	{
		if(T0IF)				//0.065536 S
		{
			T0IF=0;
			fan_reg<<=1;
			if(fan)
				bitset(fan,0);
			if(--t0_cnt==0)		// 4 minitue
			{
				work_led=w_off;
				t0_cnt=3662;
				led_up=0;
				led_down=0;
			}	
				
		}
		key_tmp=PORTC&0x038;
		j=6;
		do
		{
			if((PORTC&0x038)!=key_tmp)
			{
				j=6;
				continue;
			}
		}
		while(--j!=0);	 
		recieve();	
		if(CARRY==1)
		{
			Verify_120();
			if((CARRY==1)||(key_tmp&0x38)!=0x38)
			{
				if((key_stop==0)||(CSR0&0xf)==4)
		 		{
			 		do_stop();
				}
				if((key_up==0)||(CSR0&0xf)==8)
				{
			 		if(fan_reg==0)
			 			do_up();
			 		else
			 			do_down();	
				} 	
				if((key_down==0)||(CSR0&0xf)==1)
				{
			 		if(fan_reg==0)
			 			do_down();
			 		else
			 			do_up();	
				} 	
			}
		}
		if(RA2==1)
		{
			work_led=w_off;
			led_up=0;
			led_down=0;
			TRISA2=0;
			RA2=1;
			TMR0=0;
			learn_cnt=153;
			while(1)
			{
				recieve();	
				if(CARRY==1)
				{
					if((CSR0&0xf)==2)
					{
						Write_a_sn();
						learn_cnt=5;
						do
						{
							RA2=0;
							delay_1ms(250);
							RA2=1;
							delay_1ms(250);
						}
						while(--learn_cnt!=0);
						TRISA2=1;
						break;
					}	
				}
				if(!T0IF)	
					continue;
				T0IF=0;
				if(--learn_cnt==0)
				{
					TRISA2=1;		//10 second reach
					break;
				}						
				TRISA2=1;
				if(read_s_port(10)==1)
				{
					if(++l_cnt2==32)
					{
						TRISA2=0;
						RA2=0;
						Erase_120();
						delay_1ms(250);
						delay_1ms(250);
						delay_1ms(250);
						delay_1ms(250);
						TRISA2=1;
						break;		
					}	
				}
				else
				{
					if(l_cnt2!=0)
						l_cnt2--;		
				}							
			}
		}			 	 		 				
	}
}	

⌨️ 快捷键说明

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