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