單片機第八次作業(yè)


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

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末连茧,一起剝皮案震驚了整個濱河市核蘸,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌啸驯,老刑警劉巖客扎,帶你破解...
    沈念sama閱讀 218,386評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異罚斗,居然都是意外死亡徙鱼,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,142評論 3 394
  • 文/潘曉璐 我一進店門针姿,熙熙樓的掌柜王于貴愁眉苦臉地迎上來袱吆,“玉大人,你說我怎么就攤上這事距淫〗嗜蓿” “怎么了?”我有些...
    開封第一講書人閱讀 164,704評論 0 353
  • 文/不壞的土叔 我叫張陵榕暇,是天一觀的道長蓬衡。 經(jīng)常有香客問我,道長彤枢,這世上最難降的妖魔是什么撤蟆? 我笑而不...
    開封第一講書人閱讀 58,702評論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮堂污,結果婚禮上家肯,老公的妹妹穿的比我還像新娘。我一直安慰自己盟猖,他們只是感情好讨衣,可當我...
    茶點故事閱讀 67,716評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著式镐,像睡著了一般反镇。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上娘汞,一...
    開封第一講書人閱讀 51,573評論 1 305
  • 那天歹茶,我揣著相機與錄音,去河邊找鬼。 笑死惊豺,一個胖子當著我的面吹牛燎孟,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播尸昧,決...
    沈念sama閱讀 40,314評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼揩页,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了烹俗?” 一聲冷哼從身側響起爆侣,我...
    開封第一講書人閱讀 39,230評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎幢妄,沒想到半個月后兔仰,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,680評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡蕉鸳,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,873評論 3 336
  • 正文 我和宋清朗相戀三年乎赴,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片置吓。...
    茶點故事閱讀 39,991評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡无虚,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出衍锚,到底是詐尸還是另有隱情友题,我是刑警寧澤,帶...
    沈念sama閱讀 35,706評論 5 346
  • 正文 年R本政府宣布戴质,位于F島的核電站度宦,受9級特大地震影響,放射性物質發(fā)生泄漏告匠。R本人自食惡果不足惜戈抄,卻給世界環(huán)境...
    茶點故事閱讀 41,329評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望后专。 院中可真熱鬧划鸽,春花似錦、人聲如沸戚哎。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,910評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽型凳。三九已至丈冬,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間甘畅,已是汗流浹背埂蕊。 一陣腳步聲響...
    開封第一講書人閱讀 33,038評論 1 270
  • 我被黑心中介騙來泰國打工往弓, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人蓄氧。 一個月前我還...
    沈念sama閱讀 48,158評論 3 370
  • 正文 我出身青樓函似,卻偏偏與公主長得像,于是被迫代替她去往敵國和親匀们。 傳聞我的和親對象是個殘疾皇子缴淋,可洞房花燭夜當晚...
    茶點故事閱讀 44,941評論 2 355

推薦閱讀更多精彩內(nèi)容

  • title: 單片機第九次作業(yè)date: 2020-04-11 02:57:21tags:- 單片機作業(yè)- C語言...
    拜德英納夫閱讀 218評論 0 1
  • 這是是我大二做的一個課程設計准给,小菜鳥一個泄朴,歡迎大家指正和參考。 摘要本次設計選擇基于藍牙遙控的多功能智能小車為對象...
    一顆小樹___溥閱讀 4,935評論 0 10
  • 一露氮、原理簡介 鍵盤接口電路是單片機系統(tǒng)設計非常重要的一環(huán)祖灰,作為人機交互界面里最常用的輸入設備。我們可以通過鍵盤輸入...
    創(chuàng)客烏托邦閱讀 4,643評論 0 1
  • 單片機的學習絕不僅僅是對一項知識的掌握。想要學好單片機叁扫,需要從硬件結構三妈、內(nèi)部資源、外設應用等幾個方面多方位入手莫绣。而...
    玩轉嵌入式閱讀 2,213評論 2 59
  • 昨晚到今天畴蒲,我又嘗試了當一次逃兵《允遥恐懼和逃避又差一點俘虜我模燥,把我重新帶回“我不行,辦不到”的那個銘印的小黑屋...
    雷紫珂閱讀 239評論 0 6