51单片机步进电机的正反转。加减速控制
电路原理图如下:
仿真原理图如下
单片机源程序如下:
#include #include #include #define uchar unsigned char #define uint unsigned int sbit RS = P2^4;//1602数据/命令选择端(H:数据寄存器L:指令寄存器) sbit RW = P2^5;//1602读/写选择端 sbit E = P2^6;//1602使能信号端 sbit key1=P3^0;//用户按键 sbit key2=P3^1; sbit key3=P3^2; sbit key4=P3^3; sbit key5=P3^4; uchar code B_Rotation[8]={0x7f,0x3f,0xbf,0x9f,0xdf,0xcf,0xef,0x6f}; //反转表格 uchar code F_Rotation[8]={0xef,0xcf,0xdf,0x9f,0xbf,0x3f,0x7f,0x6f}; //正转表格 uchar table1[]="dir: + spe:005"; uchar table2[]="cir:000 ang:000"; uchar num; uint key,flag,speed=5,zflag,znum,fflag,fnum,select,pp,qq; //1键值2键值标志3速度4正转标志5正转圈数6反转标志7反转圈数8正转角度9反转角度10选择 float zang,fang; /******************************************************************/ /* 延时函数 Xms */ /******************************************************************/ void delay(uint z) { uint x,y; for(x=z;x>0;x--) for(y=110;y>0;y--); } /******************************************************************/ /* LCD1602写命令操作 */ /******************************************************************/ void WriteCommand(uchar com) { delay(5);//操作前短暂延时,保证信号稳定 E=0; RS=0; RW=0; P0=com; E=1; delay(5); E=0; } /******************************************************************/ /* LCD1602写数据操作 */ /******************************************************************/ void WriteData(uchar dat) { delay(5); //操作前短暂延时,保证信号稳定 E=0; RS=1; RW=0; P0=dat; E=1; delay(5); E=0; } /******************************************************************/ /* 1602初始化程序 */ /******************************************************************/ void InitLcd()//1602初始化程序 { delay(15); WriteCommand(0x38); //display mode WriteCommand(0x38); //display mode WriteCommand(0x38); //display mode WriteCommand(0x06); //当读或写一个字符后地址指针加一,且光标加一 WriteCommand(0x0c); //显示开及光标不显示 WriteCommand(0x01); //清屏 WriteCommand(0x80); for(num=0;num<15;num++)//第一行的显示 { WriteData(table1[num]); delay(15); } WriteCommand(0x80+0x40);//第二行的显示 for(num=0;num<15;num++) { WriteData(table2[num]); delay(15); } } /******************************************************************/ /* 独立键盘扫描函数 */ /******************************************************************/ void keyscan() { P3=0xff;//拉高P3口,以读取P3口的值 if(key1==0)//键1被按下 { delay(5);//延时消抖 if(key1==0) { flag=1; } while(!key1); delay(5);//延时消抖 while(!key1);//松手检测 } if(key2==0) { delay(5); if(key2==0) { flag=2; } while(!key2); delay(5); while(!key2); } if(key3==0)//键1被按下 { delay(5);//延时消抖 if(key3==0) { flag=3; } while(!key3); delay(5);//延时消抖 while(!key3);//松手检测 } if(key4==0) { delay(5); if(key4==0) { flag=4; } while(!key4); delay(5); while(!key4); } if(key5==0) { delay(5); if(key5==0) { flag=5; } while(!key5); delay(5); while(!key5); } } /******************************************************************/ /* 1602显示3位数 */ /******************************************************************/ void write_sfm(uchar add,uint date)//1602显示 { uchar bai,shi,ge; bai=date/100; shi=date%100/10; ge=date%10; WriteCommand(0x80+add);//设置数据地址指针 WriteData(0x30+bai); WriteData(0x30+shi); WriteData(0x30+ge); WriteData(0x20); } /******************************************************************/ /* 键值处理 */ /******************************************************************/ void handle_flag() { uchar select1; if(TR0==0&&TR1==0) { if(flag==1) //正转 { WriteCommand(0x80+0x05); WriteData('+'); delay(20); select=0; } if(flag==2) //反转 { WriteCommand(0x80+0x05); WriteData('-'); delay(20);
上一篇:单片机自行车测速系统+源程序+proteus仿真
下一篇:非常完备的按键操作系统,单击、双击、N击,长按。可移植
推荐阅读最新更新时间:2024-11-11 08:45
设计资源 培训 开发板 精华推荐
- 【物联网】鸿蒙wifi开关
- 电路允许 DAC 信号动态调整输出电压
- 基于CH582F的索尼MultiPort接口蓝牙快门
- TLV431C 低压精密可调并联稳压器的典型应用
- AKD4145-A,AK4145 BTSC 编码器评估板
- LTC2953IDD-2 用于具有复位功能的双电源监视器的电压监控器的典型应用电路
- 基于51单片机8键电子琴设计(原理图、源程序等)毕业设计
- PCA9685 16 通道、12 位 PWM Fm+ I 方型 C 总线 LED 控制器的典型应用
- SSM2604,评估板是一款适用于便携式数字音频应用的低功耗、高质量立体声音频编解码器
- STEVAL-ILD004V1,用于卤素、低功耗灯评估板的数字墙壁调光器