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;
}
}
}
}