找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2536|回复: 4
打印 上一主题 下一主题
收起左侧

电子工艺实习:0基础智能循迹小车程序分享

[复制链接]
跳转到指定楼层
楼主
ID:399680 发表于 2018-9-18 19:37 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本人刚刚完成了两周的电子工艺实习,0基础完成了红外线智能循迹小车的设计。
分享源代码给大家,希望能对0基础新手有所帮助~
说明:此智能小车拥有五个传感器,在车头由左到右均匀分布,本文附件中最后的注释中详细分析了传感器信号的32种情况。
以下是源程序:
#include <reg52.h>
#define uchar unsigned char
//传感器
sbit left2 = P3^6;//左外
sbit left1 = P3^5;//左内
sbit middle = P3^4;//中间
sbit right1 = P3^3;//右内
sbit right2 = P3^2;//右外
// motoa 右车轮
sbit IN1 = P1^3;
sbit IN2 = P1^5;  
sbit ENA = P1^4;
//  motob 左车轮  
sbit IN3 = P1^2;
sbit IN4 = P1^0;  
sbit ENB = P1^1;   
//转弯标志
uchar data r=0;
uchar data l=0;
//计时
uchar data t=0;  

//延时函数
void Delay_ms(uint xms)       //延时程序,xms是形式参数
{                                       
uint i, j;
for(i=xms;i>0;i--)            // i=xms,即延时xms, xms由实际参数传入一个值
  for(j=115;j>0;j--);       //此处分号不可少
}
//中断服务函数
void timer0() interrupt 1   //定时器1溢出中断函数  
{
TH1=0XFC;      //重置定时器1初值
TL1=0X18;
t++;       //每一毫秒t2加一
if(t==6)  
  t=0;     //六毫秒为一周期为电机和数码管延时
if(P3^6==1&&P3^5==1) l=1;    //左侧探头探测到黑线
if(P3^3==1&&P3^2==1) r=1;    //右侧探头探测到黑线
}
//直行函数
void forward()
{
IN1=1;IN2=0;
IN3=1;IN4=0;
}
//右转函数
void turnright()
{
IN1=0;IN2=0;
IN3=1;IN4=0;
}
//左转函数
void turnleft()
{
IN1=1;IN2=0;
IN3=0;IN4=0;
}
//原地右转函数
void rturnback()
{
IN1=0;IN2=1;
IN3=1;IN4=0;
}
//原地左转函数
void lturnback()
{
IN1=0;IN2=1;
IN3=1;IN4=0;
}
//主函数
void main()
{  
TMOD=0X11;     //定时器工作模式设定   
IE=0X8A;     //允许定时器0,1溢出中断
TR1=1;      //定时器1运行
    TH1=0XFC;     //定时器1初值设定
TL1=0X18;
IN1=1;IN2=0;IN3=1;IN4=0;
    ENA=1;ENB=1;              //开始前进
while(1)  //死循环
{
  if(left2==0&&left1==0&&right1==1)
   {turnright();}//右转
     else if(left1==1&&right1==0&&right2==0)
   {turnleft();}//左转
  else if(left2==1&&left1==0&&middle==0&&right1==0&&right2==0)
   {lturnback();}//向左原地转弯
  else if(left2==0&&left1==0&&middle==0&&right1==0&&right2==1)
   {rturnback();}//向右原地转弯
  else if(left2==0&&left1==0&&middle==0&&right1==0&&right2==0&&r==1&&l==0)
   {lturnback();}//如果之前左侧探头检测到轨道则向左原地转弯
  else if(left2==0&&left1==0&&middle==0&&right1==0&&right2==0)
   { turnleft();
     if(left2==0&&left1==0&&middle==0&&right1==0&&right2==0&&r==1&&l==0) rturnback();
     else turnleft();
   }//如果之前右侧探头检测到轨道则向右原地转弯
  else {forward();}//前进
    }
}


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏2 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:338171 发表于 2018-9-19 08:54 | 只看该作者
看程序好像也不难
回复

使用道具 举报

板凳
ID:393577 发表于 2018-9-28 17:54 | 只看该作者
学习一下 思路
回复

使用道具 举报

地板
ID:130231 发表于 2018-9-28 21:27 | 只看该作者
可是你的延时函数没有用到,应当去掉,不然编译不成功
回复

使用道具 举报

5#
ID:267330 发表于 2018-9-29 09:38 | 只看该作者
看程序好像也不难
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表