微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 大神们帮我看看这个程序有没有问题,用来调节电机速度的

大神们帮我看看这个程序有没有问题,用来调节电机速度的

时间:10-02 整理:3721RD 点击:
#include<reg52.h>  //包含头文件
#define uint unsigned int  //宏定义
#define uchar unsigned char
sbit KEY1 = P3^0;    // 定义调速按键S1
sbit KEY2 = P3^5;    // 定义调速按键S2
sbit PWM = P1^6;    // 定义调速端口
sbit PWM2= P1^7;   
sbit lcden = P1^0;     //定义1602 使能端、RS端
sbit lcdrs = P1^1;
uchar code table1[]="+ 3  dang " ;   //定义直流电机正转档位显示
uchar code table2[]="+ 2  dang ";
uchar code table3[]="+ 1  dang ";
uchar code table0[]="+ 0  dang ";
uchar code table11[]="- 3  dang " ;     //定义直流电机反转档位显示
uchar code table22[]="- 2  dang ";
uchar code table33[]="- 1  dang ";
uchar code table00[]="- 0  dang ";
unsigned char CYCLE;  //定义周期
unsigned char PWM_ON ;  //定义正转高电平时间
unsigned char PWM_DOWN ;  //定义正转高电平时间
unsigned char PWM_Num2;
unsigned char PWM_Num;
uchar num;
/******************************************************************/
/*                       延时函数1 、2                           */
/******************************************************************/
void delayms(uint z)
{
uint x,y;
for(x=z;x>0;x--)                                                                                 
for(y=110;y>0;y--);     
}
void delay(unsigned int cnt)
{
while(--cnt);
}
/******************************************************************/
/*                          1602显示函数                           */
/******************************************************************/
void write_com(uchar com)
{
lcdrs=0;
P2=com;                                                            
delayms(5);
lcden=1;
delayms(5);
lcden=0;
}
void write_data(uchar date)
{
lcdrs=1;
P2 = date;
delayms(5);
lcden=1;
delayms(5);
lcden=0;
}
void init()   //1602初始化
{
lcden=0;
write_com(0x38);
write_com(0x0c);
write_com(0x06);
write_com(0x01);}
void Display0()  //正转档位零显示
{
init();
write_com(0x80);
for(num=0;num<11;num++)
{write_data(table0[num]);
delayms(5);}
}     
void Display3()  //正转档位一显示
{
init();
write_com(0x80);
for(num=0;num<11;num++)
{write_data(table3[num]);
delayms(5);}
}     
void Display2()  //正转档位二显示
{
init();
write_com(0x80);
for(num=0;num<11;num++)
{write_data(table2[num]);
delayms(5);}
}                  
void Display1()   //正转档位三显示
{
init();
write_com(0x80);
for(num=0;num<11;num++)
{write_data(table1[num]);
delayms(5);}
}                  
void Display00()   //反转  档位零显示  
{
init();
write_com(0x80);
for(num=0;num<11;num++)
{write_data(table00[num]);
delayms(5);}
}     
void Display33()  //反转档位一显示
{
init();
write_com(0x80);
for(num=0;num<11;num++)
{write_data(table33[num]);
delayms(5);}
}     
void Display22()  //反转档位二显示
{
init();
write_com(0x80);
for(num=0;num<11;num++)
{write_data(table22[num]);
delayms(5);}
}                  
void Display11()  //反转档位三显示
{
init();
write_com(0x80);
for(num=0;num<11;num++)
{write_data(table11[num]);
delayms(5);}
}                  
/******************************************************************/
/*                          主函数                                */
/******************************************************************/
main()
{
TMOD |=0x01;           //定时器设置
TH0=(65536-1000)/256;
TL0=(65536-1000)%256;  //定时1ms
IE= 0x82;               //打开中断
TR0=1;                 //启动定时器0
CYCLE = 10;            //时间可以调整
P3=0x21;
while(1)
{
if(!KEY1)               //按下按键S1  使直流电机正转
{
delay(10000);
  if(!KEY1)
    {
         PWM2=0;
         PWM_Num2=0;
         PWM_ON=11;
         PWM_Num++;
         if(PWM_Num==4)
            PWM_Num=0;
     switch(PWM_Num)  //调制占空比
{
      case 0:Display0();PWM_DOWN=10;break; //占空比为0%
      case 1:Display1();PWM_DOWN=1;break;  //占空比为90%
      case 2:Display2();PWM_DOWN=5;break;   //占空比为50%
      case 3:Display3();PWM_DOWN=8;break;  //占空比为20%
      default:break;
      }
         if(PWM_Num==4)
PWM_Num=0;
   }
  }
if(!KEY2)               ///按下按键S2  使直流电机反转
{
delay(10000);
if(!KEY2)
  {
PWM=0;
PWM_DOWN=11       ;
PWM_Num=0;
  PWM_Num2++;
if(PWM_Num2==4)
PWM_Num2=0;
  switch(PWM_Num2)  //调制占空比
{
      case 0:Display00();PWM_ON=10;break; //占空比为0%
      case 1:Display11();PWM_ON=1;break;  //占空比为90%
      case 2:Display22();PWM_ON=5;break;  //占空比为50%
      case 3:Display33();PWM_ON=8;break;  //占空比为20%
      default:break;
      }
if(PWM_Num2==4)
PWM_Num2=0;
   }
  }
}                                                         
}

路过,帮顶一下哦

里面的PWM-on和pwm-down为什么要等于11?

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top