找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1485|回复: 5
打印 上一主题 下一主题
收起左侧

请各位大师指导,以下写的单片机函数是否可以控制两个电机正常运行?

[复制链接]
跳转到指定楼层
楼主
ID:889206 发表于 2021-3-10 22:16 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 kpljn 于 2021-3-11 22:47 编辑

本人刚学单片机,感觉写的函数不一定正确,请各位大师多多指教,谢谢!
      程序的目的:用一个启动开关控制两个电机按次序运行,两个电机都设有原位感应开关及限位感应开关。只有两个机械部件恢复至原位并按下各自的感应开关,触发一下启动开关就可以控制两个电机开始运行。
     目的流程如下:1、检测两个原位开关为0状态,当启动开关状态触发一下时,开始启动M2电机运行,控制第一个机械部件离开原位感应开关S3,往限位感应开关S4前进。2、到达S4后,M2电机停转两秒钟。3、M2电机恢复运行,机械部件离开S4,往S3前进。4、第一个机械部件回到原位后,M2电机停止,两秒后开始启动M1电机,控制第二个机械部件离开原位感应开关S1,往限位感应开关S2前进。5、到达S2后,M1电机停转两秒钟。6、M1电机开始反向运行,机械部件离开S2,往原位S1返回。7、返回S1后,M1电机也停止。8、系统回到初始状态,等待启动开关的被按下后执行下一个周期的动作。
  代码如下:
#include<STC12C2052AD.H> //头文件
#define uchar unsigned char
#define uint unsigned int
sbit M1F=P1^0;
sbit M1B=P1^1;
sbit M2F=P1^2;
sbit M2B=P1^3;
sbit SS1=P1^7;            //定义启动开关
sbit S1=P3^0;             //定义托盘原位感应开关
sbit S2=P3^1;             //定义托盘限位感应开关
sbit S3=P3^2;                                                        //定义剪切原位感应开关
sbit S4=P3^3;                                                        //定义剪切限位感应开关

unsigned int num;               //无符号整型变量
void Delay10Ms()              //去抖延时子函数,暂时不引用
{
        TMOD=0x01;                                                        //设置定时器0的工作方式为1(M1M0为01)
        TH0=(65536-10000)/256;        //装初值12M晶振定时10ms数为55536
        TL0=(65536-10000)%256;        
        EA=1;                                                                                //开总中断
        ET0=1;                                                                        //开定时器0中断
        TR0=1;                                                                        //启动定时器0
}
void Second2()              //等待2秒的子函数
         {
                 TMOD=0x01;
                 TH0=(65536-50000)/256; //重装初值        
          TL0=(65536-50000)%256;
          EA=1;                                                                                //开总中断
                ET0=1;                                                                        //开定时器0中断
                TR0=1;
          num=0;
          num++;                                                                 //num每次加1
          if(num==40)                                                 //num到40,说明2秒时间到
           {
            num=0;                                                         //然后把num清0,重新再计40次
              }
            }
void main()        //主函数
{
        {
        SS1=1;                                                                        //启动开关初值置1
        S2=1;                                                                          //托盘限位感应开关置1
        S4=1;                                                                          //剪切限位感应开关置1
        M1F=0;                                                                        //托盘电机正极置0
        M1B=0;                                                                        //托盘电机负极置0
        M2F=0;                                                                        //剪切电机正极置0
        M2B=0;                                                                        //剪切电机负极置0
       if(S1==0&&S3==0)        //判断两个原位感应开关状态被按下  
                if(SS1==0)               //再判断启动开关也被触发一下(再学习了一下,发现这两行代码用if不对,请大师指导啥写才正确)
        while(S4)                           //剪切限位感应开关被按下之前执行以下两行代码
        {
        S3=1;                      //剪切原位感应开关置1
        M2F=1;                   //启动M2电机
        }
        }                             //剪切限位感应开关被按下后执行以下两行代码
        M2F=0;                   //暂停M2电机
        Second2();              //等待2秒
        while(S3)                //剪切原位感应开关未按下之前执行以下一行代码
        {
        M2F=1;                   //启动M2电机
        }                            //剪切原位感应开关被按下之后执行以下三行代码
        M2F=0;                   //停止M2电机
        Second2();              //等待2秒
        while(S2)                //托盘限位感应开关未按下之前执行以下三行代码               
        {
        S1=1;                    //托盘原位感应开关置1
        M1F=1;                  //M1电机正向运行
        M2B=0;
        }
        M1F=0;                   //暂停M1电机
        Second2();               //等待2秒
        while(S1)                 //托盘原位感应开关未按下之前执行以下两行代码
        {
        M1F=0;                   //M1电机反向运行
        M1B=1;
        }
        M1B=0;                   //托盘原位感应开关被按下后,停止M2电机   最后这一行是否要添加return,等待下一次触发启动键?
}

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:889206 发表于 2021-3-11 08:09 | 只看该作者
今天测试了一下,加电后发现电机在乱转。
回复

使用道具 举报

板凳
ID:827243 发表于 2021-3-11 11:01 | 只看该作者
无语,Second2() 根本就无法等待2秒,也许1ms就结束了。
if(num==40)                                                 //num到40,说明2秒时间到
这个能执行几次?

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

地板
ID:889206 发表于 2021-3-11 12:27 | 只看该作者
daemondong 发表于 2021-3-11 11:01
无语,Second2() 根本就无法等待2秒,也许1ms就结束了。
if(num==40)                                    ...

电机乱转不是这个定时子函数引起的,好像是最前面的if语句有问题引致的,但自己水平有限,分析不出问题。另外,Sencond2()这个只是大概的时间值,要求不太高的话,是可以接受的。我将Second2()放在控制LED闪亮的函数里面测试,是可以控制LED作间隔大约2秒的闪亮动作。
回复

使用道具 举报

5#
ID:889206 发表于 2021-3-11 12:34 | 只看该作者
回复

使用道具 举报

6#
ID:889206 发表于 2021-3-11 20:03 | 只看该作者
顶一顶,求大神指导。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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