设计包含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;//消隐 }
上一篇:51单片机控制12864液晶显示屏显示图片
下一篇:数码管动态扫描显示01234567显示
推荐阅读最新更新时间:2024-11-13 04:03
设计资源 培训 开发板 精华推荐
- 基于STM32S103的独轮车控制器原理图
- 使用 NXP Semiconductors 的 MCF51JM128 的参考设计
- 使用 Analog Devices 的 LTC1261IS8 的参考设计
- Tiny_CP2104
- LTC6400-8 的典型应用 - 用于 DC-300MHz 的 2.2GHz 低噪声、低失真差分 ADC 驱动器
- 使用外部基准电流的 LT3089IDF 线性稳压器的典型应用电路
- LTC3622EDE 5V/3.3V 串联输出、突发模式操作中的降压稳压器的典型应用电路
- STC免冷启烧录器--软件版
- LT1370 演示板、6A 开关 2.7V 至 12V 输入、5V 或 12V 输出
- #第八届立创电赛#桌面电子时钟
- 平头哥RVB2601开源应用方案征集来啊~100套板卡助阵,天猫精灵智能套装礼品组等你抱走~
- 西门子EDA直播:多板产品互联规划方案,为破局而来!
- TI 嵌入式处理器最新产品发布会 全程在线直播 4月16日精彩为您呈现!预报名、看直播、享好礼
- 下载有礼|是德科技:测试设备如何影响产品质量调研报告
- TI 工业知识挑战赛开启,一起争霸前20强,赢取属于你的荣耀!
- 有奖直播|TI DLP® 技术如何推动AR HUD和汽车大灯的发展
- 更直观的了解5G?观看罗德与施瓦茨主题演讲,填问卷赢好礼!
- 模电怎么学?TI帮你定制课程清单!体验“模电选课测试”功能,赢精彩好礼
- 泰克 MSO6B 探索营:技术指标大挑战,闯关赢好礼