51单片机求程序 急急急急急急急急急急急急急急急急急急急急!

2025-03-10 06:30:08
推荐回答(1个)
回答1:

汇编的没有,C的模块在下面。main删了,本来是自动门的程序。可以直接调用下面的函数。

#include
#define uchar unsigned char
#define uint unsigned int
sbit CP1=P1^0; // 左电机脉冲
sbit DIR1=P1^1; // 左电机方向 0 为开门 1为关门
sbit CP2=P1^2; // 右电机脉冲
sbit DIR2=P1^3; // 右电机方向 0 为开门 1为关门
sbit ADS=P3^2; // 传感器输入的检测人的端子
bit int0_flag=0; //中断0标志位
uchar position; //位置变量,以步数计 共2000步
/******************************************
步进电机控制 diret为方向 step为步数
*******************************************/
bit contrl(bit diret,uint step)
{
uint k;
CP1=1; //脉冲置高电平
CP2=1; //脉冲置高电平
DIR1=diret; //运行方向输出
DIR2=diret; //运行方向输出
if(step>11) //所走步数大于11步时采用加速--匀速--减速 走
{
for(k=5;k>0;k--) //加速
{
CP1=0;
CP2=0;
del2ms(2*k); //延时时间逐步减少 则加速
CP1=1;
CP2=1;
del2ms(2*k);
if(diret==0) //开门 位置步数加
{
position++;
}
else //关门 位置步数减
{
position--;
if(int0_flag==1)
return 0; //返回0 表示又有人 关门失败
}
}
for(k=0;k<(step-5-5);k++) //匀速
{
CP1=0;
CP2=0;
del2ms(1);
CP1=1;
CP2=1;
del2ms(1);
if(diret==0) //开门 位置步数加
{
position++;
}
else //关门 位置步数减
{
position--;
if(int0_flag==1)
return 0;
}
}
for(k=1;k<6;k++) //减速
{
CP1=0;
CP2=0;
del2ms(2*k); //延时时间逐步增加 则减速
CP1=1;
CP2=1;
del2ms(2*k);
if(diret==0) //开门 位置步数加
{
position++;
}
else //关门 位置步数减
{
position--;
if(int0_flag==1)
return 0;
}
}
}
else //当所走步数小于等于11步时采用匀速走
{
for(k=0;k {
CP1=0;
CP2=0;
del2ms(2);
CP1=1;
CP2=1;
del2ms(2);
if(diret==0) //开门 位置步数加
{
position++;
}
else //关门 位置步数减
{
position--;
if(int0_flag==1)
return 0;
}
}
}
return 1;
}
/*************************************
s延时 time约为2ms
**************************************/
void del2ms(uint time1)
{
uint deli,delj;
for(deli=0;deli for(delj=0;delj<240;delj++); //约为2ms