单片机用的是STC12C2052AD,时延子函数是STC-ISP(V6.88)自动计算出来的,用12M的外部晶振。用STC12C2052AD+L298N去控制12V直流电机执行动作,使用的测试电源是正常的。
程序执行后期望达到的目的:
1、当SS1启动开关被触发一下后,在SW4未被按下之前,M2电机保持运行。
2、SW4被按下后,M2电机停止运行4秒钟。
3、M2电机恢复运行,直至SW3被按压下后停止运行,回到初始状态。
程序运行后,测试了一百次,有六十多次都是可以正常运行的,其他几十次不正常。很多次都是在SW4还未被按压,M2电机运行一会儿后暂停,然后再运行到SW4被压下后不再执行程序下半部分。当出现M2电机异常暂停这种情况后,用万用表测试单片机运行时I/O脚的电压,发现P1^5引脚的电压还是保持在+5V,而P1^2输出已经是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; //定义启动开关
sbit SW3=P1^4; //定义剪切原位感应开关
sbit SW4=P1^5; //定义剪切限位感应开关
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() //主函数
{
SS1=1; //启动开关初值置1
SW4=1; //剪切限位感应开关置1
M2F=0; //剪切电机正极置0
M2B=0; //剪切电机负极置0
if(SS1==0) //判断启动开关被按下
{
while(SW4) //剪切限位感应开关被按下之前执行以下代码
{
M2F=1; //启动M2电机
}
M2F=0; //暂停M2电机
Delay4000ms();
while(SW3) //剪切限位感应开关被按下后执行以下两行代码
{
M2F=1; //剪切原位感应开关未按下之前执行行代码
Delay200ms();
}
M2F=0; //停止M2电机
Delay1000ms();
}
}
|