基于51单片机的步进电机控制系统(步数,方向,拍,LCD1602)原理图、流程图、物料清单、仿真图、源代码

您所在的位置:网站首页 stm32f407步进电机正反转限位开关 基于51单片机的步进电机控制系统(步数,方向,拍,LCD1602)原理图、流程图、物料清单、仿真图、源代码

基于51单片机的步进电机控制系统(步数,方向,拍,LCD1602)原理图、流程图、物料清单、仿真图、源代码

2024-06-30 14:49| 来源: 网络整理| 查看: 265

基于51单片机的步进电机控制系统(步数,方向,拍,LCD1602)原理图、流程图、物料清单、仿真图、源代码

基于51单片机的步进电机(步数,方向,拍,LCD1602)

基于单片机的步进电机控制系统设计用单片机来控制步进电机的运行,要求有启动控制、换向控制、电机停止、正转和反转状态均由不同颜色指示灯来指示。此外还要求电机的通电方式由按键进行切换。电机的步数可通过按键设定来确定,电机转动过程要显示剩余步数。

用LCD1602显示控制方式:4拍或8拍

请添加图片描述 请添加图片描述 请添加图片描述 请添加图片描述 请添加图片描述 请添加图片描述

#include "reg51.h" #define uchar unsigned char #define uint unsigned int sbit rs=P2^6; //1602数据/命令选择引脚 H:数据 L:命令 sbit rw=P2^5; //1602读写引脚 H:数据寄存器 L:指令寄存器 sbit e =P2^7; //1602使能引脚 下降沿触发 sbit L1=P1^0;//电机 sbit L2=P1^1; sbit L3=P1^2; sbit L4=P1^3; sbit led1=P2^0;//led sbit led2=P2^1; sbit k1=P3^1;//按钮 sbit k2=P3^0; sbit k3=P3^2; sbit k4=P3^3; uint step=100,step_set=100,start=0;//电机控制 uchar mode=0,moshi=1; uchar fang=0;//方向 uchar cixu=0; uchar sec=0; uchar disp1[]="step:0000"; uchar disp2[]="pai:8 "; //延时 void delay_uint(uint i) { while(i--); } //1602命令函数 void write_com(uchar com) { e=0; rs=0; rw=0; P0=com; delay_uint(20); e=1; delay_uint(20); e=0; } //1602写数据函数 void write_data(uchar dat) { e=0; rs=1; rw=0; P0=dat; delay_uint(20); e=1; delay_uint(20); e=0; } //设置当前行和列 void write_sfm(uchar hang,uchar add) { if(hang==1) //设置当前行 write_com(0x80+add); else write_com(0x80+0x40+add); } //改变液晶中某位的值 void write_string(uchar hang,uchar add,uchar *p) { if(hang==1) write_com(0x80+add); else write_com(0x80+0x40+add); while(1) { if(*p == '\0') break; write_data(*p); p++; } } //初始化1602液晶 void init_1602() { write_com(0x38); //数据总线为8位,显示2行,5x7点阵 write_com(0x0c); //开显示,有光标,光标闪烁 write_com(0x06); //光标自动右移 delay_uint(1000); //等待设置完成 } void disp()//显示 { if(mode==1)//设置步数 { disp1[5]=step_set/1000+0x30; disp1[6]=step_set%1000/100+0x30; disp1[7]=step_set%100/10+0x30; disp1[8]=step_set%10+0x30; write_com(0x0c); write_string(1,0,disp1); } else//显示步数 { disp1[5]=step/1000+0x30; disp1[6]=step%1000/100+0x30; disp1[7]=step%100/10+0x30; disp1[8]=step%10+0x30; write_string(1,0,disp1); } if(mode==2)//通电方式 { disp2[4]=moshi*4+4+0x30; write_com(0x0c); write_string(2,0,disp2); } else { disp2[4]=moshi*4+4+0x30; write_string(2,0,disp2); } if(mode==3)//方向 { write_com(0x0c); if(fang)//左 write_string(2,8,"left "); else write_string(2,8,"right"); } else { if(fang)//左 write_string(2,8,"left "); else write_string(2,8,"right"); } if(mode==1)//设置光标 write_sfm(1,8); if(mode==2) write_sfm(2,4); if(mode==3) write_sfm(2,10); if(mode==0) write_com(0x0c); else write_com(0x0e); } //主函数 void main() { uchar k=0; init_1602(); P1=0x01; TMOD|=0X01; TH0=0XD8; TL0=0XF0; ET0=1;//打开定时器0中断允许 EA=1;//打开总中断 TR0=1;//打开定时器 while(1) { if(fang==0)//方向指示 led2=0; else led2=1; if(start) led1=0; else led1=1; if(!k1 &&(k!=1))//启停 { k=1; start=!start; if(start==1) { step=step_set; } else { step=0; } } if(!k2 &&(k!=2))//设置 { k=2; if(mode


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3