|
直流电机正反转,pwm占空比调速,测速,数码管显示当前的速度
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit jiasu=P1^0; //占空比加
sbit jiansu=P1^1; //占空比减
sbit zhengz=P1^2; //正传
sbit fanz=P1^3; //反转
sbit tingz=P1^4; //停止
sbit IN1=P3^0; //用于正传
sbit IN2=P3^1; //用于反转
sbit pwm=P1^7; //调速
uint zhuansu,count,flag,r=25;
uchar code duanma[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//共阴管
void delay(uint z) //延时1ms函数
{
uint x,y;
for(x=0;x<z;x++)
for(y=0;y<110;y++);
}
/*void pwm(uint t) //调速
{
ENA=0;
delay(95);
ENA=1;
delay(t);
} */
void zz()
{
IN1=1;
IN2=0;
}
void fz()
{
IN1=0;
IN2=1;
}
void stop()
{
IN1=0;
IN2=0;
}
void init()//初始化函数
{
TMOD=0x51; //定时器,1计数,T0,T1方式1 G,C/t,M0,M1
TH0=(65535-10000)/256;
TL0=(65535-10000)%256; //定时器0装入初值
EA=1; //开总中断
ET0=1; //定时器0开中断
TR0=1;
TH1=0x00;
TL1=0x00; //定时1计数初值
ET1=1; //定时器1开中断
TR1=1;
//EX0=1;
//IT0=1;
//count=0;
// flag=0;
}
void t11()
{
TH1=0x00;
TL1=0x00; //定时1计数初值
ET1=1; //定时器1开中断
TR1=1;
}
void keyscan() //控制函数
{
if(jiasu==0)
{
while(jiasu==0)
r++;
}
if(jiansu==0)
{
while(jiansu==0)
r--;
}
}
void display(uint x) //速度显示
{
if(x>10000)
{
P2=0xfd;
P0=duanma[x/10000]; //wan
delay(5);
P2=0xfb;
P0=duanma[x%10000/1000]; //qian
delay(5);
P2=0xf7;
P0=duanma[x%1000/100]; //bai
delay(5);
P2=0xef;
P0=duanma[x%100/10]; //shi
delay(5);
P2=0xdf;
P0=duanma[x%10]; //ge
delay(5);
}
else if(x>1000)
{
P2=0xfb;
P0=duanma[x%10000/1000]; //qian
delay(5);
P2=0xf7;
P0=duanma[x%1000/100]; //bai
delay(5);
P2=0xef;
P0=duanma[x%100/10]; //shi
delay(5);
P2=0xdf;
P0=duanma[x%10]; //ge
delay(5);
}
else if(x>100)
{
P2=0xf7;
P0=duanma[x%1000/100]; //bai
delay(5);
P2=0xef;
P0=duanma[x%100/10]; //shi
delay(5);
P2=0xdf;
P0=duanma[x%10]; //ge
delay(5);
}
else if(x>10)
{
P2=0xef;
P0=duanma[x%100/10]; //shi
delay(5);
P2=0xdf;
P0=duanma[x%10]; //ge
delay(5);
}
else
{
P2=0xdf;
P0=duanma[x%10]; //ge
delay(5);
}
}
void main()
{
init(); //初始化
while(1)
{
if(tingz==0)
stop();
else if(fanz==0)
fz();
else zz();
keyscan(); //调速程序
display(zhuansu); //显示转速
}
}
/*void t1()interrupt 0 using 1 //外部中断0脉冲技术记录电机的转速 电机转一圈count加一
{
count++ ;
} */
void t0()interrupt 1 using 2 //定时器0显示转速
{
count++;
flag++;
if(count>50)
count=0;
if(count<r)
pwm=1;
else pwm=0;
if(flag==100) //计时到达1s
{
zhuansu=(TH1*256+TL1);
t11();
flag=0;
}
TH0=(65535-10000)/256;
TL0=(65535-10000)%256;//定时10ms 12
}
|
-
电机.png
(36.4 KB, 下载次数: 107)
电机proteus仿真图
评分
-
查看全部评分
|