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

📄 infrared.c.bak

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


#include "m16io.h"         

#define INTER_TIME1		25         /* 用于滤除杂波的时间常数 - 50 us */
#define INTER_TIME2		850        /* 用于区分宽窄脉冲的时间常数 - 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        /* 低速定时常数 */
#define SCALE      7               /* 设置数据的精度 */

#pragma INTERRUPT	int0        
#pragma INTERRUPT	ta0int         /* 用于延时接收数据的定时器  */
#pragma INTERRUPT	ta1int         /* 用于测脉宽的定时器  */
#pragma BIT flag                   /* 定义标志位 */      

struct bit          
{                    
	char b0 : 1;             /*  标志定时器ta1的开关(0:关;   1:开) */
	char b1 : 2;             /*  标志小车是否处于前进或后退的状态(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 = 0;
	int j = 0;

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

	return j;                               /*  返回正确的数据位数  */
}

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) > SCALE))            
	{
		if (Code[8] != '0')
		{
			port_0 = 0xfe;
			wait(20);
			port_0 = 0xff;			
						
			if (Code[8] == '2')         /* 前进 */
			{
				flag.b1 = 1;
				forward_run();
			}
			else				        /* 后退 */
			{
				flag.b1 = 2;
				bak_run();
			}
		}
	}
	
	else if ((strcmp(Code, "2012202010", 10) > SCALE))       
	{
		if (Code[8] != '0')
		{
			port_0 = 0xfe;
			wait(20);
			port_0 = 0xff;	
		
			flag.b1 = 0;
			 
			if (Code[8] == '1')        /* 左转 */
			{
				left_run();
			}
			else
			{
				right_run();          /* 右转  */
			}
		}
	} 

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

		flag.b1 = 0;
		stop_run();
	}

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

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

		speed = flag.b3 ? SPEED_FAST : SPEED_SLOW;
		
		if (flag.b1 == 1)
		{
			port_1 = 0x03;		
			port_3 = 0x02;
		}
		else
		{
			port_1 = 0x02;		
			port_3 = 0x03;
		}
	
		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 + -