最近做了一个pwm直流电机调速
下面是程序
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
uchar num;
uint speed,count,gao_num=50,gao_count;
sbit lcdrs=P3^5;
sbit lcden=P3^4;
sbit jia_key=P3^0;
sbit jian_key=P3^1;
sbit kaiguan=P3^2;
sbit dianji=P1^0;
uchar code table[]={"0123456789"};
uchar code digit2[]={"speed: r/min"};
uchar code digit3[]={"Gao_count: "};
void delay(uint z)
{
uint x;
for(x=z;x>0;x--) ;
// for(y=110;y>0;y--);
}
void write_com(uchar com)
{
lcdrs=0;
P0=com;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void write_date(uchar date)
{
lcdrs=1;
P0=date;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void display()
{
write_com(0x80+7);
write_date(table[speed/100]);
write_com(0x80+8);
write_date(table[speed%100/10]);
write_com(0x80+9);
write_date(table[speed%10]);
write_com(0x80+0x40+12);
write_date(table[gao_num/10]);
write_com(0x80+0x40+13);
write_date(table[gao_num%10]);
}
void init()
{
lcden=0;
write_com(0x38);
write_com(0x0c);
write_com(0x06);
write_com(0x00);
write_com(0x80);
for(num=0;num<15;num++)
{
write_date(digit2[num]);
delay(5);
}
write_com(0x80+0x40);
for(num=0;num<15;num++)
{
write_date(digit3[num]);
delay(5);
}
TMOD=0x51;
TH0=(65536-10000)/256;
TL0=(65536-10000)%256; //12HZ 10ms 中断一次
EA=1;
ET0=1;
TR0=1;
TR1=1;
TH1=0;
TL1=0;
}
void timer0() interrupt 1
{
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
count++;
gao_count++;//统计高电平的时间
}
void key()
{ /*启动和关闭电机*/
if(kaiguan==0)
{
dianji=1;
}
else
{
dianji=0;
}
/**按键加**/
if(jia_key==0)//加速
{
delay(5);
if(jia_key==0)
gao_num+=5; //按键每按下一次,加5已达到让风扇转的更快
if(gao_num>99) //当gao_num加到100时,时间正好达到1s
gao_num=99;
while(!jia_key);
}
/**按键减**/
if(jian_key==0)//减速
{
delay(5);
if(jian_key==0)
{
if(gao_num!=0)
gao_num-=5;
else
gao_num=50;
while(!jian_key);
}
}
}
void qudong()
{ if(gao_count>99)
gao_count=0;
if(gao_count<gao_num)
dianji=1;//加速
else
dianji=0;//减速
}
void main()
{
init();
dianji=0;
while(1)
{
key();
qudong();
if(count>99) //1s
{ count=0;
speed=(TH1*256+TL1)*60/7;
TH1=0;
TL1=0;
}
display();
}
}
|