|
发表于 2023-5-20 22:13:43
|
显示全部楼层
这是我写的
#include "reg52.h"
typedef unsigned int u16; //对系统默认数据类型进行重定义
typedef unsigned char u8;
sbit IN1_A=P1^0;
sbit IN2_B=P1^1;
sbit IN3_C=P1^2;
sbit IN4_D=P1^3;
sbit KEY1=P3^1;
sbit KEY2=P3^0;
sbit KEY3=P3^2;
sbit KEY4=P3^3;
#define KEY1_PRESS 1
#define KEY2_PRESS 2
#define KEY3_PRESS 3
#define KEY4_PRESS 4
#define KEY_UNPRESS 0
#define STEPMOTOR_MAXSPEED 1
#define STEPMOTOR_MINSPEED 5
void delay_10us(u16 ten_us)
{
while(ten_us--);
}
void time0_init(void)
{
TMOD|=0X01;//选择为定时器0模式,工作方式1
TH0=0X4c; //给定时器赋初值,定时1ms
TL0=0X00;
ET0=1;//打开定时器0中断允许
EA=1;//打开总中断
TR0=1;//打开定时器
}
void step_motor_28BYJ48_send_pulse(u8 step,u8 dir)
{
u8 temp=step;
if(dir==0) //如果为逆时针旋转
temp=7-step;//调换节拍信号
switch(temp)//8个节拍控制:A->AB->B->BC->C->CD->D->DA
{
case 0: IN1_A=1;IN2_B=0;IN3_C=0;IN4_D=0;break;
case 1: IN1_A=1;IN2_B=1;IN3_C=0;IN4_D=0;break;
case 2: IN1_A=0;IN2_B=1;IN3_C=0;IN4_D=0;break;
case 3: IN1_A=0;IN2_B=1;IN3_C=1;IN4_D=0;break;
case 4: IN1_A=0;IN2_B=0;IN3_C=1;IN4_D=0;break;
case 5: IN1_A=0;IN2_B=0;IN3_C=1;IN4_D=1;break;
case 6: IN1_A=0;IN2_B=0;IN3_C=0;IN4_D=1;break;
case 7: IN1_A=1;IN2_B=0;IN3_C=0;IN4_D=1;break;
default: IN1_A=0;IN2_B=0;IN3_C=0;IN4_D=0;break;//停止相序
}
}
void main()
{
time0_init();//定时器0中断配置
while(1)
{
}
}
void delay_ms(u16 ms)
{
u16 n,j;
for(n=ms;n>0;n--)
for(j=110;j>0;j--);
}
void time0() interrupt 1 //定时器0中断函数
{ u8 key=0;
u8 dir=0;//默认逆时针方向
u8 speed=STEPMOTOR_MAXSPEED;//默认最大速度旋转
u8 step=0;
static u16 i;//定义静态变量i
TH0=0X4c;
TL0=0X00;
i++;
if(i==200)
{ if(speed<STEPMOTOR_MINSPEED)
speed=5;
}
if(i==400)
{
i=0;
}
if(i<200)
{
if(speed>STEPMOTOR_MAXSPEED)
speed=1;
}
step_motor_28BYJ48_send_pulse(step++,dir);
if(step==8)step=0;
delay_ms(speed);
} |
|