电工优优今天要和大家分享的单片机相关信息,接下来我将从51单片机学习:步进电机实验这个方面来介绍。
实验名称:步进电机实验接线说明:实验现象:下载程序后,当按下KEY1键可调节电机旋转方向;当按下KEY2键,电机加速;当按下KEY3键,电机减速注意事项:将步进电机红色线对接到“步进电机模块”输出端子J47的5V上,其它相序依次接入。***************************************************************************************/#include "reg52.h"
typedef unsigned int u16; //对系统默认数据类型进行重定义typedef unsigned char u8;
//定义ULN2003控制步进电机管脚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
// 定义步进电机速度,值越小,速度越快// 最小不能小于1#define STEPMOTOR_MAXSPEED 1#define STEPMOTOR_MINSPEED 5
/******************************************************************************** 函 数 名 : delay_10us* 函数功能 : 延时函数,ten_us=1时,大约延时10us* 输 入 : ten_us* 输 出 : 无*******************************************************************************/void delay_10us(u16 ten_us){while(ten_us--);}
/******************************************************************************** 函 数 名 : delay_ms* 函数功能 : ms延时函数,ms=1时,大约延时1ms* 输 入 : ten_us* 输 出 : 无*******************************************************************************/void delay_ms(u16 ms){u16 i,j;for(i=ms;i>0;i--)for(j=110;j>0;j--);}
/******************************************************************************** 函 数 名 : step_motor_28BYJ48_send_pulse* 函数功能 : 输出一个数据给ULN2003从而实现向步进电机发送一个脉冲* 输 入 : step:指定步进序号,可选值0~7dir:方向选择,1:顺时针,0:逆时针* 输 出 : 无*******************************************************************************/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;//停止相序}}
/******************************************************************************** 函 数 名 : key_scan* 函数功能 : 检测独立按键是否按下,按下则返回对应键值* 输 入 : mode=0:单次扫描按键mode=1:连续扫描按键* 输 出 : KEY1_PRESS:K1按下KEY2_PRESS:K2按下KEY3_PRESS:K3按下KEY4_PRESS:K4按下KEY_UNPRESS:未有按键按下*******************************************************************************/u8 key_scan(u8 mode){static u8 key=1;
if(mode)key=1;//连续扫描按键if(key==1&&(KEY1==0||KEY2==0||KEY3==0||KEY4==0))//任意按键按下{delay_10us(1000);//消抖key=0;if(KEY1==0)return KEY1_PRESS;else if(KEY2==0)return KEY2_PRESS;else if(KEY3==0)return KEY3_PRESS;else if(KEY4==0)return KEY4_PRESS;}else if(KEY1==1&&KEY2==1&&KEY3==1&&KEY4==1) //无按键按下{key=1;}return KEY_UNPRESS;}
/******************************************************************************** 函 数 名 : main* 函数功能 : 主函数* 输 入 : 无* 输 出 : 无*******************************************************************************/void main(){u8 key=0;u8 dir=0;//默认逆时针方向u8 speed=STEPMOTOR_MAXSPEED;//默认最大速度旋转u8 step=0;
while(1){key=key_scan(0);if(key==KEY1_PRESS)//换向{dir=!dir;}else if(key==KEY2_PRESS)//加速{if(speed>STEPMOTOR_MAXSPEED)speed-=1;}else if(key==KEY3_PRESS)//减速{if(speed