|
直流電機正反轉,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)
下載附件
2019-7-12 16:38 上傳
電機proteus仿真圖
評分
-
查看全部評分
|