难点:1、串口定时器T1,和T0定时器优先级

2、pwm频率与占空比的设置

按键控制

按键1——前进

按键2——后退

按键3——加速

按键4——减速

(板子上只有四个按键)

串口控制

‘1’——前进

‘2’——后退

‘3’——加速

‘4’——减速

‘5’——左转

‘6’——右转

源码:

#include <reg52.h>

typedef unsigned char u8;
typedef unsigned int u16;

//L298N引脚定义
sbit ena = P0^0;
sbit in1 = P0^1;
sbit in2 = P0^2;
sbit in3 = P0^3;
sbit in4 = P0^4;
sbit enb = P0^5;

//按键
sbit key1 = P3^3;    //模拟前进
sbit key2 = P3^4;         //模拟后退
sbit key3 = P3^6;         //模拟加速
sbit key4 = P3^7;   //模拟减速
 
u16 MA = 0,MB = 0;      //pwm控制用

u16 SpeedA = 20; //50%占空比
u16 SpeedB = 20;

u8 flag;                 //标志,1代表前进,0代表后退
u8 cmd;         //串口接收的命令sbuf

void delay(u16 z);        //声明延时函数

//前进
void forward()
{
flag = 1;                 //代表前进状态
in1=1;                    //l298n手册
in2=0;  
in3=1;  
in4=0;
}

//后退
void fallback()
{
flag = 0;                //代表后退状态
in1=0;  
in2=1;  
in3=0;  
in4=1;
}

//加速
void quick()
{
SpeedA += 1;  //每次加1
if(SpeedA >= 40)        //最大40
{
SpeedA = 40;
}
SpeedB += 1;
if(SpeedB >= 40)
{
SpeedB = 40;
}
}

//减速
void slow()
{
SpeedA -= 1;        //每次减1
if(SpeedA <= 5)//最小5
{
SpeedA = 5;
}
SpeedB -= 1;
if(SpeedB <= 5)
{
SpeedB = 5;
}
}

//左转
void move_left()              //只有前进的时候可以左转
{
if(flag == 1)            //前进状态
{
in1=1;  
in2=0;  
in3=0;  
in4=0;
delay(50000);
forward();
}
}

//右转
void move_right()                 //只有前进的时候可以右转
{
if(flag == 1)                //前进状态
{
in1=0;  
in2=0;  
in3=1;  
in4=0;
delay(50000);
forward();
}
}

//停止
void stop()
{
in1=0;  
in2=0;  
in3=0;  
in4=0;
}

void delay(u16 z)
{  
u16 x,y;  
for(x=z;x>0;x--)   
for(y=125;y>0;y--); 
}

void SendOneByte(u8 c)    //串口发送数据
{
SBUF = c;
while(!TI);
TI = 0;
}

void main()
{   
//串口定时器 定时器T0
TMOD = 0x21;  //T0定时器为工作方式一,T1定时器为工作方式二
PCON = 0x00;  //串口初始化相关,波特率
SCON = 0x50;                 //串口初始化相关,串口工作方式一,允许接收
        TH1 = 0xFD;                   //设置初值
        TL1 = 0xFD;                   //设置初值
TR1 = 1;                          //开启定时器T1

TH0 = 0xF4;                    //设置初值
TL0 = 0x48;          //设置初值
TR0 = 1; //开启定时器T0

ES = 1;//开放串口中断
//PS = 1;                         //串口中断优先
PT0 = 1;                 //定时器0中断优先
ET0 = 1;//开放定时器T0中断
EA = 1;//开放总中断

//按键控制小车
while(1)
{
if(key1 == 0)
{
delay(10);
if(key1 == 0)
{
forward();
SendOneByte(1);
}
while(key1 == 0);
}
if(key2 == 0)
{
delay(10);
if(key2 == 0)
{
fallback();
SendOneByte(2);
}
while(key2 == 0);
}
if(key3 == 0)
{
delay(10);
if(key3 == 0)
{
quick();
SendOneByte(3);
}
while(key3 == 0);
}
if(key4 == 0)
{
delay(10);
if(key4 == 0)
{
slow();
SendOneByte(4);
}
while(key4 == 0);
}
}
}

void time0_int() interrupt 1   //T = 3ms * 40 = 120ms
{  
TR0 = 0;      
TH0 = 0xF4; 
TL0 = 0x48; //3000;  3ms
MA++;          
if(MA < SpeedA)  
{    
ena = 1;  
}  
else 
  ena = 0;  
if(MA == 40)
{    
  MA = 0;  
}

MB++;          
if(MB < SpeedB)  
{    
enb = 1;  
}  
else 
  enb = 0;  
if(MB == 40)
{    
  MB = 0;  
}  
TR0 = 1;
}

void UARTInterrupt(void) interrupt 4
{
if(RI)
{
RI = 0;
//add your code here!
cmd = SBUF;
SendOneByte(cmd);

//串口控制小车
switch (cmd)
{
case 1:
forward();
SendOneByte(1);
break;
case 2:
fallback();
SendOneByte(2);
break;
case 3:
quick();
SendOneByte(3);
break;
case 4:
slow();
SendOneByte(4);
break;
case 5:
move_left();
SendOneByte(5);
break;
case 6:
move_right();
SendOneByte(6);
break;
default:
SendOneByte(7);
break;
}
}
}

