基于STC8G2K64S4单片机控制小车循迹

#前言

本文从硬件和软件两方面介绍了使用STC8G2K64S4单片机控制舵机的方法,并使用步进电机和直流电机来举例说明

之前说讲了如何用STC8G2K64S4单片机控制步进电机和直流电机,这次就是说用这两种电机来控制小车结合循迹模块来实现循迹,这也是一个在学习51单片机过程中的一个很基础的例程

硬件方面

步进电机和直流电机可参考我写的两外两篇文章,基于STC8G2K64S4单片机控制步进电机和 基于STC8G2K64S4单片机控制直流电机,这里就不多介绍了

要完成小车循迹任务,必不可少的就是光敏传感器,这里我用的是单数字量灰度传感,所以当传感器检测到黑色时输出“1”,检测到白色是输出“0”

黑色    i=1;
白色    i=0;

当检测红黄蓝这些颜色时需要调整电位器来控制输出,电位器的准确度也是很重要的,避免后期出现漏判误判。光敏传感器的高度也有一定的影响,只要在他的高度范围内就可以。高度范围一般在某宝买的时候下面商品详情都有

软件方面

这里两种电机控制方法也可以参考基于STC8G2K64S4单片机控制步进电机和 基于STC8G2K64S4单片机控制直流电机这两篇文章

我是用了双路的循迹,也就是两个光敏传感器。对我来说这样足以循迹也相对稳定,如果觉得不稳定的话也可以用四路。双路循迹原理是当两个光敏同时检测到黑色是,小车前进;当左边检测到白色时,意思小车向左偏,则需左边轮子加速或者右边轮子减速即可;当右边检测到白色时,意思小车向右偏,则需右边轮子加速或者左边轮子减速即可

if G1==1&&G2==1    GO
if G1==0&&G2==1    turn right
if G1==1&&G2==0    turn left

在设计程序时由于地纸是方格所以我就写的按格数行进,给多少变量走几格。记格是通过行进方向两边的光敏传感器实现,当两边传感器检测到黑线时格数加一

#步进电机

正常行驶代码:

#include "headfile.h"//sbit P36        //定义P36为左后电机使能端
//sbit P06        //定义P06为右前电机使能端
//sbit P07        //定义P07为右前电机pwm输出端
//sbit P37        //定义P37为左后电机pwm输出端
//sbit P33        //定义P33为左侧光光敏
//sbit P32        //定义P32为右侧光光敏void init_all()
{pwm_init(PWM0_P07, 0, 0);pwm_init(PWM1_P37, 0, 0);
}void go()
{   P36=1;P06=0;        //两个电机方向使能while(1){   if(P33==1&&P32==1){pwm_freq(PWM0_P07, 5000, 5000);        //右前电机正常速度pwm_freq(PWM3_P37, 5000, 5000);        //左后电机正常速度} if(P33==1&&P32==0){pwm_freq(PWM0_P07, 5000, 5000);        //右前电机正常速度pwm_freq(PWM3_P37, 4000, 5000);        //左后电机减速} if(P33==0&&P32==1){pwm_freq(PWM0_P07, 4000, 5000);        //右前电机减速pwm_freq(PWM3_P37, 5000, 5000);        //左后电机正常速度}        }
}void main()
{DisableGlobalIRQ();        //关闭总中断board_init();            //初始化内部寄存器,勿删除此句代码。init_all();EnableGlobalIRQ(); //开启总中断while(1){go();        }
}       

记格数行驶代码:

#include "headfile.h"unsigned int i,j;
//sbit P36        //定义P36为左后电机使能端
//sbit P06        //定义P06为右前电机使能端
//sbit P07        //定义P07为右前电机pwm输出端
//sbit P37        //定义P37为左后电机pwm输出端
//sbit P20        //定义P20为检测黑线记格数用光敏
//sbit P33        //定义P33为左侧光光敏
//sbit P32        //定义P32为右侧光光敏void init_all()
{pwm_init(PWM0_P07, 0, 0);pwm_init(PWM3_P37, 0, 0);
}void go_forward(i)       //定义变量i为格数
{   j=0;P36=1;P06=0;        //两个电机方向使能while(1){if(P20==1&&j!=i)        //两边光敏检测黑线并计数{j++;pwm_freq(PWM0_P07, 4000, 5000);        //右前电机低速pwm_freq(PWM3_P37, 4000, 5000);        //左后电机低速pca_delay_ms(500);        //延时度过黑线 }if(P33==1&&P32==1){pwm_freq(PWM0_P07, 5000, 5000);        //右前电机正常速度pwm_freq(PWM3_P37, 5000, 5000);        //左后电机正常速度} if(P33==1&&P32==0){pwm_freq(PWM0_P07, 5000, 5000);        //右前电机正常速度pwm_freq(PWM3_P37, 4000, 5000);        //左后电机减速} if(P33==0&&P32==1){pwm_freq(PWM0_P07, 4000, 5000);        //右前电机减速pwm_freq(PWM3_P37, 5000, 5000);        //左后电机正常速度} if(P20==1&&i==j) break;        //当检测到黑线并格数记完退出循环}pwm_freq(PWM0_P07, 0, 0);        //右前电机停止pwm_freq(PWM3_P37, 0, 0);        //左后电机停止
}void main()
{DisableGlobalIRQ();        //关闭总中断board_init();            //初始化内部寄存器,勿删除此句代码。init_all();EnableGlobalIRQ(); //开启总中断while(1){go_forward(2);        //向前前进两格}
}       

#直流电机

正常行驶代码:

#include "headfile.h"//sbit P15,P16    //定义P15 P16为右前电机方向使能端
//sbit P35,P36    //定义P35 P36为左后电机方向使能端
//sbit P07        //定义P07为右前电机pwm输出端
//sbit P37        //定义P37为左后电机pwm输出端
//sbit P33        //定义P33为左侧光光敏
//sbit P32        //定义P32为右侧光光敏void init_all()
{pwm_init(PWM0_P07, 0, 0);pwm_init(PWM3_P37, 0, 0);
}void go()
{   P15=1;P16=0;        //右前电机方向使能P35=1;P36=0;        //左后电机方向使能while(1){   if(P33==1&&P32==1){pwm_duty(PWM0_P07, 5000, 5000);        //右前电机正常速度pwm_duty(PWM3_P37, 5000, 5000);        //左后电机正常速度} if(P33==1&&P32==0){pwm_duty(PWM0_P07, 5000, 5000);        //右前电机正常速度pwm_duty(PWM3_P37, 4000, 5000);        //左后电机减速} if(P33==0&&P32==1){pwm_duty(PWM0_P07, 4000, 5000);        //右前电机减速pwm_duty(PWM3_P37, 5000, 5000);        //左后电机正常速度}        }
}void main()
{DisableGlobalIRQ();        //关闭总中断board_init();            //初始化内部寄存器,勿删除此句代码。init_all();EnableGlobalIRQ(); //开启总中断while(1){go();        }
}       

记格数行驶代码:

#include "headfile.h"unsigned int i,j;
//sbit P15,P16    //定义P15 P16为右前电机方向使能端
//sbit P35,P36    //定义P35 P36为左后电机方向使能端
//sbit P07        //定义P07为右前电机pwm输出端
//sbit P37        //定义P37为左后电机pwm输出端
//sbit P20        //定义P20为检测黑线记格数用光敏
//sbit P33        //定义P33为左侧光光敏
//sbit P32        //定义P32为右侧光光敏void init_all()
{pwm_init(PWM0_P07, 0, 0);pwm_init(PWM3_P37, 0, 0);
}void go_forward(i)        //定义变量i为格数
{   j=0;P15=1;P16=0;        //右前电机方向使能P35=1;P36=0;        //左后电机方向使能while(1){if(P20==1&&j!=i)        //两边光敏检测黑线并计数{j++;pwm_duty(PWM1_P07, 4000);        //右前电机低速 pwm_duty(PWM3_P37, 4000);        //左后电机低度pca_delay_ms(500);        //延时度过黑线 }if(P33==1&&P32==1){pwm_duty(PWM0_P07, 5000, 5000);        //右前电机正常速度pwm_duty(PWM3_P37, 5000, 5000);        //左后电机正常速度} if(P33==1&&P32==0){pwm_duty(PWM0_P07, 5000, 5000);        //右前电机正常速度pwm_duty(PWM3_P37, 4000, 5000);        //左后电机减速} if(P33==0&&P32==1){pwm_duty(PWM0_P07, 4000, 5000);        //右前电机减速pwm_duty(PWM3_P37, 5000, 5000);        //左后电机正常速度}if(P20==1&&i==j) break;        //当检测到黑线并格数记完退出循环}pwm_duty(PWM1_P07, 0);        //右前电机停止pwm_duty(PWM3_P37, 0);        //左后电机停止
}void main()
{DisableGlobalIRQ();        //关闭总中断board_init();            //初始化内部寄存器,勿删除此句代码。init_all();EnableGlobalIRQ(); //开启总中断while(1){go_forward(2);        //向前前进两格        }
}       

在检测黑线时延迟是为了同一根黑线不检测两次,给一段延时在度过黑线后再继续检测黑线。代码中的库函数为逐飞库函数

本人小白,有问题交流讨论,虚心受教

