5iMX宗旨:分享遥控模型兴趣爱好

5iMX.com 我爱模型 玩家论坛 ——专业遥控模型和无人机玩家论坛(玩模型就上我爱模型,创始于2003年)
查看: 3758|回复: 36
打印 上一主题 下一主题

用单片机做了个脉冲输出的手柄。替代电脑控制

[复制链接]
跳转到指定楼层
楼主
发表于 2014-2-9 21:13 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 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, 下载次数: 22)

来张背面的

来张背面的

欢迎继续阅读楼主其他信息

沙发
发表于 2014-2-9 21:21 | 只看该作者
DIY 能自己做的东西花钱买是一种耻辱的精神
3
发表于 2014-2-9 21:24 | 只看该作者
电子强人
4
 楼主| 发表于 2014-2-9 21:26 | 只看该作者
1zmit 发表于 2014-2-9 21:21
DIY 能自己做的东西花钱买是一种耻辱的精神

yes
5
 楼主| 发表于 2014-2-9 21:32 | 只看该作者

没这么强,,床子这方面我可是个超级新手。。正在纠结,滕州20钻铣和西菱ZX7016,打算2000左右入个小钻铣哪个好呢。。。。

6
发表于 2014-2-9 21:59 | 只看该作者
没明白楼主的宗旨是什么。但是在性能方面能达到一致。我想应该是成功地。
7
 楼主| 发表于 2014-2-9 22:49 | 只看该作者
老撅杆 发表于 2014-2-9 21:59
没明白楼主的宗旨是什么。但是在性能方面能达到一致。我想应该是成功地。

就是一个可以控制xyz轴步进电机的手柄。为以后的DIY数控小铣 做准备
8
发表于 2014-2-9 23:50 | 只看该作者
两年半不换水是怎么做到的

9
 楼主| 发表于 2014-2-10 09:37 | 只看该作者
疯狂芹菜 发表于 2014-2-9 23:50
两年半不换水是怎么做到的

1,鱼缸长150cm 宽28cm ,底沙是土质的陶沙,可供植物生长.
2,有几条彩霞,不经常喂 每3天喂一次,饿的时候鱼偶尔吃点水草,防止水草过多。
3,彩霞经常下崽,定期清理多余的彩霞,,保留8条之内,2条公的,6条母的,多余的,直接扔掉,为了维持平衡,,没办法
4,有种大胡子鱼,,吃水底脏东西的,主要彩霞的便便。植物生长也会用到鱼便便。
5,有三四条清洁工,清理缸壁
6,偶尔水质不好偏黄的时候加入少量硝化细菌
7,每周开2小时过滤。
8,由于水分蒸发,定期补入新水,,坛子快变成养鱼的了,哈哈

10
发表于 2014-2-10 12:39 | 只看该作者



甲类两声道啊。电源变压器有点小哦。
11
 楼主| 发表于 2014-2-10 16:16 | 只看该作者
灯丝是独立供电,所以省了十瓦左右的功率,
12
发表于 2014-2-10 20:20 | 只看该作者
支持原创
13
发表于 2014-2-10 21:46 | 只看该作者
呵呵,一直想玩玩胆机.但是器材不好找啊,你这个用来推5寸书架箱爽啊
14
 楼主| 发表于 2014-2-10 22:10 | 只看该作者
没专业的音箱,,不过有个aiwa的老磁带CD机520,,音箱效果还维持、、
15
发表于 2014-2-11 10:39 | 只看该作者



用6P14好些吧,费用差不多。

16
 楼主| 发表于 2014-2-11 12:04 | 只看该作者
机械人家 发表于 2014-2-11 10:39
用6P14好些吧,费用差不多。

手头有好几斤6P1,6N1,6N2.。。所以就这么做了,,,够用一辈子的了。。
17
发表于 2014-2-11 12:11 | 只看该作者
楼主买个单片机实验箱吧,用里面的成品电路,组合调试好之后,再画pcb板,然后开始焊接,其实多费不了多少事情的。洞洞板实在是看着晕。
18
 楼主| 发表于 2014-2-11 20:54 | 只看该作者
wangcaidepy 发表于 2014-2-11 12:11
楼主买个单片机实验箱吧,用里面的成品电路,组合调试好之后,再画pcb板,然后开始焊接,其实多费不了多少 ...

单片机的试验箱有很多,但是按钮不是这么摆放的按着不顺手,这个做出来就直接使用了,用左手操作正好(有点左撇子)。。还有试验箱要连的线太多,而且杜邦线插接也不稳定。为这一块手柄 开个版不太划算、、
19
 楼主| 发表于 2014-2-12 23:49 | 只看该作者
本帖最后由 mzral 于 2014-2-15 19:01 编辑


1
20
发表于 2014-2-13 12:56 | 只看该作者
努力就有希望!
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

关闭

【站内推荐】上一条 /1 下一条

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