/*********************************************************
文件名:car.c
文件说明:小车的蓝牙,避障,自动寻迹C程序
编写人员:Seven
编写日期:2017年6月9日
程序说明:MCU采用AT89C52,外接11.0592MHz晶振、3个光电
开关、5个红外对管、HC06蓝牙模块、L298N电机驱
动模块,12V电源供电,L7805稳压输出5V。
版权标注:河南工程学院 电气信息工程系C303创新实验室
*********************************************************/
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
#define MAIN_Fosc 11059200
uint i;
uchar tmp;
sbit IN1=P0^0; //控制左前后轮正转 1正转 0停止
sbit IN2=P0^1; //控制左前后轮倒转 1倒转 0停止
sbit IN3=P0^2; //控制右前后轮正转 1正转 0停止
sbit IN4=P0^3; //控制右前后轮倒转 1倒转 0停止
sbit ENA=P0^4; //左轮使能端
sbit ENB=P0^5; //右轮使能端
sbit red1=P1^0; //red是红外对管,从左到右分别是1~~5
sbit red2=P1^1; //红外对管以第三个为准,寻迹时返回为高电平
sbit red3=P1^2; //为1时为高电平,无信号返回
sbit red4=P1^3;
sbit red5=P1^4;
sbit eye1=P2^5; //eye为红外光电开关
sbit eye2=P2^6;
sbit eye3=P2^7;
sbit Beep=P0^7;
/********串*口*初*始*化*函*数*******/
void init()
{
TMOD = 0x20; //工作模式2,8位自动重装
TH1 = 0xfd;
TL1 = 0xfd; //波特率9600bps
SM0 = 1;
SM1 = 1; //串口工作方式1 10位异步收发器
TR1 = 1; //T1定时器启动
REN = 1; //允许串口通讯
EA = 1; //开总中断
ES = 1; //串口中断打开
}
/********* ms*级*延*时*函*数*********/
void Delay_Ms(uint ms)
{
uint i;
do{
i = MAIN_Fosc / 96000;
while(--i);
}while(--ms);
}
/*****运*动*状*态*控*制*函*数*****/
void turnleft()
{
for(i=0;i<7;i++)
{
IN1=0;
IN2=1;
IN3=1;
IN4=0;
ENA=ENB=1; //设置占空比,控制小车速度,下同
Delay_Ms(3);
ENA=ENB=0;
Delay_Ms(8);
}
}
void turnright()
{
for(i=0;i<7;i++)
{
IN1=1;
IN2=0;
IN3=0;
IN4=1;
ENA=ENB=1;
Delay_Ms(3);
ENA=ENB=0;
Delay_Ms(8);
}
}
void anticlockwise()
{
for(i=0;i<13;i++)
{
IN1=0;
IN2=1;
IN3=1;
IN4=0;
ENA=ENB=1;
Delay_Ms(3);
ENA=ENB=0;
Delay_Ms(7);
}
}
void clockwise()
{
for(i=0;i<13;i++)
{
IN1=1;
IN2=0;
IN3=0;
IN4=1;
ENA=ENB=1;
Delay_Ms(3);
ENA=ENB=0;
Delay_Ms(7);
}
}
/*******go*函*数*用*于*寻*迹*******/
void go(void)
{
for(i=0;i<10;i++)
{
IN1=1;
IN2=0;
IN3=1;
IN4=0;
ENA=ENB=1;
Delay_Ms(2);
ENA=ENB=0;
Delay_Ms(14);
}
}
/*********用*于*180度*转*身*避*障*********/
void turn_round(void)
{
for(i=0;i<58;i++)
{
IN1=0;
IN2=1;
IN3=1;
IN4=0;
ENA=ENB=1;
Delay_Ms(4);
ENA=ENB=0;
Delay_Ms(8);
}
}
/*******run*函*数*用*于*蓝*牙*遥*控*******/
void run(void)
{
for(i=0;i<13;i++)
{
IN1=1;
IN2=0;
IN3=1;
IN4=0;
ENA=ENB=1;
Delay_Ms(2);
ENA=ENB=0;
Delay_Ms(8);
}
}
void upleft(void)
{
for(i=0;i<13;i++)
{
IN1=1;
IN2=0;
IN3=1;
IN4=0;
ENB=1;
Delay_Ms(13);
ENA=1;
Delay_Ms(5);
ENA=ENB=0;
Delay_Ms(12);
}
}
void upright(void)
{
for(i=0;i<13;i++)
{
IN1=1;
IN2=0;
IN3=1;
IN4=0;
ENA=1;
Delay_Ms(13);
ENB=1;
Delay_Ms(5);
ENA=ENB=0;
Delay_Ms(12);
}
}
void back(void)
{
for(i=0;i<15;i++)
{
IN1=0;
IN2=1;
IN3=0;
IN4=1;
ENA=ENB=1;
Delay_Ms(3);
ENA=ENB=0;
Delay_Ms(7);
}
}
void stop()
{
IN1=0;
IN2=0;
IN3=0;
IN4=0;
}
void bottom_left()
{
for(i=0;i<15;i++)
{
IN1=0;
IN2=1;
IN3=0;
IN4=1;
ENB=1;
Delay_Ms(13);
ENA=1;
Delay_Ms(5);
ENA=ENB=0;
Delay_Ms(12);
}
}
void bottom_right()
{
for(i=0;i<10;i++)
{
IN1=0;
IN2=1;
IN3=0;
IN4=1;
ENA=1;
Delay_Ms(13);
ENB=1;
Delay_Ms(5);
ENA=ENB=0;
Delay_Ms(12);
}
}
/*************蓝*牙*遥*控*函*数*********************/
void ctrl() //接收处理函数
{
switch(tmp)
{
case '1': //led1 = 0;
upleft();
break;
case '2':
run();
break;
case '3':
upright();
break;
case '4':
anticlockwise();
break;
case '5':
stop();
break;
case '6':
clockwise();
break;
case '7':
bottom_left();
break;
case '8':
back();
break;
case '9':
bottom_right();
break;
default:
stop();
}
}
/*******寻*迹*函*数*******/
void Tracing(void)
{
if((red1==0)&&(red3==1)&&(red5==0))
go();
if(((red4==1)||(red5==1))&&(red3==0))
turnleft();
if(((red1==1)||(red2==1))&&(red4==0))
turnright();
if((red1==0)&&(red2==0)&&(red3==0)&&(red4==0)&&(red5==0))
stop();
}
/*************避*障*函*数************/
void Avoid(void)
{
P2=0xe0;
while(((eye1==0)&&(eye2==0))||(eye1==0))
{
Beep=0;
turnleft();
Beep=1;
}
while(((eye2==0)&&(eye3==0))||(eye3==0))
{
Beep=0;
turnright();
Beep=1;
}
while(((eye1==0)&&(eye2==0)&&(eye3==0))||(eye2==0)||((eye1==0)&&(eye2==1)&&(eye3==0)))
{
Beep=0;
turn_round();
Beep=1;
}
}
void main()
{
init();
while(1)
{
// tmp = SBUF;
// if(tmp == '2')
// {
// go();
// }
//
// if(tmp == '8')
// {
// back();
// }
Tracing();
Avoid();
}
}
/*******串*口*中*断*服*务*程*序*******/
void UART() interrupt 4
{
if(RI==1) //是否有数据到来 1为是 0为否
{
tmp = SBUF; //暂存接收到的数据
RI = 0;
}
ctrl();
}
转载:https://blog.csdn.net/seven94959/article/details/72957432