基于STC8G2K64S4单片机控制小车循迹(直流电机和步进电机)相关推荐

  1. 基于51单片机智能小车循迹功能的实现

    基于51单片机智能小车循迹功能的实现 目录 基于51单片机智能小车循迹功能的实现 一.思路(仅供参考) 二.部分硬件模块介绍 1.L298n电机驱动模块 2.两路红外循迹模块 三.实现 1.代码 2. ...

  2. 【C51开发应用】基于C51单片机开发的循迹灭火机器人

    基于C51单片机开发的循迹灭火机器人 一.作品摘要 二.系统设计步骤 三.方案设计 3.1   小车主体设计 3.1.1   购买玩具小车进行改装 3.1.2   自己设计小车主体结构 3.2   电 ...

  3. 基于51单片机的红外循迹小车

    在前面(废话):金沙滩的板子入门51单片机,有幸见过学长的各种小车视频,亿点点羡慕,于是在期末考试前计划寒假上手尝试,刚好学校社团又有比赛 材料: 小车套件(包含底盘,轮子,减速电机,若干铜柱螺丝螺帽 ...

  4. 基于STC89c52rc单片机的红外循迹小车

    循迹小车 由于要准备明年的恩智浦飞思卡尔智能车比赛,飞思卡尔智能车用的是K60系列的单片机,以我目前的阶段来说还处于学习阶段,所以先试着用51单片机做一个智能循迹小车.学习一下小车硬件以及软件程序,这 ...

  5. 基于51单片机的红外循迹模块

    目录 循迹模块介绍及原理 部分程序 结合小车的全部程序 循迹模块介绍及原理 这里使用的四路循迹模块 部分端口介绍 主板的OUT1-4端分别连接单片机的IO口,用于检测输出电平 主板另一排针侧的VCC ...

  6. 基于51单片机实现红外循迹

    红外循迹外观: 红外循迹原理:         红外循迹模块原理还是很简单的,和许多光电传感器原理一样,当发射器发射出去的光被接收器接收到后,模块上对应的LED灯点亮,此时相应的输出引脚输出低电平:如 ...

  7. 51单片机智能小车循迹完整程序_电气与信息工程学院双创协会开展循迹小车培训...

    为培养青年学子创新意识和创新能力,激发勇于创新的主动性和积极性,营造良好科技创新氛围,10月29日至30日,电气与信息工程学院双创协会于一教609.三教102和三教202开展循迹小车培训,该培训由电子 ...

  8. 基于STC8G2K64S4单片机使用幻尔舵机控制板

    #前言 本文主要是讲解了如何使用STC8G2K64S4单片机二次开发使用幻尔舵机控制板 在官网给的资料里有使用方法,因为涉及到串口通讯,对于小白来说可能比较难懂 硬件方面 这块幻尔舵机控制板在淘宝店里 ...

  9. 【电路】基于单片机智能睡眠枕系统设计-基于单片机音乐喷泉制作设计-基于单片机智能温控风扇调速系统设计-基于单片机智能自动循迹小车控制系统设计-基于数字电路的4人投票系统设计(仿真,报告)毕设课设资料

    1620基于单片机智能睡眠枕系统设计-文档+PPT+PCB图+原理图+源码 智能睡眠枕主要由lcd屏幕.蓝牙.压力传感器.蜂鸣器.单片机等等组成,用户可通过四个独立按键进行操控(四个按键从左至右为1. ...

最新文章

  1. C# 如何实现pfx与snk密钥文件的转换
  2. No module named ‘sklearn.utils.linear_assignment_‘
  3. [转]VirtualBox下RedHat 5.4 使用DVD光盘作为yum源
  4. python随机生成100内的10个整数_用python随机生成数字教程_如何用Python编程随机产生10个随机整数,并输出这10个整数的和�9�3...
  5. java开发工程师工作内容怎么写
  6. 美图2019年财报发布:“高级订阅”收入亮眼 成为重要商业模式
  7. 使用k8s安装minio
  8. Web文件管理原码.rar
  9. vm驱动程序版本不正确_微软 Win10 版本 2004 获得新版 Intel/Nvidia 显卡驱动程序
  10. INADDR_ANY的确切含义
  11. PLSQL常用方法汇总
  12. logistics regression 线性不可分转换成线性可分
  13. 金三银四,是纵马一跃,还是稳如老狗!
  14. python3.6的新特性:f-strings格式化输出;python3.8新特性:f-strings增加了 = 说明符
  15. php模拟安卓端捉取数据,ios - PHP如何模拟安卓设备,请求API接口的数据
  16. 计算文件及字符串的VBS脚本
  17. DSO Framer ActiveX 控件
  18. web安全学习-sql注入-针对mysql的攻击
  19. PCIe(二)——TLP包构成
  20. matlab 矩阵 列 逆序,matlab对矩阵/向量的常用操作(拼接矩阵、向量逆序、改变矩阵形状、求行阶梯形矩阵、提取矩阵的一部分等)...

热门文章

  1. Unity常用设计模式之代理模式
  2. MapReduce 之一:MapReduce体系结构
  3. iOS面试备战-网络篇
  4. 计算机视觉(十六):目标检测概述
  5. QNAP-NAS外网访问——aliyun-ddns,docker,myqnapcloud
  6. [数据结构]线性表——顺序存储
  7. 核范数与规则项参数选择
  8. 8.编写程序,要求如下: 定义名为VolumeArea的抽象类,在其中定义圆周率的值为3.14159,并定义两个抽象方法volume(double r)和area(double r),它们的返回
  9. Oracle 内连接、左右连接、全外连接
  10. 基于知识图谱的多模内容创作技术