#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;
}
|