📄 m8-红外线遥控小车.c
字号:
/*****************************************************************************
红外线遥控小车,电压最好达到5V
PD0、PD1——方向轮
PD2、PD3——驱动轮
PD4 ————红外发射
PD6、PD7——红外接收
******************************************************************************/
#include <iom8v.h>
#include <macros.h>
#define KEY (PIND&0X80)
#define LEFT PORTD&=0XFC;PORTD|=0X01
#define RIGHT PORTD&=0XFC;PORTD|=0X02
#define GO PORTD&=0XF3;PORTD|=0X04
#define BACK PORTD&=0XF3;PORTD|=0X08
#define STOP PORTD&=0XF0
unsigned int data1=0,data2=0;
char ks=0;
void port_init(void)
{
PORTD = 0xE0;
DDRD = 0x1F;
}
void delay_100us(int t)//100微秒延时
{
int x;
for(t;t>0;t--)
for(x=102;x>0;x--);
}
void begain(void) //启始
{
char i=0,j=0;
ks=0;
while(KEY!=0)//等待200ms
{
delay_100us(10);//1ms
j++;
if(j>500){ks=0;break;}//用于连发码的判断
}
j=0;
while(KEY==0)//引导低电平,或连发低电平
{
delay_100us(1);
j++;
if(j>50)ks|=1; //BIT1引导低电平
if(j>100){ks=0;break;}
}
j=0;
if((ks&0x01)!=0)
{
while(KEY!=0)//引导高电平,或连发高电平
{
delay_100us(1);
j++;
if(j>200){ks=0;break;}
}
if(j>15&&j<25){ks&=0XFD;ks|=4;} //BIT3连发
if(j>25){ks&=0XFB;ks|=2;} //BIT2引导
}
}
unsigned int scan(void)
{
unsigned int data=0;
char i,j;
for(i=0;i<16;i++)
{
j=0;
while(KEY==0)
{
delay_100us(1);
j++;
if(j>20)return 0;
}
j=0;
while(KEY!=0)
{
delay_100us(1);
j++;
if(j>6)data|=1<<i;
if(j>20)return 0;
}
}
return data;
}
char check(unsigned int data)//校验
{
char i,j;
i=data&0XFF;
j=(data>>8)&0XFF;
if(i+j==255)
return 1;
return 0;
}
void main()
{
char i=0,j=0,k=0,t=0;
port_init();
while(1)
{
begain();
if((ks&0x03)==3)
{
data1=scan();
data2=scan();
}
if(check(data2)==1)
k=data2&0XFF;
if(ks!=0)
{
t=5;
} //是否连发
if(t>0)t--;
if(ks==0)k=0;
switch (k)
{
case 0:STOP;break;
case 1:GO;break;
case 2:BACK;break;
case 3:GO;LEFT;break;
case 4:GO;RIGHT;break;
case 5:BACK;LEFT;break;
case 6:BACK;RIGHT;break;
}
delay_100us(300);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -