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); }
}
原理图如下:
|