#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit inl1=P1^0; //左轮
sbit enl=P1^4;
sbit inl2=P1^1;
sbit inr1=P1^2; //右轮
sbit enr=P1^5;
sbit inr2=P1^3;
sbit left1=P2^3; //中左第一个
sbit left2=P2^2; //中左第二个
sbit right1=P2^1; //中右第一个
sbit right2=P2^0; //中右第二个
sbit back_left1=P2^6; //中后左第一个
sbit back_left2=P2^7; //中后左第二个
sbit back_right1=P2^5; //中后右第一个
sbit back_right2=P2^4; //中后右第二个
sbit front_out=P3^0; //前面555发射
sbit back_out=P3^1; //后面555发射
bit front_flag; //前面中断标志
bit back_flag; //后面中断标志
bit sound_flag=1; //声音中断标志
uint sound_time; //声音中断后的计时
sbit clk=P0^0;
sbit sda=P0^1;
sbit play=P0^2;
uchar code add[]={0x00,0x2a}; //语音地址
void delay(uint a) ////延时 1ms
{
int i;
for (; a>0; a--)
for(i=0; i<110; i++);
}
void speech(uchar a) //语音播报
{
uchar i;
play=1;
for(i=0;i<8;i++)
{
if(_crol_(a,i)&0x80)
sda=1;
else sda=0;
clk=0;
clk=1;
}
play=0;
delay(2000);
}
void init_time(void) //声音中断初始化和声音延时初始化
{
TMOD=0x16;
EA=1;
ET0=1;
ET1=1;
TH0=255;
TL0=255;
TH1=0xd8;
TL1=0xff;
TR0=1;
TR1=0;
}
void init_int0(void) //前面避障中断初始化
{
EX0=1;
IT0=1;
front_out=0;
}
void init_int1(void) //后面避障中断初始化
{
EX1=1;
IT1=1;
back_out=0;
}
void int0(void) interrupt 0 //前面避障中断处理函数
{
EX0=0;
front_out=0;
front_flag=1;
}
void t0(void) interrupt 1 //声音中断处理函数
{
TR0=0;
TR1=1;
sound_flag=~sound_flag;
}
void int1(void) interrupt 2 //后面避障中断处理函数
{
EX1=0;
back_out=0;
back_flag=1;
}
void t1(void) interrupt 3 //定时10ms
{
TH0=0xd8;
TL0=0xff;
sound_time++;
if (sound_time == 150) //设置声音中断后的多少时间后开
{
sound_time=0;
TR0=1;
TR1=0;
}
}
void go_along(void) //直走
{
inl1=1;
inl2=0;
inr1=1;
inr2=0;
}
void go_left(void) // 向左转
{
inl1=0;
inl2=0;
inr1=1;
inr2=0;
}
void go_right(void) //向右转
{
inl1=1;
inl2=0;
inr1=0;
inr2=0;
}
void go_back(void) //后退
{
inl1=0;
inl2=1;
inr1=0;
inr2=1;
}
void left_back(void) //左转弯后退
{
inl1=0;
inl2=0;
inr1=0;
inr2=1;
}
void right_back(void) //右转弯后退
{
inl1=0;
inl2=1;
inr1=0;
inr2=0;
}
void stop(void) //停止
{
inl1=0;
inl2=0;
inr1=0;
inr2=0;
}
void kill_stop(void) //杀停
{
inl1=1;
inl2=1;
inr1=1;
inr2=1;
}
void scan_sensor(void) //扫描前面传感器 并前行
{
if (right1==0)
{
go_right();
delay(5);
}
else if (left1==0)
{
go_left();
delay(5);
}
else if (right2 == 0)
{
kill_stop();
delay(10);
go_right();
delay(15);
}
else if (left2 == 0)
{
kill_stop();
delay(10);
go_left();
delay(15);
}
else
{
stop();
delay(15);
go_along();
delay(5);
}
}
void scan_back_sensor(void) //扫描后面传感器 并后退
{
if (back_right1==0)
{
right_back();
delay(5);
}
else if (back_left1==0)
{
left_back();
delay(5);
}
else if (back_right2 == 0)
{
kill_stop();
delay(10);
right_back();
delay(15);
}
else if (back_left2 == 0)
{
kill_stop();
delay(10);
left_back();
delay(15);
}
else
{
stop();
delay(20);
go_back(); //后退
delay(5);
}
}
void main(void)
{
init_time(); //声音中断初始化和声音延时初始化
init_int0(); //前面避障中断初始化
init_int1(); //后面避障中断初始化
while(1)
{
EX0=1; //开前面避障中断
front_out=1; //开前面的红外发射
while(1)
{
if (sound_flag == 1) //当声音标志为1时正常运行
{
scan_sensor(); //扫描前面传感器 并前行
}
else //当声音标志不为1时停止
{
kill_stop();
}
if (front_flag == 1) //前面避障中断为1时退出前行程序
{
front_flag=0;
break;
}
}
kill_stop(); //暂停
speech(add[0]); //播报“前方遇到障碍物”
EX1=1; //开后面避障中断
back_out=1; //开后面的红外发射
while(1)
{
if (sound_flag == 1) //当声音标志为1时正常运行
{
scan_back_sensor(); //扫描后面传感器 并后退
}
else //当声音标志不为1时停止
{
kill_stop();
}
if (back_flag == 1) //后面避障中断为1时退出后退程序
{
back_flag=0;
break;
}
}
kill_stop(); //暂停
speech(add[1]); //播报“后方遇到障碍物”
}
}
zhinengxiaoche.rar_C51循迹小车L298_2路寻迹_l298
版权申诉
5星 · 超过95%的资源 17 浏览量
2022-09-24
16:54:39
上传
评论
收藏 2KB RAR 举报
小波思基
- 粉丝: 72
- 资源: 1万+
最新资源
- video_20240515_132356_edit.mp4
- (python源码)(基于torch框架)基于LSTM的时间序列预测算法实现
- Java 实现CRC码算法(含实现原理和步骤)
- Screenshot_2024-05-15-15-51-23-937_com.tencent.mm.jpg
- gcr.io/k8s-staging-sig-storage/nfs-subdir-external-provisioner
- content_1715761104170.m3u8
- 202391630110 贾增林.zip
- (python源码)基于症状的心脏病预测算法实现
- c# 反编译工具ILSpy 新版
- ESP8266-01模块继电器制作手机APP远程遥控智能开关
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