单片机第八次作业


title: 单片机第八次作业
date: 2020-04-03 19:24:08
tags:
- 单片机作业
- C语言
categories:
- 单片机作业
summary: 控制某运动工作台沿轴向运动,有前进和后退两个方向。
top:
img:


老师给的要求

1.控制运动工作台的两个电机均可沿轴向运动,有前进和后退两个方向。

2.每轴的电机都有2种控制模式:
一种是点动控制,即“foward”按键按下时工作台前进动作,放手即停;“backward”按键按下时工作台后退动作,放手即停。
另一种是:模态动作控制,即只要“foward”按键按下,工作台即发生前进动作,放手后依然保持前进动作,除非机床接到新的控制命令;即只要“backward”按键按下,工作台即发生后退动作,放手后依然保持后退动作,除非机床接到新的控制命令。
3.控制系统设计有四个按钮:一个是运动轴电机选择的切换按键,一个是模式切换按钮,一个是“foward”按键,一个是“backward”按键。 k1-k4这四个按键可由设计者根据设计功能要求自行分配。
3.工作台的每个运动轴两端各设计安排一个限位传感器,采用外部中断扩展方式设计,电路原理如图所示。
4.液晶显示系统工作状态,界面自拟。
5.电机在运动时不得切换控制模式。
6.触碰到限位开关时,要求用中断功能实现停止电机动作,并做液晶报警提醒。
7.其他个性化功能自拟。

写代码过程

将原来的程序进行加工,现在只有一个控制端口,但是要实现4种控制,这种和上次的很想但是又有变化,将原来的设计重新做一下,再将新的信号接入,这样就可以了。
在运行过程中出现了很多问题,在设计之前以为就是小小的改变了一下,这次的代码量明显比之前多了很多,所以重新设计的量也大了。一开始出现了按钮按下电机可以转动,但是相互锁的只有一次机会,我找了好几久才发现,原来是一次限位之后没有释放第二次的机会,最后我还是解决了;还有的就是代码的量太大了,有点乱,我都搞混了,以后写代码后面必须加一些可以区分的标志物,这样方便修改和编辑。

这次的代码练习我做了一个下午,为什么时间那么长呢?是因为我找错误找了好久,本就已经找到代码错在哪里了,但是还是搞了那么久,不知道为什么就是有点乱,以后我知道了,在写代码后面必须要注释一些东西加以区分,这样方便以后修改和编辑。

单片机代码:

#include<reg51.h>
#include<1602lcd.h>
sbit signal1=P1^0; 
sbit signal2=P1^1; 
sbit signal3=P1^7;
sbit signal4=P2^7;  // control port
sbit forward=P1^2;  
sbit backward=P1^3; 
sbit run=P1^5;      //  four keys
sbit control_mode=P1^4;

sbit limit_1l=P2^3;     
sbit limit_1r=P2^4;
sbit limit_2l=P2^5;     
sbit limit_2r=P2^6;  //four limits  

unsigned char md[]={"mode:"};      
unsigned char st[]={"status:"};    //状态
unsigned char au[]={"auto"};
unsigned char ma[]={"manu"};
unsigned char fd[]={"fowd"};
unsigned char bk[]={"back"};
unsigned char stp[]={"stop"};
unsigned char x[]={"x"};
unsigned char y[]={"y"};

bit status=0;      //status=1 动 0 停止
bit mode_flag;
bit fd_flag;
bit bk_flag;
bit run_flag;
bit fd_flag2;
bit bk_flag2;

bit limit_1l_flag;  //限位标志位
bit limit_1r_flag;
bit limit_2l_flag;
bit limit_2r_flag;

void scan_key();
void out_put();
void scan_key2();
void main()
{
    lcd_init();
    lcd_pos(1,1);
    lcdwrite_string(md);
    lcd_pos(1,7);    
    lcdwrite_string(ma);
    lcd_pos(2,1);
    lcdwrite_string(st);
    lcd_pos(2,9);
    lcdwrite_string(stp);   
    lcd_pos(2,14);
    lcdwrite_string(x);

    EA=1;
    EX0=1;
    EX1=1;
    IT0=1;
    IT1=1;
    while(1)
    {
      scan_key();
      scan_key2();
      out_put();
    }                   
}

void scan_key()     //mode单键复用
{
   if(run==0 && status==0)
   {
     run_flag=~run_flag;
     if(run_flag==0)  //x模式
     {
            lcd_pos(2,14);
            lcdwrite_string(x);
     }
     else            //y模式
     {
            lcd_pos(2,14);
            lcdwrite_string(y);
     }     
     while(run==0);
   }
}