结束!

转载于:https://www.cnblogs.com/gundan/p/8118919.html

51单片机 小车 L298N pwm调速 串口控制 按键控制相关推荐

  1. pwm调速流程图小车_51单片机 小车 L298N pwm调速 串口控制 按键控制

    难点:1.串口定时器T1,和T0定时器优先级 2.pwm频率与占空比的设置 按键控制 按键1--前进 按键2--后退 按键3--加速 按键4--减速 (板子上只有四个按键) 串口控制 '1'--前进 ...

  2. 基于51单片机的L298N直流电机调速系统Proteus仿真程序

    基于51单片机的L298N直流电机调速系统Proteus仿真程序 本此设计选择STC89C52单片机作为主控芯片,选取带有光电编码器的直流电机作为被控对象,利用单片机的T0定时器产生PWM信号并送到直 ...

  3. 51单片机的直流电机PWM调速控制系统(附Proteus仿真+C程序等全套资料)

    设计思路 直流电机PWM控制系统的主要功能包括:很实现对直流电机的加速.减速以及电机的正转.反转和急停,并且可以调整电机的转速,能够方便的实现电机的智能控制. 主体电路:即直流电机PWM控制模块.这部 ...

  4. 104、基于51单片机智能风扇pwm调速红外遥控无线遥控风扇温控风扇系统设计

    毕设帮助.开题指导.技术解答(有偿)见文末. 目录 摘要 一.硬件方案 二.设计功能 三.实物图 四.原理图 五.Protues仿真 六.流程图 七.程序源码 八.资料包括 摘要 随着气温的逐渐上升, ...

  5. pwmc语言调速程序_51单片机的直流电机PWM调速系统设计,正转反转,加减速,急停等,仿真和代码...

    设计思路 直流电机PWM控制系统的主要功能包括:实现对直流电机的加速.减速以及电机的正转.反转和急停,并且可以调整电机的转速,能够方便的实现电机的智能控制. 主体电路:即直流电机PWM控制模块.这部分 ...

  6. uln2803驱动直流电机电路图_51单片机的直流电机PWM调速系统设计,正转反转,加减速,急停等,仿真和代码...

    设计思路 直流电机PWM控制系统的主要功能包括:实现对直流电机的加速.减速以及电机的正转.反转和急停,并且可以调整电机的转速,能够方便的实现电机的智能控制. 主体电路:即直流电机PWM控制模块.这部分 ...

  7. 小车PWM调速-串口控制

    小车PWM调速-串口控制 串口控制调速,即通过串口修改speed的值, 1.将上节PWM调速用到的定时器0源文件和头文件引入进来,工程文件如下 mian.c:主函数 Motor.c:小车前进.后退.左 ...

  8. STM32蓝牙小车以及PWM调速

    STM32蓝牙遥控小车 基于STM32F103系列的蓝牙控制小车以及PWM调速 代码下载 HC-06蓝牙模块 使用蓝牙模块前,需要先对其进行一些设置: 使用USB转TTL模块将蓝牙模块连接到电脑,蓝牙 ...

  9. 基于STM32单片机的直流电机PWM调速(Proteus仿真+程序)

    编号:9 基于STM32单片机的直流电机PWM调速 功能描述: 由 STM32单片机+液晶1602显示模块+键盘模块+L298N电机驱动模块+直流电机 1.采用STM32F103单片机为主控制器 2. ...

最新文章

  1. CSS之布局(盒子的垂直布局)
  2. 为何人工智能首推Python 初学者怎么学Python
  3. Android开发者指南(4) —— Application Fundamentals
  4. mysql数据库一些可能会用到的命令
  5. hbase集群部署与测试(2017)
  6. 维度爆炸?Python实现数据压缩竟如此简单!
  7. 每周一题 —— 3n+1问题
  8. linux没有jre文件夹,linux上配置jdk时,java命令提示没有此文件或文件夹的解决方法...
  9. Spring半注解半Xml
  10. 项目经理如何把工作简单化
  11. Gartner分享物联网和智慧城市最新数据
  12. CIRIquant:circRNA定量和剪接体转换识别
  13. eclipse怎么配置python解释器,在Eclipse中配置Pydev Interpreter以使用Enthought Python分发...
  14. 20191007每日一句
  15. html 动态导航菜单,导航菜单,css3,javascript,响应式菜单,html,css
  16. 搜索及代码在GitHub上查重小技巧
  17. linux怎么样用终端打开百度,linux下用终端访问百度网站.doc
  18. 服装企业的ERP实施是有条件的
  19. matlab, 生成一个数值一样的n维列向量
  20. GAN生成对抗网络论文翻译(一)

热门文章

  1. dev c++ 调试时候发生软件崩溃解决办法
  2. 后端怎么防止重复提交?(常用的做法)
  3. 办公word,ppt,excel问题
  4. 使用余弦相似度算法计算文本相似度-数学
  5. OpenArkCompiler方舟编译
  6. CMOS图像传感器与DDI显示芯片
  7. 2D池化IPoolingLayer
  8. CUDA 8混合精度编程
  9. Pytorch和CNN图像分类
  10. JavaWeb--过滤器