标题:
智能小车超声波跟随的单片机程序源码
[打印本页]
作者:
casvot
时间:
2018-7-13 09:54
标题:
智能小车超声波跟随的单片机程序源码
智能小车超声波跟随
单片机源程序如下:
#include<reg51.h>
#define reload_count_1200bps 0xe8
#define reload_count_2400bps 0xf4
#define reload_count_4800bps 0xfa
#define reload_count_9600bps 0xfd
//定义智能小车电机驱动芯片L293D输入IO口
sbit IN1 = P1^3;
sbit IN2 = P1^4;
sbit IN3 = P1^5;
sbit IN4 = P1^6;
sbit EN1 = P1^2;
sbit EN2 = P1^7;
sbit BEEP_IO = P2^3; //蜂鸣器定义
unsigned char pwmval_left = 0; //变量定义
unsigned char pwmval_right = 0;
unsigned char pwmval_left_init = 10;
//左电机占空比调节 ,调节值在0到20之间,调节此值可调节小车速度。
unsigned char pwmval_right_init = 10;
//右电机占空比调节 ,调节值在0到20之间,调节此值可调节小车速度。
bit right_pwm = 1; //右电机PWM开关,为1时打开
bit left_pwm = 1; //左电机PWM开关,为1时打开
unsigned char num = 0x00;
unsigned char UART_REV_BUFFER;
unsigned char one_frame_finished = 0;
bit forward_flag = 0;
bit backward_flag=0;
bit left_flag = 0;
bit right_flag = 0;
bit back_flag = 0;
bit stop_flag = 1;
void delay(int In,int Out) //定义延时函数
{
int i,j;
for(i=0;i<In;i++)
{
for(j=0;j<Out;j++)
{;}
}
}
void forward(void) //前进
{
if(forward_flag == 0)
{
ET0 = 0;
pwmval_right = 0;
pwmval_left = 0;
pwmval_left_init = 20;
pwmval_right_init = 20;
ET0 = 1;
IN1 = 1;
IN2 = 0; //左车轮的正转
IN3 = 1;
IN4 = 0;
} //右车轮的正转
forward_flag = 1;
}
void backward(void) //前进
{
if(backward_flag == 0)
{
ET0 = 0;
pwmval_right = 0;
pwmval_left = 0;
pwmval_left_init = 20;
pwmval_right_init = 20;
ET0 = 1;
IN1 = 0;
IN2 = 1; //左车轮的正转
IN3 = 0;
IN4 = 1;
} //右车轮的正转
backward_flag = 1;
}
void stop(void) //停车
{
IN1 = 0;
IN2 = 0; //左电机不动
IN3 = 0;
IN4 = 0;
forward_flag = 0;
left_flag = 0;
right_flag = 0;
back_flag = 0;
}
void right(void) //向右
{
if(right_flag == 0)
{
ET0 = 0;
pwmval_right = 0;
pwmval_left = 0;
pwmval_left_init = 20;
pwmval_right_init = 20;
ET0 = 1;
IN1 = 1;
IN2 = 0; //智能小车左车轮正转
IN3 = 0;
IN4 = 1; //智能小车右车轮反转
}
right_flag = 1;
}
void left(void) //向左
{
if(left_flag == 0)
{
ET0 = 0;
pwmval_right = 0;
pwmval_left = 0;
pwmval_left_init = 20;
pwmval_right_init = 20;
ET0 = 1;
IN1 = 0;
IN2 = 1;
IN3 = 1;
IN4 = 0;
}
left_flag = 1;
}
/************************************************************************/
void left_moto(void) //left speed adjust
{
if(left_pwm)
{
if(pwmval_left <= pwmval_left_init)
{
EN1 = 1;
}
else
{
EN1 = 0;
}
if(pwmval_left >= 20)
{
pwmval_left = 0;
}
}
else
{
EN1 = 0;
}
}
/******************************************************************/
void right_moto(void)
{
if(right_pwm)
{
if(pwmval_right <= pwmval_right_init)
{
EN2 = 1;
}
else if(pwmval_right > pwmval_right_init)
{
EN2 = 0;
}
if(pwmval_right >= 20)
{
pwmval_right = 0;
}
}
else
{
EN2 = 0;
}
}
void timer0()interrupt 1 using 2 //
{
TH0 = 0xfc; //1Ms定时
TL0 = 0x66;
pwmval_left = pwmval_left + 1;
pwmval_right = pwmval_right + 1;
left_moto();
right_moto();
}
void timer_init()
{
TMOD=0x01;
TH0= 0xfc; //1ms定时
TL0= 0x66;
TR0= 1;
ET0= 1;
EA = 1; //开总中断
}
void serial_port_initial(char TH,char TL)
{
SCON = SCON | 0x50; //0101,0000 8位可变波特率,无奇偶校验位
TMOD = TMOD | 0x20; //0011,0001 设置定时器1为8位自动重装记数器
PCON = PCON | 0x00;
TH1 = TH; //设置定时器1自动重装数
TL1 = TL;
ES = 1; //允许串口中断
EA = 1; //开总中断
TR1 = 1; //开定时器1
}
void send_UART(unsigned char i) //发送一节函数
{
ES = 0; //关串 口中断
TI = 0; //清零串口发送完成中断请求标志
SBUF = i;
while(TI==0); // 等特数据传送
TI = 0; // 清除数据传送标志
ES = 1;
}
char UARTReceive(void)
{
char ch;
ch = SBUF;
return (ch); //暂存接收到的数据
}
void UART_Interrupr_Receive(void) interrupt 4
{
ES = 0;
if(RI) //接引起的中断处理程序
{
UART_REV_BUFFER = UARTReceive();
RI = 0;
ES = 1;
one_frame_finished = 1;
}
}
void PROCESS(void)
{
if(one_frame_finished == 1)
{
send_UART(UART_REV_BUFFER);
if(UART_REV_BUFFER == 0x31)
{
stop();
}
else if(UART_REV_BUFFER == 0x32)
{
left();
delay(80,100);
stop();
}
else if(UART_REV_BUFFER == 0x33)
{
right();
delay(80,100);
stop();
}
else if(UART_REV_BUFFER == 0x34)
{
forward();
delay(200,100);
stop();
}
else if(UART_REV_BUFFER==0x35)
{
backward();
delay(100,100);
stop();
}
else
{
stop();
}
one_frame_finished = 0;
}
//==================Test=====================
/*right();
delay(500,100);
left();
delay(500,100);
backward();
delay(500,100);
*/
//forward();
//delay(500,100);
}
void main(void)
{
delay(10,10);
timer_init();
serial_port_initial(reload_count_9600bps,reload_count_9600bps);
BEEP_IO = 0;
delay(100,100);
BEEP_IO = 1;
while(1)
{
PROCESS();
}
}
复制代码
所有资料51hei提供下载:
智能小车超声波跟随程序.zip
(35.23 KB, 下载次数: 122)
2018-7-13 09:54 上传
点击文件名下载附件
下载积分: 黑币 -5
作者:
paladincc
时间:
2018-12-22 23:25
请问是什么型号得超声波模块?
作者:
ywq123
时间:
2019-3-13 20:35
你好,可以分享一下小车电路图吗?
作者:
爱出风头的小白
时间:
2019-3-13 23:05
什么是超声波跟随?
作者:
QTW0921
时间:
2019-11-20 16:46
谢谢大佬,要是有电路图就更加完美了
作者:
yiyang168
时间:
2019-12-24 21:58
小车安装好了,下载程序试试
作者:
muse122334
时间:
2020-3-3 14:56
谢谢分享
作者:
焦小波
时间:
2020-3-17 08:57
您好,可以您这个程序,超声波接在哪呢
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1