用LED燈和按鍵來模擬工業自動化裝置的運動控制

2022-07-17 19:51:08 字數 4960 閱讀 1938

/*

開場白:

前面講了獨立按鍵控制跑馬燈的各種狀態,這一例講的是乙個機械手控制程式,這個機械手可以左右移動,最左邊有

乙個開關感應器,最右邊也有乙個開關感應器。它也可以上下移動,最下邊有乙個開關感應器。左右移動是通過乙個

氣缸控制,上下移動也是通過乙個氣缸控制。而微控制器控制氣缸,本質上是通過三極體把訊號放大,然後控制氣缸上

的電磁閥。這個系統機械手驅動部分的輸出訊號和輸入訊號如下:

2個輸出io口,分別控制兩個氣缸。對於左右移動的氣缸,io口為0表示左移,當io口為1表示右移。對於上下移動的

氣缸,當io口為0往上跑,當io口為1時往下跑。

3個輸入io口,分別檢測3個開關感應器。感應器沒有被觸發時,io口檢測到高電平1.被觸發時,檢測到低電平0

實現功能:

開機預設機械手在左上方的原點位置,按下啟動按鍵後,機械手從左邊開始往右邊移動,當機械手移動到最右邊時,

機械手馬上開始往下移動,當機械手移動到最右下角的時候,延時1秒,然後原路返回,一直返回到左上角的原點位置。

請注意:按鍵必須等機械手處於左上角的位置時,啟動按鍵的觸發才有效。

s5和s1同時按下,啟動,從左往右移動;s9從上往下移動;s13延時1s後由下往上移動,s9由右往左移動,知道s5觸發停止。

*/#include "reg52.h"

#define const_voice_short 40 //蜂鳴器短叫的持續時間

#define const_key_time1 20  //按鍵去抖動延時的時間

#define const_sensor 20   //開關感應器去抖動延時的時間

#define const_1s 500   //1秒鐘大概的定時中斷次數

void initial_myself();

void initial_peripheral();

void delay_short(unsigned int uidelayshort);

void delay_long(unsigned int uidelaylong);

void left_to_right();  //從左邊移到右邊

void right_to_left();  //從右邊返回左邊

void up_to_down();   //從上邊移動到下邊

void down_to_up();   //從下邊返回到上邊

void run(); //裝置自動控制程式

void hc595_drive(unsigned char ucledstatustemp08_01);

void led_update();  //led更新函式

void t0_time();  //定時中斷函式

void key_service(); //按鍵服務的應用程式

void key_scan();  //按鍵掃瞄函式,放在定時中斷裡

void sensor_scan(); //開關感應器軟體抗干擾處理函式,放在定時中斷裡

sbit hc595_sh_dr=p3^6;  //上公升沿時,資料暫存器資料移位

sbit hc595_st_dr=p3^5;  //上公升沿時移位暫存器的資料進入資料暫存器,下降沿時資料不變。當移位結束後,會產生乙個正脈衝,用於更新顯示資料。

sbit hc595_ds_dr=p3^4;  //序列資料輸入端,級聯的話接上一級的q7

sbit beep_dr=p1^5;  //蜂鳴器的io口

sbit key_sr1=p0^0;  //s1鍵

sbit left_sr=p0^1;  //左邊的開關感測器  s5鍵

sbit right_sr=p0^2;  //右邊的開關感測器 s9鍵

sbit down_sr=p0^3;  //下邊的開關感測器 s13鍵

sbit key_gnd_dr=p0^4;

unsigned char uckeysec=0; //被觸發的按鍵編號

unsigned int uikeytimecnt1=0; //按鍵去抖動延時計數器

unsigned char uckeylock1=0;  //按鍵觸發後自鎖的變數標誌

unsigned char ucleftsr=0; //左邊感應器經過軟體干擾後處理後的狀態標誌

unsigned char ucrightsr=0; //右邊感應器經過軟體干擾後處理後的狀態標誌

unsigned char ucdownsr=0; //下邊感應器經過軟體干擾後處理後的狀態標誌

unsigned int uileftcnt1=0; //左邊感應器軟體抗干擾所需的計數器變數

unsigned int uileftcnt2=0;

unsigned int uirightcnt1=0; //右邊感應器軟體抗干擾所需的計數器變數

unsigned int uirightcnt2=0;

unsigned int uidowncnt1=0; //下邊感應器軟體抗干擾所需的計數器變數

unsigned int uidowncnt2=0;

