📄 infrared.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 + -