总结流程:
1.对每个引脚位定义,后面好用
2.宏定义了红外传感器的2个引脚对应的名字
3.宏定义小车的速度speed,方便后期修改
4.对左右电机的pwm分别进行了宏定义
5.宏定义小车左右2个电机的转动方向
6.定义左右电机pwm_value用来调控电机的转速,设置drive_value用来接接收小车的speed
7.设置延时函数方便后期调用,设置小车行驶方式函数(以左转为例实际上就是让drive_value=speed,然后调用相应的宏定义,让左边电机向前或者向后转),注意以左边电机为例:实际上每个电机由3个引脚共同控制,假设px_1对应前转,px_2对应后转, px_3对应pwm,那么速度加实际上是pwm=1,速度会一直加,而px_1和px_2控制的是准备往前还是往后转。
8.设置电机pwm调节函数,这个函数由定时器0中断函数调用,函数内容是设置对应电机判断pwm_value是否大于dirve_value,如果pwm_value>drive_value就把对应电机的pwm置为0,如果pwm_value<drive_value就把对应电机的pwm置为1;并且在后续会判断pwm_value是否大于20,是就把pwm_value置为0从同再来;实际上就是控制pwm为0和为1的占用时间
9.设置定时器初始化函数。TMOD设置工作模式,TH0,TL0设置定时间隔;TR0置为1开始定时器0计数,ET0置为1开启定时器0中断,EA置为1开启总中断;
10,设置定时器0中断函数,每次中断pwm_value++;然后调用pwm调节函数,控制小车速度;

