📄 tiao1zhushi.c
字号:
#include "m16io.h"
/*一共9个按键*/
#define TIME1 50-1 /*一毫秒脉宽是扰动,检测的信号脉宽必须大于一毫秒*/
#define TIME2 500-1
#define TIME3 12500-1
#define RUN 0x600
#define BACK 0x604
#define LEFT 0x184
#define RIGHT 0x180
#define STOP 0x120
#define REMOTE 0X48
#define SAFE_H 0X1e
#define SAFE_L 0x420
#define OVER 0x4c
#define AOTO 0x7e
void portinit(void);
void pwminit(void);
void caroperation(void);/*红外马 比较*/
void wait(unsigned int k );
void wait_1(unsigned int k );
void run(void);
void back(void);
void right_c(void);
void left_c(void);
void left(unsigned int k );
void right(unsigned int k );
void stop(void);
void pwminit(void);
void remote(void); /*预编成的遥控程序*/
void main(void);
int ircode;
void main(void)
{
unsigned char temp1, temp2; /*temp1用于接收记录当前port7_0的当前值,temp2定义为0x00,两者进行当前比较*/
unsigned presentbit; /*红外码的当前位*/
unsigned int n;
static int s; /*保存的按键值,键码*/
int s_h[5]; /*方向指令数组,前后左右的方向指令*/
int s_l[5]; /*持续时间的数组*/
int j=0;
int k=0;
int i;
int safe1,safe2 ; /*自锁*/
int tempcode; /*记录当前红外码*/
int pluswidth; /*当前电平持续时间*/
int time1;
int time2;
int time3;
portinit();
pwminit();
port_0 = 0x00;
while(1)
{
temp1 = ( port_7&0x01 ); /*7口是干什么的?初始值是多少?与0x01相与的用意是什么?*/
if (temp1 == 0x00) /*如果相与的结果为0x00*/
{
ta0 = TIME3; /*定时器0赋值*/
tabsr |= 0x01; /*关闭计时器*/
/*三个time变量都赋值为25ms是什么意思,有什么意义*/
time1 = TIME3;
time2 = TIME3;
time3 = TIME3;
temp2 = 0x00; /*temp2赋值为0x00的意义是什么*/
presentbit = 0x00; /*当前的控制信号码*/
tempcode = 0x00; /*累加值*/
//累加解码
while( ta0>10 ) /*定时器0的值大于10(十进制?)是什么意思*/
{
temp1 = ( port_7&0x01 ); /*7口第二次与0x01相与的用意是什么?*/
if(temp1 != temp2) /*temp2此时等于0x00*/
{
time1 = ta0; /*把定时器0的值给与time1*/
pluswidth= time2-time1; /*脉宽=25ms-定时器0的值*/
time2 = time1; /*把定时器0的值给与time2*/
if( pluswidth<TIME1 ) /*若脉宽值小于定时器0的值*/
{
tempcode >>= 1;
tempcode = tempcode - (presentbit & 0x01);
time2 = time3;
continue;
}
else if( pluswidth<TIME2 )
{
presentbit = 0;
tempcode = tempcode + (presentbit & 0x01);
tempcode <<= 1;
time3 =time2 + pluswidth;
}
else
{
presentbit = 1;
tempcode = tempcode + (presentbit & 0x01);
tempcode <<= 1;
time3 =time2 + pluswidth;
}
}
else
;
temp2 = temp1;
}
port_0 = 0x01;
port_0 = 0x00;
ircode = tempcode;
tabsr &= 0xFE; /*tabsr是定时器使能寄存器,等于1时使能,此时是关闭*/
/*以下代码是不是表示弹片机开始接收遥控器的指令?*/
if(ircode==SAFE_H) /*SAFE_H开始记录方向键,预编程用*/
{s=1;}
if(ircode==SAFE_L) /*记录时间键,预编程用*/
{s=2;}
if(ircode==AOTO) /*按下后实施控制*/
{s=3;
j=0; /*j*/
k=0; /*k变量记录的又是什么?*/
for(i=0;i<5;i++) /*i表示可以预编程的步数*/
{
s_h[i]=0; /*s_h数组的作用?*/
s_l[i]=0; /*s_l数组的作用?*/
}
}
if(ircode==REMOTE) /*自动行走*/
{s=0;
j=0;
k=0;}
if(s==1) /*记录控制方向*/
{ safe1=ircode;
if(ircode==RUN && safe1!=safe2)
{
s_h[j]=1; /*代表前进,无特殊意义*/
safe2=safe1;
j=j+1;
}
if(ircode==BACK && safe1!=safe2)
{
s_h[j]=2;
safe2=safe1;
j=j+1;
}
if(ircode==RIGHT && safe1!=safe2)
{
s_h[j]=3;
safe2=safe1;
j=j+1;
}
if(ircode==LEFT && safe1!=safe2)
{
s_h[j]=4;
safe2=safe1;
j=j+1;
}
}
if(s==2)/*开始记录时间*/
{
safe1=ircode;
if(ircode==0x4 && safe1!=safe2)
{
s_l[k]=1;
safe2=safe1;
k++;
}
if(ircode==0x6 && safe1!=safe2)
{
s_l[k]=2;
safe2=safe1;
k++;
}
if(ircode==0x10 && safe1!=safe2)
{
s_l[k]=3;
safe2=safe1;
k++;
}
if(ircode==0x18 && safe1!=safe2)
{
s_l[k]=4;
safe2=safe1;
k++;
}
if(ircode==0x16 && safe1!=safe2)
{
s_l[k]=5;
safe2=safe1;
k++;
}
if(ircode==0x12 && safe1!=safe2)
{
s_l[k]=6;
safe2=safe1;
k++;
}
if(ircode==0x40 && safe1!=safe2)
{
s_l[k]=7;
safe2=safe1;
k++;
}
if(ircode==0x60 && safe1!=safe2)
{
s_l[k]=8;
safe2=safe1;
k++;
}
if(ircode==0x64 && safe1!=safe2)
{
s_l[k]=9;
safe2=safe1;
k++;
}
}
while(s==0) /*开始自动行走*/
{
if(s_h[j]==1)
{
run();
wait_1(s_l[j]);
stop();
wait(1);
}
if(s_h[j]==2)
{
back();
wait_1(s_l[j]);
stop();
wait(1);
}
if(s_h[j]==3)
{
right();
wait(s_l[j]);
stop();
wait(1);
}
if(s_h[j]==4)
{
left();
wait(s_l[j]);
stop();
wait(1);
}
j=j+1;
if(j==5)
{s=4;
j=0;}
}
if(s==3) /*实施控制,随机控制*/
{
caroperation(); /*比较指令信号*/
}
}
else
;
}
}
void portinit(void)
{
port_0 = 0x01; /*此口只控制一灯
pd0 = 0xff;
port_1 = 0x02; /*1号口用于控制右轮的前进的方向*/
pd1 = 0xff;
port_3 = 0x03; /*用于左轮,等于0x03时等于前进*/
pd3 = 0xff;
pd7 = 0x08;
udf = 0x00; /*未知*/
ta0mr = 0x80;/*0号定时器的工作方式*/
tabsr = 0x00;/*所有定时器关闭*/
}
void pwminit(void)
{
ta2mr = 0x47; /*2号定时器处于PWM工作方式*/
ta3mr = 0x47;
ta2 = 0x803e; /*前两位控制占空比,换算成10进制后除以255,得到占空比,后两位控制周期*/
ta3 = 0x803e;
tabsr = 0x00;
}
void caroperation()
{
switch(ircode)
{
case RUN: run();
break;
case BACK: back();
break;
case LEFT: left(1);
break;
case RIGHT: right(1);
break;
case STOP: stop();
break;
default: stop();
}
}
void wait(unsigned int k ) /*k值自定,可以遥控器定,控制左右转,时间持续短*/
{
unsigned int i, j;
for (i = 0; i < 15*10*k; i++ )
for ( j = 0; j < 300; j++ )
;
}
void wait_1(unsigned int k ) /*用于前进的,时间稍长*/
{
unsigned int i, j;
for (i = 0; i < 15*50*k; i++ )
for ( j = 0; j < 300; j++ )
;
}
void run(void)
{
port_1=0x03;
port_3=0x02;
ta2=0x803e;
ta3=0x913e;
tabsr = 0x0c;
}
void back(void)
{
port_1=0x02;
port_3=0x03;
ta2=0x803e;
ta3=0x913e;
tabsr=0x0c;
}
void right_c(void) /*右转半圈*/
{
port_1=0x03;
port_3=0x02;
ta2=0x843e;
ta3=0x743e;
tabsr = 0x0c;
}
void left_c(void)/*左转半圈*/
{
port_1=0x03;
port_3=0x02;
ta2=0x603e;
ta3=0x933e;
tabsr = 0x0c;
}
void right(unsigned int k )
{
port_1=0x03;
port_3=0x02;
ta2=0xfe3e;
ta3=0x803e;
tabsr = 0x0c;
wait(15*k);
stop();
}
void left(unsigned int k )
{
port_1=0x03;
port_3=0x02;
ta2=0x803e;
ta3=0xfe3e;
tabsr = 0x0c;
wait(15*k);
stop();
}
void stop(void)
{
port_1=0x03;
port_3=0x02;
ta2=0xfe3e;
ta3=0xfe3e;
tabsr = 0x0c;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -