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

📄 infrared.c

📁 通过红外遥控器可靠的控制小车能向前直线运动、向后直线运动、向前左转运动、向前右转运动、向后左转运动、向后右转运动、停止运动的功能.
💻 C
字号:
/***************************************/
/*文件名:    infrared.c
/*日期:      2005.7.24
/*作者:      Jackey 
/**************************************/


#include "m16io.h"         

#define INTER_TIME1		25         /* 用于滤除杂波的时间常数 - 50 us */
#define INTER_TIME2		1000       /* 用于区分宽窄脉冲的时间常数 - 2 ms */
#define INTER_TIME3     350        /* 用于区分宽窄脉冲的时间常数 - 0.7 ms */

#define CNT_TA0		12500-1        /* 定时器TA0时间常数 - 25 ms */
#define CNT_TA1     7500-1         /* 定时器TA1时间常数 - 15 ms */

#define SPEED_FAST   0x103e        /* 高速定时常数 */
#define SPEED_SLOW   0x803e        /* 低速定时常数 */

#pragma INTERRUPT	int0        
#pragma INTERRUPT	ta0int         /* 用于延时接收数据的定时器  */
#pragma INTERRUPT	ta1int         /* 用于测脉宽的定时器  */


#pragma BIT flag             /* 定义标志位 */

struct bit          
{                    
	char b0 : 1;             /*  标志定时器ta1的开关(0:关;   1:开) */
	char b1 : 1;             /*  标志小车是否处于前进或后退的状态(0:未处于;  1:处于) */
	char b2 : 1;             /*  标志是否处于延时接收数据的状态(0:未处于;  1:处于) */
	char b3 : 1;             /*  标志速度的快慢状态 (0:慢;	 1:快) */
};

struct bit flag;

void main(void);             /*  主程序 */
void int0(void);             
void ta0int(void);
void ta1int(void);
void port_init(void);			 /* 端口初始化函数 */
void interrupt_init(void);       /* 中断初始化函数 */
void Operate(void);              /*  小车动作函数  */
int strcmp(char *string1, char _far *string2, int m);     /*  比较字符串函数 */
void wait(unsigned int k );

void pwminit(void);
void forward_run(void);            /* 前进 */   
void bak_run(void);				   /* 后退 */
void stop_run(void);               /* 停止 */
void right_run(void);              /* 右转 */
void left_run(void);               /* 左转 */


int n;                       /*  数据位计数变量  */
int inputCode[40];           /*  用于接收数据位(包含杂波)的数组   */
char Code_char[23];          /*  用于存储滤波后的有效数据位的数组  */
int speed;                   /*  速度变量  */


void main(void)
{

	flag.b0 = 0;              /*  变量初始化   */
	flag.b1 = 0;
	flag.b2 = 0;
	flag.b3 = 0;
    n = 0;
	speed = SPEED_SLOW;
	
	port_init();
	pwminit();
	interrupt_init();

	_asm("FSET I");            /*  开中断  */ 

	for(;;)
	{
	}
}


void int0(void)
{
			if (flag.b0 == 0)        
			{
				ta1 = CNT_TA1;      /*  启动定时器ta1 */
				tabsr |= 0x02;     

				flag.b0 = 1;
			}
			else                     
			{
				tabsr &= 0xfd;       /* 关闭定时器ta1 */
				flag.b0 = 0;

				if (flag.b2 == 0)                         /* 判断是否为第一个脉冲 */
				{
					if ((CNT_TA1-ta1) > INTER_TIME1)      /* 判断接收到的第一个脉冲是否为杂波 */
					{
						inputCode[0] = CNT_TA1 - ta1;     /* 若不是,则记录下脉宽 */
	                    
						ta0  = CNT_TA0;                 /*  启动定时器ta0  */      
						tabsr |= 0x01;
						flag.b2 = 1;                  
						
						n = 1;
					}
				}

				else
				{
					inputCode[n] = CNT_TA1 - ta1;      /*记录延时时间内的所有脉冲的宽度(包括杂波)*/

					n++;
				}
				
				ta1 = CNT_TA1;                 /*则再次打开定时器ta1  */ 
				tabsr |= 0x02;   
				flag.b0 = 1;

			}
 }

void ta0int(void)
{
	int i;
	int j;

	tabsr &= 0xfd;       /* 关闭定时器ta1 */
	flag.b0 = 0;

	tabsr &= 0xfe;	     /* 关闭定时器ta0 */
	flag.b2 = 0;          

	for (i=0, j=0; i<n; i++,j++)              /*  通过判断脉宽从而滤除杂波并解码得到有效数据(23位)  */
	{
		if (inputCode[i] > INTER_TIME1)       
		{
			if (inputCode[i] > INTER_TIME2)
			{
				Code_char[j] = '1';                   /* 若 脉宽>1000 则解码为1  */     
			}
			else if (inputCode[i] > INTER_TIME3)
			{
				Code_char[j] = '2';                   /* 若 350<脉宽<1000 则解码为2  */
			}
			else
			{
				Code_char[j] = '0';                   /* 若 25<脉宽<350 则解码为0  */
			}
		}
		else
		{
			j--;
		}
	}

	n = 0;                          /*  计数变量复位,等待接收下一串数据  */

	Operate();                      /*  小车动作  */

}

void ta1int(void)
{
	tabsr &= 0xfd;       /* 关闭定时器ta1 */
	flag.b0 = 0;	
}
void interrupt_init(void)
{
	udf = 0x00;            /*  定时器中断初始化  */

	ta0mr = 0x80;
	ta1mr = 0x80;

	ta0ic = 0x07;
	ta1ic = 0x07;
	
	int0ic = 0x06;         /* INT0中断初始化 */
	ifsr = 0x01;
}


int strcmp(char *string1, char *string2, int m)
{
	int i;

	for (i=0; i<m; i++)
	{
		if (string1[i] != string2[i])
		{
			return 0;
		}
	}

	return 1;
}

void Operate(void)
{
	int i;
	
	char Code[11];                    /*   用于接收有用的数据信号(10位)  */

	for (i=0; i<10; i++)
	{
		Code[i] = Code_char[13+i];
	}

	Code[10] = '\0';

	if (strcmp(Code, "1220202020", 10))             /* 前进 */
	{
		port_0 = 0xfe;
		wait(20);
		port_0 = 0xff;	

		flag.b1 = 1;
		forward_run();
	}
	
	else if (strcmp(Code, "2012202010", 10))        /* 左转 */
	{
		port_0 = 0xfe;
		wait(20);
		port_0 = 0xff;	
		
		flag.b1 = 0;
		left_run();
	} 
	else if (strcmp(Code, "2012202020", 10))        /* 右转  */
	{
		port_0 = 0xfe;
		wait(20);
		port_0 = 0xff;	
		
		flag.b1 = 0;
		right_run();
	}
	else if (strcmp(Code, "1220202010", 10))        /* 后退 */
	{
		port_0 = 0xfe;
		wait(20);
		port_0 = 0xff;	

		flag.b1 = 1;
		bak_run();
	}

	else if (strcmp(Code, "2020102220", 10))        /* 停止 */
	{
		port_0 = 0xfe;
		wait(20);
		port_0 = 0xff;

		flag.b1 = 0;
		stop_run();
	}

	else if ((strcmp(Code,"2010222020",10)) && (flag.b1==1))        /* 变速 */
	{
		port_0 = 0xfe;
		wait(20);
		port_0 = 0xff;

		flag.b3 = ~flag.b3;                      /*  切换两种速度  */

		speed = flag.b3 ? SPEED_FAST : SPEED_SLOW;

		ta2 = speed;		
		ta3 = speed;		
		tabsr |= 0x0c;
	}
}

void	forward_run(void)
{
	port_1 = 0x03;		
	port_3 = 0x02;		
	ta2 = speed;		
	ta3 = speed;		
	tabsr |=0x0c ;       
}

void	bak_run(void)
{
	port_1 = 0x02;		
	port_3 = 0x03;		
    ta2 = speed;		
	ta3 = speed;		
	tabsr |= 0x0c;	    
}

void	stop_run(void)
{
	port_1 = 0x03;		
	port_3 = 0x02;		
	ta2 = 0xfe3e;		
	ta3 = 0xfe3e;		
	tabsr |= 0x0c;
}

void	right_run(void)
{
	port_1 = 0x02;		
	port_3 = 0x02;		
	ta2 = 0x903e;		
	ta3 = 0x803e;		
	tabsr |= 0x0c;	

	wait(45);

	ta2 = 0xfe3e;		
	ta3 = 0xfe3e;
	tabsr |= 0x0c;	
}

void	left_run(void)
{
	port_1 = 0x03;		
	port_3 = 0x03;		
	ta2 = 0x803e;		
	ta3 = 0x903e;		
	tabsr |= 0x0c;	

	wait(45);

	ta2 = 0xfe3e;		
	ta3 = 0xfe3e;
	tabsr |= 0x0c;	
}

void 	pwminit(void)
{
	ta2mr  = 0x27;	
	ta3mr  = 0x27;		

	tabsr  &= 0xf3;		
}

void port_init(void)
{
	pd0 = 0xff;
	port_0 = 0xff;

	pd1     = 0xff;			
	pd3     = 0xff;	
}

void wait(unsigned int k )
{
	unsigned int	i, j;

	for (i = 0; i < 15*k; i++ )   	 
		for ( j = 0; j < 300; j++ )
			;
}

⌨️ 快捷键说明

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