#include
#include
#include
#include
#include
#define uchar unsigned char //无符号字符型占用一个字节 范围0~255,
#define uint unsigned int /*无符号整型占用二个字节 范围0~65535*/
#define dataPort P1
uchar bianma1; //编码计数
uint yejinjishu=0; //液晶计数
uchar wang=1;
uchar guo=1;
uchar a1=0,a2=0,a3=0,a4=0; //小车方向判断
uchar b1=0,b2=0,b3=0,b4=0;
//电机操作初始化
uchar i=0,j=0; /* 中断计数器 */
uchar m1=0; /* 电机1速度值 */
uchar m2=0; /* 电机2速度值 */
sbit s1=P0^0; /* L298的Input 1 */
sbit s2=P0^1; /* L298的Input 2 */
sbit s3=P0^2; /* L298的Input 3 */
sbit s4=P0^3; /* L298的Input 4 */
sbit en1=P0^4; /* L298的Enable A */
sbit en2=P0^5; /* L298的Enable B */
//寻线 红外接收头 初始化
sbit P2_2=P3^1;
sbit P2_3=P2^3;
sbit P2_4=P2^4;
sbit P2_5=P2^5;
sbit P2_6=P2^6;
sbit P2_7=P2^7;
//按键初始化
sbit markkey=P2^0;
sbit logokey=P2^1;
uchar mark=0; //选线while 标志
uchar logo=0; //最佳路线行走标记
unsigned char idata road[30]; //转向数组
unsigned char code aa[10][4]={"LBL","LBA","ABL","ABA","ABR","RBA","RBR","RBL","LBR"};//数组无需改变 code
unsigned char code a[10][2]={"A","R","R","B","L","L","A","B","B"};
unsigned char idata *p; //地址寄存器 用于字符串操作
//unsigned char idata cun24c02[15];//ram允许情况可以无限添加 记忆数组
// 函数初始化
void KEY();
void line();
void stop();
void youlun();
void zuolun();
void zhizou();
void zhizou1();
void zhizou2();
void ISD1420p(uchar t1,uint t2);
void Run_SNAKE(void);
/********简易延时函数******/
void delay(uint t)
{
for(t;t>0;t--);
}
void DelayUs(uint us) //标准延时 us
{
unsigned char uscnt;
uscnt=us>>1;
while(--uscnt);
}
void DelayMs(uint ms) //标准延时 ms
{
while(--ms)
{
DelayUs(250);
DelayUs(250);
DelayUs(250);
DelayUs(250);
}
}
//595 初始化 串转并
/*sbit sclk=P3^0;
sbit dat=P3^1;
sbit st = P2^1;
void write595(uchar wrdat)
{
uchar sum;
for(sum=0;sum<8;sum++)
{
sclk=0;
dat=wrdat&0x80;
wrdat<<=1;
sclk=1;
}
st=0;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
st=1;
} */
sbit SDA=P0^6;//sbit dat=P3^1;
sbit SCL=P2^2;//sbit sclk=P3^0;
sbit jiyibiaozhi=P0^7;//st = P2^1;
void write595(uchar wrdat)
{
uchar sum;
for(sum=0;sum<8;sum++)
{
SCL=0;
SDA=wrdat&0x80;
wrdat<<=1;
SCL=1;
}
jiyibiaozhi=0;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
jiyibiaozhi=1;
}
/*******************************************************
********************************************************
***************24c02部分*********************************
********************************************************
*******************************************************
#define _Nop() _nop_() //定义空指令
bit ack; //应答标志位
//sbit SDA=P2^1;
//sbit SCL=P2^0;
/*------------------------------------------------
启动总线
------------------------------------------------
void Start_I2c()
{
SDA=1; //发送起始条件的数据信号
_Nop();
SCL=1;
_Nop(); //起始条件建立时间大于4.7us,延时
_Nop();
_Nop();
_Nop();
_Nop();
SDA=0; //发送起始信号
_Nop(); //起始条件锁定时间大于4μ
_Nop();
_Nop();
_Nop();
_Nop();
SCL=0; //钳住I2C总线,准备发送或接收数据
_Nop();
_Nop();
}
/*------------------------------------------------
结束总线
-----------------------------------------------
void Stop_I2c()
{
SDA=0; //发送结束条件的数据信号
_Nop(); //发送结束条件的时钟信号
SCL=1; //结束条件建立时间大于4μ
_Nop();
_Nop();
_Nop();
_Nop();
_Nop();
SDA=1; //发送I2C总线结束信号
_Nop();
_Nop();
_Nop();
_Nop();
}
/*----------------------------------------------------------------
字节数据传送函数
函数原型: void SendByte(unsigned char c);
功能: 将数据c发送出去,可以是地址,也可以是数据,发完后等待应答,并对
此状态位进行操作.(不应答或非应答都使ack=0 假)
发送数据正常,ack=1; ack=0表示被控器无应答或损坏。
------------------------------------------------------------------
void SendByte(unsigned char c)
{
unsigned char BitCnt;
for(BitCnt=0;BitCnt<8;BitCnt++) //要传送的数据长度为8位
{
if((c<
else SDA=0;
_Nop();
SCL=1; //置时钟线为高,通知被控器开始接收数据位
_Nop();
_Nop(); //保证时钟高电平周期大于4μ
_Nop();
_Nop();
_Nop();
SCL=0;
}
_Nop();
_Nop();
SDA=1; //8位发送完后释放数据线,准备接收应答位
_Nop();
_Nop();
SCL=1;
_Nop();
_Nop();
_Nop();
if(SDA==1)ack=0;
else ack=1; //判断是否接收到应答信号
SCL=0;
_Nop();
_Nop();
}
/*----------------------------------------------------------------
字节数据传送函数
函数