📄 注释文本.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 + -