1、实验目的:
利用stc8a8k的内置硬件PWM,这里用到P20,P21产生PWM,调节占空比,调小车速度;
熟悉按键和IO口的读取功能;
2、实现效果,
按下按键开始,两秒后,小车启动,然后循迹,到达2终点,达到以1为起点,2为终点,在2地方调头,然后继续循迹的功能。

3、接线:
(1)5个循迹模块
循迹模块不拘于其他型号,循迹就行。
从左边都右边,名字是L1S,意思是左边第一个传感器,left1sensor.
L1S–L0S–MS–R0S–R1S
分别接到
P10–P11–P12–P13–P14

(2)小车的电机接线
接驱动模块的输出端
1)左边轮子的两根线:接
AO2 AO1,
调速线用P20
P04----AIN2
P05----AIN1

,电路板原理图,看原理图,已连接;
2)右边轮子的两根线:接
BO2 BO1,调速用P21,
P06—BIN1
P07----BIN2
电路板原理图已连接,看原理图;

3)VM和VCC用跳线帽短接;给电机使用
(3)电源接线
外面电源大于5V。
电池正极----INPOWER
电池负极----GND
通过7805降压模块,降到5V,给单片机的电压。
(4)屏幕,直插到对应排母端口;
(5)下载器,插到对应的下载端口。
(6)按键,根据自己喜欢进行接线,这里用的是连接到P34的那个按键。

4、编程思路:
(1)测试PWM是不是正常,可以调节占空比;
(2)调试的时候,如果电机的正转、反转和我们的程序设定的不一样,那么可以对换两根电机的线,比如电机线A接到AO2,电机线B接到AO1,那么就对换一下,A接到AO1,B接到AO2。
(3)流程图:

(3)测试程序1

//*****************************************************************************************************下面是主函数
//*******************************************主函数
void main()
{//每个外设,比如按键,屏幕,PWM等内部资源的初始化,配置一下环境OLED_Init();HPWM_Init();OLED_ShowString(0,0,"Press Start,Please...");  delay_tms(100);//*********************************************正式执行程序while(1){   //*****************************//检测按键是不是按下,开始启动if(key==0){delay_tms(10);//延时去抖动if(key==0){   startflag=1;OLED_ShowString(0,0,"I am running,GO,GO...");    stop();delay_tms(2000);//延时,按下两秒之后,小车开始启动进行循迹}   }       //**********************如果开始标记等于1,说明按下启动键,这时候小车才开始跑if(startflag==1){//开始循迹,请看这部分代码,太长了,单独拉出来写,方便看主程序逻辑 qianjin(vturnsmallM,vturnbigM);//左da转弯,转到碰到中线停止delay_tms(2000);stop();delay_tms(2000);//延时,按下两秒之后,小车开始启动进行循迹qianjin(vturnsmall,vturnbig);//左da转弯,转到碰到中线停止delay_tms(2000);stop();delay_tms(2000);//延时,按下两秒之后,小车开始启动进行循迹//开始循迹,请看这部分代码,太长了,单独拉出来写,方便看主程序逻辑 qianjin(vturnbigM,vturnsmallM);//左da转弯,转到碰到中线停止delay_tms(2000);stop();delay_tms(2000);//延时,按下两秒之后,小车开始启动进行循迹qianjin(vturnbig,vturnsmall);//左da转弯,转到碰到中线停止delay_tms(2000);stop();delay_tms(2000);//延时,按下两秒之后,小车开始启动进行循迹//  trackline0();   }}
}

测试是不是能够正常大转弯,小转弯,直接行走

最后程序2

#include<stc8a8k.h>
#include<oled.h>
#include<delay.h>
#include "hpwm.h"
//***************************************************************************下面是接线定义
//左电机
sbit LPWM=P2^0;//电机调节速度的信号
sbit LA2=P0^4;
sbit LA1=P0^5;
//右电机
sbit RPWM=P2^1;
sbit RA2=P0^6;
sbit RA1=P0^7;
//接传感器
sbit L1S=P1^0;
sbit L0S=P1^1;
sbit MS=P1^2;
sbit R0S=P1^3;
sbit R1S=P1^4;
//*************************************
sbit key=P3^4;//接按键
sbit beep=P0^3;//接蜂鸣器
sbit led=P0^0;//接LED报警灯//****************************************************************************下面是全局变量的定义,每个函数都能使用
//定义黑白线的信号,根据实际模块定义,1是高电平,0是低电平,后面如果换模块,
//不同模块的情况不一样,有些是碰到黑线是1,有些是0,就很容易修改
unsigned char blackline=1;
unsigned char whiteline=0;
unsigned char startflag=0;
//这里定义变量,后面如果小车需要调节速度,比较方便修改,直接改这里就好了。
float vleftmove=0.4;
float vrightmove=0.4;//直线行走的速度float vturnbig=0.55;
float vturnsmall=0.25;//转弯的速度差速度,一个是大,一个小,小转弯差速度float vturnbigM=0.75;
float vturnsmallM=0.1;//转弯的速度差速度,大转弯差速度
//**************************************************************************************************下面是子函数的定义、或者声明
//循迹函数声明,先声明后定义,不然main都不知道有这个函数,在main函数后面定义具体程序代码
//****************************************************************子函数0:函数声明;void trackline0();
void trackline0();
//****************************************************************子函数1:qianjin(float vleft,float vright)
//这个是定义,不声明,后面main函数可以直接用,
//小车前进,根据速度两个轮子速度差,进行前进,转弯等
void qianjin(float vleft,float vright)
{HPWM_Set(0,8000,vleft);LA2=1;LA1=0;HPWM_Set(1,8000,vright);RA2=1;RA1=0;}
//****************************************************************子函数2:void back(float vleft,float vright)
//小车后退程序,一个轮子正转,一个反转
void back(float vleft,float vright)
{HPWM_Set(0,8000,vleft);LA2=0;LA1=1;HPWM_Set(1,8000,vright);RA2=1;RA1=0;}
//****************************************************************子函数3:void stop()
//小车停止
void stop()
{ LA2=0;LA1=0;RA2=0;RA1=0;
}
//*****************************************************************************************************下面是主函数
//*******************************************主函数
void main()
{//每个外设,比如按键,屏幕,PWM等内部资源的初始化,配置一下环境OLED_Init();HPWM_Init();OLED_ShowString(0,0,"Press Start,Please...");  delay_tms(100);//*********************************************正式执行程序while(1){   //*****************************//检测按键是不是按下,开始启动if(key==0){delay_tms(10);//延时去抖动if(key==0){   startflag=1;OLED_ShowString(0,0,"I am running,GO,GO...");    stop();delay_tms(2000);//延时,按下两秒之后,小车开始启动进行循迹}   }       //**********************如果开始标记等于1,说明按下启动键,这时候小车才开始跑if(startflag==1){//开始循迹,请看这部分代码,太长了,单独拉出来写,方便看主程序逻辑 trackline0();   }}
}//***********************************下面是前面声明的函数的定义
//**************************************************************//函数定义trackline0();
//**************************************************************功能:按键循迹;
void trackline0()
{//+++++++++++++++++++++++++++++++++++++++++++++++++++++++第1种情况if(L1S==blackline &&L0S==whiteline  && MS==whiteline && R0S==whiteline&& R1S==whiteline)//1 0 0 0 0 {qianjin(vturnsmallM,vturnbigM);//左da转弯,转到碰到中线停止while(1){if(MS==blackline)break;}}
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++第2种情况else if(L1S==whiteline &&L0S==blackline  && MS==whiteline && R0S==whiteline&& R1S==whiteline)//0 1 0 0 0 {qianjin(vturnsmall,vturnbig);//左xiao转弯}
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++第3种情况else if(L1S==whiteline &&L0S==whiteline  && MS==blackline && R0S==whiteline&& R1S==whiteline)//00 1 0 0 {qianjin(vleftmove,vleftmove);//直走}
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++第4种情况   else if(L1S==whiteline &&L0S==whiteline  && MS==whiteline && R0S==blackline&& R1S==whiteline)//0 0 0 1 0 {qianjin(vturnbig,vturnsmall);//左xiao转弯vturnbig vturnsmall}
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++第5种情况else   if(L1S==whiteline &&L0S==whiteline  && MS==whiteline && R0S==whiteline&& R1S==blackline)//1 0 0 0 0 {qianjin(vturnbigM ,vturnsmallM);//左da转弯vturnbigM  vturnsmallM,碰到黑线,不然一直大转弯while(1){if(MS==blackline)break;}}
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++第6种情况   else    if(L1S==blackline && L0S==blackline && R0S==whiteline )//11x00 判断是左转90度{stop();delay_tms(500);qianjin(vturnsmall,vturnbig);//左转弯delay_tms(100);while(1){      if(R0S==blackline)break;} }
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++第7种情况else   if( L1S==whiteline &&L0S==whiteline &&R0S==blackline && R1S==blackline)//00x11 判断是右转90度{stop();delay_tms(1000);qianjin(vturnbig,vturnsmall);//delay_tms(10);while(1)         { if(L0S==blackline)break;}}
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++第8种情况else   if(L1S==blackline &&L0S==blackline&& MS==blackline && R0S==blackline)//1111x 判断是终点,调头{qianjin(vleftmove,vleftmove);delay_tms(500);stop();delay_tms(1000);back(vleftmove,vleftmove);delay_tms(500);while(1)//如果中间的传感器碰到黑线,就跳出循环{        if(MS==blackline)break;      }}
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++第9种情况   这是极端情况,放在最后面判断else   if(L1S==whiteline &&L0S==whiteline && MS==whiteline && R0S==whiteline && R1S==whiteline)//000找不到直线,如如果前面是直走,就转360度,如果是之前右边,就左转,之前左偏,就右转{qianjin(vturnbig,vturnsmall);//}}

stc8a循迹小车程序编写实验:完成循迹功能,包括直角转弯,以及调头相关推荐

  1. RISC_V循迹小车程序(自用)

    RISC_V循迹小车程序 C程序 C程序 因为用的时perfv已经集成好的IDE,里面H文件已经包含好了,所以只有C. 位置在E:\project\car_1\car_1\src /********* ...

  2. arduino黑线循迹小车程序_循迹小车:给我一条线,我能自己走完全程

    在老少通吃的智能小车到底是什么呢?科普来喽!一文中,我们介绍了智能小车的分类及组成,为什么循迹小车能够追踪黑线轨迹呢? 智能小车在画有黑线的白纸 "路面"上行驶,由于黑线和白纸对光 ...

  3. 循迹小车程序编程_电子编程?其实很容易!

    7月17日至18日,重庆大学分营第八组的部分成员在重庆大学A区第八教学楼参加了"科创生活之初体验"活动.在老师的指导下,营员们拼接电子硬件,使用智能电子编程软件完成了呼吸灯.调速风 ...

  4. 计算机脚本程序编写,实验三-shell脚本程序设计.docx

    实验报告 课程名称 Linux 系统实践 实验项目LINUX SHELL脚本程序设计 实验仪器PC 系别计算机学院 专业网络工程 班级 / 学号 网 1702/2017011463 学生姓名孟启贤 实 ...

  5. 51“motorrr”寻迹小车学习1电机和寻迹模块

    目录 一 硬件 二 软件 前几天完成了寻迹小车的电机和寻迹模块的学习,这里板子用的是51最小系统板. 一 硬件 电机驱动模块L298N 和 寻迹模块 其实也没什么,pwm控制速度再加上寻迹模块,主要是 ...

  6. 简单循迹小车实验心得_新人刚刚接触单片机,求教一个简单的循迹小车程序(实在看不懂)...

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 程序如下: #include #define uint unsigned int #define uchar unsigned char sbit P10 ...

  7. 步进电机麦轮小车程序编写

    0.工程模板 复制<ALIENTEK MiniSTM32 实验1 跑马灯>到桌面,同时将源码中的BALANCE/HARDWARE全部复制到工程目录下,添加.c到相应目录和.h的路径/在sy ...

  8. 循黑线程序c语言,51单片机舵机循黑线小车程序

    #include sbit pwm = P2^0;    //定义舵机p20 sbit ENA = P3^6;   //定义驱动模块 sbit ENB = P3^7;   // sbit IN1 = ...

  9. 无人机寻迹要两个单片机吗_单片机寻迹小车程序

    雨非. 2018.03.28 采纳率:38%    等级:32 已帮助:17万人 占空比 占空比是指脉冲信号的通电时间与通电周期之比.在一串理想的脉冲周期序列中(如方波),正脉冲的持续时间与脉冲总周期 ...

  10. STM32、51循迹小车 【STM32入门控制必会 含51全部程序】

    目录 前言 方案设计 逻辑分析 程序编写 C51程序-模块化便于移植 STM32程序 添加串口程序变身STM32遥控小车 结语 前言 故事的由来的从给学弟学妹门辅导一次单片机综合实验课开始,由于笔者比 ...

最新文章

  1. +7白盒测试与黑盒测试的定义与区别
  2. F2etest+UIRecorder(录制脚本)【2】
  3. 计算机在机电一体化应用论文2000字,机电一体化论文3000字范文参考(5)
  4. 使用CreateProcess函数运行其他程序
  5. ACM题目————A simple problem
  6. Bootstrap按钮支持的元素
  7. 用9种办法解决 for 循环取 i
  8. Git 基础(六)—— 工作区和暂存区与 Git 对修改的管理
  9. Taking a serious look at grids
  10. DCMM GBT 36073-2018 数据管理能力成熟度评估模型(Word版)
  11. 第三届长安杯检材一复盘
  12. ps切图后 JAVA开发_PS切图工具
  13. java性能调优_Java性能调优常用手段
  14. [R语言] R语言快速入门教程
  15. 小米手环6NFC iphone添加门禁卡
  16. 微商模式的出路在哪里?
  17. 常用指令linux总结
  18. ef core连接Oracle数据库
  19. 原生js实现点名册效果
  20. LeetCode135. 分发糖果(贪心算法)

热门文章

  1. 将json文件格式转化成Excel表格形式
  2. Iptables 指南
  3. pytorch可视化实例:gradcam在resnet18上的应用(快餐式代码教程)
  4. 计算机应用基础教程学什么,[电脑基础知识]计算机应用基础教程学习.ppt
  5. 【Kilav】数据库知识点速通 其二
  6. Mac-录屏软件-视频转gif动图
  7. kitti数据集label解析和可视化教程
  8. 每天一点matlab——字符分割
  9. lammps数据后处理:Python Ovito 统计键长分布
  10. 基于微信小程序的考勤打卡系统