|
本帖最后由 kpljn 于 2021-3-11 22:47 編輯
本人剛學(xué)單片機(jī),感覺寫的函數(shù)不一定正確,請(qǐng)各位大師多多指教,謝謝!
程序的目的:用一個(gè)啟動(dòng)開關(guān)控制兩個(gè)電機(jī)按次序運(yùn)行,兩個(gè)電機(jī)都設(shè)有原位感應(yīng)開關(guān)及限位感應(yīng)開關(guān)。只有兩個(gè)機(jī)械部件恢復(fù)至原位并按下各自的感應(yīng)開關(guān),觸發(fā)一下啟動(dòng)開關(guān)就可以控制兩個(gè)電機(jī)開始運(yùn)行。
目的流程如下:1、檢測(cè)兩個(gè)原位開關(guān)為0狀態(tài),當(dāng)啟動(dòng)開關(guān)狀態(tài)觸發(fā)一下時(shí),開始啟動(dòng)M2電機(jī)運(yùn)行,控制第一個(gè)機(jī)械部件離開原位感應(yīng)開關(guān)S3,往限位感應(yīng)開關(guān)S4前進(jìn)。2、到達(dá)S4后,M2電機(jī)停轉(zhuǎn)兩秒鐘。3、M2電機(jī)恢復(fù)運(yùn)行,機(jī)械部件離開S4,往S3前進(jìn)。4、第一個(gè)機(jī)械部件回到原位后,M2電機(jī)停止,兩秒后開始啟動(dòng)M1電機(jī),控制第二個(gè)機(jī)械部件離開原位感應(yīng)開關(guān)S1,往限位感應(yīng)開關(guān)S2前進(jìn)。5、到達(dá)S2后,M1電機(jī)停轉(zhuǎn)兩秒鐘。6、M1電機(jī)開始反向運(yùn)行,機(jī)械部件離開S2,往原位S1返回。7、返回S1后,M1電機(jī)也停止。8、系統(tǒng)回到初始狀態(tài),等待啟動(dòng)開關(guān)的被按下后執(zhí)行下一個(gè)周期的動(dòng)作。
代碼如下:
#include<STC12C2052AD.H> //頭文件
#define uchar unsigned char
#define uint unsigned int
sbit M1F=P1^0;
sbit M1B=P1^1;
sbit M2F=P1^2;
sbit M2B=P1^3;
sbit SS1=P1^7; //定義啟動(dòng)開關(guān)
sbit S1=P3^0; //定義托盤原位感應(yīng)開關(guān)
sbit S2=P3^1; //定義托盤限位感應(yīng)開關(guān)
sbit S3=P3^2; //定義剪切原位感應(yīng)開關(guān)
sbit S4=P3^3; //定義剪切限位感應(yīng)開關(guān)
unsigned int num; //無符號(hào)整型變量
void Delay10Ms() //去抖延時(shí)子函數(shù),暫時(shí)不引用
{
TMOD=0x01; //設(shè)置定時(shí)器0的工作方式為1(M1M0為01)
TH0=(65536-10000)/256; //裝初值12M晶振定時(shí)10ms數(shù)為55536
TL0=(65536-10000)%256;
EA=1; //開總中斷
ET0=1; //開定時(shí)器0中斷
TR0=1; //啟動(dòng)定時(shí)器0
}
void Second2() //等待2秒的子函數(shù)
{
TMOD=0x01;
TH0=(65536-50000)/256; //重裝初值
TL0=(65536-50000)%256;
EA=1; //開總中斷
ET0=1; //開定時(shí)器0中斷
TR0=1;
num=0;
num++; //num每次加1
if(num==40) //num到40,說明2秒時(shí)間到
{
num=0; //然后把num清0,重新再計(jì)40次
}
}
void main() //主函數(shù)
{
{
SS1=1; //啟動(dòng)開關(guān)初值置1
S2=1; //托盤限位感應(yīng)開關(guān)置1
S4=1; //剪切限位感應(yīng)開關(guān)置1
M1F=0; //托盤電機(jī)正極置0
M1B=0; //托盤電機(jī)負(fù)極置0
M2F=0; //剪切電機(jī)正極置0
M2B=0; //剪切電機(jī)負(fù)極置0
if(S1==0&&S3==0) //判斷兩個(gè)原位感應(yīng)開關(guān)狀態(tài)被按下
if(SS1==0) //再判斷啟動(dòng)開關(guān)也被觸發(fā)一下(再學(xué)習(xí)了一下,發(fā)現(xiàn)這兩行代碼用if不對(duì),請(qǐng)大師指導(dǎo)啥寫才正確)
while(S4) //剪切限位感應(yīng)開關(guān)被按下之前執(zhí)行以下兩行代碼
{
S3=1; //剪切原位感應(yīng)開關(guān)置1
M2F=1; //啟動(dòng)M2電機(jī)
}
} //剪切限位感應(yīng)開關(guān)被按下后執(zhí)行以下兩行代碼
M2F=0; //暫停M2電機(jī)
Second2(); //等待2秒
while(S3) //剪切原位感應(yīng)開關(guān)未按下之前執(zhí)行以下一行代碼
{
M2F=1; //啟動(dòng)M2電機(jī)
} //剪切原位感應(yīng)開關(guān)被按下之后執(zhí)行以下三行代碼
M2F=0; //停止M2電機(jī)
Second2(); //等待2秒
while(S2) //托盤限位感應(yīng)開關(guān)未按下之前執(zhí)行以下三行代碼
{
S1=1; //托盤原位感應(yīng)開關(guān)置1
M1F=1; //M1電機(jī)正向運(yùn)行
M2B=0;
}
M1F=0; //暫停M1電機(jī)
Second2(); //等待2秒
while(S1) //托盤原位感應(yīng)開關(guān)未按下之前執(zhí)行以下兩行代碼
{
M1F=0; //M1電機(jī)反向運(yùn)行
M1B=1;
}
M1B=0; //托盤原位感應(yīng)開關(guān)被按下后,停止M2電機(jī) 最后這一行是否要添加return,等待下一次觸發(fā)啟動(dòng)鍵?
}
|
|