用51单片机控制步进电机的转向,速度,并且将速度显示在LCD1602 |
您所在的位置:网站首页 › 调速电机怎样才能加速 › 用51单片机控制步进电机的转向,速度,并且将速度显示在LCD1602 |
#include "reg52.h" #include "intrins.h" #include"LCD1602.h" #include"Delay.h" typedef unsigned int u16; typedef unsigned char u8; sbit IN1_A=P2^0; sbit IN2_B=P2^1; sbit IN3_C=P2^2; sbit IN4_D=P2^3; //unsigned char x=0; sbit KEY1=P1^0; sbit KEY2=P1^1; sbit KEY3=P1^2; sbit KEY4=P1^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 u8 key=0; u8 dir=0; u8 peed=STEPMOTOR_MAXSPEED; u8 step=0; u8 sil=0; void delay_10us(u16 ten_us) { while(ten_us--); } void delay_ms(u16 ms) { u16 i,j; for(i=ms;i>0;i--) for(j=110;j>0;j--); } void step_motor_28BYJ48_send_pulse(u8 step,u8 dir) { u8 temp=step; if(dir==0) temp=7-step; switch(temp) { 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;//停止相序 } } 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; } sbit SlotSensor = P3^2; volatile unsigned long timestamp1 = 0; // 上一个脉冲信号捕捉的时间戳 volatile unsigned long timestamp2 = 0; // 当前脉冲信号捕捉的时间戳 volatile unsigned int interval = 0; // 相邻两个脉冲之间的时间间隔,单位为微秒 volatile unsigned long speed = 0; // 电机当前的转速,单位为rpm void External_ISR(void) interrupt 0 // 外部中断服务函数,中断号为0 { LCD_ShowNum(1,7,speed,6); // 显示转速 delay_ms(5); timestamp1 = timestamp2; timestamp2 = TH0*256 + TL0; // 记录当前时间戳 interval = timestamp2 - timestamp1; speed = 60000000 / (interval * 12); // 计算转速 } void main() { LCD_Init(); // 清屏LCD_Init(); delay_ms(5); LCD_Init(); // 清屏LCD_Init(); delay_ms(5); LCD_Init(); // 清屏LCD_Init(); delay_ms(5); LCD_Init(); // 清屏LCD_Init(); delay_ms(5); LCD_ShowString(1, 1, "speed:"); // 显示标签 delay_ms(5); EA = 1; EX0 = 1; IT0 = 1; TMOD = 0x01; TH0 = 0; TL0 = 0; TR0 = 1; while(1) { key=key_scan(0); if(key==KEY1_PRESS)//换向 { dir=!dir; } else if(key==KEY2_PRESS)//加速 { if(peed>STEPMOTOR_MAXSPEED) peed-=1; } else if(key==KEY3_PRESS)//减速 { if(peed |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |