基于51单片机垃圾箱自动分类加料机快递物流分拣器系统设计
本设计包含程序+原理图+PCB+视频解说
📚开发环境
程序编译器:keil 4
原理图PCB:Altium Designer
编程语言:C语言
设计编号:C0015
📚功能说明
本系统由STC89C52单片机、ULN2003步进电机驱动、RFID读卡器模块、
LCD1602液晶显示组成。
1、步进电机左右转动进行通道选择(或理解为传送带方向),
有2张卡,一个表示需要通向左侧通道,一个表示需要通向右侧通道。
2、如果RFID阅读器读到卡1,则步进电机左转一定角度,
停留片刻后,等待传送的物品通过,再返回到原位置即中间位置。
3、如果RFID阅读器读到卡2,则步进电机右转一定角度,
停留片刻后,等待传送的物品通过,再返回到原位置即中间位置。
📚实物图

📚原理图

📚PCB

📚程序代码
c
/***************************/
sbit A1=P1^3; //定义步进电机连接端口
sbit B1=P1^2;
sbit C1=P1^1;
sbit D1=P1^0;
#define TIMELATERNUM 2000 //步进电机旋转时间
#define Coil_A1 {A1=1;B1=0;C1=0;D1=0;}//A相通电,其他相断电
#define Coil_B1 {A1=0;B1=1;C1=0;D1=0;}//B相通电,其他相断电
#define Coil_C1 {A1=0;B1=0;C1=1;D1=0;}//C相通电,其他相断电
#define Coil_D1 {A1=0;B1=1;C1=0;D1=1;}//D相通电,其他相断电//**All notes can be deleted and modified**//
#define Coil_OFF {A1=0;B1=0;C1=0;D1=0;}//全部断电
unsigned int timeLater=0; //步进电机转动时间
unsigned char zfFlag = 0; //正反转标志
unsigned char needBack = 0;//需要返回到中间标志
unsigned int stayCount = 0;//停留时间
unsigned char UID[5]; //卡号
unsigned char Temp[4] ; //中间量
unsigned long time_3ms=0; //定时器计数 初始值可以任意值
unsigned char dis0[16]; //显示数组
void Init_Timer0(void);
void uartSendStr(unsigned char *s,unsigned char length);
void UART_Init(void);
void uartSendByte(unsigned char dat);
void main (void)
{
Init_Timer0(); //定时器0初始化
UART_Init();
time_3ms = 0;//初始化赋值
LCD_Init(); //初始化液晶
DelayMs(20); //延时有助于稳定
LCD_Clear();
sprintf(dis0,"Where to go : ");//打印
LCD_Write_String(0,0,dis0);//显示第二行
LCD_Write_String(0,1," Middle channel ");//显示第二行
PcdReset();//复位RC522
PcdAntennaOn();//开启天线发射
while (1) //主循环
{
if(PcdRequest(0x52,Temp)==MI_OK){ //检测到卡号
if(PcdAnticoll(UID)==MI_OK){ //获取卡号成功
if((UID[0]==leftID[0])&&(UID[1]==leftID[1])&&(UID[2]==leftID[2])) //左侧通道
{
zfFlag = 1;//左侧转动
timeLater=500; //转动时间
needBack = 1; //需要返回标志
LCD_Write_String(0,1," Left channel ");//显示第二行
}
else if((UID[0]==rightID[0])&&(UID[1]==rightID[1])&&(UID[2]==rightID[2]))//卡号为用户的
{
zfFlag = 2;//右侧转动
timeLater=500; //转动时间
needBack = 1; //该过程回到中间 不需要返回标志
LCD_Write_String(0,1," Right channel ");//显示第二行
}
uartSendByte(0x00);
uartSendStr(UID,4); //调试打印卡号
uartSendByte(0x00);
}
}
if(needBack&&(timeLater==0)){ //转动结束 需要返回
if((zfFlag == 1)&&(stayCount >= 300)){ //当前偏左 停留了600ms左右
zfFlag = 2;//右侧转动
timeLater=500; //转动时间
needBack = 0; //该过程回到中间 不需要返回标志
}
else if((zfFlag == 2)&&(stayCount >= 300)){//当前偏右 停留了600ms左右
zfFlag = 1;//左侧转动
timeLater=500; //转动时间
needBack = 0; //该过程回到中间 不需要返回标志
}
}
else if(!needBack&&(timeLater==0)){ //不需要返回情况下 运行结束 即回到中间位置
zfFlag = 0;//不转动
timeLater=0; //转动时间
needBack = 0; //该过程回到中间 不需要返回标志
LCD_Write_String(0,1," Middle channel ");//显示第二行
}
}
}