void scan_key2()
{
    if(control_mode==0 && status==0)
   {
     mode_flag=~mode_flag;
     if(mode_flag==0)  //手动模式
     {
            lcd_pos(1,7);    
            lcdwrite_string(ma);
     }
     else            //自动模式
     {
            lcd_pos(1,7);    
            lcdwrite_string(au);
     }     
     while(control_mode==0);
   }
}

void out_put()
{
    if(run_flag==0)     //X轴
    {    
         if(mode_flag==1)   //自动模态
         {
              if(forward==0 && bk_flag==0 && limit_1r_flag==0 ) 
              {
                    fd_flag=~fd_flag;
                    if(fd_flag==1)
                    {
                        lcd_pos(1,16);
                        lcdwrite_zm(' ');
                        lcd_pos(2,9);
                        lcdwrite_string(fd);                    
                        signal1=1;
                        signal2=0;
                        status=1;
                    }
                    else
                    {
                        lcd_pos(1,16);
                        lcdwrite_zm(' ');
                        lcd_pos(2,9);
                        lcdwrite_string(stp);
                        signal1=1;
                        signal2=1;
                        status=0;
                    }
                    while(forward==0);
              }
             if(backward==0 && fd_flag==0 && limit_1l_flag==0 )
              {         
                    bk_flag=~bk_flag;
                    if(bk_flag==1)
                    {
                        lcd_pos(1,16);
                        lcdwrite_zm(' ');
                        lcd_pos(2,9);
                        lcdwrite_string(bk);
                        signal1=0;
                        signal2=1;
                        status=1;
                    }
                    else
                    {
                        lcd_pos(1,16);
                        lcdwrite_zm(' ');
                        lcd_pos(2,9);
                        lcdwrite_string(stp);
                        signal1=1;
                        signal2=1;
                        status=0;                             
                    } 
                    while(backward==0);
              } 
         }
      else if(mode_flag==0) //手动
        {
              if(forward==0 && limit_1r_flag==0)    
              {
                    lcd_pos(1,16);
                    lcdwrite_zm(' ');
                    lcd_pos(2,9);
                    lcdwrite_string(fd);                    
                    signal1=1;
                    signal2=0;
                    status=1;
                    limit_1l_flag=0;                
              }
             else if(backward==0 && limit_1l_flag==0)
              {
                    lcd_pos(1,16);
                    lcdwrite_zm(' ');
                    lcd_pos(2,9);
                    lcdwrite_string(bk);
                    signal1=0;
                    signal2=1;
                    status=1;
                    limit_1r_flag=0;                
              }
              else
              {
                    lcd_pos(1,16);
                    lcdwrite_zm(' ');
                    lcd_pos(2,9);
                    lcdwrite_string(stp);
                    signal1=1;
                    signal2=1;
                    status=0;
              }
        }
    }
    else if(run_flag==1)     //Y轴
    {
         if(mode_flag==1)   //自动模态
         {
              if(forward==0 && bk_flag2==0) 
              {
                    fd_flag2=~fd_flag2;
                    if(fd_flag2==1)
                    {
                        lcd_pos(1,16);
                        lcdwrite_zm(' ');
                        lcd_pos(2,9);
                        lcdwrite_string(fd);                    
                        signal3=1;
                        signal4=0;
                        status=1;
                        limit_2l_flag=0;
                    }
                    else
                    {
                        lcd_pos(1,16);
                        lcdwrite_zm(' ');
                        lcd_pos(2,9);
                        lcdwrite_string(stp);
                        signal3=1;
                        signal4=1;
                        status=0;
                    }
                    while(forward==0);
              }
             if(backward==0 && fd_flag2==0)
              {         
                    bk_flag2=~bk_flag2;
                    if(bk_flag2==1 )
                    {
                        lcd_pos(1,16);
                        lcdwrite_zm(' ');
                        lcd_pos(2,9);
                        lcdwrite_string(bk);
                        signal3=0;
                        signal4=1;
                        status=1;
                        limit_2r_flag=0;
                    }
                    else
                    {
                        lcd_pos(1,16);
                        lcdwrite_zm(' ');
                        lcd_pos(2,9);
                        lcdwrite_string(stp);
                        signal3=1;
                        signal4=1;
                        status=0;                             
                    } 
                    while(backward==0);
              } 
         }
      else if(mode_flag==0) //手动
        {
              if(forward==0 && limit_2r_flag==0)    
              {
                    lcd_pos(1,16);
                    lcdwrite_zm(' ');
                    lcd_pos(2,9);
                    lcdwrite_string(fd);                    
                    signal3=1;
                    signal4=0;
                    status=1;               
              }
             else if(backward==0 && limit_2l_flag==0)
              {
                    lcd_pos(1,16);
                    lcdwrite_zm(' ');
                    lcd_pos(2,9);
                    lcdwrite_string(bk);
                    signal3=0;
                    signal4=1;
                    status=1;               
              }
              else
              {
                    lcd_pos(1,16);
                    lcdwrite_zm(' ');
                    lcd_pos(2,9);
                    lcdwrite_string(stp);
                    signal3=1;
                    signal4=1;
                    status=0;
              }
        }
    }
}

