单片机第九次作业


title: 单片机第九次作业
date: 2020-04-11 02:57:21
tags:
- 单片机作业
- C语言
categories:
- 单片机作业
summary: 实现单轴工作台往返运动控制,按下K1键,启动电机带动工作台向右运动,运动1秒后反向运动1秒种,如此往复,按下K2键,停止动作。


项目要求:

1.实现单轴工作台往返运动控制,按下K1键,启动电机带动工作台向右运动,运动1秒后反向运动1秒种,如此往复,按下K2键,停止动作。

2.基于前面基础,将按键的检测用定时器T0实现,每20毫秒检测一次;

3.基于前面基础,采用定时器T1完成运动过程的定时控制;

4.基于前面基础,把运动的定制控制和按键检测定时控制合并用1个定时器实现。

5.按下K1键,启动电机带动工作台向右运动,运动1秒后停止1秒钟,接着反向运动1秒种,后停止1秒种,如此往复,按下K2键,停止动作。

课后作业:

基于前面基础,如遇任何限位,电机立即停止,延时1秒钟后反向移动2秒钟后自动停止。

提交文档要求:

  • 项目设计的C程序文档

  • 课程学习报告

  • 调试视频

分析:

老师在课上已经和我们一起完成了前四个问题,留下第5个问题和一个课后问题。第五个问题就是在原来的基础上再在正转和反转的中间加入停止时间1秒,就是在原来的一秒变为2秒,3秒,4秒,在各个秒的时间内都做不同的事情,这样就可以解决加停止的时间问题了。

按照老师的接下去的方法编写:

#include<reg51.h>
#include<intrins.h>
sbit signal1=P1^0; 
sbit signal2=P1^1; // control port
sbit forward=P1^2;
sbit backward=P1^3; //  two keys

bit flag;
bit time_1s_flag;
bit time_2s_flag;
bit time_3s_flag;
bit time_4s_flag;

unsigned char count;

void scan_key();
void out_put();

void main()
{
   TMOD=0x01;
     TH0=(65536-20000)/256;
     TL0=(65536-20000)%256;

    EA=1;
    ET0=1; 
    TR0=1;
    EX0=1;
    EX1=1;

    while(1)
    {
      out_put();
    }
}

void scan_key()     
{
      if(forward==0 && flag==0)//只有当前停止状态时响应启动按键
      {
           flag=1;
                 
      }
      else if(backward==0)
      {
         flag=0;
      } 
}

void out_put()
{
     if(flag==1 )
    {   
         if(time_1s_flag==1 )
         {
            signal1=1;
            signal2=0;
              time_1s_flag=0;  
       }    
        if(time_2s_flag==1)
        {
            signal1=1;
            signal2=1;
            time_2s_flag=0;
        }
        if(time_3s_flag==1)
        {
            signal1=0;
          signal2=1;
          time_3s_flag=0;
        }
        if(time_4s_flag==1)
        {
            signal1=0;
          signal2=0;
          time_4s_flag=0;
        }
     }
   else if(flag==0)
   {
       signal1=1;
       signal2=1;
   }
} 

除了上面的程序可以以外,我还独自建立了一个简单的程序:

喜欢玩的可以编写这样的,这样简单易懂!

#include<reg51.h>
#include<intrins.h>
sbit signal1=P1^0; 
sbit signal2=P1^1; // control port
sbit forward=P1^2;
sbit backward=P1^3; //  two keys

bit flag;
bit state;
bit time_1s_flag;
bit time_2s_flag;
bit time_3s_flag;
bit time_4s_flag;

unsigned char count;

void scan_key();

void main()
{
    TMOD=0x01;
    TH0=(65536-20000)/256;
    TL0=(65536-20000)%256;

    EA=1;
    ET0=1;
    TR0=1;

    while(1);
}

void timer0() interrupt 1
{
    scan_key();
    count++;
    TH0=(65536-20000)/256;
    TL0=(65536-20000)%256;
 
    if(count==50 && state==1)    //1秒后
    {
        signal1=1;
        signal2=1;  
    }
    if(count==100 && state==1)   //2秒后
    {
        signal1=0;
        signal2=1;      
    }
    if(count==150 && state==1)   //3秒后
    {
        signal1=0;
        signal2=0;                  
    }
    if(count==200 && state==1)   //4秒后
    {
        signal1=1;
        signal2=0;
        count=0;            
    }               
}


void scan_key()     
{
    if(forward==0 && state==0)//只有当前停止状态时响应启动按键
    {
        flag=1;
        signal1=1;
        signal2=0;
        TR0=1;

        state=1;             
    }
    else if(backward==0)
    {
        signal1=1;
        signal2=1;
        state=0;
    }   
}   

课后的习题

而课后问题是在限位上加时间,涉及到了外部限制加时间定时。这个就有点难了。其实思路还是比较清晰的,就是在加入一个定时器,极限按钮按下后就定时开始,在定时中设置其他想要的动作就可以了。

