用51单片机控制步进电机的转向,速度,并且将速度显示在LCD1602

您所在的位置:网站首页 调速电机怎样才能加速 用51单片机控制步进电机的转向,速度,并且将速度显示在LCD1602

用51单片机控制步进电机的转向,速度,并且将速度显示在LCD1602

2023-07-01 11:28| 来源: 网络整理| 查看: 265

#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