找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3033|回复: 11
打印 上一主题 下一主题
收起左侧

直流电机的变速问题

[复制链接]
跳转到指定楼层
楼主
#include <reg52.h>

#define KeyPort P3

#define DataPort P0
sbit LATCH1=P2^2;//段锁存
sbit LATCH2=P2^3;//位锁存

sbit DCOUT = P1^1;//定义电机信号输出端口

unsigned char PWM_ON;   //定义速度等级
#define CYCLE 10        //周期

unsigned char code dofly_DuanMa[10]=
{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};// 显示段码值0~9
unsigned char code dofly_WeiMa[]=
{0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//分别对应相应的数码管点亮,即位码

unsigned char TempData[8]; //存储显示值的全局变量


void DelayUs2x(unsigned char t);//us级延时函数声明
void DelayMs(unsigned char t); //ms级延时
void Display(unsigned char FirstBit,unsigned char Num);//数码管显示函数
unsigned char KeyScan(void);//键盘扫描
void Init_Timer0(void);//定时器初始化


void main (void)
{
        unsigned char num;                  
        PWM_ON=0;
        Init_Timer0();    //初始化定时器0,主要用于数码管动态扫描
       
        TempData[0]=0x5E; //'d'
        TempData[1]=0x39; //'C'
       
        while (1)         //主循环
          {
       
         
           num=KeyScan();    //循环调用按键扫描
           if(num==1)//第一个按键,速度等级增加
              {
                   if(PWM_ON<CYCLE)
                   PWM_ON++;
                  }       
           else if(num==2)//第二个按键,速度等级减小
              {
                   if(PWM_ON>0)
                   PWM_ON--;
                  }       
          TempData[5]=dofly_DuanMa[PWM_ON/10]; //显示速度等级
          TempData[6]=dofly_DuanMa[PWM_ON%10];          
          }
}
/*------------------uS延时函数-----------------------*/
void DelayUs2x(unsigned char t)
{   
while(--t);
}
/*---------------------mS延时函数------------------------*/
void DelayMs(unsigned char t)
{

while(t--)
{
     //大致延时1mS
     DelayUs2x(245);
         DelayUs2x(245);
}
}
/*----------------------显示函数-----------------------------*/
void Display(unsigned char FirstBit,unsigned char Num)
{
      static unsigned char i=0;
          

           DataPort=0;   //清空数据,防止有交替重影
       LATCH1=1;     //段锁存
       LATCH1=0;

       DataPort=dofly_WeiMa[i+FirstBit]; //取位码
       LATCH2=1;     //位锁存
       LATCH2=0;

       DataPort=TempData[i]; //取显示数据,段码
       LATCH1=1;     //段锁存
       LATCH1=0;

           i++;
       if(i==Num)
              i=0;


}
/*------------------------------------------------
                    定时器初始化子程序
------------------------------------------------*/
void Init_Timer0(void)
{
TMOD |= 0x01;          //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响                     
//TH0=0x00;              //给定初值
//TL0=0x00;
EA=1;            //总中断打开
ET0=1;           //定时器中断打开
TR0=1;           //定时器开关打开
}
/*---------------------定时器中断子程序----------------------------*/
void Timer0_isr(void) interrupt 1
{
static unsigned char count;
TH0=(65536-1000)/256;                  //重新赋值 2ms
TL0=(65536-1000)%256;

Display(0,8);                // 调用数码管扫描

if (count==PWM_ON)
    {
     DCOUT = 0;              //如果定时等于on的时间,
                         //说明作用时间结束,输出低电平
    }
  count++;
if(count == CYCLE)       //反之低电平时间结束后返回高电平
    {
            count=0;
                if(PWM_ON!=0)    //如果开启时间是0 保持原来状态
                   DCOUT = 1;      

    }

}

/*----------------------------------按键扫描函数,返回扫描键值------------------------------*/
unsigned char KeyScan(void)
{
unsigned char keyvalue;
if(KeyPort!=0xff)
   {
    DelayMs(10);
    if(KeyPort!=0xff)
           {
                    keyvalue=KeyPort;
                    while(KeyPort!=0xff);
                        switch(keyvalue)
                {
                         case 0xfe:return 1;break;
                         case 0xfd:return 2;break;
                         //case 0xfb:return 3;break;
                        // case 0xf7:return 4;break;
                         //case 0xef:return 5;break;
                        // case 0xdf:return 6;break;
                        // case 0xbf:return 7;break;
                        // case 0x7f:return 8;break;
                         default:return 0;break;
                }
          }
   }
   return 0;
}



这个代码没问题     就是不知道怎么变速的   急啊?????

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:79544 发表于 2015-8-1 23:19 | 只看该作者
if(num==1)//第一个按键,速度等级增加
              {
                   if(PWM_ON<CYCLE)
                   PWM_ON++;
                  }        
           else if(num==2)//第二个按键,速度等级减小
              {
                   if(PWM_ON>0)
                   PWM_ON--;
                  }        
占空比高电平的改变,就变速啦。
回复

使用道具 举报

板凳
ID:83634 发表于 2015-8-2 17:58 | 只看该作者
键码=1时,PWM_ON++;增加占空比,速度增加
回复

使用道具 举报

地板
ID:84145 发表于 2015-8-3 16:50 | 只看该作者
直流电机调速主要是控制占空比,按照这个思路来,肯定没有问题的
回复

使用道具 举报

5#
ID:87135 发表于 2015-8-19 19:45 | 只看该作者
腾飞的龙 发表于 2015-8-1 23:19
if(num==1)//第一个按键,速度等级增加
              {
                   if(PWM_ON0)

哦哦  知道了 谢谢
回复

使用道具 举报

6#
ID:87135 发表于 2015-8-19 19:47 | 只看该作者
lixiang7789 发表于 2015-8-3 16:50
直流电机调速主要是控制占空比,按照这个思路来,肯定没有问题的

恩恩  我已经知道了   谢谢
回复

使用道具 举报

7#
ID:87135 发表于 2015-8-19 19:48 | 只看该作者
chhome 发表于 2015-8-2 17:58
键码=1时,PWM_ON++;增加占空比,速度增加

恩恩   明白   谢了
回复

使用道具 举报

8#
ID:148546 发表于 2016-11-17 22:50 | 只看该作者
明白了,谢谢
回复

使用道具 举报

9#
ID:148546 发表于 2016-11-17 22:51 | 只看该作者
挺好的,可以用。
回复

使用道具 举报

10#
ID:111634 发表于 2016-11-18 14:48 | 只看该作者
本帖最后由 zl2168 于 2016-11-18 14:52 编辑

实例100  直流电机正反转及PWM调速
Proteus仿真一下,确认有效。
实例100 直流电机正反转及调速.rar (44.12 KB, 下载次数: 14)








以上摘自张志良编著《80C51单片机仿真设计实例教程——基于Keil CProteus》清华大学出版社ISBN 978-7-302-41682-1,内有常用的单片机应用100案例,用于仿真实验操作,电路与程序真实可靠可信可行。
书中电路和程序设计有详细说明,程序语句条条有注解。




回复

使用道具 举报

11#
ID:148496 发表于 2016-11-20 00:37 | 只看该作者
直流电机调速 用程序设定占空比是最省事的
回复

使用道具 举报

12#
ID:148496 发表于 2016-11-20 00:38 | 只看该作者
直流电机  利用pwm调速 很简单的
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表