写一个避障小车的程序

写一个避障小车的程序,第1张

很简单啊,传感器当做I/O输入,电机当做I/O输出,首先需要进行转定义,将地址映射为变量。

#define SENSOR_LEFT 0x????

#define SENSOR_RIGHT 0x????

#define MOTOR_LEFT 0x????

#define MOTOR_RIGHT 0x????

int Func()

{

while (1)

{

if ((1 ==SENSOR_LEFT) &&(1 ==SENSOR_RIGHT))

{

MOTOR_LEFT = 0

MOTOR_RIGHT = 0

}

else if (1 ==SENSOR_LEFT)

{

MOTOR_LEFT = 1

MOTOR_RIGHT = 0

}

else if (1 ==SENSOR_RIGHT)

{

MOTOR_LEFT = 0

MOTOR_RIGHT = 1

}

else

{

MOTOR_LEFT = 1

MOTOR_RIGHT = 1

}

}

}

#include<reg52.h> //添加函数库

#define uint unsigned int //宏定义

#define uchar unsigned char //宏定义

sbit s=P3^5 //定义红外避障检测端口

sbit m1=P3^4   //定义电机M1电平输出端口

sbit m2=P3^6   //定义电机M2电平输出端口

void delay_ms(uint z) //声明延时函数

main()  //主函数

{

uint i=0 //初始值设定

m1=1

m2=1

while(1) //无限循环

{

if(s==0)//S=0表示前方有障碍物 进行转向

{

for(i=0i<5i++)

{

m1=0

m2=1

delay_ms(15)//状态保持15ms

m1=1

m2=1

delay_ms(5)//状态保持5ms

}

}

if(s==1)//S=1表示前方无障碍物 直线行驶

{

m1=1

m2=1

delay_ms(10)//状态保持10ms

}

}

}

void delay_ms(uint z)//延时函数 循环嵌套原理

{

uint x,y

for(x=zx>0x--)

for(y=110y>0y--)

}

这个是数码管显示的,我还有LCD,串口显示,要得话可以私信

/***********************************************************************************************************/

//hc-sr04 超声波测距模块 DEMO 程序

//晶振:11。0592

//接线:模块TRIG接 P0.2 ECH0 接P0.1

//数码管:共阳数码管P1接数据口,P2.5 P2.4 P2.3接选通数码管

/***********************************************************************************************************/

#include <AT89x51.H> //器件配置文件

#include <intrins.h>

#define RX P0_1

#define TX P0_2

unsigned int time=0

unsigned int timer=0

unsigned char posit=0

unsigned long S=0

bit flag =0

unsigned char const discode[] ={ 0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xBF,0xff/*-*/}

unsigned char const positon[3]={ 0xdf,0xef,0xf7}

unsigned char disbuff[4] ={ 0,0,0,0,}

/********************************************************/

void Display(void) //扫描数码管

{

if(posit==0)

{P1=(discode[disbuff[posit]])&0x7f}

else

{P1=discode[disbuff[posit]]}

P2=positon[posit]

if(++posit>=3)

posit=0

}

/********************************************************/

void Conut(void)

{

time=TH0*256+TL0

TH0=0

TL0=0

S=(time*1.7)/100//算出来是CM

if((S>=700)||flag==1) //超出测量范围显示“-”

{

flag=0

disbuff[0]=10 //“-”

disbuff[1]=10 //“-”

disbuff[2]=10 //“-”

}

else

{

disbuff[0]=S%1000/100

disbuff[1]=S%1000%100/10

disbuff[2]=S%1000%10 %10

}

}

/********************************************************/

void zd0() interrupt 1 //T0中断用来计数器溢出,超过测距范围

{

flag=1 //中断溢出标志

}

/********************************************************/

void zd3() interrupt 3 //T1中断用来扫描数码管和计800MS启动模块

{

TH1=0xf8

TL1=0x30

Display()

timer++

if(timer>=400)

{

timer=0

TX=1 //800MS 启动一次模块

_nop_()

_nop_()

_nop_()

_nop_()

_nop_()

_nop_()

_nop_()

_nop_()

_nop_()

_nop_()

_nop_()

_nop_()

_nop_()

_nop_()

_nop_()

_nop_()

_nop_()

_nop_()

_nop_()

_nop_()

_nop_()

TX=0

}

}

/*********************************************************/

void main( void )

{

TMOD=0x11 //设T0为方式1,GATE=1;

TH0=0

TL0=0

TH1=0xf8 //2MS定时

TL1=0x30

ET0=1//允许T0中断

ET1=1 //允许T1中断

TR1=1 //开启定时器

EA=1 //开启总中断

while(1)

{

while(!RX) //当RX为零时等待

TR0=1 //开启计数

while(RX) //当RX为1计数并等待

TR0=0 //关闭计数

Conut() //计算

}

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12133252.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-21
下一篇 2023-05-21

发表评论

登录后才能评论

评论列表(0条)

保存