void int_int0() interrupt 0
{
    if(run_flag==0)        // X
    {
        if(mode_flag==0)
        {
           if(limit_1l==0)
           {
                limit_1l_flag=1;
                limit_1r_flag=0;            
                signal1=0;
                signal2=0;

                lcd_pos(1,16);
                lcdwrite_zm('l');
                lcd_pos(2,9);
                lcdwrite_string(stp);
                status=0;
            }
           else if(limit_1r==0)
           {
                limit_1r_flag=1;
                limit_1l_flag=0;            
                signal1=0;
                signal2=0;

                lcd_pos(1,16);
                lcdwrite_zm('r');
                lcd_pos(2,9);
                lcdwrite_string(stp);
                status=0;
           }                                                    
        }
        else
        {   
            if(limit_1l==0)
           {
                limit_1l_flag=1;
                limit_1r_flag=0;
                signal1=0;
                signal2=0;              
                fd_flag=0;
                bk_flag=0;
                lcd_pos(1,16);
                lcdwrite_zm('l');
                lcd_pos(2,9);
                lcdwrite_string(stp);
                status=0;
            }
           else if(limit_1r==0)
           {
                limit_1r_flag=1;
                limit_1l_flag=0;
                signal1=0;
                signal2=0;
                fd_flag=0;
                bk_flag=0;                              
                lcd_pos(1,16);
                lcdwrite_zm('r');
                lcd_pos(2,9);
                lcdwrite_string(stp);
                status=0;
           }   
        }
    }
    else            // Y
    {
        if(mode_flag==0)       //手动
        {
              if(limit_2l==0)
              {
                    limit_2l_flag=1;
                    limit_2r_flag=0;                                
                    signal3=0;
                    signal4=0;  
                    lcd_pos(1,16);
                    lcdwrite_zm('l');
                    lcd_pos(2,9);
                    lcdwrite_string(stp);
                    status=0;
              }
              else if(limit_2r==0)
              {
                    limit_2r_flag=1;
                    limit_2l_flag=0;            
                    signal3=0;
                    signal4=0;  
                    lcd_pos(1,16);
                    lcdwrite_zm('r');
                    lcd_pos(2,9);
                    lcdwrite_string(stp);
                    status=0;
              }                                                 
        }
        else              //自动
        {   
            if(limit_2l==0)
           {
                limit_2l_flag=1;
                limit_2r_flag=0;
                signal3=0;
                signal4=0;              
                fd_flag2=0;
                bk_flag2=0;
                lcd_pos(1,16);
                lcdwrite_zm('l');
                lcd_pos(2,9);
                lcdwrite_string(stp);
                status=0;
            }
           else if(limit_2r==0)
           {
                limit_2r_flag=1;
                limit_2l_flag=0;
                signal3=0;
                signal4=0;
                fd_flag2=0;
                bk_flag2=0;                             
                lcd_pos(1,16);
                lcdwrite_zm('r');
                lcd_pos(2,9);
                lcdwrite_string(stp);
                status=0;
           }   
        }               
    }       
}

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • title: 单片机第九次作业date: 2020-04-11 02:57:21tags:- 单片机作业- C语言...
    拜德英纳夫阅读 231评论 0 1
  • 这是是我大二做的一个课程设计,小菜鸟一个,欢迎大家指正和参考。 摘要本次设计选择基于蓝牙遥控的多功能智能小车为对象...
    一颗小树___溥阅读 5,187评论 0 10
  • 一、原理简介 键盘接口电路是单片机系统设计非常重要的一环,作为人机交互界面里最常用的输入设备。我们可以通过键盘输入...
    创客乌托邦阅读 4,853评论 0 1
  • 单片机的学习绝不仅仅是对一项知识的掌握。想要学好单片机,需要从硬件结构、内部资源、外设应用等几个方面多方位入手。而...
    玩转嵌入式阅读 2,242评论 2 59
  • 昨晚到今天,我又嘗試了當一次逃兵。恐懼和逃避又差一點俘虜我,把我重新帶回“我不行,辦不到”的那個銘印的小黑屋...
    雷紫珂阅读 250评论 0 6