• 风益达
    了解作者
  • C51
    开发工具
  • 105KB
    文件大小
  • zip
    文件格式
  • 0
    收藏次数
  • 1 积分
    下载积分
  • 4
    下载次数
  • 2016-08-28 10:03
    上传日期
使用51单片机,通过多个个ST188传感器来实现小车的循迹运动,包括直行,转弯,绕圈,上下坡的控制,小车采用步进电机,并辅助以1602及数码管的显示,使用干簧管检测模块可以对磁铁障碍物进行检测,发上来大家共同学习,附原理图
robot.zip
  • robot
  • jichuzu.plg
    0B
  • jichuzu_Uv2.Bak
    0B
  • robot.c
    3.6KB
  • 1602.h
    2.2KB
  • jichuzu.uvgui.Administrator
    67.1KB
  • jichuzu_uvproj.bak
    13.4KB
  • jichuzu
    17.9KB
  • jichuzu.uvopt
    9.2KB
  • STARTUP.OBJ
    749B
  • STARTUP.A51
    6.2KB
  • robot.LST
    9.2KB
  • motor.h
    4KB
  • jichuzu_Opt.Bak
    1.7KB
  • STARTUP.LST
    13.7KB
  • 原理图.pdf
    58.4KB
  • jichuzu.Uv2.bak
    2.2KB
  • jichuzu.hex
    3.3KB
  • jichuzu_uvopt.bak
    67.9KB
  • jichuzu.lnp
    60B
  • jichuzu.opt.bak
    1.7KB
  • jichuzu.uvproj
    13.5KB
  • jichuzu.M51
    24.8KB
  • robot.OBJ
    20.4KB
内容介绍
/******************************************* 机器人大赛高级组例程 ********************************************/ #include <reg52.h> #include <intrins.h> #define uchar unsigned char #define uint unsigned int #include "motor.h" #include "1602.h" uchar b='0'; int road_status; uchar flag='0'; uchar flag1='0'; uchar flag2='0'; sbit buzzer=P3^4; uchar a='0'; sbit OPT1 = P3^6; //光敏电阻 sbit OPT2 = P3^7; void Buzzer(uint x) { buzzer = 0; DelayMs(x); buzzer = 1; } /***********道路检测循迹********************** 函数名称: RoadTrack_for_middle 函数输入: 函数输出: 函数功能: **********************************************/ void RoadTrack_for_middle(road_status) { switch (road_status) //左中右-转弯// { // P2.7 -543-0// case 0x00 : GoBack(15,15); break; //全白后退 //00-000-000// case 0x20 : GoLeft(7,12); break; //大左转 //00-100-000// case 0x10 : GoHead(12,12); break; //直线 //00-010-000// case 0x30 : GoHead(13,9); break; //小左转 //00-110-000// case 0x08 : GoRight(12,12); break; //大右转 //00-001-000// case 0x28: break; //不存在 //00-101-000// case 0x18: GoHead(8,12); break; //小右转 //00-011-000// default:break; } } RoadTrack_for_circle(road_status) { switch(road_status) { case 0x00 : GoRight(8,12); break; //全白后退 //00-000-000// case 0x20 : GoHead(0,12); break; //大左转 //00-100-000// case 0x10 : GoHead(12,8); break; //直线 //00-010-000// case 0x30 : GoHead(12,6); break; //小左转 //00-110-000// case 0x08 : GoRight(12,8); break; //大右转 //00-001-000// case 0x28: break; //不存在 //00-101-000// case 0x18: GoHead(16,7); break; //小右转 //00-011-000// default:break; } } /********************主函数******************/ void main() { Init(); LcdReset(); DisplayListChar(0,0,"All Black:",10); DisplayListChar(0,1,"Flag num:",9); /////////////////////换车道后循迹//////////////////////////////// while(flag1!='2') //00111000用中间三位判断是否全黑 { if((P2&0x38)==0x38) //进入后跳出 { flag1++; Buzzer(100); DispOneChar(10,0,flag1); } road_status=(P2 & 0x38); //00111000用高1~3位循迹 RoadTrack_for_middle(road_status); } /*while((P2 & 0x38)!=0x38) //00111000用中间三位判断是否全黑 { //进入后跳出 road_status=(P2 & 0x38); //00111000用高1~3位循迹 RoadTrack_for_circle(road_status); }*/ Stop(); Buzzer(100); DelayMs(1100); GoLeft(20,20); DelayMs(350); Buzzer(100); Stop(); DelayMs(1100); while((P2&0x40)!=0x40) //11100000用左起第2个检测T字 { road_status=(P2 & 0x38); //01110用高1~3位循迹 RoadTrack_for_circle(road_status); } Buzzer(100); GoHead(12,12); DelayMs(200); GoRight(15,15); DelayMs(700); /*while(flag2!=5) { if((P2&0x40)==0x40) { flag2++; DispOneChar(11,1,a); //Buzzer(100); } if(flag2==0||flag2==1) { RoadTrack_for_middle(road_status); } else if(flag2==2) { GoLeft(12,12); DelayMs(250); if(flag2==3) { RoadTrack_for_circle(road_status); } } } */ Stop(); while(1); } void service_int0() interrupt 0 { EX0=0; b++; DispOneChar(10,1,b); Buzzer(100); GoHead(12,12); DelayMs(200); EX0=1; }
评论
    相关推荐