#include<REGX51.H> //單片機頭文件,包含相關特殊寄存器物理映射
sbit UP=P1^0; //按鍵加速
sbit DOWN=P1^1; //按鍵減速
sbit RIGHT=P1^2;
sbit LEFT=P1^3;
sbit STOP=P1^4;
sbit IN1=P2^5;
sbit IN2=P2^6;
sbit ENA=P2^7;
unsigned char num[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //數碼管代碼表
char PWM=5; //占空比
char MOTO_STATE; //電機狀態
char counter;
void delay(unsigned int a) //延時函數
{
while(a--);
}
void INIT() //初始化定時計數器
{
TMOD=0x01; //設計定時器為定時模式,方式為1
TH0=(65536-1000)>>8; //初值計算
TL0=(65536-1000);
TR0=1; //啟動定時計數器0
ET0=1;
EA=1;
}
void key_scan() //按鍵掃描
{
if(!UP)
{
delay(1000);
if(!UP) //轉速加快
{
PWM++;if(PWM>9)PWM=9; //轉速10檔
}
while(!UP);
}
if(!DOWN) //按下減速按鈕
{
delay(1000);
if(!DOWN) //轉速降低
{
PWM--;if(PWM<=0)PWM=0; //轉速0檔
}
while(!DOWN);
}
if(!RIGHT)
{
delay(1000);
if(!RIGHT)
{
MOTO_STATE=1;
}
while(!RIGHT);
}
if(!LEFT)
{
delay(1000);
if(!LEFT)
{
MOTO_STATE=2;
}
while(!LEFT);
if(!STOP) //按下停止按鈕
{
delay(1000);
if(!STOP) //轉速停止為0
{
MOTO_STATE=0; //電機停止運轉
}
while(!STOP);
}
}
switch(MOTO_STATE)
{
case0:IN1=1;IN2=1;break;
case1:IN1=1;IN2=0;break;
case2:IN1=0;IN2=1;break;
default:MOTO_STATE=0;break;
}
void main()
{
INIT(); //調用INIT函數
while(1);
{
key_scan();
moto_ctrl();
P3=num[PWM];
}
}
void Timer0() interrupt 1
{
TH0=(65536-1000)/256;
TL0=(65536-1000)%256; //初值重裝
counter++;
if(counter>=5){counter=0;}
if(counter<PWM)ENA=1;
if(counter>=PWM)ENA=0;
}
|