历史上的今天
返回首页

历史上的今天

今天是:2024年12月20日(星期五)

正在发生

2019年12月20日 | 分享一个51单片机直流电机调速源程序

2019-12-20 来源:51hei

帮助新手更快掌握学习关于51单片机模拟PWM波进行直流电机调速的系统设计

单片机源程序如下:

/*******************************************************************/

/* 程序名:PWM直流电机调速 */

/* 晶振:11.00592 MHz CPU型号:AT89C51 */

/* 直流电机的PWM波控制,可以直接的调速从0到20级的调速 */ 


/*****************************************************************/ 


#include

#define TH0_TL0 (65536-1000)//设定中断的间隔时长

unsigned char count0 = 50;//低电平的占空比

unsigned char count1 = 0;//高电平的占空比


bit Flag = 1;//电机正反转标志位,1正转,0反转


sbit Key_add=P2 ^ 0; //电机减速

sbit Key_dec=P2 ^ 1; //电机加速

sbit Key_turn=P2 ^ 2; //电机换向


sbit PWM1=P2^6;//PWM 通道 1,反转脉冲

sbit PWM2=P2^7;//PWM 通道 2,正转脉冲


unsigned char Time_delay;


/************函数声明**************/

void Delay(unsigned char x);

void Motor_speed_high(void);

void Motor_speed_low(void);

void Motor_turn(void);

void Timer0_init(void);


/****************延时处理**********************/

void Delay(unsigned char x)

{

        Time_delay = x;

        while(Time_delay != 0);//等待中断,可减少PWM输出时间间隔

}


/*******按键处理加pwm占空比,电机加速**********/

void Motor_speed_high(void)

{

        if(Key_add==0)

        {

                  Delay(10);

                  if(Key_add==0)

                  {

                    count0 += 5;

  

                    if(count0 >= 100)

                    {

                            count0 = 100;

                    } 

                  }

                  while(!Key_add);//等待键松开

        }

}


/******按键处理减pwm占空比,电机减速*****/

void Motor_speed_low(void)

{

        if(Key_dec==0)

        {

                  Delay(10);

                  if(Key_dec==0)

          {

            count0 -= 5;

  

            if(count0 <= 0)

            {

                    count0 = 0;

            } 

          }

          while(!Key_dec );

        } 

}


/************电机正反向控制**************/

void Motor_turn(void)

{

        if(Key_turn == 0)

        {

          Delay(10);

          if(Key_turn == 0)

          {

            Flag = ~Flag;

          }

         while(!Key_turn);

        }

}


/***********定时器0初始化***********/

void Timer0_init(void)

{

TMOD=0x01; //定时器0工作于方式1

TH0=TH0_TL0/256;

TL0=TH0_TL0%256;

TR0=1;

ET0=1;

EA=1;

}


/*********主函数********************/

void main(void)

{

        Timer0_init();


        while(1)

        {

          Motor_turn();

          Motor_speed_high();

          Motor_speed_low();

        }

}


/**************定时0中断处理******************/

void Timer0_int(void) interrupt 1 using 1

{

TR0 = 0;//设置定时器初值期间,关闭定时器

TL0 = TH0_TL0 % 256;

TH0 = TH0_TL0 / 256 ;//定时器装初值

TR0 = 1;


if(Time_delay != 0)//延时函数用

{

  Time_delay--; 

}


if(Flag == 1)//电机正转

{

  PWM1 = 0; 

  

  if(++count1 < count0)

  {

    PWM2 = 1;

  }

    else 

    PWM2 = 0;


    if(count1 >= 100)

    {

    count1=0;

    }

}

  else //电机反转

  {

    PWM2 = 0; 

  

    if(++count1 < count0)

    {

    PWM1 = 1;

    }

    else 

    PWM1 = 0;

    

    if(count1 >= 100)

    {

      count1=0;

    }

  }

}

/************************************************


void Delay(unsigned char x)

{

Time_delay = x;


while(Time_delay != 0);//等待中断,可减少PWM输出时间间隔

}


Delay(10);


if(Time_delay != 0)//延时函数用

{

  Time_delay--; 

}


其实这三个部分是相关联的。

Delay(10)这是延时防抖的这是毫无疑问的,但这个消抖在消抖的同时将一开始只是声明了下的Time-


delay赋值了,赋值还不算他还牵扯到定时器里去了。你看在赋值后Time-delay变成了10,看第二个部分


的while(Time-delay!=10);这个语句正如注释所说的等待中断,当等来了中断后你可以看第三个部


分了,看见了吧终端中有将Time-delay减一,每中断一次就减一次直到等于0之后。也就是说延时的时长


是十个中断的时长。注释中:可减少PWM输出时间间隔      也就可想而知了。

*****************************************************/



推荐阅读

史海拾趣

Anaren公司的发展小趣事

Anaren公司是一家全球领先的无线通信和微波技术解决方案提供商,以下是该公司的发展故事:

  1. 公司成立与初期阶段:Anaren公司成立于1967年,总部位于美国纽约州Syracuse市。公司最初是由Hugh Hair和Carl Gerst Jr.两位工程师创立的,致力于提供微波电子元器件和无线通信解决方案。在创立初期,Anaren专注于为国防和航空航天行业提供高性能的微波组件和系统。

  2. 技术创新与产品推出:随着技术的发展和市场需求的变化,Anaren公司不断进行技术创新,并积极推出新产品。公司开发了一系列创新的微波电子元器件和射频无线通信模块,包括功率分配器、耦合器、滤波器、射频放大器等产品。这些产品广泛应用于卫星通信、雷达系统、航空航天等领域。

  3. 市场拓展与业务扩张:随着无线通信技术的普及和应用范围的扩大,Anaren公司开始加大对商业市场的开拓力度。公司不断拓展产品应用领域,涉足消费电子、通信基础设施、汽车电子等领域,并与全球领先的电子设备制造商和系统集成商合作,提供定制化的解决方案和服务。

  4. 收购与合并:为了加强市场竞争力和拓展业务范围,Anaren公司通过收购和合并不断扩大规模和实力。公司先后收购了多家与自身业务相关的企业,包括Unicircuit Inc、ELCOM Technologies Inc和MS Kennedy Corp等。这些收购使Anaren公司在技术、产品和市场方面实现了快速增长和巩固。

  5. 持续发展与未来展望:作为一家历史悠久的电子行业企业,Anaren公司将继续致力于技术创新和产品优化,满足不断变化的市场需求。公司将继续加强研发投入,拓展产品应用领域,提升市场竞争力。在未来,Anaren公司将秉承“创新、质量、服务”的经营理念,持续为客户提供高品质、高性能的无线通信和微波技术解决方案,实现共同发展和成功。

Advanced Ceramic X Corporation公司的发展小趣事

非常抱歉,由于我无法直接获取到Advanced Ceramic X Corporation公司的具体发展细节,因此无法为您直接编写关于该公司发展的五个具体故事。然而,我可以为您提供一种构建这类故事的框架,您可以根据这个框架,结合公司的公开信息,来编写符合要求的故事。

故事框架示例

故事一:技术突破引领市场

Advanced Ceramic X Corporation自成立以来,一直致力于陶瓷材料的研究与开发。某年,公司成功研发出一种具有极高耐高温性能的新型陶瓷材料,这一技术突破使得公司在航空航天领域获得了广泛应用,推动了公司的快速发展。随着技术的不断完善和市场需求的增长,公司逐渐成为了陶瓷材料领域的领军企业。

故事二:国际合作拓宽市场

为了进一步扩大市场份额,Advanced Ceramic X Corporation积极寻求国际合作机会。公司与欧洲一家知名陶瓷材料公司签订了战略合作协议,共同开发新型陶瓷产品。这一合作不仅提高了公司的技术水平,还拓宽了公司的国际市场,使得公司的产品在全球范围内得到了广泛应用。

故事三:环保理念驱动创新

在环保意识日益增强的背景下,Advanced Ceramic X Corporation积极响应国家环保政策,将环保理念融入产品研发和生产过程中。公司成功研发出一种环保型陶瓷材料,该材料不仅具有优异的性能,而且在生产过程中产生的污染极低。这一创新举措赢得了客户的广泛赞誉,也提升了公司的品牌形象。

故事四:人才培养与团队建设

Advanced Ceramic X Corporation深知人才是企业发展的核心动力。公司注重人才培养和团队建设,通过定期举办技术培训、团队建设活动等方式,提高员工的业务能力和团队协作能力。同时,公司还积极引进国内外优秀人才,为公司的长远发展奠定了坚实的基础。

故事五:社会责任与公益事业

作为一家有社会责任感的企业,Advanced Ceramic X Corporation积极参与公益事业。公司捐资支持教育事业、扶贫济困等公益活动,为社会发展贡献自己的力量。同时,公司还关注员工福利,为员工提供良好的工作环境和福利待遇,增强了员工的归属感和忠诚度。

请注意,上述故事仅为示例,并未涉及Advanced Ceramic X Corporation公司的具体发展情况。您可以根据公司的实际情况和公开信息,结合上述框架来编写符合要求的故事。在编写过程中,请确保只描述事实,避免加入个人主观评价。

