/*
開場白:
前面講了獨立按鍵控制跑馬燈的各種狀態,這一例講的是乙個機械手控制程式,這個機械手可以左右移動,最左邊有
乙個開關感應器,最右邊也有乙個開關感應器。它也可以上下移動,最下邊有乙個開關感應器。左右移動是通過乙個
氣缸控制,上下移動也是通過乙個氣缸控制。而微控制器控制氣缸,本質上是通過三極體把訊號放大,然後控制氣缸上
的電磁閥。這個系統機械手驅動部分的輸出訊號和輸入訊號如下:
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...