来一下定时中的动作代码:

void timer1() interrupt 3
{
    scan_key1();
    count++;
    TH1=(65536-20000)/256;
    TL1=(65536-20000)%256;
        if(count==50 && state==1)
        {
            if(limit_l_flag==1)
            {   
                signal1=1;
                signal2=0;
                limit_l_flag=0;
            }
            if(limit_r_flag==1)
            {
                signal1=0;
                signal2=1;
                limit_r_flag=0;
            }
        }
        if(count==150 && state==1)
        {
            signal1=0;
            signal2=0;

            state=0;
        }
} 

这样就能完美的解决了主要问题了。

最后给全部代码:

#include<reg51.h>
#include<intrins.h>
sbit signal1=P1^0; 
sbit signal2=P1^1; // control port
sbit forward=P1^2;
sbit backward=P1^3; //  two keys
sbit limit_l=P3^2;
sbit limit_r=P3^3;

bit state;
bit time_1s_flag;
bit time_2s_flag;
bit time_3s_flag;
bit time_4s_flag;

bit limit_l_flag;
bit limit_r_flag;

unsigned char count;

void scan_key1();
void scan_key();
void main()
{
    TMOD=0x11;
    TH0=(65536-20000)/256;
    TL0=(65536-20000)%256;
    TH1=(65536-20000)/256;
    TL1=(65536-20000)%256;

    EA=1;
    ET0=1;
    ET1=1;
        
    while(1)
    {
        scan_key();
        scan_key1();
    }
}

void scan_key()     
{
    if(forward==0 && state==0)//只有当前停止状态时响应启动按键
    {
        signal1=1;
        signal2=0;
        TR0=1;
        TR1=0;
        state=1;             
    }
    else if(backward==0)
    {
        signal1=0;
        signal2=0;
        state=0;
        TR1=0;
        TR0=0;
    }   
}

void timer0() interrupt 1
{
    scan_key();
    scan_key1();
    count++;
    TH0=(65536-20000)/256;
    TL0=(65536-20000)%256;
    

    if(count==50 && state==1)    //1秒后
    {
        signal1=1;
        signal2=1;  
    }
    if(count==100 && state==1)   //2秒后
    {
        signal1=0;
        signal2=1;      
    }
    if(count==150 && state==1)   //3秒后
    {
        signal1=0;
        signal2=0;                  
    }
    if(count==200 && state==1)   //4秒后
    {
        signal1=1;
        signal2=0;
        count=0;            
    }               
}

void scan_key1()
{
    if(limit_l==0 && state==1)
    {
         TR0=0;
         TR1=1;
         limit_l_flag=1;         
         signal1=0;
         signal2=0;
    }
    if(limit_r==0 && state==1)
    {
        TR0=0;
        TR1=1;
        limit_r_flag=1;      
        signal1=0;
        signal2=0;
        
    }
}

void timer1() interrupt 3
{
    scan_key1();
    count++;
    TH1=(65536-20000)/256;
    TL1=(65536-20000)%256;
        if(count==50 && state==1)
        {
            if(limit_l_flag==1)
            {   
                signal1=1;
                signal2=0;
                limit_l_flag=0;
            }
            if(limit_r_flag==1)
            {
                signal1=0;
                signal2=1;
                limit_r_flag=0;
            }
        }
        if(count==150 && state==1)
        {
            signal1=0;
            signal2=0;

            state=0;
        }
}
  

所有代码打包:

你如果想要直接下载的点击这里,所有文件都在这里面了。

总结:

感觉这次的代码有点小乱,但是如果真的懂了就是再乱也是懂的,千万不要不懂装懂,要不然会死的很惨。

目前代码还不是最优的,希望在以后的学习中能更加的简洁明了一点。

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

推荐阅读更多精彩内容

  • 最近总是检测不出耳机的插入,很郁闷。但是在其他设备上测试发现耳机并无异常。我仔细想了想,最近更改了哪些设置。好像是...
    苺一語阅读 729评论 0 0
  • 1.ConcurrentHashMap ①为什么要使用ConcurrentHashMap 1)线程不安全的Hash...
    加夕阅读 307评论 0 0
  • 在Redis的使用过程中,经常会遇到一些在特定时间之后就需要删除的数据,Redis提供了键的过期时间这个功能来解决...
    冷若秋枫阅读 321评论 0 1
  • 三次握手与四次挥手分别对应TCP连接建立过程与断开过程,先上TCP报文格式: 三次握手过程: 问题1: 为什么要三...
    maerzi阅读 456评论 0 0
  • 本以为没有感觉了,但还是会痛,会期待~可惜你不知道,也没人知道只有我自己知道~但它终会让我们成为陌生人~
    加菲猫95阅读 140评论 0 0