?? 電機(jī)測速.c
字號:
#include<reg52.h>
sbit a4=P2^4;
sbit a5=P2^5;
sbit a6=P2^6;
sbit z0=P3^6; //正轉(zhuǎn)口//
sbit z1=P3^7; //反轉(zhuǎn)口//
unsigned char i,j,k,l,m,n;
unsigned char key,count,flag=0,flag_1,flag_2=1,flag_3=0,flag_4=0,num[8];
unsigned int shijian=0,mc=0,t,rps_int=0,time=0,time_1=0,hol=1; //shijian是產(chǎn)生mc個脈沖用的時間;time總時間;rps電機(jī)實際速度//
float rps=0.0,v,dv,dv_1,dv_2; //設(shè)置的速度v//
void delay(count) //延時count MS//
{
for(i=0;i<count;i++)
for(j=0;j<125;j++);
}
unsigned char KEYZHI() //按鍵掃描程序//
{
k=0;
while(k==0) //掃描//
{
do
{ P1=0xf0; }
while ((0xf0&P1)==0xf0) ; //有按下?有則跳出do……while循環(huán)//
delay(5); //延時,防干擾//
if((0xf0&P1)==0xf0) k=0; //真的按下去了嗎?延時后再作判斷//
else k=1;
}
P1=0x0f;
switch(P1) //掃描行,得出行號j//
{
case 0x0e: j=0;break;
case 0x0d: j=1;break;
case 0x0b: j=2;break;
case 0x07: j=3;break;
default: break;
}
P1=0xf0; //掃描列,得出列號i//
switch(P1)
{
case 0xe0: i=0;break;
case 0xd0: i=1;break;
case 0xb0: i=2;break;
case 0x70: i=3;break;
default: break;
}
return(i+j*4); //返回鍵值,供下面作數(shù)據(jù)處理//
}
void DF() //等待按鍵釋放程序//
{
n=0;
while(n==0)
{
do
{ P1=0x0f; }
while((0x0f&P1)!=0x0f); //等待按鍵釋放,即若沒有放開則一直循環(huán)//
delay(5); //放開鍵后消抖//
P1=0x0f;
if((0x0f&P1)!=0x0f) //真的放開了嗎?延時后再次判斷//
n=0;
else
n=1;
}
}
void Int0(void) interrupt 0 //外部中斷0 測脈沖個數(shù)//
{
mc++; //脈沖累加//
TR1=1; //定時器1啟動//
// if(flag==1) //測周入口//
// {
// if(flag_1==1){TH1=0x00;TL1=0x00;shijian=0;mc=0;flag_1=0;} //第一mc進(jìn)來 準(zhǔn)備測周 時間清零//
//
// else
// {
// TR1=0;rps=1000000/(13.0*((TH1<<8)+TL1));
// dv=v-rps;
// t=t+114*dv;
// rps_int=100*rps;
// num[7]=rps_int%10;
// num[6]=(rps_int/10)%10;
// num[5]=(rps_int/100)%10;
// num[4]=(rps_int/1000)%10;
// }
// }
}
void Int1(void) interrupt 2 //外部中斷1 自動//
{
// time_1=0; dv=0; t=13667;
// if(time_1==100) t=12080;
// if(time_1==200) t=50000;
if(flag_4==0) {t=13667;flag_4=1;}
else
{
if(flag_4==1){t=12080;flag_4=2;}
else {t=50000;flag_4==0;}
}
}
void Timer0(void) interrupt 1 //定時器0中斷 產(chǎn)生PWM波 使電機(jī)轉(zhuǎn)動//
{
switch(l*2+hol)
{
case 0: TH0=(65536-t)>>8; TL0=(65536-t)-(((65536-t)>>8)<<8);z1=0; z0=1; hol=1; break; //正轉(zhuǎn) 高電平//
case 1: TH0=(15536+t)>>8; TL0=(15536+t)-(((15536+t)>>8)<<8);z1=0; z0=0; hol=0; break; //正轉(zhuǎn) 低電平//
case 2: TH0=(65536-t)>>8; TL0=(65536-t)-(((65536-t)>>8)<<8);z0=0; z1=1; hol=1; break; //反轉(zhuǎn) 高電平//
case 3: TH0=(15536+t)>>8; TL0=(15536+t)-(((15536+t)>>8)<<8);z0=0; z1=0; hol=0; break; //反轉(zhuǎn) 低電平//
}
}
void Timer1(void) interrupt 3 //定時器1中斷 計時50MS一次//
{
TH1=0x3c;
TL1=0xaf;
shijian=shijian+1;
time_1=time_1+1;
if(shijian==1)
{
// if(mc/2.4<42) { flag=1; flag_1=1;} //低速區(qū) 測周//
// else //高速區(qū) 測頻//
// {
rps=mc/0.65;
rps_int=10*rps;
num[7]=rps_int%10;
num[6]=(rps_int/10)%10;
num[5]=(rps_int/100)%10;
num[4]=(rps_int/1000)%10;
dv=v-rps;
if(flag_3==0){dv_1=dv;flag_3=1;}
else {dv_2=dv;flag_3=0;}
t=t+8*dv+0.7*(dv_1-dv_2);
shijian=0;
mc=0;
// }
}
}
void Timer2(void) interrupt 5 //定時器2中斷 選通及顯示//
{
TH2=0xf8 ;
TL2=0x2f ;
m=P2;
m=0x70 & m; //m為位選通變量//
switch(m) //掃描顯示;a6,a5,a4為下次選通先給P2高位賦值//
{
case 0x60 : P2=num[7];a6=1; a5=1; a4=1; break;
case 0x70 : P2=num[0];a6=0; a5=0; a4=0; break;
case 0x00 : P2=num[1];a6=0; a5=0; a4=1; break;
case 0x10 : P2=num[2];a6=0; a5=1; a4=0; break;
case 0x20 : P2=num[3];a6=0; a5=1; a4=1; break;
case 0x30 : P2=num[4];a6=1; a5=0; a4=0; break;
case 0x40 : P2=num[5];a6=1; a5=0; a4=1; break;
case 0x50 : P2=num[6];a6=1; a5=1; a4=0; break;
}
}
void main()
{ //
TMOD=0X11; //
EA=1; //
EX0=1; //外部中斷0打開//
EX1=0; //外部中斷1//
IT0=1; // 設(shè)置電平觸發(fā)方式//
ET0=1; //
ET1=1; //
ET2=1; //
TR0=0; //
TR1=0;
TR2=1;
TH0=0xc5;
TL0=0x67;
TH1=0x3c;
TL1=0xaf;
CP_RL2=1;
C_T2=0;
EXEN2=0;
TH2=0xf8 ;
TL2=0x2f ;
for(i=0;i<=7;i++)
num[i]=0;
while(1)
{
P1=0x0f;
key=KEYZHI();
DF();
switch(key)
{
case 10 : l=0;TR0=1;flag_2=0;break;
case 11 : l=1;TR0=1;flag_2=0;break;
case 12 : if(flag_2==1){TR0=1;flag_2=0;}
else {z0=0;z1=0;TR0=0;flag_2=1;}
break;
case 13 : num[0]=0;num[1]=0;num[2]=0;num[3]=0;break;
case 14 : EX1=1;TR0=1;flag_2=0;break;
case 15 : time=time_1/20;
num[0]=(time/60)/10;
num[1]=(time/60)%10;
num[2]=(time%60)/10;
num[3]=(time%60)%10;
break;
default : for(i=0;i<3;i++)
{ j=i+1; num[i]=num[j]; }
num[3]=key; break; //前4個數(shù)碼管顯示設(shè)置的速度值//
}
v=100*num[0]+10*num[1]+num[2]+0.1*num[3];
t=226.7*v+11400;
// rps_int=10*rps;
// num[7]=rps_int%10;
// num[6]=(rps_int/10)%10;
// num[5]=(rps_int/100)%10;
// num[4]=(rps_int/1000)%10;
// dv=v-rps;
// t=t+114*dv;
}
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -