|
單片機(jī)用的是STC12C2052AD,時(shí)延子函數(shù)是STC-ISP(V6.88)自動(dòng)計(jì)算出來的,用12M的外部晶振。用STC12C2052AD+L298N去控制12V直流電機(jī)執(zhí)行動(dòng)作,使用的測(cè)試電源是正常的。
程序執(zhí)行后期望達(dá)到的目的:
1、當(dāng)SS1啟動(dòng)開關(guān)被觸發(fā)一下后,在SW4未被按下之前,M2電機(jī)保持運(yùn)行。
2、SW4被按下后,M2電機(jī)停止運(yùn)行4秒鐘。
3、M2電機(jī)恢復(fù)運(yùn)行,直至SW3被按壓下后停止運(yùn)行,回到初始狀態(tài)。
程序運(yùn)行后,測(cè)試了一百次,有六十多次都是可以正常運(yùn)行的,其他幾十次不正常。很多次都是在SW4還未被按壓,M2電機(jī)運(yùn)行一會(huì)兒后暫停,然后再運(yùn)行到SW4被壓下后不再執(zhí)行程序下半部分。當(dāng)出現(xiàn)M2電機(jī)異常暫停這種情況后,用萬用表測(cè)試單片機(jī)運(yùn)行時(shí)I/O腳的電壓,發(fā)現(xiàn)P1^5引腳的電壓還是保持在+5V,而P1^2輸出已經(jīng)是0V,請(qǐng)問這個(gè)是啥原因呢?
單片機(jī)程序如下
#include<STC12C2052AD.H> //頭文件
#define uchar unsigned char
#define uint unsigned intsbit M2F=P1^2;
sbit M2F=P1^2;
sbit M2B=P1^3;
sbit SS1=P1^7; //定義啟動(dòng)開關(guān)
sbit SW3=P1^4; //定義剪切原位感應(yīng)開關(guān)
sbit SW4=P1^5; //定義剪切限位感應(yīng)開關(guān)
void Delay200ms() //@12.000MHz
{
unsigned char i, j, k;
i = 10;
j = 31;
k = 147;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void Delay1000ms() //@12.000MHz
{
unsigned char i, j, k;
i = 46;
j = 153;
k = 245;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void Delay4000ms() //@12.000MHz
{
unsigned char i, j, k;
i = 183;
j = 100;
k = 225;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void main() //主函數(shù)
{
SS1=1; //啟動(dòng)開關(guān)初值置1
SW4=1; //剪切限位感應(yīng)開關(guān)置1
M2F=0; //剪切電機(jī)正極置0
M2B=0; //剪切電機(jī)負(fù)極置0
if(SS1==0) //判斷啟動(dòng)開關(guān)被按下
{
while(SW4) //剪切限位感應(yīng)開關(guān)被按下之前執(zhí)行以下代碼
{
M2F=1; //啟動(dòng)M2電機(jī)
}
M2F=0; //暫停M2電機(jī)
Delay4000ms();
while(SW3) //剪切限位感應(yīng)開關(guān)被按下后執(zhí)行以下兩行代碼
{
M2F=1; //剪切原位感應(yīng)開關(guān)未按下之前執(zhí)行行代碼
Delay200ms();
}
M2F=0; //停止M2電機(jī)
Delay1000ms();
}
}
|
|