找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机i/0控制电机正反转模块程序执行逻辑问题

[复制链接]
跳转到指定楼层
楼主
ID:470826 发表于 2019-2-18 13:24 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
控制两个直流电机正反转,i/0已经规划好,但是写在中断了里面,执行起来,只要上下左右哪个碰触开关起作用的话,就执行不了下一步, 猜测原因触碰开关按下后,没发自复位,有没有高手给点建议,怎么改程序呢?
/*-----------------------------------------------
  项目:外部中断控制用电器
  日期:
  描述:外部中断0接收脉冲、或者电平信号,开启设备,
              外部中断1接收脉冲、或者电平信号,关闭设备。              
------------------------------------------------*/
#include <reg52.h>                               //包含特殊寄存器,一般不要改动。
/*------------------------------------------------
定义新变量
------------------------------------------------*/
#define uchar unsigned char      
#define uint unsigned int
/*------------------------------------------------
单片机P1、P2、P3端口变量声明  默认端口状态为高电平
/****************P0口还剩0个空余****************
*****************P1口还剩4个空余****************
*****************P2口还剩0个空余****************
*****************P3口还剩6个空余****************
------------------------------------------------*/
/***继电器控制2个外部中断,执行2套动作****/
sbit ExtTrigOn = P3^2;             //外部中断0,接收开机信号
sbit ExtTrigOff= P3^3;             //外部中断1,接收关机信号
sbit PaiCha  = P2^0;               //控制排插
sbit DaPing1 = P2^1;               //控制大屏幕1
sbit DaPing2 = P2^2;               //控制大屏幕2
sbit DaPing3 = P2^3;               //控制大屏幕3
sbit PcOn    = P2^4;               //控制电脑开机运行
sbit CameraPower =P2^5;            //控制摄像机电源
sbit MotOnePower=P2^6;             //电机1电源开关
sbit MotTowPower=P2^7;             //电机2电源开关
sbit Keydp1  = P1^1;               //按钮控制大屏幕1关闭
sbit Keydp2  = P1^2;               //按钮控制大屏幕2关闭
sbit Keydp3  = P1^3;               //按钮控制大屏幕3关闭
sbit KeyCam  = P1^4;               //按钮控制摄像头电源
sbit MotorONEFWD = P0^0;           //电机1正转   
sbit MotorONEREV = P0^1;           //电机1反转   
sbit MotorTOWFWD = P0^2;           //电机2正转   
sbit MotorTOWREV = P0^3;           //电机2反转
sbit KeyRight=P0^4;                //右边触碰开关
sbit KeyUp   =P0^5;                //上边触碰开关
sbit KeyLeft =P0^6;                //左边触碰开关
sbit KeyDown =P0^7;            //下边触碰开关



//模拟中断信号
sbit zhongduan0= P1^5;             //按下后执行中断0
sbit zhongduan1= P1^6;             //按下后执行中断1
/*------------------------------------------------
用到的功能函数模块
------------------------------------------------*/  
void KeyProcess();                //按钮控制
void KeyDelayMs(unsigned char t); //延时消抖函数
void McuInitial();                //MCU上电初始化
void OnProcess();                 //开机动作
void OffProcess();                //关机动作
/*------------------------------------------------
主函数
------------------------------------------------*/
void main(void)
{
        
while(1)
{
                McuInitial();              //单片机上电初始化函数
          KeyDelayMs(0);            //延时函数
          KeyProcess();             //按钮控制大屏、摄像头等函数
               
}
}
/*------------------------------------------------
按键控制大屏、摄像头电源打开与闭合
------------------------------------------------*/
void KeyProcess()
{
        Keydp1 = 0x01;
        Keydp2 = 0x01;
        Keydp3 = 0x01;
        KeyCam = 0x01;
        while(1)
        {
                if(!Keydp1)
                {
                                KeyDelayMs(10);
                                if(!Keydp1)
                                {
                                        DaPing1=~DaPing1;
                                        while(!Keydp1);
                                }
                        
                }
                if(!Keydp2)
                {
                                KeyDelayMs(10);
                                if(!Keydp2)
                                {
                                        DaPing2=~DaPing2;
                                        while(!Keydp2);
                                }
                        
                }
                if(!Keydp3)
                {
                                KeyDelayMs(10);
                                if(!Keydp3)
                                {
                                        DaPing3=~DaPing3;
                                        while(!Keydp3);
                                }
                        
                }
                        if(!KeyCam)
                {
                                KeyDelayMs(10);
                                if(!KeyCam)
                                {
                                        CameraPower=~CameraPower;
                                        while(!KeyCam);
                                }
                        
                }
                if(!zhongduan0)
                {
                                KeyDelayMs(10);
                                if(!zhongduan0)
                                {
                                        ExtTrigOn=~ExtTrigOn;
                                        while(!zhongduan0);
                                }
                        
                }
                if(!zhongduan1)
                {
                                KeyDelayMs(10);
                                if(!zhongduan1)
                                {
                                        ExtTrigOff=~ExtTrigOff;
                                        while(!zhongduan1);
                                }
                        
                }
               
}
}        


