迪文科技论坛

 找回密码
 立即注册
搜索
查看: 84|回复: 0

【分享】简易数控机床

[复制链接]

1

主题

0

回帖

22

积分

新手上路

Rank: 1

积分
22
发表于 2024-9-1 09:03:38 | 显示全部楼层 |阅读模式
1、作品功能介绍
基于迪文屏的C51内核单片机的开发,配合自定义功能的简易数控磨床,实现对简易数控磨床的基本控制。通过程序设计与编写,实现可调节倍率的位置、速度、转速的调节。
2、工作原理
单片机系统是机床数控系统的核心,通过键盘输入命令,数控装置送来的一系列连续脉冲通过环形分配器、光电耦合器和功率放大器,按一定的顺序分配给步进电动机各相绕 组,使各相绕组按照预先规定的控制方式通电或断电,这样控制步进电动机带动工作台按照指令运动。
3、设计思路
(1)硬件部分
学校和迪文公司提供了课题所需的模块,通过查找各模块的功能、参数等,将各个模块连接成系统。将4个电机按连接好。其他的按照标准的单片机连接。
(2)软件部分
根据简易数控磨床的工作原理,编写设备的驱动代码,编写按钮扫描功能,并将指定功能与对应按钮绑定。
(3)GUI的设计 采用设计软件对界面进行简单设计,使界面简洁美观。分别设计了主页、X、Y、Z、旋转轴控制界面 .
代码如下:
#include <reg51.h> // 包含8051寄存器定义
#include <stdio.h>
unsigned int t=20;
const char step_table1[]={0x01,0x03,0x02,0x06,0x04,0x0C,0x08,0x09};
const charstep_table2[]={0x10,0x30,0x20,0x60,0x40,0xC0,0x80,0x90};
unsigned char code SedDisp[] ={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
// 定义电机方向控制变量
int direction1 = 0; // 0 - 停止, 1 - 正转, 2 - 反转
int direction2 = 0;
// 定义电机步进索引
int step1 = 0;
int step2 = 0;
// 定义电机一圈的脉冲数
#define PULSES_PER_REV 200

// 定义脉冲计数器
long pulse_count1 = 0;
long pulse_count2 = 0;

// 定义圈数计数器
int revolutions1 = 0;
int revolutions2 = 0;

// 延时函数
void delay(unsigned int ms) {
   unsigned int i, j;
   for (i = 0; i < ms; i++)
        for (j = 0; j < 5; j++);
}

int keypad()//键盘
{
  char key=0x10;
  char temp;
  P1=0xEF;
  temp=P1 & 0x0F;



  if(temp!=0x0F){

  if(temp==0x07)key=0x0A;
  if(temp==0x0b)key=0x01;
  if(temp==0x0d)key=0x04;
  if(temp==0x0e)key=0x07;
}
  P1=0xDF;
  temp=P1 & 0x0F;
  if(temp!=0x0F){

  if(temp==0x07)key=0x00;
  if(temp==0x0b)key=0x02;
  if(temp==0x0d)key=0x05;
  if(temp==0x0e)key=0x08;
}
  P1=0xBF;
  temp=P1 & 0x0F;
  if(temp!=0x0F){

  if(temp==0x07)key=0x0B;
  if(temp==0x0b)key=0x03;
  if(temp==0x0d)key=0x06;
  if(temp==0x0e)key=0x09;
}
  P1=0x7F;
  temp=P1 & 0x0F;
  if(temp!=0x0F){

  if(temp==0x07)key=0x0C;
  if(temp==0x0b)key=0x0D;
  if(temp==0x0d)key=0x0E;
  if(temp==0x0e)key=0x0F;
}
  return key;
  }




void display(long pulse_count1,longpulse_count2){
  int a,b,c,d;
  int e,f,g,h;
   // 分离第一个参数的每一位
   a = (pulse_count1 / 1000) % 10; // 千位
   b = (pulse_count1 / 100) % 10; // 百位
   c = (pulse_count1 / 10) % 10;  // 十位
   d = pulse_count1 % 10;         // 个位

   // 分离第二个参数的每一位
   e = (pulse_count2 / 1000) % 10; // 千位
   f = (pulse_count2 / 100) % 10; // 百位
   g = (pulse_count2 / 10) % 10;  // 十位
   h = pulse_count2 % 10;         // 个位

  P0 = 0xFF;
  P2 = 0x80;
  P0 = SedDisp[d];
  delay(t);

  P0 = 0xFF;
  P2 = 0x40;
  P0 = SedDisp[c];
  delay(t);

  P0 = 0xFF;
  P2 = 0x20;
  P0 = SedDisp;
  //P0=0xBF;
  delay(t);

  P0 = 0xFF;
  P2 = 0x10;
  P0 = SedDisp[a];
  delay(t);

  P0 = 0xFF;
  P2 = 0x08;
  P0 = SedDisp[h];
  delay(t);

  P0 = 0xFF;
  P2 = 0x04;
  P0 = SedDisp[g];
  //P0=0xBF;
  delay(t);

  P0 = 0xFF;
  P2 = 0x02;
  P0 = SedDisp[f];
  delay(t);

  P0 = 0xFF;
  P2 = 0x01;
  P0 = SedDisp[e];
  delay(t);


  P0 = 0xFF;
  }   



  // 主函数
void main(void) {
   // 初始化电机步进索引
    char key;
    step1 = 0;
    step2 = 0;
while (1) {
        display(pulse_count1,pulse_count2);
         key = keypad();
         if(key==0x0C){direction2=1;}
        if(key==0x0D){direction2=2;}
        if(key==0x0E){direction1=1;}
        if(key==0x0F){direction1=2;}
        if(keypad()==0x0A){direction1=0;}
        if(keypad()==0x0B){direction2=0;}
        // 控制电机1
        if (direction1==1) {
            // 正转
            P3 = step_table1[step1];
            if (step1 == 7) {
                step1 = 0;
               revolutions1++;
            } else {
                step1++;
              pulse_count1=pulse_count1+1;  
            }
        } else if(direction1==2){
            // 反转
            P3 = step_table1[step1];
            if (step1 == 0) {
                step1 = 7;
               revolutions1--;
            } else {
                step1--;
               pulse_count1=pulse_count1-1;
            }
        }

        // 控制电机2
        if (direction2==1) {
            // 正转
            P3 = (P3 & 0x7F) |step_table2[step2]; // 确保电机1的低四位不变
            if (step2 == 7) {
                step2 = 0;
               revolutions2++;
            } else {
                step2++;
               pulse_count2=pulse_count2+1;
            }
        } else if(direction2==2){
            // 反转
            P3 = (P3 & 0x7F) |step_table2[step2]; // 确保电机1的低四位不变
            if (step2 == 0) {
                step2 = 7;
               revolutions2--;
            } else {
                step2--;
               pulse_count2=pulse_count2-1;
            }
        }

        // 延时
        delay(500);
   }

}

原理图如下:

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|迪文科技论坛 ( 京ICP备05033781号-1 )

GMT+8, 2024-11-23 02:19 , Processed in 0.070901 second(s), 24 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表