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;
}
}
}
}
}
刚学到延时函数 !但对计数器和定时器 大体有个了解了 ! 大神们你们都 用什么调整转速!
用延时函数能否实现 导星精确跟踪 ???、菜鸟问题 !!!!
是比较激动 !!{:2_189:}能控制步进电机啦{:2_197:} 期待大神讲解 不知道这个延时函数能否精确定时? 我自学单片机现在都还不会搞步进电机 佩服 现在初步定的方案是 用GM 导星软件 U转并口线 控制单片机这个方案。在心里整理方案的时候,突然想到个问题,分别控制赤经赤纬好控制。但是 还有一种情况是赤经和赤纬同事要控制啊 。这咋搞啊 ?大神指点。难道要2片单片机不成 ??、 火星蒙面侠 发表于 2016-1-30 20:57
我自学单片机现在都还不会搞步进电机
我刚学 3天就能简单控制步进电机了啊 !买现成的驱动器 !单片机给个脉冲就行了啊 !只要能控制点亮熄灭发光二极管就可以控制步进电机了啊 。直接把 控制发光管的信号给步进电机驱动器 电机就转了啊 。
liwenbao 发表于 2016-1-31 10:33
我刚学 3天就能简单控制步进电机了啊 !买现成的驱动器 !单片机给个脉冲就行了啊 !只要能控制点亮熄 ...
L298还是ULN2003驱动?这个我勉强可以,但是用TB6560这种就不会了
本帖最后由 lenovovo 于 2016-2-4 23:55 编辑
用AVR16位计时器的PWM输出,用外部中断做ST4导星接口;驱动板可以用THB6128或者7128. lenovovo 发表于 2016-2-4 23:54
用AVR16位计时器的PWM输出,用外部中断做ST4导星接口;驱动板可以用THB6128或者7128. ...
哪如果 两个轴都需要同事调整动作的时候怎么搞啊??
没冲突.或者直接用这个https://github.com/hjd1964/OnStep有goto,支持lx200协议,可以手机蓝牙控制. lenovovo 发表于 2016-2-5 13:17
没冲突.或者直接用这个https://github.com/hjd1964/OnStep有goto,支持lx200协议,可以手机蓝牙控制. ...
咳!偶对于编程 来说还只是个菜鸟啊 !这个根本看不懂!!!简单的编写点51 控制步进电机的程序还是能完成。所以看到GM导星软件可以并口直接输出控制信号。所以方案是GM控制!
有些时间帮你解释一下吧
#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;
}
}
}
}
}
//程序结束
//好好学习 天天向上
这个不准确的,得用定时器才准确 学到定时器 和 中断系统了 于是乎 又边了 一个 能调速的啊大神给看看 这样 能行不。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; //电机脉冲
} 上AVR或者STM8或者STM32吧,定时器多,不用为资源不够用发愁,有专门的PWM输出。严格的同时改变两轴的速度是不存在的,毕竟修改寄存器数据也有先后顺序。在中断里修改下速度值就可以了,不过这个时间很短可以认为是同时的。
页:
[1]