历史上的今天
返回首页

历史上的今天

今天是:2025年03月02日(星期日)

2020年03月02日 | 基于51单片机的PWM+L293d控制直流电机程序

2020-03-02 来源:51hei

左侧开关减速,右侧加速。l293d芯片驱动直流电机

单片机源代码:


#include

#define Tpwm 0xfc18//PWM周期对应的计数值1ms,基于12MHz晶振

unsigned int duty[]={0,/*0*/

0xff9c/*100us*/,0xff38/*200us*/,0xfed4/*300us*/,

0xfe70/*400us*/,0xfe0c/*500us*/,0xfda8/*600us*/,

0xfd44/*700us*/,0xfce0/*800us*/,0xfc7c/*900us*/,

0xfc18/*1000us*/};//PWM高电平时间 

unsigned char i=0;

sbit P32 = P3^2;

sbit P33 = P3^3;

sbit PWMOUT = P2^0;

sbit PWMIN1 = P2^1;

sbit PWMIN2 = P2^2;

bit flag = 1;//PWM输出电平状态,1为输出高电平时间,0为输出低电平时间    

void delay10ms(int n); 

void  main(void)

{

  PWMOUT = 0;//初始化L293D ,停止电机

  PWMIN1 = 0;

  PWMIN2 = 1;

  EA = 1;  //开总中断

  IT0 = 1;  //中断方式为跳变

  IT1 = 1;

  EX0 = 1;  //打开外部中断0  

  EX1 = 1;  //打开外部中断1 

  ET0 = 1;  //开定时器0中断允许

  TMOD = 0x01; //设置定时方式

  while(1)  //等待中断

  {

  /*在此可以实现其它任务*/

  }

}

//10ms延时函数

void delay10ms(int n)

{

    int i=0,j;

  while(n--)

  { 

     for(i=0;i<10;i++)

     {

          for(j = 0; j < 125; j++);

      }

  }

}

void keySpeeddownISR() interrupt 0 //按键中断服务程序

{

  EA = 0;   //关中断

  delay10ms(2);  //延时消抖

  if (!P32)    //确认按键按下,滤除键盘抖动干扰

  {//减少PWM高电平时间 

   if(i>0)

    i--;  

   if((TR0=1) && (i == 0))

   {   

    TR0 = 0;   

    PWMOUT = 0;

   }

  }

  EA = 1;

}

void keySpeedupISR() interrupt 2 //按键中断服务程序

{

  EA = 0;   //关中断

  delay10ms(2);  //延时消抖

  if (!P33)    //确认按键按下,滤除键盘抖动干扰

  {//增加PWM高电平时间 

   if(i<=10)

    i++;

   if((TR0 == 0) && (i > 0))   

   {//启动PWM,电机顺时针旋转

    PWMIN1 = 0;

    PWMIN2 = 1;

    PWMOUT = 1;

    TH0 = duty[i]>>8;

    TL0 = duty[i]&0xff;

    TR0 = 1;

    flag = 1;   

   }

  }

  EA = 1;

}

void T0ISR() interrupt 1 //定时器0中断服务程序

{

  EA = 0;   //关中断

  if(flag)

  {//高电平时间结束,输出低电平补齐PWM周期

   PWMOUT = 0;

   TH0 = (65535-(duty[i]-Tpwm))>>8;

   TL0 = (65535-(duty[i]-Tpwm))&0xff;

   flag = 0;  

  }else

  {//周期结束

   PWMOUT = 1;

   TH0 = duty[i]>>8;

   TL0 = duty[i]&0xff;

   flag = 1;

  } 

  EA = 1;

}


推荐阅读

史海拾趣

Ferroxcube公司的发展小趣事

随着全球环保意识的日益增强,电子行业也开始面临着越来越严格的环保要求。Ferroxcube公司作为行业领军企业,积极响应环保号召,开始研发更加环保的磁性元件。

经过长时间的研发和试验,公司成功推出了一款采用环保材料制成的新型磁芯。这款磁芯不仅性能优异,而且在使用寿命结束后可以方便地进行回收再利用,大大降低了对环境的污染。

这一创新产品一经推出,就受到了市场的热烈欢迎。许多环保意识强烈的客户纷纷选择使用Ferroxcube的环保磁芯,以支持绿色环保事业。这也使得Ferroxcube在环保领域的声誉大大提升,为公司赢得了更多的市场份额和客户认可。

Achronix Semiconductor Corporation公司的发展小趣事

在电子行业中,质量始终是客户最关心的问题之一。Ferroxcube公司深知这一点,因此在生产过程中严格控制产品质量,确保每一个出厂的产品都符合甚至超过客户的期望。

有一次,一个大型电子设备制造商向Ferroxcube下了一笔大额订单,要求提供一批高性能的磁环。然而,在生产过程中,质检部门发现其中一部分磁环的性能指标略低于标准要求。虽然这批产品仍然符合市场上的大部分需求,但Ferroxcube公司决定全部返工,确保每一件产品都达到最高标准。

这一举动虽然增加了公司的生产成本,但却赢得了客户的极高评价。那家大型电子设备制造商对Ferroxcube的严谨态度和专业精神表示赞赏,并将Ferroxcube列为了其首选供应商之一。此后,双方的合作更加紧密,共同开发了许多创新的电子产品。

