📄 51
字号:
#include <reg51.h>
#include <absacc.h>
#define uchar unsigned char
#define uint unsigned int
#define Count0 XBYTE[0x1fff] //8254计数器0
#define Count1 XBYTE[0x3fff] //8254计数器1
#define Con_word XBYTE[0x7fff] //8254控制字
#define Con_M P3 //电动机方向控制端口
#define Pos_M1 0x02 //电动机1正转
#define Re_M1 0x01 //电动机1反转
#define Sto_M1 0x03 //电动机1反转
#define Pos_M2 0x08 //电动机2正转
#define Re_M2 0x04 //电动机2反转
#define Sto_M2 0x0c //电动机2反转
uint time1=10000,time2=10000; //8254计数器0、计数器1初值
uchar M1_flag=0,M2_flag=0; //电机运行标志位
/************************函数声明***********************/
void delay(uint n); //延时函数
void init_T0(void); //定时器T0初始化
uchar M_turn(uchar n); //读正反转设置函数
uchar key_scan(void); //键盘扫描函数
void motor_star(uchar num); //电机启动函数
void motor_stop(uchar num); //电机制动函数
void motor_inc(uchar num); //电机加速函数
void motor_dec(uchar num); //电机减速函数
void key_manage(uchar num); //键值处理函数
/************************主程序*************************/
main()
{
uchar keynum;
init_T0(); //定时器T0初始化程序
while(1)
{
keynum=key_scan(); //按键监视程序
key_manage(keynum); //键盘处理程序
}
}
/************************延时函数*************************/
void delay(uint n)
{
uchar i,j;
for (i=0;i<n;i++)
for (j=19;j>0;j--);
}
/**********************定时器T0初始化*********************/
void init_T0(void)
{
TMOD=0x01; //工作方式1
TH0=0x4c; //定时50ms
TL0=0x00;
ET0=1; //允许定时器T0中断
EA=1; //开总中断
TR0=1; //启动定时器T0
}
/********************定时器TO中断服务程序****************/
void timer0(void) interrupt 1
{
TR0=0;
TH0=0x4c; //重载定时器T0初值
TL0=0x00;
Con_word=0x30; //写8254计数器0初值
Count0=(uchar)(time1/256);
Count0=(uchar)(time1%256);
Con_word=0x70; //写8254计数器1初值
Count0=(uchar)(time2/256);
Count0=(uchar)(time2%256);
TR0=1;
}
/**********************读正反转设置函数********************/
uchar M_turn(uchar n)
{
uchar temp,turn;
temp=(P3&0x30)>>4;
if(n==1)
{
temp&=0x01;
switch(temp)
{
case 0x00: //电机1反转
turn=Re_M1;
break;
case 0x01: //电机1正转
turn=Pos_M1;
break;
}
}
else
{
temp=(temp&0x02)>>1;
switch (temp)
{
case 0x00: //电机2反转
turn=Re_M2;
break;
case 0x01: //电机2正转
turn=Pos_M2;
break;
}
}
return(turn);
}
/**********************电机启动函数***********************/
void motor_star(uchar num)
{
uchar temp1,temp2;
temp1=Con_M; //读电机控制状态
if ((num==1)&(M1_flag!=1)) //电动机1未启动
{
M1_flag=1; //电机1启动标志位
temp2=M_turn(1); //读电机1设置
Con_M=(temp1&0xfc)|temp2; //送电机1控制
time1=10000; //设定启动速度
}
else if((num==2)&(M2_flag!=1)) //若电动机2未启动
{
M2_flag=1; //电机2启动标志位
temp2=M_turn(2); //读电机2设置
Con_M=(temp1&0xfc)|temp2; //送电机1控制
time2=10000; //设定启动速度
}
}
/**********************电机制动函数***********************/
void motor_stop(uchar num)
{
uchar temp1,temp2;
temp1=Con_M; //读电机控制状态
if ((num==1)&(M1_flag==1)) //电动机1启动
{
M1_flag=0; //清零电机1启动标志位
temp2=Sto_M1; //读电机1设置
Con_M=(temp1&0xfc)|temp2; //送电机1控制
}
else if((num==2)&(M2_flag==1)) //若电动机2启动
{
M2_flag=0; //清零电机2启动标志位
temp2=Sto_M2; //读电机2设置
Con_M=(temp1&0xfc)|temp2; //送电机1控制
}
}
/***********************电机加速函数**********************/
void motor_inc(uchar num)
{
if ((num==1)&(M1_flag==1)) //电动机1启动
{
if(time1>0)
time1=time1-2000;
}
else if((num==2)&(M2_flag==1)) //若电动机2启动
{
if(time2>0)
time2=time2-2000;
}
}
/**********************电机减速函数***********************/
void motor_dec(uchar num)
{
if ((num==1)&(M1_flag==1)) //电动机1启动
{
if(time1<20000)
time1=time1+2000;
}
else if((num==2)&(M2_flag==1)) //若电动机2启动
{
if(time2<20000)
time2=time2+2000;
}
}
/**********************键值处理函数*************************/
void key_manage(uchar num)
{
switch(num)
{
case 0: //电机2启动
while(P1!=0xff);
motor_star(2);
break;
case 1: //电机2制动
while(P1!=0xff);
motor_stop(2);
break;
case 2: //电机2加速
while(P1!=0xff);
motor_inc(2);
break;
case 3: //电机2减速
while(P1!=0xff);
motor_dec(2);
break;
case 4: //电机1启动
while(P1!=0xff);
motor_star(1);
break;
case 5: //电机1制动
while(P1!=0xff);
motor_stop(1);
break;
case 6: //电机1加速
while(P1!=0xff);
motor_inc(1);
break;
case 7: //电机1减速
while(P1!=0xff);
motor_dec(1);
break;
default:break;
}
}
/**********************键盘扫描函数************************/
uchar key_scan(void)
{
uchar i,temp;
temp=P1;
if (temp!=0xff) //判断有无按键按下
{
delay(200); //延时去抖动
if (temp!=0xff) //判断是否是误动作
{
for (i=0;i<8;i++) //确定被按键
{
if ((temp&0x80)==0x80)
{
temp<<=1;
}
else
{
return(i); //返回按键键值
}
}
}
}
return(0x0e);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -