找回密码
 立即注册

QQ登录

只需一步,快速开始

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

基于c51单片机的直流电机调速代码

[复制链接]
跳转到指定楼层
楼主
ID:127742 发表于 2016-6-22 22:55 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#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
case2: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;
   }
  }
}                                                         
}

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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