大神们帮我看看这个程序有没有问题,用来调节电机速度的
时间: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;
}
}
}
}
#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?