您现在所在的是:

单片机论坛

回帖:0个,阅读:984 [上一页] [1] [下一页]
912
sfmcu
文章数:44
年度积分:50
历史总积分:912
注册时间:2006/8/22
发站内信
08年优秀博客奖
发表于:2010/3/4 12:02:00
#0楼
 
一、 实验简介:
本程序通过前端,底端的红外发射头和接收头来判断小车的运行轨迹,当前与底端发生信号输入时,信号将被单片机接收,单片机来控制机器按照写好的程序开始运行。同时为达到好的效果,加入声音识别与蜂鸣器输入输出设备。.使得此机器人的运动变得更加有趣。
二、 实验原理图:
[URL=http://www.sfmcu.com/bbs/upfile/2010_2/201021510344278975.jpg]
图
700){this.width=700;} border=0>[/URL]
三、 实现代码:
//==================================================================//
//  开发日期:2009/01/28                 //
//  修改日期:                                                         //
//  程序备注:此程序仅为表现本机功能而演示用,当用作实际工程时请慎用。    //
//  特别声明:此程序可作研究之用,但引用、转载、使用请注明出处。    //
//================================================================== //
#include                         //包含51单片机相关的头文件
sbit leftled=p2^0;                          //定义前方左侧指示灯端口
sbit rightled=p0^7;                         //定义前方右侧指示灯端口
sbit leftir=p3^5;                           //定义前方左侧红外探头端口
sbit rightir=p3^6;                          //定义前方右侧红外探头端口
sbit fontir=p3^7;                           //定义前方正前方红外探头端口
sbit m1a=p0^0;                            //定义左侧电机驱动a端
sbit m1b=p0^1;                             //定义左侧电机驱动b端
sbit m2a=p0^2;                             //定义右侧电机驱动a端
sbit m2b=p0^3;                             //定义右侧电机驱动b端
sbit b1=p0^4;                              //定义语音识识别传感器端口
sbit sb1=p0^6;                             //定义蜂鸣器端口
#define runshow p1                         //定义数据显示端口
void delay()                               //定义机器人调转子时间子程序
{ unsigned int delaytime=50000;             //定义机器人转弯时间变量
 while(delaytime--);                      //机器人转弯循环
 sb1=!sb1;                                //蜂鸣器闪响
 return;
}
void controlcar(unsigned char contype)      //定义电机控制子程序
{
m1a=0;                                    //将m1电机a端初始化为0
m1b=0;                                    //将m1电机b端初始化为0
m2a=0;                                    //将m2电机a端初始化为0
m2b=0;                                    //将m2电机b端初始化为0
switch(contype)                           //判断用户设定电机形式
{
 case 1:  //前进                        //判断用户是否选择形式1
 { m1a=1;                                 //m1电机正转
   m2a=1;                                 //m2电机正转
   break;
 }
 case 2: //后退                            //判断用户是否选择形式2
 { m1b=1;                                 //m1电机反转
   m2b=1;                                 //m2电机反转
   break;
 }
 case 3: //左转                            //判断用户是否选择形式3
 { m1b=1;                                 //m1电机反转
   m2a=1;                                 //m2电机正转
break;
 }
 case 4: //右转                            //判断用户是否选择形式4
 { m1a=1;                                 //m1电机正转
   m2b=1;                                 //m2电机反转
break;
 }
 case 8: //停止                            //判断用户是否选择形式8
 {
   break;                                 //退出当前选择
 }
}
}
void main()                                //主程序入口
{
 bit runflag=0;                           //定义小车运行标志位
 runshow=0;                               //初始化显示状态
 controlcar(1);                            //初始化小车运行状态
 while(1)                                 //程序主循环
 {
  leftled=leftir;                    //前方左侧指示灯指示出前方左侧红外探头状态
  rightled=rightir;                  //前方右侧指示灯指示出前方右侧红外探头状态
  runshow=fontir;                  //数据显示窗口,指示前方红外探头状态
  if(fontir==0 || leftir==1 ||           //判断前方,左侧,右侧是否有信号输入
     rightir==1)
  {controlcar(2);                          //让小车后退
delay();                               //开始小车后退延时子程序
delay();                               //决定了小车后退的步数
delay();                               //改变它可以改小车后退的距离
delay();                               //这里只是一个延时
   controlcar(3);                          //改变小车为左转方向
delay();                               //开始小车左转延时子程序
delay();                               //改变它可以改变小车旋转的角度
delay();                                //同上
delay();                               //同上
controlcar(1);                          //改变小车为前进运行状态
sb1=1;                                 //这个多一步将蜂鸣器关闭
  }
  if(b1==0)                               //判断是否有声音信号输入
  {
   while(b1==0);                          //去除声音多余的杂波
if(runflag==0)                         //判断小车当前的运行状态标志
{runflag=1;                            //改变小车当前的运行状态标志
 controlcar(8);                         //停止小车的运行
}
else                                   //否则执行的代码如下
{runflag=0;                            //判断小车的运行状态标志
 controlcar(1);                        //改变小车为前进的运行状态
}
  }
 }
}
四、 运行效果:
程序效果: 打开本机电源开关,机器人开始向前运行(这要看当时的条件),在运动的过程中,如果前方有障碍物,机器人则开始向后后退一段时间后,向左运动,在向左运行一段时间后。再开始向前运行。在整个调向的过程中,蜂鸣器闪响。并且在机器人前进的过程中,你可以通过拍手来控制机器人的停止和运行。
----------------------------------------------
此篇文章从博客转发
原文地址: Http://blog.gkong.com/more.asp?id=111170&Name=sfmcu

关于我们 | 联系我们 | 广告服务 | 本站动态 | 友情链接 | 法律声明 | 非法和不良信息举报

工控网客服热线:0755-86369299
版权所有 工控网 Copyright©2024 Gkong.com, All Rights Reserved

31.2002