/*

* 作者:赵新

* 功能:实现小车躲避障碍,通过检测三个方向的距离,选择最大距离转弯

* 日期:2015/3/14

* 说明:STC89c52RC,12MHz

* 注意:1000ms和100ms待测,完成后删除此行

*—————————————————管脚说明——————————————

* Trig = P1^0

* Echo = P3^2

* PWM_OUT = P0^4

*————————————————————————————————————————

*/

#include "stc89c5x.h"

#include "intrins.h"

#include "Motor.h"

#define X 20   //最短距离参考值 约为12厘米 受温度影响,会存在10%左右的误差

sbit Trig = P1^0;//发送端

sbit Echo = P3^2;//接收端 若用外部中断0,则此引脚必须是P3.2

sbit PWM_OUT = P0^4;//PWM信号输出端

u8 counts = 0;      //设置初值

u8 PWM =6;                        //设置初值,任意值也可不设

u8 Flag_Angle = 1;  //0 左45度 1 右45度 在函数Scan()中调用

u8 Distance_Middle;

u8 Distance_Temp[2];//0 左45度 1 右45度

void Delay20us();

void Delay100ms();

void Delay1000ms();  //@12.000MHz  用于等待

u8 Compute(u8 th,u8 tl);

void Scan_Around();  //扫描左右

void Scan_Middle();  //扫描正中前进方向距离

void main()

{

TMOD = 0x11;//设置T0,T1 T0用于电平检测 T1用于产生舵机需要的PWM信号

TH0 = 0x00;           //转载初值

TL0 = 0x00;

ET0 = 1;           //打开定时器中断

TF0 = 0;           //失能定时器中断标志,也可忽略此语句

TR0 = 0;           //开始时T0关闭

TH1 =        0xff;  //产生时基100us定时,用于组成舵机各个角度的信号

TL1 = 0x9c;

ET1 = 1;

TF0 = 0;     //可忽略此语句,51复位此位为0

TR1 = 0;           //暂时关闭T1

EX0 = 1;     //开外部中断

IT0 = 1;     //下降沿触发中断

EA = 1;           //全局中断开

Trig = 0;           //触发端拉低

Echo = 0;

while(1)

{

//Scan_Around();

Scan_Middle();

if(Distance_Middle<=X)

{

Stop();

Scan_Around();

if((Distance_Temp[0]>Distance_Temp[1])&&Distance_Temp[0]>=X)

{

Turn_Left(0);

Delay100ms();

//Delay100ms();

}else

if((Distance_Temp[0]=X)

{

Turn_Right(0);

Delay100ms();

//Delay100ms();

}else

if((Distance_Temp[0]==Distance_Temp[1])&&Distance_Temp[0]>=X)

{

Turn_Right(0);

Delay100ms();

//Delay100ms();

}else

{

Back();

Delay100ms();

Delay100ms();

Delay100ms();

Delay100ms();

Delay100ms();

Turn_Right(0);

Delay100ms();

//Delay100ms();

}

}else

{

Go();

}

}

}

void Timer1(void) interrupt 3 //PWM产生

{

TH1 = 0xff;

TL1 = 0x9c;

if(counts

{

PWM_OUT = 1;

}

else

{

PWM_OUT = 0;

if(counts==200)

{

counts = 0;

}

}

++counts;

}

void Timer0(void) interrupt 1 //T0溢出中断函数,一般来说T0溢出是不可能发生的,原因是传感器最大探测距离为4m左右,所用时间不会超过65536us

{

}

void INT0_Test(void) interrupt 0  //下降沿到来之后,进入外部中断函数,停止T0计数,计算并发送计算值到计算机

{

TR0 = 0;

switch(Flag_Angle)

{

case 0:Distance_Temp[0]=Compute(TH0,TL0);TH0 = TL0 = 0x00;break;  //左

case 1:Distance_Temp[1]=Compute(TH0,TL0);TH0 = TL0 = 0x00;break;  //右

default:break;

}

//为了下一次准确计数,必须清空

}

void Scan_Around()   //扫描左右

{

Flag_Angle = 0;

PWM = 17;//左转45度

TR1 = 1;

Delay1000ms();

TR1 = 0;

Trig = 1;                //触发一次检测

Delay20us();

Trig = 0;

while(!Echo);        //如果没有检测到返回信号,等

TR0 = 1;                //检测到高电平,开T0计数,一直计到下降沿到来

Delay100ms();

Flag_Angle = 1;

PWM = 8; //右转45度

TR1 = 1;

Delay1000ms();

TR1 = 0;

Trig = 1;                //触发一次检测

Delay20us();

Trig = 0;

while(!Echo);        //如果没有检测到返回信号,等

TR0 = 1;                //检测到高电平,开T0计数,一直计到下降沿到来

Delay100ms();

PWM = 12; //测完回到正中

TR1 = 1;

Delay1000ms();

TR1 = 0;

}

void Scan_Middle() //扫描正中前进方向距离

{

//Stop();

Flag_Angle = 3;

Trig = 1;                //触发一次检测

Delay20us();

Trig = 0;

while(!Echo);        //如果没有检测到返回信号,等

TR0 = 1;                //检测到高电平,开T0计数,一直计到下降沿到来

Delay100ms();

Distance_Middle = Compute(TH0,TL0);

TH0 = TL0 = 0x00;

//Go();

}

u8 Compute(u8 th,u8 tl)

{

u16 times = 0x0000;

times = th;

times = times<<8;

times |= tl;

return (times/58);

}

void Delay20us()                //@12.000MHz  用于产生超声波触发信号

{

unsigned char i;

_nop_();

i = 7;

while (--i);

}

void Delay100ms()                //@12.000MHz

{

unsigned char i, j;

i = 195;

……………………

…………限于本文篇幅 余下代码请从51黑下载附件…………

避障机器人程序c语言,基于51单片机小车寻迹、避障源程序(注释很详细)相关推荐

  1. 51单片机电机测速程序c语言,基于51单片机光电编码器测速.doc

    基于51单片机光电编码器测速 PAGE PAGE 2 课程设计报告 课程名称: 微机原理课程设计 题 目: 基于51单片机的光电编码器测速 摘要 光电编码器是高精度位置控制系统常用的一种位移检测传感器 ...

  2. 声控灯程序C语言,基于51单片机的声控灯设计设计-包含完整设计与指导文件.doc...

    基于51单片机的声控灯设计设计-包含完整设计与指导文件 工 学 院 毕 业 设 计(论文) 题 目:基于单片机的智能光控路灯的设计 专 业: 机电技术教育 班 级: *** 姓 名: *** 学 号: ...

  3. 声控灯程序C语言,基于51单片机的声控灯的设计.doc

    PAGE 3 基于51单片机的声控小灯 电子信息工程技术信息工程系 电子信息工程技术 信息工程系 年 10 月 20 日 诚 信 声 明 本人郑重声明:所呈交的毕业设计文本和成果,是本人在指导老师的指 ...

  4. 基于51单片机的寻迹小车

    智能车刚入门,前段时间制作了一个51寻迹小车,就是网上那种寻迹是用四个红外传感器,驱动是L298N,主板是自己焊接的51最小系统加了一个7805将电池的7.2v稳压成5v(虽然我直接用的电池电压),原 ...

  5. 智能窗帘定时程序c语言,基于51单片机的智能窗帘程序设计

    #include #include #define uchar unsigned char                // 以后unsigned char就可以用uchar代替 #define u ...

  6. 简易电子钟c语言程序,(最新整理)基于51单片机的电子钟C语言程序

    <(最新整理)基于51单片机的电子钟C语言程序>由会员分享,可在线阅读,更多相关<(最新整理)基于51单片机的电子钟C语言程序(9页珍藏版)>请在人人文库网上搜索. 1.完整) ...

  7. 单片机c语言程序开发洗衣机,基于51单片机洗衣机控制器的设计(附程序)☆

    基于51单片机洗衣机控制器的设计(附程序)☆(任务书,开题报告,中期检查表,毕业论文21000字,程序) 摘  要 洗衣机是人们日常生活中常见的一种家电,已经成为人们生活中不可缺少的家用电器.在工业生 ...

  8. 单片机课程设计洗衣机c语言,基于51单片机洗衣机控制器的设计(附程序)☆

    基于51单片机洗衣机控制器的设计(附程序)☆(任务书,开题报告,中期检查表,毕业论文21000字,程序) 摘  要 洗衣机是人们日常生活中常见的一种家电,已经成为人们生活中不可缺少的家用电器.在工业生 ...

  9. 单片机检测电机频率c语言,基于51单片机的电动机测速表的设计.doc

    基于51单片机的电动机测速表的设计 基于51单片机的电动机测速表设计 摘 要 本文介绍了采用光电传感器实施电机转速测量的方法.基本原理,完成了一种基于AT89C51单片机平台的电动机测速表的软硬件设计 ...

最新文章

  1. linux shell 特殊变量 符号 $0, $#, $*, $@, $?, $$ 命令行参数
  2. C二维数组行为空,列不为空
  3. 如果去掉数学前后的空格_理综+数学+地理+英语完型的方法和技巧
  4. [转]Some Cool Tips for .NET
  5. CJOJ 【DP合集】最长上升序列2 — LIS2
  6. 红橙Darren视频笔记 自定义RatingBar touch事件学习 dp转px listener监听
  7. Android URI简介
  8. 如何理解lower_bound/upper_bound
  9. [转载] 数组快速排序python_python实现快速排序
  10. 20150406--RBAC+添加字段栏目
  11. linux导入通达oa数据库,将通达OA迁移到linux平台
  12. 拓端tecdat|Python使用矩阵分解法找到类似的音乐
  13. [小工具]取色器gcolor2
  14. 计算机科学导论的试题,《计算机科学导论》期末考试试题
  15. nginx+red5流媒体服务器搭建
  16. 新版码支付个人免签支付系统源码+实测成功
  17. 干货分享——安卓USB通信
  18. python修改ppt的字体和颜色,PPT小技巧:批量修改文字颜色,批量替换字体
  19. Data Whale第20期组队学习 Pandas学习—文本数据
  20. 计算机824难不难,南京理工大学

热门文章

  1. pandas DataFrame 索引(二)
  2. oracle创建表语句_利用FME去拼接SQL语句并创建表
  3. kubernetes安装_kubernetes安装教程之三:安装kubeadm
  4. F5 BIG-IP 远程代码执行漏洞 CVE-2021-22986 虚拟机上复现
  5. 文巾解题 797. 所有可能的路径
  6. tableau必知必会之学做漂亮易用的哑铃图
  7. Python中numpy库unique函数解析
  8. 关于后端java项目使用SpringBoot框架的报错总结
  9. 4000+系统,10w+服务的立体式监控是如何炼成的?
  10. Writing Images to the Excel Sheet using PHPExcel--转载