title: 單片機第八次作業(yè)
date: 2020-04-03 19:24:08
tags:
- 單片機作業(yè)
- C語言
categories:
- 單片機作業(yè)
summary: 控制某運動工作臺沿軸向運動揖赴,有前進和后退兩個方向如孝。
top:
img:
老師給的要求
1.控制運動工作臺的兩個電機均可沿軸向運動扁掸,有前進和后退兩個方向心赶。
2.每軸的電機都有2種控制模式:
一種是點動控制蘸拔,即“foward”按鍵按下時工作臺前進動作截歉,放手即停颊乘;“backward”按鍵按下時工作臺后退動作寸宏,放手即停歧蒋。
另一種是:模態(tài)動作控制土砂,即只要“foward”按鍵按下,工作臺即發(fā)生前進動作谜洽,放手后依然保持前進動作萝映,除非機床接到新的控制命令;即只要“backward”按鍵按下阐虚,工作臺即發(fā)生后退動作序臂,放手后依然保持后退動作,除非機床接到新的控制命令实束。
3.控制系統(tǒng)設計有四個按鈕:一個是運動軸電機選擇的切換按鍵奥秆,一個是模式切換按鈕逊彭,一個是“foward”按鍵,一個是“backward”按鍵构订。 k1-k4這四個按鍵可由設計者根據(jù)設計功能要求自行分配侮叮。
3.工作臺的每個運動軸兩端各設計安排一個限位傳感器,采用外部中斷擴展方式設計悼瘾,電路原理如圖所示签赃。
4.液晶顯示系統(tǒng)工作狀態(tài),界面自擬分尸。
5.電機在運動時不得切換控制模式锦聊。
6.觸碰到限位開關時,要求用中斷功能實現(xiàn)停止電機動作箩绍,并做液晶報警提醒孔庭。
7.其他個性化功能自擬。
寫代碼過程
將原來的程序進行加工材蛛,現(xiàn)在只有一個控制端口圆到,但是要實現(xiàn)4種控制,這種和上次的很想但是又有變化卑吭,將原來的設計重新做一下芽淡,再將新的信號接入,這樣就可以了豆赏。
在運行過程中出現(xiàn)了很多問題挣菲,在設計之前以為就是小小的改變了一下,這次的代碼量明顯比之前多了很多掷邦,所以重新設計的量也大了白胀。一開始出現(xiàn)了按鈕按下電機可以轉動,但是相互鎖的只有一次機會抚岗,我找了好幾久才發(fā)現(xiàn)或杠,原來是一次限位之后沒有釋放第二次的機會,最后我還是解決了宣蔚;還有的就是代碼的量太大了向抢,有點亂,我都搞混了胚委,以后寫代碼后面必須加一些可以區(qū)分的標志物挟鸠,這樣方便修改和編輯。
這次的代碼練習我做了一個下午篷扩,為什么時間那么長呢兄猩?是因為我找錯誤找了好久,本就已經(jīng)找到代碼錯在哪里了鉴未,但是還是搞了那么久枢冤,不知道為什么就是有點亂,以后我知道了铜秆,在寫代碼后面必須要注釋一些東西加以區(qū)分淹真,這樣方便以后修改和編輯。
單片機代碼:
#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:"}; //狀態(tài)
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) //自動模態(tài)
{
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) //自動模態(tài)
{
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;
}
}
}
}