#include"reg51.h"
#define uchar unsigned char
#define uint unsigned int
sbit duan=P2^0;
sbit wei=P2^1;
sbit mc=P3^2; //外部脈沖
sbit pmw1=P2^2; //EA
sbit pmw2=P2^3; //IN1
sbit pmw3=P2^4; //IN2
sbit Speed_high=P1^0; //加速
sbit Speed_low=P1^1; //減速
sbit Fan_turn=P1^2; //反轉
uint count,num,num1,num3=50;
uint bai,shi,ge,zs;
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x27,0x7f,0x6f,0x40,0x7c,0x39,0x5e,0x79,0x71};//段碼
uchar code weima[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//位碼
void Init_time();
void T0_time();
void T1_time();
void INT0_jishu();
void delay(uint jishi);//計時,以毫秒為單位
void display(uint bai,uint shi,uint ge);//顯示轉速
void main()
{
Init_time();
while(1)
{
display(bai,shi,ge);//顯示電機速度
if(Speed_high==0) //檢測加速按鈕
{
delay(5);
if(Speed_high==0)
{
if(num3 >= 100)
num3 = 100;
else
num3=num3+10;
while(!Speed_high);//連續按鍵加速
}
}
if(Speed_low==0) //檢測減速按鈕
{
delay(5);
if(Speed_low==0)
{
if(num3 < 10)
num3 = 0;
else
num3=num3-10;
while(!Speed_low);//連續按鍵檢測
}
}
if(Fan_turn==0) //檢測加速按鈕
{
delay(5);
if(Fan_turn==0)
{
pmw2=!pmw2;
pmw3=!pmw3;
while(!Fan_turn);//連續按鍵加速
}
}
}
}
//初始化設置
void Init_time()
{
TMOD=0x11;
pmw2=0;
pmw3=1;
TH1=(65536-50000)/256;
TL1=(65536-50000)%256; //每50ms計數
TH0=(65536-100)/256;
TL0=(65536-100)%256; //定時間隔為0.1ms,PWM
ET0=1;
TR0=1; //開定時器0
ET1=1;
TR1=1; //開定時器1
EX0=1; //外部中斷允許
IT0=1; //設置下降觸發中斷
EA=1; //全局中斷允許
}
//定時器0設置產生pwm波
void T0_time()interrupt 1 //計時0中斷,每0.1毫秒一次
{
TR0=0;
TH0=(65536-100)/256;
TL0=(65536-100)%256;
num1++;
if(num1>=100)//PWM波完整周期為10ms
{
num1=0;
}
if(num1<=num3)//設置占空比
{
pmw1=1;
}
else
{
pmw1=0;
}
//pmw2=0;
TR0=1;
}
//定時器計數50ms,采集速度
void T1_time()interrupt 3
{
TR1=0;
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
num++;
if(num==20) //每1秒測速一次
{
num=0;
EX0=0; //關外部中斷
zs=60*count/24; //求出速度
bai=zs/100;
shi=zs%100/10;
ge=zs%10;
count=0; //脈沖計數歸零
EX0=1;
}
TR1=1;
}
//外部中斷函數
void INT0_jishu() interrupt 0 using 1 //外部脈沖計數
{
count++ ;
}
//延時函數
void delay(uint jishi)
{
uint i,j;
for(i=jishi;i>0;i--)
for(j=110;j>0;j--);
}
//數碼管顯示函數
void display(uint bai,uint shi,uint ge)
{
duan=0;
wei=0;
duan=1; //百位顯示
P0=table[bai];
duan=0;
delay(1);
P0=0x0;
wei=1;
P0=weima[5];
wei=0;
delay(1);
P0=0x0;
duan=1; //十位顯示
P0=table[shi];
duan=0;
delay(1);
P0=0x0;
wei=1;
P0=weima[6];
wei=0;
delay(1);
P0=0x0;
duan=1; //個位顯示
P0=table[ge];
duan=0;
delay(1);
P0=0x0;
wei=1;
P0=weima[7];
wei=0;
delay(1);
P0=0x0;
} |