unsigned int uivoicecnt=0; //蜂鳴器鳴叫的持續時間計數器

unsigned char ucled_dr1=0; //代表16個燈的亮滅狀態,0滅,1亮

unsigned char ucled_dr2=0;

unsigned char ucled_dr3=0;

unsigned char ucled_dr4=0;

unsigned char ucled_dr5=0;

unsigned char ucled_dr6=0;

unsigned char ucled_dr7=0;

unsigned char ucled_dr8=0;

unsigned char ucled_update=1; //重新整理變數。每次更改led燈的狀態都要更新一次

unsigned char ucledstatus08_01=0; //代表底層74hc595輸出狀態的中間變數

unsigned int uiruntimecnt=0;  //運動中的時間延時計數器變數

unsigned char ucrunstep=0;  //運動控制的步驟變數

void main()

}/*注釋一:

開關感測器的抗干擾處理,本質上類似按鍵的去抖動處理。唯一的區別是:

按鍵去抖動關注的是io口的一種狀態,而開關感應器關注的是io口的兩種狀態。

當開關感應器從原來的1狀態切換到0狀態之前,要進行軟體濾波處理過程,一旦

成功的切換到0狀態了,再想從0狀態切換到1狀態的時候,又要經過軟體濾波處

理過程,符合條件後才能切換到1狀態。

通俗的講,按鍵去抖動從1變成0難,從0變成1容易。

開關感應器從1程式設計0難,從0程式設計1也難。這裡的「難」指的是要進行去抖動。

*/void sensor_scan() //開關感應器軟體抗干擾處理函式,放在定時中斷裡

}else //左邊感應器是低電平,說明有可能被觸發到了

}if(right_sr==1)

}else

}if(down_sr==1)

}else}}

void key_scan()  //按鍵掃瞄函式 放在定時中斷裡

else if(uckeylock1==0) //有按鍵按下,且第一次被按下}}

void key_service()

uckeysec=0;

break;}}

void led_update() //led更新函式

}void hc595_drive(unsigned char ucledstatustemp08_01)

hc595_st_dr=0;

delay_short(15);

hc595_st_dr=1;  //st引腳負責把暫存器的資料更新輸出到74hc595的輸出引腳上並且鎖存起來。上公升沿時更新顯示資料。

delay_short(15);

hc595_sh_dr=0; //拉低,抗干擾就增強

hc595_st_dr=0;

hc595_ds_dr=0;

}void left_to_right() //從左邊移動到右邊

void right_to_left() //從右邊返回到左邊

void up_to_down() //從上邊移動到下邊

void down_to_up() //從下邊返回到上邊

void run() //裝置自動控制程式

break;

case 5:

if(uiruntimecnt>const_1s) //延時1秒

ucrunstep=6;

break;

case 6:  //原路返回,機械手從右下邊往右上邊移動

down_to_up();

ucrunstep=7;

break;

case 7:  //原路返回,等待機械手移動到最右邊的感應開關

if(ucrightsr==0)

ucrunstep=8;

break;

case 8:  //原路返回,等待機械手從右邊移動到左邊

right_to_left();

ucrunstep=9;

break;

case 9:

if(ucleftsr==0)  //原路返回,等待機械手移動到最左邊的感應開關,表示回到了原點

ucrunstep=0;

break;   }}

void t0_time() interrupt 1

if(uivoicecnt!=0)

else

th0=0xf8; //重灌初始值(65535-2000)=63535=0xf82f

tl0=0x2f;

tr0=1; //開中斷

}void delay_short(unsigned int uidelayshort)

{unsigned int i;

for(i=0;i

/*最近忙著寫開題報告,之後會晚點更新。之後更新如何與上位機通訊等***/

按鍵點亮LED燈(中斷)

設定pb11為下降沿觸發,初始化中斷模式 gpio inittypedef gpio initstructure exti inittypedef exti initstructure nvic inittypedef nvic initstructure 配置管腳時鐘和復用時鐘 rcc apb2p...

中斷 按鍵控制LED燈

xjp的資源 初始化函式 init.c 進行一些初始化 include s3c24xx.h led1,led2,led4對應gpf4 gpf5 gpf6 define gpf4 out 1 define gpf5 out 1 define gpf6 out 1 define gpf4 msk 3 d...

Mixly按鍵控制LED燈

include include rfid rfid 10,5 unsigned char rc size unsigned char blockaddr 選擇操作的塊位址0 63 unsigned char i,tmp unsigned char status unsigned char str m...