|
本帖最后由 mzral 于 2014-2-15 22:22 编辑
虽然已经有卖遥控手柄的了,而且价格不贵,但本着DIY 能自己做的东西花钱买是一种耻辱的精神,用单片机做了个xyz轴步进信号发生器。应该相当于数控上的遥控手柄了吧,,不知道具体有什么意义,但至少可以不用手去拧平台了,
下图51系统+1602液晶点阵
下图装好后,因为没有手摇的那种滚轮,,所以调速只能靠按钮了。。
来张背面的
硬件已经搭建完毕,因为是旧洞洞板,不上锡,所以焊接的比较难看,但能用。下一步,软件编写
在编了N天之后,,终于小有成效,初步调试通过,下一步,焊接线端子,后面的裸露电路需要包扎一下
代码已经完成Xyz轴的运动处理,亲测能用。。等我的7016钻铣到了,上床调试速度.不多说了,先上个代码给感兴趣的坛友研究研究
以下是代码
// 1 xyz轴默认速度选择按钮
// 2 默认速度减
// 3 默认速度加
// 4 X+
// 5 X-
// 6 Y+
// 7 Y-
// 8 Z+
// 9 Z- 随着代码一点点的完成 还发现很多不足的地方,代码里还没留限位开关呢,可是芯片的管脚已经不够用了,还需要增加管脚。或者把指示灯去掉节省几个管脚?。。。
// 双击4或5 x轴对应加减0.1mm距离 (需上机调试后确定)
// 双击6或7 y轴对应加减0.1mm距离 (需上机调试后确定)
// 双击8或9 z轴对应加减0.1mm距离 (需上机调试后确定)
//
//
/*******************************************************************************
* 描述: 晶振11.0592 30p起振电容 DC5V *
********************************************************************************/
#include <reg51.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
/************* 1602引脚定义 *************/
#define LCD_data P0 //数据口
sbit LCD_RS = P1^6; //寄存器选择输入
sbit LCD_RW = P1^3; //液晶读写控制
sbit LCD_EN = P1^4; //液晶使能控制
#define delayNOP(); {_nop_();_nop_();_nop_();_nop_();};
sbit KXA = P3^5; //7 X+
sbit KXB = P3^6; //6 X-
sbit KYA = P3^3; //4 Y+
sbit KYB = P3^7; //5 Y-
sbit KZA = P3^2; //8 Z+
sbit KZB = P3^4; //9 Z-
sbit XLED = P1^0; //X轴调速选择指示灯LED
sbit YLED = P1^1; //Y轴调速选择指示灯LED
sbit ZLED = P1^2; //Z轴调速选择指示灯LED
sbit Kslow = P3^1; //减速
sbit Kfast = P3^0; //加速
sbit Kchice = P1^5; //选择
sbit Xmaichong = P2^0; //X轴脉冲输出
sbit Xzhishi = P2^1; //X轴脉冲指示灯
sbit Xfanzheng = P2^2; //X轴方向控制
sbit Ymaichong = P2^3; //Y轴脉冲输出
sbit Yzhishi = P2^4; //Y轴脉冲指示灯
sbit Yfanzheng = P2^5; //Y轴方向控制
sbit Zmaichong = P2^6; //Z轴脉冲输出
sbit Zzhishi = P2^7; //Z轴脉冲指示灯
sbit Zfanzheng = P1^7; //Z轴方向控制
bit flag1=1; //程序标志
bit flagKXA=1; //程序标志
bit flagKXB=1; //程序标志
bit flagKYA=1; //程序标志
bit flagKYB=1; //程序标志
bit flagKZA=1; //程序标志
bit flagKZB=1; //程序标志
uchar o=0; //计数变量
uchar p=0; //计数变量
uchar q=0; //计数变量
uchar z=0; //计数变量
uchar Xr=0; //计数变量
uchar Yr=0; //计数变量
uchar Zr=0; //计数变量
int Xrate=10; //预设定速率
int Yrate=10; //预设定速率
int Zrate=10; //预设定速率
/*********************************************************/
uchar code DIS1[] = {"F: X10 Y10 Z10"};
uchar code num[] = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
/*******************************************************************/
/* 延时函数 */
/*******************************************************************/
void delay(int ms)
{
while(ms--)
{
uchar i;
for(i=0;i<150;i++)
{
}
}
}
void Zdelay(int ms)
{
while(ms--)
{
uchar i;
}
}
/*******************************************************************/
/*检查LCD忙状态 */
/*lcd_busy为1时,忙,等待。lcd-busy为0时,闲,可写指令与数据。 */
/*******************************************************************/
bit lcd_busy()
{
bit result;
LCD_RS = 0;
LCD_RW = 1;
LCD_EN = 1;
delayNOP();
result = (bit)(P0&0x80);
LCD_EN = 0;
return(result);
}
/*******************************************************************/
/*写指令数据到LCD */
/*RS=L,RW=L,E=高脉冲,D0-D7=指令码。 */
/*******************************************************************/
void lcd_wcmd(uchar cmd)
{
while(lcd_busy());
LCD_RS = 0;
LCD_RW = 0;
LCD_EN = 0;
_nop_();
_nop_();
P0 = cmd;
delayNOP();
LCD_EN = 1;
delayNOP();
LCD_EN = 0;
}
/*******************************************************************/
/*写显示数据到LCD */
/*RS=H,RW=L,E=高脉冲,D0-D7=数据。 */
/*******************************************************************/
void lcd_wdat(uchar dat)
{
while(lcd_busy());
LCD_RS = 1;
LCD_RW = 0;
LCD_EN = 0;
P0 = dat;
delayNOP();
LCD_EN = 1;
delayNOP();
LCD_EN = 0;
}
/*******************************************************************/
/* LCD初始化设定 */
/*******************************************************************/
void lcd_init()
{
lcd_wcmd(0x34); //扩充指令操作
delay(5);
lcd_wcmd(0x30); //基本指令操作
delay(5);
lcd_wcmd(0x0C); //显示开,关光标
delay(5);
lcd_wcmd(0x01); //清除LCD的显示内容
delay(5);
}
/*********************************************************/
/* 设定显示位置 */
/*********************************************************/
void lcd_pos(uchar X,uchar Y)
{
uchar pos;
if (X==1)
{X=0x80;}
else if (X==2)
{X=0x90;}
else if (X==3)
{X=0x88;}
else if (X==4)
{X=0x98;}
pos = X+Y ;
lcd_wcmd(pos); //显示地址
}
/*********************************************************
* 闪烁函数 *
*********************************************************/
void lcdflag()
{
lcd_wcmd(0x08);
delay(400);
lcd_wcmd(0x0c);
delay(400);
lcd_wcmd(0x08);
delay(400);
lcd_wcmd(0x0c);
delay(400);
lcd_wcmd(0x08);
delay(200);
lcd_wcmd(0x0c);
delay(5);
lcd_wcmd(0x01);
delay(5);
}
/*********************************************************
* 清屏函数 *
*********************************************************/
void clr_screen()
{
lcd_wcmd(0x34); //扩充指令操作
delay(5);
lcd_wcmd(0x30); //基本指令操作
delay(5);
lcd_wcmd(0x01); //清屏
delay(5);
}
/*********************************************************
* 初始化定时器 *
*********************************************************/
void Timer_Init(void) //-------T0初始化函数
{
TMOD = 0x11; //--设置T1 T0工作方式
TH0 = 0xff;TL0 = 0xf6;
TH1 = 0xff;TL1 = 0xfa;
IE = 0x9a; //-------------开中断
ES = 0;
TR0 = 1; //----------Timmer0开
TR1 = 1; //----------Timmer1开
}
/********************************************************
/* 定时器 0 中断 *
/********************************************************/
void Xmotor() interrupt 1 using 1
{
TH0 = 0xff; //重新给TH0赋值
TF0 = 0 ; //定时溢出清0
p++;
//=======================================================================
//=======================================================================
///////////////////////////////////////////////////////处理X轴运动///////
if(p > (20-Xrate) && flagKXA==0)
{
p=0;
Xr=Xr+1;
Xmaichong=~Xmaichong;
if(Xr>50)
{
Xzhishi = ~Xzhishi;
Xr=0;
}
}
if(p > (20-Xrate) && flagKXB==0)
{
p=0;
Xr=Xr+1;
Xmaichong=~Xmaichong;
if(Xr>50)
{
Xzhishi = ~Xzhishi;
Xr=0;
}
}
}
///////////////////////////////////////////////////////处理X轴运动///////
//=======================================================================
///////////////////////////////////////////////////////处理Y轴运动///////
void Ymotor(void) interrupt 3 using 2
{
TH1 = 0xff; //重新给TH1赋值
//TL0 = 0x00; //不对TL1赋值,让其继续计数
TF1 = 0 ; //定时溢出清0
q++;
if(q > (20-Yrate) && flagKYA==0)
{
q=0;
Yr=Yr+1;
Ymaichong=~Ymaichong;
if(Yr>50)
{
Yzhishi = ~Yzhishi;
Yr=0;
}
}
if(q > (20-Yrate) && flagKYB==0)
{
q=0;
Yr=Yr+1;
Ymaichong=~Ymaichong;
if(Yr>50)
{
Yzhishi = ~Yzhishi;
Yr=0;
}
}
}
///////////////////////////////////////////////////////处理Y轴运动///////
//=======================================================================
//代码过长,帖子有字数限制,,代码分两部分发
注:19楼的代码是半成品,可是无法删掉了。。调试好的后半部分代码在24楼!!!!!
|
-
4.jpg
(71.8 KB, 下载次数: 23)
来张背面的
欢迎继续阅读楼主其他信息
|