/*------------------------------------------------
单片机I/0及中断初始化函数
------------------------------------------------*/
void McuInitial(void)
  {
  P0=0XFF;                   //P0口全部为高电平
        P1=0XFF;                   //P1口全部为高电平
        P2=0XFF;                   //P2口全部为高电平
        P3=0XFF;                   //P3口全部为高电平
        CameraPower=0;             //摄像头电源打开
        EA = 1;                    //开启总中断
  IT0 = 1;                   //中断跳变采用边沿触发(下降沿触发)
        IT1 = 1;                               //中断跳变采用边沿触发(下降沿触发)
  EX0 = 1;                   //开启外部中断0               
  EX1 = 1;                   //开启外部中断1
        IP=0x04;                   //设置外部中断1为高优先级

  }
/*------------------------------------------------
外部中断0中断执行接到开机指令进行开机动作子函数
------------------------------------------------*/
void OnProcess()
{
             PaiCha  =0;           //点亮排插           
                         DaPing1 =0 ;          //点亮大屏1
                         DaPing2 =0 ;          //点亮大屏2   
                         DaPing3 =0 ;          //点亮大屏3
                         PcOn    =0;           //点亮3台电脑

                                         在箱子的上下左右各一个碰触开关,控制2个电机的正反转
                        (触碰开关一经闭合就没法自己复位   对程序有影响,怎么解决)
                        
}
/*------------------------------------------------
外部中断1中断执行接到关机指令进行关机动作子函数
------------------------------------------------*/
void OffProcess()
{
             PaiCha  =1;               
                         DaPing1 =1 ;               
                         DaPing2 =1 ;              
                         DaPing3 =1 ;
                         PcOn    =1;

                          在箱子的上下左右各一个碰触开关,控制2个电机的正反转
}
/*------------------------------------------------
外部中断0中断执行接到开机指令进行开机动作
------------------------------------------------*/
void ExtTrigOn0(void) interrupt 0
{
        EX0=0;          //关闭外部中断0,放置在执行的过程中再次发生中断
        KeyDelayMs(10);
        EX0=1;          //打开外部中断0        
        OnProcess();    //执行开机子函数                     
}
/*------------------------------------------------
外部中断1中断执行接到关机指令进行关机动作
------------------------------------------------*/
void ExtTrigOff1(void) interrupt 2
{
         EX1=0;          //关闭外部中断1,放置在执行的过程中再次发生中断
        KeyDelayMs(10);
        EX1=1;          //打开外部中断1        
        OffProcess();   //执行关机子函数
                        
            

}
/*------------------------------------------------
延时函数,用于按键消抖    大致等于10ms         
------------------------------------------------*/
void DelayUs2x(unsigned char t)
{   
while(--t);
}
void KeyDelayMs(unsigned char t)
{
        while(t--)
        {
                DelayUs2x(245);
                        DelayUs2x(245);
        }
        
}

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

使用道具 举报

沙发
ID:444306 发表于 2019-2-18 17:39 | 只看该作者
去看看别人的作品就明白了
回复

使用道具 举报

板凳
ID:213173 发表于 2019-2-18 19:48 | 只看该作者
程序有点乱,短时间看不出问题所在,但主程序错误明显,按键程序中使用了死循环while(1),且无法证明在此使用死循环的合理性。
主程序这样才合理:
void main(void)
{
        McuInitial();              //单片机上电初始化函数
        KeyDelayMs(500);            //延时函数   
        while(1)
        {
                KeyProcess();             //按钮控制大屏、摄像头等函数
        }
}
回复

使用道具 举报

地板
ID:477934 发表于 2019-2-19 04:16 | 只看该作者
说的有道理,不能将功能放到死循环while(1)中,没有中断出不来

评分

参与人数 2黑币 +15 收起 理由
嘉立创AAA + 8 赞一个!
春风十里吹 + 7

查看全部评分

回复

使用道具 举报

5#
ID:432823 发表于 2019-2-19 22:00 | 只看该作者
按键键值加标志位取值,取反等。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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