timer0.c

来自「用MEGA8实现4路红外调制发射接收的源码」· C语言 代码 · 共 114 行

C
114
字号
#include "global.h"
#include <avr/interrupt.h>
#include <avr/io.h>
#include "timer0.h"
#include "ir.h"


//#define     max_relay_hold_time_counter       25


UCHAR relay_hold_time_table[4] = {10,25,100,200};//SEL3 SEL4 ==  11

UCHAR relay1_hold_finish_flag = 1;
UCHAR relay2_hold_finish_flag = 1;
UCHAR relay3_hold_finish_flag = 1;
UCHAR relay4_hold_finish_flag = 1;


UCHAR relay1_hold_start_flag = 0;
UCHAR relay2_hold_start_flag = 0;
UCHAR relay3_hold_start_flag = 0;
UCHAR relay4_hold_start_flag = 0;

UCHAR relay1_hold_time_counter = 0;
UCHAR relay2_hold_time_counter = 0;
UCHAR relay3_hold_time_counter = 0;
UCHAR relay4_hold_time_counter = 0;

UCHAR max_relay_hold_time_counter = 0;
//定时器T0初始化
void timer0_init(void)
{
	TCCR0  = 0x00;//停止定时器
	TCNT0  = 0x64;//初始值
	//OCR0   = 0x63;//匹配值
	TIMSK |= 0x01;//中断允许
	TCCR0  = 0x05;//启动定时器
   	max_relay_hold_time_counter = relay_hold_time_table[0];

}


//T0溢出中断服务程序
//#pragma interrupt_handler timer0_ovf_isr:10
//void timer0_ovf_isr(void)
SIGNAL(SIG_OVERFLOW0)
{
	static UCHAR last_fun_sel_val = 0;
	UCHAR current_fun_sel_val = 0;
	current_fun_sel_val = ((FUN_SEL_PORT & 0b01100000)>>5);
	if(last_fun_sel_val != current_fun_sel_val)
	{
   		max_relay_hold_time_counter = relay_hold_time_table[current_fun_sel_val];
		last_fun_sel_val = current_fun_sel_val;
	}

	TCNT0 = 0x64;
	//RELAY1
	if(relay1_hold_start_flag == 1)
	{
		relay1_hold_time_counter++;
		if(relay1_hold_time_counter >= max_relay_hold_time_counter)
		{
			relay1_hold_time_counter = 0;
			relay1_hold_start_flag = 0;
			result_out_control(0,FALSE);

		}
	}

	//RELAY2
	if(relay2_hold_start_flag == 1)
	{
		relay2_hold_time_counter++;
		if(relay2_hold_time_counter >= max_relay_hold_time_counter)
		{
			relay2_hold_time_counter = 0;
			relay2_hold_finish_flag = 1;
			relay2_hold_start_flag = 0;
			result_out_control(1,FALSE);

		}
	}

	//RELAY3
	if(relay3_hold_start_flag == 1)
	{
		relay3_hold_time_counter++;
		if(relay3_hold_time_counter >= max_relay_hold_time_counter)
		{
			relay3_hold_time_counter = 0;
			relay3_hold_finish_flag = 1;
			relay3_hold_start_flag = 0;
			result_out_control(2,FALSE);

		}
	}

	//RELAY4
	if(relay4_hold_start_flag == 1)
	{
		relay4_hold_time_counter++;
		if(relay4_hold_time_counter >= max_relay_hold_time_counter)
		{
			relay4_hold_time_counter = 0;
			relay4_hold_finish_flag = 1;
			relay4_hold_start_flag = 0;
			result_out_control(3,FALSE);

		}
	}

}

⌨️ 快捷键说明

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