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