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

📄 注释文本.txt

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


#include "m16io.h"         

#define INTER_TIME1		150       // 用于滤除杂伯的时间常数-300 us
#define INTER_TIME2		600       // 用于区分宽窄脉冲的时间常数-1.2 ms
#define CNT_TA1		7500-1        // 定时器时间常数-15 ms
#define DELAY		800-1         // 延时-1.6 ms

#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:处于)
};

struct bit flag;

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

int n;                       //  数据位计数变量
char inputCode[23];          //  用于接收数据位的数组

void main(void)
{
	pd7 = 0xff;
	port_7 = 0xff;
	pd0 = 0xff;
	port_0 = 0xff;

	flag.b0 = 0;
	flag.b1 = 0;
	flag.b2 = 0;
	n = 0;

	interrupt_init();

	_asm("FSET I");

	for(;;)
	{
	}
}

void int0(void)
{
//	port_0 = 0xfe;

	if (flag.b2 == 0)               //  判断是否处于延时状态
	{
			if (flag.b0 == 0)        
			{
				ta1 = CNT_TA1;      //  启动定时器ta1
				tabsr = 0x02;   

				flag.b1 = 0;				
				flag.b0 = 1;
			}
			else                     
			{
				tabsr = 0x00;       // 关闭定时器ta1
				flag.b0 = 0;

				if ((CNT_TA1-ta1) > INTER_TIME1)         //  判断是否为干扰脉冲
				{
					if ((CNT_TA1-ta1) > INTER_TIME2)  //  判断是否为宽脉冲
					{
						inputCode[n] = '1';
					}
					else if ((CNT_TA1-ta1) <= INTER_TIME2)   //  判断是否为窄脉冲
					{
						inputCode[n] = '0';
					}

					n++;
					
					if (n == 23)            //  判断23位数据是否接收完毕
					{
						Operate();         
						
						flag.b1 = 1;       
						n = 0;
					}

					if (flag.b1 != 1)       //  判断数据是否已经读完
					{
						ta1 = CNT_TA1;      //  若未读完,则再次打开定时器 
						tabsr = 0x02;   
						flag.b0 = 1;
					}
				}
				else                        //  若为干扰波, 则通过延时将其滤除
				{
					if (n != 0)             //  判断干扰波是否在数据位中间出现
					{
						ta0 = (23-n)*DELAY;
						tabsr = 0x01;
						flag.b2 = 1;
					}
				}
			}
	}
 }

void ta1int(void)
{
	
}
void timer_init(void)
{
	udf = 0x00;            //  定时器中断初始化

	ta0mr = 0x80;
	ta1mr = 0x80;

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

void ta0int(void)
{
	flag.b2 = 0;
	n = 0;
}

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];                    //   用于接收有用的数据信号

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

	port_7 = 0xff;	
	
	if (strcmp(Code, "1100000000", 10))             // 前进
	{
		port_7 = 0x01;
	}
	else if (strcmp(Code, "0011000010", 10))        // 左转
	{
		port_7 = 0x02;
	} 
	else if (strcmp(Code, "0011000000", 10))        // 右转
	{
		port_7 = 0x04;
	}
	else if (strcmp(Code, "1100000010", 10))        // 后退
	{
		port_7 = 0x08;
	}

//	port_0 = 0xff;
}

⌨️ 快捷键说明

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