牧夫天文网

 找回密码
 加入牧夫(请注明天文爱好者,否则无法通过审核)

QQ登录

只需一步,快速开始

[DIY咨询] 51单片机现学现卖 大神指点!!!

[复制链接]
liwenbao 发表于 2016-1-30 15:53 | 显示全部楼层 |阅读模式 来自: 天津市 联通

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?加入牧夫(请注明天文爱好者,否则无法通过审核)

x
本帖最后由 liwenbao 于 2016-1-30 16:03 编辑

为了DIY 电跟自学 51  单片机!学到了延时函数!心里就来了个想法用延时函数  控制转速!!!现学现卖于是乎就编了个 这个东西  固定转速和加速减速!!大神批判!!!应为 学习教程  是点亮发光二极管   所以程序  脉冲输出  是LED  没改 !!!程序注解忘了怎么 用了 所以没注解有点 乱  !!不过大神估计一看 就 懂 !!!
#include <reg52.h>
sbit LED1 = P1^0;
unsigned int a;
unsigned int b;
sbit S4 = P3^2;
sbit S3 = P3^3;
void delay(int z)
{
   unsigned int b,c;
   for(b=z;b>0;b--)
   for(c=20;c>0;c--);
}
void main ()
{  
   a=5000;
   while(1)
   {
      LED1 = 0;
      delay(a);
      LED1 = 1;
      delay(a);
          if(S4==0)
                 {
                    b=1;
                    while(b)
                        {
                   LED1 = 0;
               delay(500);
               LED1 = 1;
               delay(500);
                           if(S4==1)
                           {
                                  b=0;
                           }
                         }
              }
           if(S3==0)
                  {
                    b=1;
                    while(b)
                        {
                   LED1 = 0;
               delay(10000);
               LED1 = 1;
               delay(10000);
                           if(S4==1)
                           {
                                  b=0;
                           }
                         }
               }
     }
}
         
 楼主| liwenbao 发表于 2016-1-30 15:57 | 显示全部楼层 来自: 天津市 联通
刚学到延时函数   !  但对计数器和定时器 大体有个了解了 ! 大神们你们都 用  什么调整转速!
用延时函数能否实现 导星精确跟踪 ???、菜鸟问题 !!!!

回复 支持 反对

使用道具 举报

 楼主| liwenbao 发表于 2016-1-30 17:22 | 显示全部楼层 来自: 天津市 联通
是比较激动   !!能控制  步进电机啦
回复 支持 反对

使用道具 举报

老AK 发表于 2016-1-30 20:00 | 显示全部楼层 来自: 北京市 鹏博士BGP
期待大神讲解
回复 支持 反对

使用道具 举报

xiaoguilink 发表于 2016-1-30 20:49 | 显示全部楼层 来自: 广东省肇庆市 电信
不知道这个延时函数能否精确定时?
回复 支持 反对

使用道具 举报

火星蒙面侠 发表于 2016-1-30 20:57 | 显示全部楼层 来自: 广东省潮州市 联通
我自学单片机现在都还不会搞步进电机

点评

我刚学 3天就能简单控制步进电机了啊 !买现成的驱动器 !单片机给个脉冲就行了啊 !只要能控制点亮熄灭发光二极管就可以控制步进电机了啊 。直接把 控制发光管的信号给步进电机驱动器 电机就转了啊 。  详情 回复 发表于 2016-1-31 10:33
回复 支持 反对

使用道具 举报

v2500 发表于 2016-1-31 09:39 | 显示全部楼层 来自: 广东省深圳市 天威视讯
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

 楼主| liwenbao 发表于 2016-1-31 10:29 | 显示全部楼层 来自: 天津市 联通
现在  初步定的方案是   用  GM   导星软件   U转并口线   控制单片机  这个方案。在心里整理方案的时候,突然想到个问题,分别控制赤经赤纬好控制  。但是 还有一种情况是赤经和赤纬同事要控制啊 。这咋搞啊 ?大神指点  。  难道要  2片单片机不成 ??、
回复 支持 反对

使用道具 举报

 楼主| liwenbao 发表于 2016-1-31 10:33 | 显示全部楼层 来自: 天津市 联通
火星蒙面侠 发表于 2016-1-30 20:57
我自学单片机现在都还不会搞步进电机

我刚学   3天就能简单控制步进电机了啊 !买现成的驱动器 !单片机给个脉冲就行了啊 !只要能控制点亮熄灭发光二极管就可以控制步进电机了啊 。直接把 控制发光管的信号给步进电机驱动器 电机就转了啊 。

点评

L298还是ULN2003驱动?这个我勉强可以,但是用TB6560这种就不会了  详情 回复 发表于 2016-1-31 15:12
回复 支持 反对

使用道具 举报

火星蒙面侠 发表于 2016-1-31 15:12 | 显示全部楼层 来自: 广东省云浮市 联通
liwenbao 发表于 2016-1-31 10:33
我刚学   3天就能简单控制步进电机了啊 !买现成的驱动器 !单片机给个脉冲就行了啊 !只要能控制点亮熄 ...

L298还是ULN2003驱动?这个我勉强可以,但是用TB6560这种就不会了
回复 支持 反对

使用道具 举报

lenovovo 发表于 2016-2-4 23:54 | 显示全部楼层 来自: 上海市闵行区 电信
本帖最后由 lenovovo 于 2016-2-4 23:55 编辑

用AVR16位计时器的PWM输出,用外部中断做ST4导星接口;驱动板可以用THB6128或者7128.

点评

哪如果 两个轴都需要同事调整动作的时候 怎么搞啊??  详情 回复 发表于 2016-2-5 12:09
回复 支持 反对

使用道具 举报

 楼主| liwenbao 发表于 2016-2-5 12:09 | 显示全部楼层 来自: 天津市 联通
