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

📄 main.c

📁 这是我在学习红外遥控接收时写的代码
💻 C
字号:
/*可在Keil C51 6.0 以上版本中编译晶振采用11.0592Mc 工作在每个机器周期6 时钟的快速状态*/


#include <REG768.H> /*Philips 87LPC768 寄存器定义头文件*/


#include "version.h"
#include "misc.h"
#include "ir.h"
#include "func.h"

unsigned char data Timer;
unsigned int tick=0;

unsigned char control_status;
enum {
	CTRL_IDLE=0,
	
	CTRL_A0,
	CTRL_A1,
	CTRL_A2,
	CTRL_A3,
	CTRL_A4,

	CTRL_B0,
	CTRL_B1,
	CTRL_B2,
	CTRL_B3,
	CTRL_B4,
	CTRL_B5
};

void Count0(void) interrupt 1 using 3
{ /*定时器T00 中断,最大定时37ms*/
	if(Timer!=0)
	{ /*检测定时器T00 的扩展高位*/
		Timer--;
		return;
	}	
	tick++;
	Timer=(int)18.432;
}

unsigned int get_tick()
{
	return tick;
}

unsigned int timer_diff(unsigned int t1, unsigned int t2)
{
	unsigned long diff;
	if(t1>=t2) diff=t1-t2;
	else diff=t1+65536-t2;

	return (unsigned int)diff;
}

unsigned char control()
{
	static unsigned int tick0;
	switch(control_status)
	{
		case CTRL_IDLE: 
		    //处于空闲状态,如果有人靠近, 进入控制阶段
			if(SOMEBODY_COMMING==ir_read())
			{
				control_status = CTRL_A0;
			}
			break;
		case CTRL_A0:
			//启动15w电机,启动18v电压
			start_15w_motor(); 
			start_18v_vol(); 
			tick0=get_tick();
			control_status = CTRL_A1;
			break;
		case CTRL_A1:
			//1秒后,启动36v电压
			if(timer_diff(get_tick(), tick0)>100)
			{  
				start_36v_vol(); 
				tick0=get_tick();
				control_status = CTRL_A2;
			}
			break;
		case CTRL_A2:
			//再过1秒后,关闭15w电机
			if(timer_diff(get_tick(), tick0)>100)
			{
				stop_15w_motor();
				tick0=get_tick();
				control_status = CTRL_A3;
			}
			break;
		 case CTRL_A3:
		 	/*开始使用,在此过程中,如果人离开,则关闭36v和18v电压
				否则再过59秒,关闭36v电机			*/
		 	if(SOMEBODY_LEAVING==ir_read())
			{
				stop_36v_vol();
				stop_18v_vol();
				control_status = CTRL_B0;
			}
		 	else if(timer_diff(get_tick(), tick0)>5900)
			{
				stop_36v_vol();
				control_status = CTRL_A4;
			}
		 	break;
		case CTRL_A4:
			/*继续使用,在此过程中,如果人离开,则关闭18v电压		*/
			if(SOMEBODY_LEAVING==ir_read())
			{
				stop_18v_vol();
				control_status = CTRL_B0;
			}
			break;
		case CTRL_B0:
			/*人离开,启动电磁力, 启动15w电机, 启动7。5 A电机
			*/
			start_em_power();
			start_15v_vol();
			start_75A_motor();
			tick0=get_tick();
			control_status = CTRL_B1;
			break;
		case CTRL_B1:
			//1秒后,关闭电磁力
			if(timer_diff(get_tick(), tick0)>100)
			{
				stop_em_power();
				tick0 = get_tick();
				control_status = CTRL_B2;
			}
			break;
		case CTRL_B2:
		    //再过1秒后,关闭15w电机
			if(timer_diff(get_tick(), tick0)>100)
			{
				stop_15v_vol();
				tick0 = get_tick();
				control_status = CTRL_B3;
			}
			break;
	    case CTRL_B3:
		    //启动10w负荷,
			if(SOMEBODY_COMMING==ir_read())
			{
				stop_75A_motor();
				control_status = CTRL_A0;
			}
			else
			{
				start_10w_load();
				control_status = CTRL_B4;
				tick0 = get_tick();
			}
			break;
		case CTRL_B4:
		// 关闭7。5A电机
			if(SOMEBODY_COMMING==ir_read())
			{
				stop_10w_load();
				stop_75A_motor();
				control_status = CTRL_A0;
			}
			else if(timer_diff(get_tick(), tick0)>2800)
			{
				stop_75A_motor();
				control_status = CTRL_B5;
			}
			break;
	    case CTRL_B5:
		//关闭10w负荷。
			if(SOMEBODY_COMMING==ir_read())
			{
				stop_10w_load();
				control_status = CTRL_A0;
			}
			else if(timer_diff(get_tick(), tick0)>57000)
			{
				stop_10w_load();
				control_status = CTRL_IDLE;
			}
			break;
		}
		return control_status;
}
void main()
{
	IEN0=0x14; /*只打开INT1 中断*/

	WDRST=0x1E; /*看门狗清0*/
	WDRST=0xE1;
	WDCON=0x12; /*40-90ms 看门狗(>最大延时37ms)*/

	TCON=0x40; /*定时器1 开始工作, INT1 低电平触发*/
	TMOD=0x23; /*定时器0 扩展成两个8 位定时器T00 和T01 用于同步控制*/
	
	if((WDCON&0x30)!=0x30)
	{ 
		ir_init();
		init_port();
		init_serial();
		control_status=0;
	}

	while(1)
	{ /*消息循环*/
		WDRST=0x1E; /*看门狗清0*/
		WDRST=0xE1;

		control();		
	}
}

⌨️ 快捷键说明

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