历史上的今天

今天是: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控制舵机

推荐阅读

据科技日报报道,德国马普计算机科学研究所与澳大利亚弗林德斯大学合作,开发出了一种通过眼球运动判断人物性格的软件。研究人员借助人工智能(AI)可以基本确定被观察对象是否属于神经质、友好、外向、认真和好奇等性格特征。将计算机科学应用于学习和解释人类行为是一项新的热门课题,马普计算机科学研究所安德里亚斯·布林领导的研究小组开发出了这款采...
近日,英特尔开放零售倡议合作伙伴峰会在北京召开。会上,英特尔介绍了英特尔开放零售倡议(ORI),并宣布京东及VMWare已经作为早期合作伙伴正式加入该倡议。英特尔开放零售倡议旨在引领行业搭建创新零售门店整合平台,以此化解当前零售行业面临的诸多难题,变革零售体验,携手生态伙伴迈向零售行业的崭新未来。英特尔物联网事业部零售、银行、酒店餐饮及...
随着5G通信技术的发展,5G手机的功耗大约要高出4G手机的20%,对智能手机的续航能力提出了更高的要求。作为A股两大锂电池行业的龙头厂商,欣旺达和德赛电池近几年在消费类锂电池和动力电池上的业务布局大相径庭,以及在苹果供应链上进退不一,也导致其业绩出现相应的波动,彼此间“你追我赶”的竞逐状态,也成为近年来业界关注的重点。随着2020年半年报密集...
正如你可能已经听说的,今年不会有OnePlus 9T(或9T Pro)。但这可能不是故事的全部。据报道,该公司正在开发一款手机(代号为“Martini”),它可能最终会以OnePlus 9 RT的商品名推出。顾名思义,它是OnePlus 9R的加强版(一加习惯在产品最后跟个T),而OnePlus 9R本身就是一款配备骁龙870芯片(取代865)的OnePlus 8T。  据AndroidCe...

史海拾趣

问答坊 | AI 解惑

2006年广西大学生电子设计竞赛题目

本帖最后由 paulhyde 于 2014-9-15 09:46 编辑 包含本科和专科类的题目 本科的难度稍微大一些,涉及到一些机械方面的传动知识  …

查看全部问答∨

altium 编译错误

用altium编译工程,有如下错误 [Error]        串口.SchDoc        Compiler        3V3 contains Open Collector Pin and Power Pin objects (Pin CN3-1,Pin CN3-2,Pin U1-3,Pin U2 ...…

查看全部问答∨

毕业了,你怎么选择?

大学毕业后,我和所有毕业生一样,每天忙碌着跑招聘人才市场,在网上海量投递简历,几个月下来一无所获。虽然偶尔也会有公司打来通知去面试的电话,但是面试后结果都不尽人意,大部分工作都要求有项目开发经验,这一点也就成为了我找工作的拌脚石。 ...…

查看全部问答∨

★☆★诚招Linux书籍作者(兼职)★☆★

Linux书籍包括:Linux入门、Linux系统管理与网络管理、Linux程序开发、Linux驱动开发、Linux网络开发、嵌入式开发。 大部分作者都是异地兼职来写书,异地兼职来做是完全没有问题的。 作者可以得到如下报酬:         (1) ...…

查看全部问答∨

keil RTX 的好资料

网上看到,只要看了RTX  Tiny 就拿下了,而不用去研究什么UCOS啦,当然带GUI的还得研究UCOS   …

查看全部问答∨

【问TI】TI有没有类似于AD603的程控放大芯片

本帖最后由 dontium 于 2015-1-23 13:20 编辑 一直都在用AD603的芯片,不知TI有没有类似的芯片,希望能够提供一些资料。 …

查看全部问答∨

TCP VS UDP(2)

TCP与UDP区别 TCP---传输控制协议,提供的是面向连接、可靠的字节流服务。当客户和服务器彼此交换数据前,必须先在双方之间建立一个TCP连接,之后才能传输数据。TCP提供超时重发,丢弃重复数据,检验数据,流量控制等功能,保证数据能从一端传 ...…

查看全部问答∨

想找工作...

怎么说呢,不论你是不是在职,都希望能够好好沟通下,毕竟,说不定我这里的职位更适合你. 最关键的是,公司现在很着急招人,因为TLE 公司在外几乎找不到任何负面言语,同为大企业,相对好得多.如果有朋友感兴趣,可以M我,QQ:272923490,email:zhengwei@yire ...…

查看全部问答∨

stk600-atmega2560问题

刚购买一块stk600-atmega2560开发板,准备通过ISP方式下载程序到atmega2560中,电脑连接STK600成功,一直出现以下提示错误: 使用软件:studio4 PC机:thinkpad E420   i5 操作系统:32位WIN7旗舰版 猜测问题可能出在跳线的连接上, ...…

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

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

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

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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