历史上的今天
返回首页

历史上的今天

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

正在发生

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

2019-08-22 来源:eefocus

难点: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;
}
}
}

结束!


推荐阅读

史海拾趣

Amerace Electronic Components公司的发展小趣事

随着全球环保意识的提高,Amerace Electronic Components公司积极响应绿色环保号召,将环保理念融入生产和经营中。公司采用环保材料和工艺,减少生产过程中的污染排放。同时,Amerace还致力于推动电子元件的循环利用和回收,为环保事业贡献力量。这种环保理念的践行不仅提升了公司的社会形象,也为公司的可持续发展奠定了基础。

ALLEN BRADLEY公司的发展小趣事

Amerace Electronic Components公司自成立以来,一直致力于电子元件的技术创新。在早期的发展阶段,公司投入大量资源进行研发,成功推出了一系列具有创新性的电子元件产品,如高精度电阻器和电容器。这些产品在市场上获得了广泛的认可,为公司赢得了良好的声誉。随着技术的不断进步,Amerace持续引领行业创新,为电子行业带来了更多高性能、高可靠性的元件产品。

喜美克斯(Cvilux)公司的发展小趣事

在追求经济效益的同时,喜美克斯公司也高度重视环境保护。他们积极采用环保材料和生产工艺,减少生产过程中的污染排放。此外,公司还积极参与各种环保公益活动,倡导绿色消费理念,为电子行业的可持续发展做出了积极贡献。

Dawning Precision Co Ltd公司的发展小趣事

在国内市场取得一定成绩后,Dawning开始将目光投向国际市场。公司积极参加国际电子展会,与全球知名企业进行交流合作。同时,Dawning还根据不同国家和地区的市场需求,调整产品策略,推出符合当地消费者喜好的产品。经过几年的努力,Dawning的产品已经成功打入欧美、东南亚等多个国家和地区的市场,公司的国际化进程取得了显著进展。

BEKA Associates Ltd公司的发展小趣事

BCD Semi(Diodes)在电子行业中以其卓越的技术实力和持续的产品创新而闻名。近年来,公司成功研发出一系列高性能的模拟半导体产品,这些产品在市场上取得了显著的成功。通过不断优化生产工艺和设计理念,BCD Semi成功提升了产品的性能和可靠性,赢得了客户的广泛认可。同时,公司还积极开拓新的应用领域,将产品应用于汽车、通信、工业控制等多个领域,进一步扩大了市场份额。

AAT [Advanced Analog Technology, Inc.]公司的发展小趣事

人才是企业发展的核心竞争力。BCD Semi(Diodes)非常重视人才队伍的建设和培养。公司积极引进国内外优秀的研发、生产和销售人才,为他们提供良好的工作环境和职业发展机会。同时,公司还注重员工的培训和提升,定期组织各类培训活动和技术交流会议,帮助员工不断提升自身的专业技能和综合素质。通过这些措施,BCD Semi成功打造了一支高素质、专业化的人才队伍,为公司的持续发展提供了有力的人才保障。

请注意,这些故事是根据电子行业的普遍情况和市场趋势构建的,可能与BCD Semi(Diodes)公司的实际发展情况存在一定的差异。如需了解该公司更详细的发展故事,建议查阅公司官方网站、相关新闻报道或行业分析报告等权威渠道获取更准确的信息。

问答坊 | AI 解惑

一种新型高电压充电方式

目前对于UPS、EPS、逆变电源等的大功率产品,开发设计者设计的蓄电池逆变电压往往很高。面对由很多蓄电池串联而成的高电压蓄电池组,设计者对蓄电池组的充电往往以市电经过变压器升压后整流或市电整流后经高频电子BOOST升压的传统方式来实现。前者 ...…

查看全部问答>

【讨论】“嵌入式裸奔”、“嵌入式OS”、“OS”各适合什么场合?

如果你只能用的心: A)如果你手上是4位MCU? B)如果你手上是8位MCU? C)如果你手上是16位MCU? D)如果你手上是外设不多的32位MCU? E)如果你手上是外设丰富的32位MCU? F)如果你手上是外设极其丰富的64位MCU? 你要做什么产品: a)如果你 ...…

查看全部问答>

DSP分类

怎么从名称熵推知是TI还ADI的 DSP ?…

查看全部问答>

仪器类设计

仪器类设计 [ 本帖最后由 小虾米gg 于 2009-9-2 15:28 编辑 ]…

查看全部问答>

74LS08 74LS30中文资料

74LS08    74LS30中文资料…

查看全部问答>

方向识别,高手指导一下!

我在做一个东西,想找一个成本比较的识别方法,来实现识别五米开外的物体。原想用红外源发射接收的但是找了市面上找了都只有开关式的红外,高手指导一下,多谢了~~…

查看全部问答>

两路CMOS摄像头同时输入到TI DM6446 的方法请教讨论

HI,大家好,想在TI DM6446平台上,同时输入两路CMOS摄像头的方法,请教下可否用以下方法实现: 硬件上,两个CMOS数据输入到一个二选一的高速转换器的输入口中,输入直接到 DM6446 的视频输入口 软件上,在RAM里面 建立两个 视频流的区域,即A区和B区,程序 ...…

查看全部问答>

.net下,如何删除gdi对象?

Bitmap bmp = new Bitmap(\"\\\\pics\\\\a.jpg\"); IntPtr hBitmap = bmp.GetHbitmap(); pictureBox1.Image = System.Drawing.Image.FromHbitmap(hBitmap); 如果不及时删除hBitmap 所指向的GDI对象,调用次数多了,内存会溢出。 msdn中的例 ...…

查看全部问答>

某PCI设备在已有相应驱动程序的情况下,要添加另一驱动,两驱动并行工作,可以实现吗?

我有一块PCI接口的DSP开发板。PCI接口芯片是AMCC S5933。该PCI板卡已安装了相应的驱动。 我想读写AMCC S5933的配置寄存器和操作寄存器,实现主模式传输。想用Windriver写个简单的驱动程序,并写相应的应用程序,实现配置功能。但是,原来已安装的 ...…

查看全部问答>

一个关于ListCtrl的问题

遇到一些问题。希望各位不吝赐教。先谢过了。 现在有两个界面,称为A和B吧。 通过网口传输数据。在A界面接收数据,然后在B界面通过一个ListCtrl显示 ListCtrl控件选择为report 每接收一个数据就在list中显示一个。 现在的问题是。如果在A界面 ...…

查看全部问答>