#include <reg51.h>
//位定义
sbit P1_2=P1^2;
sbit P1_3=P1^3;
sbit P1_4=P1^4;
sbit P1_5=P1^5;
sbit P1_6=P1^6;
sbit P1_7=P1^7;
sbit P3_3=P3^3;
sbit P3_4=P3^4;
sbit P3_7=P3^7;
//宏定义
#define uchar unsigned char
#define uint  unsigned int
//左右红外传感器引脚
#define Left_IRSenor_Track   P3_4
#define Right_IRSenor_Track  P3_3
//速度值和左右电机PWM输入引脚
#define SPEED              10     //速度值0-20
#define Left_Motor_PWM     P1_4
#define Right_Motor_PWM    P1_5
//左右车轮运动方向
#define Left_Motor_Go      {P1_2=0,P1_3=1;}
#define Left_Motor_Back    {P1_2=1,P1_3=0;}
#define Left_Motor_Stop    {P1_2=0,P1_3=0;}
#define Right_Motor_Go     {P1_6=1,P1_7=0;}
#define Right_Motor_Back   {P1_6=0,P1_7=1;}
#define Right_Motor_Stop   {P1_6=0,P1_7=0;}
//左右电机PWM值调节变量
unsigned char Left_PWM_Value=0;
unsigned char Left_Drive_Value=0;
unsigned char Right_PWM_Value =0;
unsigned char Right_Drive_Value=0;
bit Left_moto_stop =1;//注意这里是小写,和上面的Left_Motor_Stop 区分;在这篇代码中用处就是实现if(1)判断
bit Right_moto_stop=1;
//毫秒延时
static int len = 0;
bit flag = 1;
void delay_ms(unsigned int n)
{unsigned int i,j;for(i=n; i>0; i--)for(j=114; j>0; j--);
}
//机器人向前行驶
void GoForward(void)
{Left_Drive_Value=SPEED;     Right_Drive_Value=SPEED;  Left_Motor_Go;   Right_Motor_Go;
}
//机器人向左转
void GoLeft(void)
{            Left_Drive_Value=SPEED;   Right_Drive_Value=SPEED; Right_Motor_Go; Left_Motor_Back;
}
//机器人向右转
void GoRight(void)
{ Left_Drive_Value=SPEED;   Right_Drive_Value=SPEED;  Left_Motor_Go;    Right_Motor_Back;
}
//机器人停止运行
void Stop(void)
{    Left_Motor_Stop;    Right_Motor_Stop;
}
//调节左电机转速函数
void Left_Motor_PWM_Adjust(void)
{  if(Left_moto_stop){if(Left_PWM_Value<=Left_Drive_Value){Left_Motor_PWM=1;}else {Left_Motor_PWM=0;} if(Left_PWM_Value>=20)Left_PWM_Value=0;}else    {Left_Motor_PWM=0;}
}
//调节右电机转速函数
void Right_Motor_PWM_Adjust(void)
{ if(Right_moto_stop){ if(Right_PWM_Value<=Right_Drive_Value){Right_Motor_PWM=1;}else {Right_Motor_PWM=0;}if(Right_PWM_Value>=20)Right_PWM_Value=0;}else    {Right_Motor_PWM=0;}
}void cont(){delay_ms(1);if(Left_IRSenor_Track==1&&Right_IRSenor_Track==1)       flag = !flag;GoForward();}void cont_number(void){len++;while(1){if(!(Left_IRSenor_Track==1&&Right_IRSenor_Track==1)){         flag = !flag;break;}}}//机器人采集红外循迹传感器数据控制电机智能循迹运行
void Track(void)
{if(Left_IRSenor_Track==0&&Right_IRSenor_Track==0){   GoForward();}if(Left_IRSenor_Track==0&&Right_IRSenor_Track==1)    {                    GoRight();}if(Left_IRSenor_Track==1&&Right_IRSenor_Track==0) {                     GoLeft();}if(Left_IRSenor_Track==1&&Right_IRSenor_Track==1){GoForward(); delay_ms(9);cont();//}
}
//定时器0初始化
void TIMER0_Init(void)
{TMOD=0x01; TH0=0xFC;  TL0=0x18;         TR0=1;     ET0=1;    EA=1;
}
//智能循迹沿黑线前进
void main(void)
{unsigned char i=0; P1=0xF0;   //关电机//机器人按键启动         while(1)   {if(P3_7!=1){delay_ms(50);if(P3_7!=1) break;}}delay_ms(50);   TIMER0_Init();     while(1){ while(flag == 1)Track();while(flag == 0)cont_number();//计数if(len == 9){while(1){Stop();}        }delay_ms(1);}
}
//定时器0中断函数完成PWM对电机速度调节
void TIMER0_IRQHandler(void) interrupt 1 using 2
{TH0=0xFC;TL0=0x18;Left_PWM_Value++; Right_PWM_Value++;Left_Motor_PWM_Adjust();Right_Motor_PWM_Adjust();
}

c51单片机小车代码解释相关推荐

  1. 【C51】基于C51单片机的定时闹钟(含代码,电路,拿走即可用)

    基于C51单片机的定时闹钟 上电后设置定时时间,按键1选择设置的是小时分钟还是秒钟 按键2对其进行具体的数字设置 一次选择完成之后就默认进入计时模式 达到计时时间后响铃 按键3可以关闭响铃 代码 #i ...

  2. 写一段51单片机的避障小车代码

    以下是一段使用51单片机编写的避障小车代码: #include <reg51.h>sbit LeftSensor = P3^0; sbit RightSensor = P3^1; sbit ...

  3. proteus8单片机c语言仿真教程,入门学习Proteus 8仿真软件以及C51单片机的LED点亮(C语言)——实例...

    入门学习Proteus 8仿真软件以及C51单片机LED的点亮(C语言)--实例 一.点亮LED的程序编译 1.打开Keil uVision 4新建一个工程 2.在Atmel下寻找AT89C52芯片并 ...

  4. C51单片机数码管动态显示

    数码管作为最廉价的输出设备,在各种自动化设备中有很大的应用,最简单普通的显示方式为动态刷新显示,称为假动态显示,即通过分时扫描每一位,利于人眼的视觉停留现象,造成一种静态显示的效果,如下图所示: C5 ...

  5. 基于C51单片机的万年历设计(LCD1602显示)

    C51单片机万年历设计 注:该程序基于普中科技C51 V2.2开发板设计,库函数和硬件资料均来自普中科技,侵删.main.c大部分为原创,如有雷同,纯属巧合. 名称:C51万年历. 硬件:以C51芯片 ...

  6. c51单片机万年历模拟,12864LCD屏显示实时温度与时间

    前言 c51单片机万年历模拟期末作品,用到了温度传感模块及12864液晶显示模块及矩阵键盘模块及复位电路,电源模块,晶振模块,可在12864屏上显示实时温度与时间,本人自己做的期末作品,仅供同学们研究 ...

  7. 按键控制c51单片机驱动unl2003控制步进电机正反转停止及程序调速-萌新入门

    ** 按键控制c51单片机驱动unl2003控制步进电机正反转停止及程序调速 ** 分享一个萌新入门小工程 一.原件连接: 第一种直接用51开发板 第二种用最小单元加unl2003驱动 二.开发板电路 ...

  8. C51单片机的电子时钟(数码管显示)

    C51单片机的电子时钟 硬件环境: 相关开发板原理图解析 正式代码: 效果预览图 硬件环境: 普中科技51单片机开发板STC89C52 相关开发板原理图解析 查看这两个原理图,我们可以发现控制这8个数 ...

  9. 单片机复位后为什么要对sp重新赋值_单片机常用名词解释与常用逻辑电路

    MCS-51系列单片机 MCS-51系列单片机分为两大系列,即51子系列与52子系列. 51子系列:基本型,根据片内ROM的配置,对应的芯片为8031.8051.8751.8951 52子系列:增强型 ...

  10. 初识C51单片机(详解)

    前言: 单片机是一种我们常见的开发板,我们经常会在一些项目中使用到它.而今天我们要介绍的是C51单片机,下面来介绍一下今天的"主角":STC89C52RC40I-LQFP44单片机 ...

最新文章

  1. os-cocos2d游戏开发基础-进度条-开发笔记
  2. python贴吧发帖脚本-Python实现自动添加脚本头信息的示例代码
  3. 大连大学计算机科学与技术考研真题,2016年大连大学计算机科学与技术数据库系统原理复试笔试最后押题五套卷...
  4. 能源结构进入变革时代 光伏业趋于壮大转型
  5. BugkuCTF-社工
  6. oracle alter_log,在线查看alter.log文件内容
  7. leetcode206题:反转链表(迭代或是递归)
  8. linux中打开gif图片命令,在Linux终端中安装使用Gifski创建GIF动图
  9. 增强for循环:本质是迭代器
  10. 互联网的大厂就那么几家,所以很多员工跳槽后都是互相流动的
  11. 使用PostgreSQL进行中文全文检索
  12. Dll学习心得(2)
  13. 查询子串_你知道什么是 MySQL 的模糊查询?
  14. paip.c++ tree parse tpath解析器
  15. gitlab syntax highlighting theme
  16. 厦门大学林子雨老师大数据实验环境搭建索引
  17. 大数据第一季--Hadoop(day1)-徐培成-专题视频课程
  18. 二、C语言基本数据类型全解和基本的数据存储方式
  19. Docker 之 高级篇(应用复杂安装、DockerFile、Docker网络、Docker-compose、可视化工具)
  20. “云上贵州”大赛完整诠释大数据三大业态

热门文章

  1. oracle数据库sql语句插入时间信息
  2. 记录如何卸载 Adobe 应用【Adobe Creative Cloud Cleaner Tool使用】
  3. echarts柱状图实现重叠
  4. 4.2 制定项目章程
  5. 永磁同步电机MTPA与id=0的控制原理
  6. 产业互联网周报:中国移动:择时分拆业务上市;金山云CEO王育林辞职;谷歌负面缠身,数据中心爆炸又遭罚款...
  7. 《业务测试》手机号码格式
  8. R语言数据分析及可视化实战
  9. 一键实现自动化部署(灰度发布)实践
  10. 第5章 软件质量标准概述