历史上的今天

今天是:2024年08月22日(星期四)

正在发生

2019年08月22日 | 51单片机 小车 L298N pwm调速 串口控制 按键控制

发布者:心怀梦想 来源: eefocus关键字:51单片机  L298N  pwm调速  串口控制  按键控制 手机看文章 扫描二维码
随时随地手机看文章

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

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

按键控制

按键1——前进

按键2——后退

按键3——加速

按键4——减速

(板子上只有四个按键)

串口控制

‘1’——前进

‘2’——后退

‘3’——加速

‘4’——减速

‘5’——左转

‘6’——右转

源码:

#include

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;
}
}
}

结束!


关键字:51单片机  L298N  pwm调速  串口控制  按键控制 引用地址:51单片机 小车 L298N pwm调速 串口控制 按键控制

上一篇:第一页
下一篇:使用51单片机输出PWM控制舵机

推荐阅读

  8月22日,上能电气宣布其首个海外光伏逆变器制造基地正式投产。   该制造基地位于印度卡纳塔克邦首府班加罗尔市,年产能达3GW,以满足印度及周边海外市场不断增长的需求。印度制造基地的投产,标志着上能电气在印度乃至整个海外市场的业务发展进入一个新的里程碑。   上能电气董事长吴强先生接受记者采访时表示,公司非常重视在印度市场的发展,...
自今年4月3日韩国5G商用化后,相隔140多天,韩国第一大电信运营商SK电信的5G用户于21日破百万人,未来将借此扩展海外事业。据韩媒《Money Today》报道,SK电信于22日公布,全球提供5G服务的28家电信商中,SK电信的5G用户抢先突破百万人。2011年7月LTE商用化时,SK电信耗费8个月才使LTE用户突破1百万,现在5G推广速度是LTE的两倍。SK电信自评时提到,5G用...
2020年,面临新冠肺炎疫情的巨大冲击,中国应对得宜,率先走出疫情阴霾,半导体产业也取得了优于全球的良好表现。未来,随着新基建等一系列重大政策的实施落地,中国半导体产业有望取得更大的发展。新形势下,中国半导体产业应当如何调整在全球产业生态中的定位,助力全球共同发展?《中国电子报》记者采访了中国半导体行业协会副理事长、清华大学微电子所...
荣耀 10 与荣耀 V10 现已获推鸿蒙 HarmonyOS 2.0.0.145 内测 nolog 版。  IT之家了解到,此次推送仅限两款机型首批内测报名入选成功的 1800 位 nolog 用户,其他小伙伴请耐心等待。  适配机型荣耀 10(COL-AL10)荣耀 10(COL-TL10)荣耀 V10(BKL-AL00)荣耀 V10(BKL-AL20)荣耀 V10(BKL-TL10)  版本更新日志  10.0....

史海拾趣

问答坊 | AI 解惑

电池短路以后会有什么后果呢?

  电池短路是指电池的正负极直接用导线接成通路。首先,这要看是什么电池,或者说要看电池的“能量”有多大。 1、如果是普通的干电池,一般不会出现剧烈的现象。因为普能电池内阻大,能量小,“烧”不起劲来。例如:普通5号短路后外表看不出任何 ...…

查看全部问答∨

质量流量计原理

第一节 概 述 目前广泛应用的流量计,无论是差压式、靶式、涡轮、电磁或容积等型式,从原理上看都足测量容积流量的。由于流体的容积大小受其温度、压力等参数的影响,当被测流体的温度、压力坐化时,应把所测量的容积流量换算成标准状态 ...…

查看全部问答∨

我也来玩玩多线程(终结篇)-LPC1114

前两个帖子里分别以不同的方式实现的LED的闪烁,今天再以信号量的方式来实现LED的闪烁。程序里一共用到了两个信号量,分别为io_sem和delay_sem,这两个信号量就类似一个互斥的变量,使得程序交替运行延时和IO反转的进程。下面上传源代码,同样附件 ...…

查看全部问答∨

讨论下热电偶测温差的问题

讨论下用热电偶测温差的问题,有的书上介绍可以用热电偶反向串联变送器测温差,我的问提是&nbsp;&nbsp;热电偶反向串联不是线性的,变送器处理的mv值是不等的.例如100度温差,在500度与400度时是4.058mv,而1000度与900度是3.98mv;变送器如何处理???? ...…

查看全部问答∨

友坚6410平台,目录的问题.

友坚6410平台,目录 D:\\WINCE600\\PLATFORM\\SMDK6410\\SRC\\BOOTLOADER\\下有以下几个子目录, \\EBOOT.WHIMORY \\NBL1.IROM_SD \\NBL1.LSB \\NBL2 这几个目录的作用是什么?,先执行哪一个目录? \\EBOOT.WHIMORY 可能是 EBoot, NBoot启开后, ...…

查看全部问答∨

SD卡驱动问题

目前我在TI的TMS320VC5509A上做一个项目,需要驱动SD卡。5509上自带有SD卡控制器。通过配置应该就能正常使用。 可是现在我遇到的问题是,不能连续进行SD卡读写。比如先读SD卡(查询),接着又写,在写时写命令返回的response不对。只有在读完后加 ...…

查看全部问答∨

求教:关于PE文件的导入符号

正在研究 PE 文件的格式,但是对导入表的结构和用法不太明白。 已经能够从PE文件分析出导入表中的,但是不知道怎么解析系统创建的 调转表和调转地址。 我的代码里调用一个系统函数的时候,反汇编(ARM芯片)得到 ;处理参数等 0001287C EB00033 ...…

查看全部问答∨

SST Flash Sector 擦除问题(没多少分了)

为什么我的SST Flash的Block擦除都能够实现,但是不能实现Sector 擦除! 这是什么原因?我用的是SST 39VF6401B       我的代码:          Top[0x555] = 0x00aa;      &nbs ...…

查看全部问答∨

NS2

谁有NS2的安装包,麻烦大家给我传一个吧,谢谢…

查看全部问答∨
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved