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

📄 ir.c

📁 用MEGA8实现4路红外调制发射接收的源码
💻 C
字号:
#include "ir.h"
#include <avr/io.h>
#include <avr/interrupt.h>
#include "timer0.h"

/**********************************************************************
* Function Name		result_out_control
* Function Desc		输出结果控制
* Return Value		无
* Parameter         继电器编号,继电器状态
* Version	Date		Editor		Modification
* 1.0		2007/12/02	杨春华		做成
**********************************************************************/
#define MAX_COMPARE_MUNBER   6
#define MAX_CLEAR_NUMBER     3

void result_out_control(UCHAR num,UCHAR val)
{
	switch(num)
	{
		case 0:
			if(val == TRUE)
			{
				SETBIT(RESULT_OUT1_PORT,BIT(RESULT_OUT1));
				result_led_control(0,FALSE);
				relay1_hold_time_counter = 0;
				relay1_hold_start_flag = 1;
			}
			else
			{
				CLRBIT(RESULT_OUT1_PORT,BIT(RESULT_OUT1));
				result_led_control(0,TRUE);	
			}
			break;
		case 1:
			if(val == TRUE)
			{
				SETBIT(RESULT_OUT2_PORT,BIT(RESULT_OUT2));
				result_led_control(1,FALSE);
				relay2_hold_time_counter = 0;
				relay2_hold_start_flag = 1;
			}
			else
			{
				CLRBIT(RESULT_OUT2_PORT,BIT(RESULT_OUT2));
				result_led_control(1,TRUE);	
			}
			break;
		case 2:
			if(val == TRUE)
			{
				SETBIT(RESULT_OUT3_PORT,BIT(RESULT_OUT3));
				result_led_control(2,FALSE);
				relay3_hold_time_counter = 0;
				relay3_hold_start_flag = 1;
			}
			else
			{
				CLRBIT(RESULT_OUT3_PORT,BIT(RESULT_OUT3));
				result_led_control(2,TRUE);	
			}
			break;
		case 3:
			if(val == TRUE)
			{
				SETBIT(RESULT_OUT4_PORT,BIT(RESULT_OUT4));
				result_led_control(3,FALSE);
				relay4_hold_time_counter = 0;
				relay4_hold_start_flag = 1;
			}
			else
			{
				CLRBIT(RESULT_OUT4_PORT,BIT(RESULT_OUT4));
				result_led_control(3,TRUE);	
			}
			break;
		default:
			break;	
	}

}
/**********************************************************************
* Function Name		result_led_control
* Function Desc		红外状态指示灯控制
* Return Value		无
* Parameter         LED编号,LED状态
* Version	Date		Editor		Modification
* 1.0		2007/12/02	杨春华		做成
**********************************************************************/
void result_led_control(UCHAR num,UCHAR val)
{
	switch(num)
	{
		case 0:
			if(val == FALSE)
			{
				SETBIT(RESULT_LED1_PORT,BIT(RESULT_LED1));
			}
			else
			{
				CLRBIT(RESULT_LED1_PORT,BIT(RESULT_LED1));
			}
			break;
		case 1:
			if(val == FALSE)
			{
				SETBIT(RESULT_LED2_PORT,BIT(RESULT_LED2));
			}
			else
			{
				CLRBIT(RESULT_LED2_PORT,BIT(RESULT_LED2));
			}
			break;
		case 2:
			if(val == FALSE)
			{
				SETBIT(RESULT_LED3_PORT,BIT(RESULT_LED3));
			}
			else
			{
				CLRBIT(RESULT_LED3_PORT,BIT(RESULT_LED3));
			}
			break;
		case 3:
			if(val == FALSE)
			{
				SETBIT(RESULT_LED4_PORT,BIT(RESULT_LED4));
			}
			else
			{
				CLRBIT(RESULT_LED4_PORT,BIT(RESULT_LED4));
			}
			break;
		default:
			break;	
	}
}
/**********************************************************************
* Function Name		switch_control
* Function Desc		HEF4066选通控制
* Return Value		无
* Parameter         通道编号,通道状态
* Version	Date		Editor		Modification
* 1.0		2007/12/02	杨春华		做成
**********************************************************************/
void switch_control(UCHAR num,UCHAR val)
{
	switch(num)
	{
		case 0x00:
			if(val == TRUE)
			{
				SETBIT(R_SEL1_PORT,BIT(R_SEL1));
			}
			else
			{
				CLRBIT(R_SEL1_PORT,BIT(R_SEL1));
			}
			break;
		case 0x01:
			if(val == TRUE)
			{
				SETBIT(R_SEL2_PORT,BIT(R_SEL2));
			}
			else
			{
				CLRBIT(R_SEL2_PORT,BIT(R_SEL2));
			}
			break;
		case 0x02:
			if(val == TRUE)
			{
				SETBIT(R_SEL3_PORT,BIT(R_SEL3));
			}
			else
			{
				CLRBIT(R_SEL3_PORT,BIT(R_SEL3));
			}
			break;
		case 0x03:
			if(val == TRUE)
			{
				SETBIT(R_SEL4_PORT,BIT(R_SEL4));
			}
			else
			{
				CLRBIT(R_SEL4_PORT,BIT(R_SEL4));
			}
			break;
		default:
			break;	
	}
}
/**********************************************************************
* Function Name		result_transact
* Function Desc		结果处理函数
* Return Value		结果计数值
* Parameter         无
* Version	Date		Editor		Modification
* 1.0		2007/12/02	杨春华		做成
**********************************************************************/
void result_transact(volatile UCHAR *result)
{
	UCHAR i;
	UCHAR ir_flag = 0;
	static UCHAR clear_enable = 0;
	clear_enable++;
	if(clear_enable == MAX_CLEAR_NUMBER)
	{
		clear_enable = 0;
		if(GETBIT(FUN_SEL_PORT,FUN_SEL1))//四路各自工作
		{
			for(i = 0;i < 4;i++)
			{
				if(result[i] <= MAX_COMPARE_MUNBER && result[i]>=4)
				{}
				else
				{
					//if(1)
					if(GETBIT(FUN_SEL_PORT,FUN_SEL2))
					{
						result_out_control(i,TRUE);
					}
					else
					{
						result_out_control(i,FALSE);
					}

				}
				/*else
				{
					if(GETBIT(FUN_SEL_PORT,FUN_SEL2))
					{
						result_out_control(i,FALSE);
					}
					else
					{
						result_out_control(i,TRUE);
					}

				}*/
			}	
		}
		else//四路联合工作
		{
			ir_flag = 0x00;

			for(i = 0;i < 4;i++)
			{
				if(result[i] == 0x00)
				{
					ir_flag = 0x01;				
					break;
				}
			
			}
			if(GETBIT(FUN_SEL_PORT,FUN_SEL2))
			{
				result_out_control(1,FALSE);
				result_out_control(2,FALSE);
				result_out_control(3,FALSE);		
			}
			else
			{
				result_out_control(1,TRUE);
				result_out_control(2,TRUE);
				result_out_control(3,TRUE);			
			}
			if(ir_flag == 0x00)
			{
				if(GETBIT(FUN_SEL_PORT,FUN_SEL2))
				{
					result_out_control(0,TRUE);
				}
				else
				{
					result_out_control(0,FALSE);
				}
					
			}
			else
			{
				if(GETBIT(FUN_SEL_PORT,FUN_SEL2))
				{
					result_out_control(0,FALSE);
				}
				else
				{
					result_out_control(0,TRUE);
				}	
			
			}		
		}
		//指示灯显示处理
/*		for(i = 0;i < 4;i++)
		{
			if(result[i] == MAX_COMPARE_MUNBER && result[i]<= 11)
			{
				result_led_control(i,TRUE);	

			}
			else
			{
				result_led_control(i,FALSE);	

			}
		}*/
		result[0] = 0x00;
		result[1] = 0x00;
		result[2] = 0x00;			
		result[3] = 0x00;
	}

}

⌨️ 快捷键说明

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