本帖最后由 kpljn 于 2021-3-11 22:47 编辑
本人刚学单片机,感觉写的函数不一定正确,请各位大师多多指教,谢谢!
程序的目的:用一个启动开关控制两个电机按次序运行,两个电机都设有原位感应开关及限位感应开关。只有两个机械部件恢复至原位并按下各自的感应开关,触发一下启动开关就可以控制两个电机开始运行。
目的流程如下:1、检测两个原位开关为0状态,当启动开关状态触发一下时,开始启动M2电机运行,控制第一个机械部件离开原位感应开关S3,往限位感应开关S4前进。2、到达S4后,M2电机停转两秒钟。3、M2电机恢复运行,机械部件离开S4,往S3前进。4、第一个机械部件回到原位后,M2电机停止,两秒后开始启动M1电机,控制第二个机械部件离开原位感应开关S1,往限位感应开关S2前进。5、到达S2后,M1电机停转两秒钟。6、M1电机开始反向运行,机械部件离开S2,往原位S1返回。7、返回S1后,M1电机也停止。8、系统回到初始状态,等待启动开关的被按下后执行下一个周期的动作。
代码如下:
#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; //定义启动开关
sbit S1=P3^0; //定义托盘原位感应开关
sbit S2=P3^1; //定义托盘限位感应开关
sbit S3=P3^2; //定义剪切原位感应开关
sbit S4=P3^3; //定义剪切限位感应开关
unsigned int num; //无符号整型变量
void Delay10Ms() //去抖延时子函数,暂时不引用
{
TMOD=0x01; //设置定时器0的工作方式为1(M1M0为01)
TH0=(65536-10000)/256; //装初值12M晶振定时10ms数为55536
TL0=(65536-10000)%256;
EA=1; //开总中断
ET0=1; //开定时器0中断
TR0=1; //启动定时器0
}
void Second2() //等待2秒的子函数
{
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() //主函数
{
{
SS1=1; //启动开关初值置1
S2=1; //托盘限位感应开关置1
S4=1; //剪切限位感应开关置1
M1F=0; //托盘电机正极置0
M1B=0; //托盘电机负极置0
M2F=0; //剪切电机正极置0
M2B=0; //剪切电机负极置0
if(S1==0&&S3==0) //判断两个原位感应开关状态被按下
if(SS1==0) //再判断启动开关也被触发一下(再学习了一下,发现这两行代码用if不对,请大师指导啥写才正确)
while(S4) //剪切限位感应开关被按下之前执行以下两行代码
{
S3=1; //剪切原位感应开关置1
M2F=1; //启动M2电机
}
} //剪切限位感应开关被按下后执行以下两行代码
M2F=0; //暂停M2电机
Second2(); //等待2秒
while(S3) //剪切原位感应开关未按下之前执行以下一行代码
{
M2F=1; //启动M2电机
} //剪切原位感应开关被按下之后执行以下三行代码
M2F=0; //停止M2电机
Second2(); //等待2秒
while(S2) //托盘限位感应开关未按下之前执行以下三行代码
{
S1=1; //托盘原位感应开关置1
M1F=1; //M1电机正向运行
M2B=0;
}
M1F=0; //暂停M1电机
Second2(); //等待2秒
while(S1) //托盘原位感应开关未按下之前执行以下两行代码
{
M1F=0; //M1电机反向运行
M1B=1;
}
M1B=0; //托盘原位感应开关被按下后,停止M2电机 最后这一行是否要添加return,等待下一次触发启动键?
}
|