标题: 单片机万年历和42步进电机驱动问题 [打印本页]

作者: xue123654    时间: 2023-4-3 21:33
标题: 单片机万年历和42步进电机驱动问题
请各位大佬帮我看下这个程序怎么柔和,谢谢!
本人新学的单片机,想着一边实践一边学习,我找了一个万年历的程序,可以正常使用了,又找了一个42步进电机的驱动也可以正常使用的。
现在我想把这两个程序弄在一起,就是万年历显示的同时让步进电机也转起来。
因为原来是两个程序所以有两个MIAN函数,我现在弄在一起之后像下面这样:
#include "public.h"
#include "calendar.h"
#include "motor.h"

  void delay(unsigned int x) // 延时函数
{
    unsigned int i,j;
    for(i=x;i>0;i--)
    {
        for(j=110;j>0;j--);
    }
}


void main()
{        
                 calendar_test();
        
        while(1)
        {



        }

}         

int motor()

{
while(1)
    {
        Z = 1; // 阶段1:开启A相
        delay(50); // 延时
        Z = 0; // 阶段2:关闭A相
        M = 1; // 阶段3:开启B相
        delay(50); // 延时
        M = 0; // 阶段4:关闭B相
        N = 1; // 阶段5:开启C相
        delay(50); // 延时
        N = 0; // 阶段6:关闭C相
        L = 1; // 阶段7:开启D相
        delay(50); // 延时
        L = 0; // 阶段8:关闭D相
}
return 0;
          }
编译是没有错的,但是它只显示万年历,步进电机不转,我把int motor改为intmain上面的viod main随便改个字母实现唯一main函数时它又是只有步进电机转而不显示万年历了,请大神帮我看下问题出在哪里,怎么可以弄好,谢谢。


程序.7z

34.87 KB, 下载次数: 6


作者: a185980800    时间: 2023-4-4 00:18
两个while(1)   前面一个进去就出不来了后面都不会执行了
作者: 流浪宇宙    时间: 2023-4-4 06:37
步进电机是将电脉冲控制信号转变为角位移或线位移的一种常用的数字控制执行元件,又称为脉冲电机。在驱动电源的作用下,步进电机受到脉冲的控制,其转子的角位移量和速度严格地与输入脉冲的数量和脉冲频率成正比。步进电机每接收一个电脉冲,转子就转过一个相应的角度(步距角)。改变通电顺序可改变步进电动机的旋转方向;改变通电频率可改变步进电动机的转速。因此,通过控制输入电脉冲的数目、频率及电动机绕组的通电顺序就可以获得所需要的转角、转速及转向,利用单片机就可以很容易实现步进电机的开环数字控制。
传统的步进电机控制方法是由触发器产生控制脉冲来进行控制的,但此种控制方法工作方式单一而且难于实现人机交互,当步进电机的参数发生变化时,需要重新进行控制器的设计。因此适合于单片机控制,单片机通过向步进电机驱动电路发送控制信号就能实现对步进电机的控制。
步进电机内部实际产生了一个可以旋转的磁场,如图所示,当旋转磁场依次切换时,转子(rotor)就会随之转动相应的角度。当磁场旋转过快或者转子上所带负载的转动惯量太大时,转子无法跟上步伐,就会造成失步。
————————————————

作者: man1234567    时间: 2023-4-4 08:24
while(1)这东东像黑洞,进去了没可能出来。
所以将所有你想while(1)的放在一起,while(1)只留一个。
作者: xue123654    时间: 2023-4-4 20:49
a185980800 发表于 2023-4-4 00:18
两个while(1)   前面一个进去就出不来了后面都不会执行了

谢谢,可是改了一个weil还是只能运行一个
作者: xue123654    时间: 2023-4-4 20:49
man1234567 发表于 2023-4-4 08:24
while(1)这东东像黑洞,进去了没可能出来。
所以将所有你想while(1)的放在一起,while(1)只留一个。

谢谢,改了试过了,还是一样
作者: zhuls    时间: 2023-4-8 15:26
。。。。
单步执行一下,卡在这里了:

void calendar_test(void)
{
        u8 key_temp=0;

        lcd1602_init();
        ds1302_init();
        ds18b20_init();
        time0_init();//定时器10ms       
        while(1)   //<<<<<<<<<<<<<<<
        {
。。。




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1