liwenbao 发表于 2016-1-30 15:53

51单片机现学现卖 大神指点!!!

本帖最后由 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

是比较激动   !!{:2_189:}能控制步进电机啦{:2_197:}

老AK 发表于 2016-1-30 20:00

期待大神讲解

xiaoguilink 发表于 2016-1-30 20:49

不知道这个延时函数能否精确定时?

火星蒙面侠 发表于 2016-1-30 20:57

我自学单片机现在都还不会搞步进电机

v2500 发表于 2016-1-31 09:39

liupeng134 发表于 2016-1-31 09:56

佩服

liwenbao 发表于 2016-1-31 10:29

现在初步定的方案是   用GM   导星软件   U转并口线   控制单片机这个方案。在心里整理方案的时候,突然想到个问题,分别控制赤经赤纬好控制。但是 还有一种情况是赤经和赤纬同事要控制啊 。这咋搞啊 ?大神指点。难道要2片单片机不成 ??、

liwenbao 发表于 2016-1-31 10:33

火星蒙面侠 发表于 2016-1-30 20:57
我自学单片机现在都还不会搞步进电机

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

火星蒙面侠 发表于 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.

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协议,可以手机蓝牙控制.

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输出。严格的同时改变两轴的速度是不存在的,毕竟修改寄存器数据也有先后顺序。在中断里修改下速度值就可以了,不过这个时间很短可以认为是同时的。
页: [1]
查看完整版本: 51单片机现学现卖 大神指点!!!