智能车走迷宫c语言程序,基于51单片机的智能迷宫小车设计 含PCB原理图 源程序...

该博客详细介绍了基于51单片机的智能迷宫小车设计,包括C语言程序实现、电机控制、红外寻线以及595芯片的操作。程序涉及中断、编码计数、液晶显示、按键控制等多个方面,旨在实现小车自主走迷宫的功能。
摘要由CSDN通过智能技术生成

#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();

}

/*----------------------------------------------------------------

字节数据传送函数

函数

  • 2
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值