智能车制作

 找回密码
 注册

扫一扫,访问微社区

查看: 1329|回复: 0
打印 上一主题 下一主题

求指点为什么不能实现正反转

[复制链接]

5

主题

13

帖子

0

精华

注册会员

Rank: 2

积分
124
威望
74
贡献
34
兑换币
38
注册时间
2017-3-24
在线时间
8 小时
毕业学校
福州大学
跳转到指定楼层
1#
发表于 2017-4-8 14:17:18 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
/**************************************************************************/
           //-----------------直流电机PWM调速实验程序----------------//
//测试单片机:STC89C52RC
//晶振:11.0592M (外部)
//复位方式:内部复位
      
//调试环境:KEIL4
//硬件测试环境:使用“清翔电子”单片机开发板测试通过
//程序功能: PWM也就是脉宽调制,是指在周期脉冲信号频率不变的情况下,改变高电平
//
//    和低电平的比例,也就是改变占空比。PWM在灯具调光,直流电机调速方面
//
//    有着广泛的应用。程序使用定时器0中断模拟PWM定时,S2、S3 两个独立按
//
//    键控制电机速度,为使演示结果明显,PWM输出
//
//       到整个P1接口,通过板上的LED灯可以看到亮度的变化。
//
/****************************************************************************/
#include <reg51.h>
typedef unsigned char uint8;
typedef unsigned int  uint16;
sbit down = P3^0;
sbit up = P3^1;
sbit reverse = P3^2;  //设置反转启动键
sbit stop = P3^3;
sbit z =P1^3; //设置输入端1
sbit f = P1^2; //设置输入端2
uint8 t = 0;
uint8 PWM_T = 0;   //占空比控制变
void delay(uint16 z)   //用于秒延时的函数
{
uint16 x,y;
for(x = z; x > 0; x--)
   for(y = 114; y > 0 ; y--);
}
void delay_1ms(uint16 t)  //用于毫秒延时的函数
{
uint16 x,y;
for(x=t;x>0;x--)
   for(y=120;y>0;y--);
}

           
/****************************************************
                   主程序
****************************************************/
void main(void)      
{
static uint16 num;
TMOD = 0x02;   //定时器0,工作模式2,8位定时模式
TH0=210;     //写入预置初值(取值1-255,数越大PWM频率越高)
TL0=210;     //写入预置值 (取值1-255,数越大PWM频率越高)
TR0=1;       //启动定时器
ET0=1;       //允许定时器0中断
EA=1;        //允许总中断
P1=0xff;   //初始化P1,输出端口
PWM_T=30;
z = 1;  //输入端1为高
f = 0;  //输入端2为低
  while(1)      

   {   
      if(!up)
     {
     if(PWM_T<250)
      {
        PWM_T+ = 4;
      }
     
     delay_1ms(10);
    }
    if(!down)
     {
     if(PWM_T>0)
      {
        PWM_T=PWM_T-4;
      }
     
     delay_1ms(10);
    }
   if(!reverse)
   {
     delay(5);
     if(!reverse)
     {
      z = 0; //使输入端1为低
     f = 1; //使输入端2为高
     while(up&down&stop&reverse);//若无键被按下,则停在此处
     }
      while(!reverse);//松手检测
  }
   if(!stop)
   {
     delay(5);
     if(!stop)
     {
    while(PWM_T--);
    delay_1ms(10);  
       while(up&down&stop&reverse)
       {
       PWM_T = 0;//使电机停止
      }
     }
    while(!stop);
   }
   }      
}
/****************************************************
                /定时器0中断模拟PWM
****************************************************/
timer0() interrupt 1  
{
   t++;    //每次定时器溢出加1
   
   if(t==250)   //PWM周期 100个单位
   {
      t=0;  //使t=0,开始新的PWM周期
     P1=0x00;  //输出端口
   }
   
   if(PWM_T==t)  //按照当前占空比切换输出为高电平
   {  
     P1=0xff;        //  
    }
}


如果哪位大神知道为什么不能直流电机正反转,烦请告知。应该怎么修改??

回复

使用道具 举报

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

本版积分规则

关于我们|联系我们|小黑屋|智能车制作 ( 黑ICP备2022002344号

GMT+8, 2024-12-27 15:04 , Processed in 0.104968 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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