历史上的今天
今天是:2024年08月26日(星期一)
2020年08月26日 | 利用单片机+ULN2001A对步进电机进行调速控制并显示
2020-08-26 来源:51hei
设计包含PROTEUS仿真电路图和程序代码。设计能实现步进电机的启停控制,加减档调速并显示当前档位和速度。
/***步进电机调速实验***/
/***实验内容:通过程序能够实现电机的启停,正反转,加减速。同时显示电机当前档位和速度。***/
#include #define uchar unsigned char #define uint unsigned int void Delay_ms(uint x);//延时函数 void Key_pros(); //声明按键函数 void MotorControl_fwd();//声明电机控制函数 void MotorControl_bwd(); void Dig_display();//4位数码管显示函数 void Data_pros(uint temp);//速度处理显示 uchar code Motor_fwd[8]={0x09,0x08,0x0c,0x04,0x06,0x02,0x03,0x01}; //正转动数组 uchar code Motor_bwd[8]={0x01,0x03,0x02,0x06,0x04,0x0c,0x08,0x09}; //反转动数组 uchar code segcode[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //共阴显示段码,用于共阳数码管取反。 uchar V_pros[4]; uchar count=5; //初始挡位5档 uint loop=50,j; //初始速度50ms一步,通过改变loop调整调整脉冲频率达到调速的目的 uchar flag=1; //正反转标志位 1正0反 uchar state=1; //启停标志位 1启动0关闭 sbit Motor_Dcl=P1^2; //电机减速 sbit Motor_Acl=P1^1; //电机加速 sbit Motor_Bwd=P1^4; //电机反转 sbit Motor_Fwd=P1^3; //电机正转 sbit Motor_Control=P1^0; //电机启停 sbit LSA=P2^0; sbit LSB=P2^1; sbit LSC=P2^2; void main() { while(1) { uint speed; Key_pros(); while(state==1) { if(flag==1) { MotorControl_fwd(); P2=~segcode[count]; Key_pros(); } if(flag==0) { MotorControl_bwd(); Key_pros(); P2=~segcode[count]; } switch(loop) { case 10:speed=1900;break; case 20:speed=1800;break; case 30:speed=1700;break; case 40:speed=1600;break; case 50:speed=1500;break; case 60:speed=1400;break; case 70:speed=1300;break; case 80:speed=1200;break; case 90:speed=1100;break; default:break; } Data_pros(speed); Dig_display(); } } } /*** 函数名: Delay() 函数功能:延时函数 输入:j 输出:无 ***/ void Delay_ms(uint x) { uint i,j; for(i=0;i } /******************************************************************************* * 函 数 名 : delay * 函数功能 : 延时函数,i=1时,大约延时10us *******************************************************************************/ void delay(uint i) { while(i--); } /*** 函数名: MotorControl_fwd() 函数功能: 电机正转函数 输入:无 输出:无 ***/ void MotorControl_fwd() { uchar z; for(z=0;z<8;z++) { P3=Motor_fwd[z]; Delay_ms(loop); } } /*** 函数名: MotorControl_bwd() 函数功能: 电机反转函数 输入:无 输出:无 ***/ void MotorControl_bwd() { uchar z; for(z=0;z<8;z++) { P3=Motor_bwd[z]; Delay_ms(loop); } } /*** 函数名:void Key_pros() 函数功能: 电机反转函数 输入: 输出: ***/ void Key_pros() { P1=0xff; if(P1!=0xff) Delay_ms(10); if(P1!=0xff) { switch(P1) { case 0xfe:state=~state;break; case 0xfd:loop-=10;count++;break; case 0xfb:loop+=10;count--;break; case 0xf7:flag=1;break; case 0xef:flag=0;break; } if(loop<10) //超速保护,最快10ms一步 { count=9;loop=10; } else if(loop>90) //最低转速限制90ms一步 { count=1;loop=90; } } while(P1!=0xff); //等待按键释放 } /*** 函数名: VDisplay_pros(); 函数功能: 速度处理显示 输入:speed 输出:无 ***/ void Data_pros(uint temp) { V_pros[0]=segcode[temp/1000]; V_pros[1]=segcode[temp%1000/100]; V_pros[2]=segcode[temp%100/10]; V_pros[3]=segcode[temp%10]; } /*** 函数名:void Dig_display() 函数功能: 4位数码管显示函数 输入:无 输出:无 ***/ void Dig_display() { uint i; for(i=0;i<4;i++) { switch(i) //位选,选择点亮的数码管, { case(0): LSA=0;LSB=0;LSC=0; break;//显示第0位 case(1): LSA=1;LSB=0;LSC=0; break;//显示第1位 case(2): LSA=0;LSB=1;LSC=0; break;//显示第2位 case(3): LSA=0;LSB=1;LSC=1; break;//显示第3位 } P0=~V_pros[i];//发送段码 delay(100); //间隔一段时间扫描 P0=0x00;//消隐 }
史海拾趣
|
下面的是学C++时要注意的。绝对经典!! 1.把C++当成一门新的语言学习(和C没啥关系!真的。); 2.看《Thinking In C++》,不要看《C++变成死相》; 3.看《The C++ Programming Language》和《Inside The C++ Object Model》,不要因为他 ...… 查看全部问答> |
|
反转式串联开关电源储能滤波电容的计算 开关电源原理与设计(连载七) 1-3-3.反转式串联开关电源储能滤波电容的计算 反转式串联开关电源储能滤波电容参数的计算,与串联式开关电源储能滤波电容的计算方法基本相同。但要注意,即使是在占空比D等于0.5的情况下,滤波电容器充、放电的时间都不相等,滤波电容器充电的时 ...… 查看全部问答> |
|
//--------------------------------------2010.3.25---------------------------------------- 1. Stellaris大全(不断更新) 2. Stellaris系列原理图汇总 3. Stellaris系列实验例程——IAR5.11实验例程 4. Stellaris系列实验例程——Keil实验 ...… 查看全部问答> |
|
我现在在做一个用simenz MC55模块实现通过GPRS发送彩信的项目, 现在有几个问题,请各位帮忙: 1.彩信MMS的具体标准格式是什么? 2.有了彩信文件后怎么打包成PDU? 3.打包成PDU后,已经实现连接了,怎么把彩信发送到一个指定的手机后? 是不是 ...… 查看全部问答> |
|
在用write_string(char*)函数的时候,只有while(1){write_string(char*);}才能在LCD屏上看到字符串输出;如果不加while(1),就看不到。但这样我的程序就不能往其他地方跑了,从而不能执行其他的功能。怎么来实现字符串输出,而我的程序又能在运 ...… 查看全部问答> |
|
MSP430F5xx可以延长电池寿命有广泛的应用前景,提供突破性性能和超低功率、帮助客户开发高级便携应用的全新一代产品 $(\'swf_mf3\').innerHTML=AC_FL_RunContent(\'width\', \'550\', \'height\', \'400\', \'allowNetworking\', \'intern ...… 查看全部问答> |




