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;
}
}
所有代码打包:
你如果想要直接下载的点击这里,所有文件都在这里面了。
总结:
感觉这次的代码有点小乱,但是如果真的懂了就是再乱也是懂的,千万不要不懂装懂,要不然会死的很惨。
目前代码还不是最优的,希望在以后的学习中能更加的简洁明了一点。