C&K Components公司的发展小趣事

进入新时代,C&K继续坚持创新驱动的发展战略,不断加大在研发和创新方面的投入。公司紧跟行业趋势,积极探索新技术、新工艺和新应用,推出了一系列具有创新性和领先性的开关产品。同时,C&K也注重与客户的沟通和合作,深入了解客户需求,提供个性化的解决方案和优质的服务。这些举措使C&K在激烈的市场竞争中始终保持领先地位,并赢得了更多客户的认可和支持。

这些故事展示了C&K Components公司在电子行业中的发展历程和取得的成就。从初创时期的坚持与探索,到60年代的转型与突破,再到90年代的行业领先地位确立,以及千禧年代的并购与融合和新时代的创新与发展,C&K始终保持着对技术的热爱和对市场的敏锐洞察,不断推动公司向前发展。

Eclipse Magnetics公司的发展小趣事

进入60年代,随着计算机和电子行业的迅猛发展,C&K敏锐地捕捉到了微型开关市场的巨大潜力。公司果断进行业务重组,将重心转向计算机和电子行业的微型开关生产。这一转型不仅使C&K在技术上取得了重大突破,也使其在市场上获得了更多的机会。凭借对客户需求的深入理解和优质服务的提供,C&K迅速赢得了客户的信赖,并逐渐成为行业内的佼佼者。

BeagleBoard公司的发展小趣事

作为一家以开源硬件为核心的公司,BeagleBoard深知教育和人才培养的重要性。他们积极与学校、教育机构合作,提供教育支持和培训服务,帮助更多的学生了解嵌入式系统开发的魅力。同时,公司还设立了奖学金和竞赛项目,鼓励年轻开发者积极参与创新实践,为行业培养了一批批优秀的人才。

Cedrat Technologies公司的发展小趣事

Cedrat Technologies深知技术创新的重要性,因此一直致力于打造一支跨学科的研发团队。这支团队由材料科学、机械工程、电子工程等多个领域的专家组成,他们共同致力于智能材料机电产品的研发和应用。通过多年的努力,团队在微型纳米定位、阻尼、振动产生等领域取得了显著成果,为公司的快速发展提供了强大的技术支撑。

问答坊 | AI 解惑

现场总线温度变送器原理及应用

一、引言   信息技术的飞速发展,引起了自动化系统结构的变革,逐步形成了以网络集成自动化系统为基础的企业信息系统。现场总线就是顺应这一形势发展起来的新技术。现场总线是应用在生产现场,在微机化测量控制设备(称为现场总线仪表)之间实 ...…

查看全部问答>

怎么用VHDL语言实现1602的字母的直接输入

我想通过FPGA实现与1602的控制 想显示几个英文字母 但是不知道用VHDL语言怎么实现 知道的告诉一声…

查看全部问答>

合格的电子工程师需要掌握的知识和技能

掌握了一下的硬件和软件知识,基本上就可以成为一个合格的电子工程师: 第一部分:硬件知识 一、 数字信号 1、 TTL和带缓冲的TTL信号 2、 RS232和定义 3、 RS485/422(平衡信号) 4、 干接点信号 二、 模拟信号视频 1、 非平衡信号 ...…

查看全部问答>

计数器与定时器

计数器与定时器一、计数概念的引入 从选票的统计谈起:画“正”。这就是计数,生活中计数的例子处处可见。例:录音机上的计数器、家里面用的电度表、汽车上的里程表等等,再举一个工业生产中的例子,线缆行业在电线生产出来之后要计米,也就是测 ...…

查看全部问答>

VS 中的EDIT Control 控件的问题

VS Edit Control 控件的编辑框滚动条动往下滚   随着内容的增加 而自动往下滚动 怎么设置…

查看全部问答>

求助,VxWorks异常

各位大侠,我在VxWorks下写了一个程序,在shell中敲入入口函数运行一段时间,就会出现问题,Shell中显示的错误是这样的: Error while polling for events WTX Error 0x100d2(AGENT_GOPHER_TRUNCATED) 有哪位大侠知道这是什么错误啊?多谢了。…

查看全部问答>

帮我解释两个名词?

最近在学ARM,其中提到模块的四个状态:Enable、Disable、SyncRst、SwRstDisable,请问后两个状态是什么意思啊,怎么理解呢?谢谢哦…

查看全部问答>

ST发布基于STM8的TouchSensingLibrary,支持按键、滑轮

ST刚刚发布基于STM8系列MCU的电容触摸感应固件库,相信基于STM32的库也很快就会提供。下载地址:http://www.st.com/mcu/files/mcu/1234113356.exe================================================================================ &nb ...…

查看全部问答>

基于Verilog计算精度可调的整数除法器的设计

本帖最后由 paulhyde 于 2014-9-15 09:26 编辑 基于Verilog计算精度可调的整数除法器的设计  …

查看全部问答>

线性汇编数组问题

最近刚开始接触,有个问题想请教一下各位大大们我如何在线性汇编中调用C语言中已经定义的数组 例如:int A[3]={0,1,2};B[2][3]={{0,1,2},{0,1,2},{0,1,2}}如果在线性汇编中如何定义数组并赋值(一维、二维、三维),如何调用数组针对结构体如何写成 ...…

查看全部问答>