lenovovo 发表于 2016-2-4 23:54
用AVR16位计时器的PWM输出,用外部中断做ST4导星接口;驱动板可以用THB6128或者7128. ...

哪如果   两个轴都需要同事调整动作的时候  怎么搞啊??
回复 支持 反对

使用道具 举报

lenovovo 发表于 2016-2-5 13:17 | 显示全部楼层 来自: 上海市 电信
没冲突.或者直接用这个https://github.com/hjd1964/OnStep有goto,支持lx200协议,可以手机蓝牙控制.

点评

咳 !偶 对于编程 来说还只是个菜鸟啊 !这个根本看不懂!!!简单的编写点51 控制步进电机的程序还是能完成。所以看到GM导星软件可以并口直接输出控制信号。所以方案是 GM控制!  详情 回复 发表于 2016-2-5 16:01
回复 支持 反对

使用道具 举报

 楼主| liwenbao 发表于 2016-2-5 16:01 | 显示全部楼层 来自: 天津市 联通
lenovovo 发表于 2016-2-5 13:17
没冲突.或者直接用这个https://github.com/hjd1964/OnStep有goto,支持lx200协议,可以手机蓝牙控制. ...

咳  !偶  对于编程   来说还只是个菜鸟啊 !这个根本看不懂!!!简单的编写点51 控制步进电机的程序还是能完成。所以看到GM导星软件可以并口直接输出控制信号。所以方案是  GM控制!

回复 支持 反对

使用道具 举报

Fying 发表于 2016-2-9 12:33 | 显示全部楼层 来自: 浙江省温州市 电信
有些时间帮你解释一下吧
#include <reg52.h>  //头文件
sbit LED1 = P1^0;    //定义 LED1为 P1.0
unsigned int a;         //变量
unsigned int b;         //变量
sbit S4 = P3^2;        //
sbit S3 = P3^3;        //
void delay(int z)        //延时函数  看样子是随便延时的样子
{
   unsigned int b,c;
   for(b=z;b>0;b--)
   for(c=20;c>0;c--);
}
void main ()               //程序开始
{  
   a=5000;                 //赋值  a=5000
   while(1)                     // 循环体
   {
      LED1 = 0;            //P1.0为低电平
      delay(a);               //延时    相当于 delay (5000)   因为 a=5000
      LED1 = 1;            // P1.0为高电平
      delay(a);              //
          if(S4==0)          //当 S4电平为0时  进入
                 {
                    b=1;      
                    while(b)    // 相当于while(1)
                        {           //进入循环
                   LED1 = 0;  
               delay(500);
               LED1 = 1;
               delay(500);
                           if(S4==1)   //当S4为高电平时
                           {
                                  b=0;   //b=0   如果用break可能会更好些 当b=0时 即while(0) 退出。
                           }
                         }
              }
           if(S3==0)    //同上
                  {
                    b=1;
                    while(b)
                        {
                   LED1 = 0;
               delay(10000);
               LED1 = 1;
               delay(10000);
                           if(S4==1)
                           {
                                  b=0;
                           }
                         }
               }
     }
}
//程序结束
//好好学习 天天向上
回复 支持 反对

使用道具 举报

dzhtryq 发表于 2016-2-24 19:44 | 显示全部楼层 来自: 广东省广州市 电信
这个不准确的,得用定时器才准确
回复 支持 反对

使用道具 举报

 楼主| liwenbao 发表于 2016-2-24 21:37 | 显示全部楼层 来自: 天津市 联通
学到定时器 和   中断系统了   于是乎 又边了 一个   能调速的啊大神给看看 这样   能行不。4个中断全用上了!赤纬 正反转只能直接控制驱动板了!
#include <reg52.h>
sbit LED1 = P1^0;
sbit LED2 = P1^1;
sbit DIR = P1^3;
unsigned int a;
unsigned int d;
void delay(int z)
{
   unsigned int b,c;
   for(b=z;b>0;b--)
   for(c=20;c>0;c--);                                                                          
}

void main()
{
        TMOD = 0X11; //定时器0,1。16位定时器
        TH0 = 0X45;
        TL0 = 0X96;         //装载初值17814.
        TR0 = 1;        //启动定时器0
        ET0 = 1;        //启动定时器0中断
       


        TH1 = 0X45;
        TL1 = 0X96;         //装载初值17814.
        TR1 = 1;        //启动定时器1
        ET1 = 1;        //启动定时器1中断

    IT0 = 0;  //低电平触发
    EX0 = 1;  //外部中断0允许
    IT1 = 0;  //低电平触发
    EX1 = 1;  //外部中断1允许
        EA = 1;                //开总中断
        while(1);        // 等待中断
       
}
void waizhong0() interrupt 0 //开外部中断0加速
{
LED1 = ~LED1;
delay(5);
LED1 =~LED1;
}
void waizhong1() interrupt 2 //开外部中断1减速
{
delay(1000);
LED1 =~LED1;
}                 

void timer0() interrupt 1         //定时器0中断服务程序
{
LED1 = ~LED1;                                 //电机脉冲
}
void timer1() interrupt 3         //定时器1中断服务程序
{
LED2 = ~LED2;                                 //电机脉冲
}
回复 支持 反对

使用道具 举报

optical 发表于 2016-2-24 22:34 | 显示全部楼层 来自: 河南省郑州市 联通
上AVR或者STM8或者STM32吧,定时器多,不用为资源不够用发愁,有专门的PWM输出。严格的同时改变两轴的速度是不存在的,毕竟修改寄存器数据也有先后顺序。在中断里修改下速度值就可以了,不过这个时间很短可以认为是同时的。
回复 支持 反对

使用道具 举报

本版积分规则

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