FETek Technology(东沅)公司的发展小趣事

在半导体测试领域取得成功后,东沅并没有停止前进的步伐。他们开始关注新兴的电子行业趋势,并决定拓展新的业务领域。例如,他们开始研发和生产与电源管理相关的Power Mosfet产品,这些产品具有高效能、高可靠度和价格优势等特点,迅速在市场上占据了一席之地。此外,东沅还积极拓展射频和模拟芯片领域的研发和销售,为客户提供更全面的解决方案。

ADTech公司的发展小趣事

AdTech公司深知人才是企业发展的核心动力。因此,公司一直致力于培养和引进高素质的人才,打造了一支具有丰富经验和专业技能的团队。公司通过提供良好的工作环境和福利待遇,吸引了一批优秀的研发、市场和管理人才。同时,公司还注重员工的培训和成长,为员工的职业发展提供了广阔的空间。这些措施使得公司的团队更加稳定和高效,为公司的持续发展提供了有力保障。

博林(BL)公司的发展小趣事

随着全球环保意识的不断提高,博林公司积极响应号召,将绿色环保理念融入到产品设计和生产过程中。公司采用环保材料和节能技术,努力降低产品的能耗和排放。同时,博林公司还加强了对废弃电子产品的回收和处理工作,实现了资源的循环利用。这些举措不仅提升了博林公司的品牌形象,也为其在可持续发展的道路上奠定了坚实基础。

需要强调的是,以上故事是基于一般性的行业知识和假设构建的,并不直接代表博林公司的实际发展经历。博林公司的具体发展历程和故事可能涉及更多的细节和复杂性,需要进一步的了解和研究。

GE (General Electric)公司的发展小趣事
如故障难以排查,可查阅电气原理图电路图,根据电路图逐一检查各元件和线路。

问答坊 | AI 解惑

linux 下 CY7C68013 的 slavefifo 驱动

linux 下 CY7C68013 的 slavefifo  驱动 在 linux 下 自己编写 68013 驱动 1:在驱动程序调试中发现 写函数 成功执行了,68013 也 收到了数据,但是相应的硬件并不出现 68013 slavefifo 模式下应该出现的结果。 2:但是 68013 slavef ...…

查看全部问答>

如何实现wince多用户?

如题,各用户要有自己的注册表信息和密码等信息!…

查看全部问答>

关于PXA270的AC97采集电压问题

各位:    CPU为PXA270,采集电压芯片为WM9712 ,通过AC-LINK采集电压 一共有两处用到:         1、触摸屏,         2、电池当前电压 问题:     正常情 ...…

查看全部问答>

[求教]使用单片机解决UDP传输问题

小弟使用的是C8051F020芯片 以太网接口芯片是CP2201 由于开发使用芯片自带的库文件 函数和socket有些类似 程序基本实现将从PC收到的数据再次传回去 发送发送一段时间后(10ms或100ms) 单片机将不收数据了 不知道是什么原因?…

查看全部问答>

STM32用串口调试助手收不到数据

STM32可以编译包括运行,但是收不到数据。很郁闷。 公司台式电脑没串口,用的是USB转串口,相当于虚拟串口,串口调试助手,是用COM3口。下述程序可以运行,LED也会闪,但是串口调试助手上就是收不到数据。 请帮忙看看,十分感谢! 附近 ...…

查看全部问答>

请问 2401 能用JTAG 烧写和调试吗???谢谢

             大家好,我按着TI的资料做了一块2401的板子,做出来后不要说用来做调试了,就是连都不能连上.接下来的工作根本无法进行.后来找JTAG的资料来研究,发现EUM0和EUM1是用来作为接收来自仿真器的中断 ...…

查看全部问答>

面板PCB(多图)

直接上图 [ 本帖最后由 lindabell 于 2012-3-25 18:22 编辑 ]…

查看全部问答>

关于320F28035实现并口的问题?<时钟问题续集>

    我用这个28035运行其他的程序能够运行,应该说明系统时钟应该能够支持系统的运行。 但是我现在在做一个28035+TOPWAY 的液晶屏的显示就是显示不出来。    以前我在MSP430F149上已经实现了。这次只是换到DSP28035上就 ...…

查看全部问答>

FRAM在医疗领域完胜其他小伙伴们?大家怎么看

前不久参加医疗电子大会,重点了解了一下现在很热门的一个存储器——FRAM。Speaker认为因为FRAM的以下优势在医疗应用已经取得绝对主导地位: 首先,在医疗领域,FRAM的抗辐射性是一个比较大的优势,因为医院里的特殊环境所致(CT扫描X射线、用于消 ...…

查看全部问答>