历史上的今天
返回首页

历史上的今天

今天是: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                for(j=0;j<112;j++);

}

/*******************************************************************************

* 函 数 名         : 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;//消隐

        }

}


推荐阅读

史海拾趣

ELDECO公司的发展小趣事

在激烈的市场竞争中,ELDECO公司始终坚持质量至上的原则。公司建立了严格的质量管理体系和检测机制,确保每一台出厂的ELD产品都符合高质量标准。同时,公司还注重售后服务体系建设,为客户提供及时、专业的技术支持和解决方案。正是凭借过硬的产品质量和优质的售后服务,ELDECO公司的ELD产品赢得了客户的广泛认可和信赖。

Bel Power Solutions公司的发展小趣事

Bel Power Solutions的创立源于对电源转换和管理技术的深刻理解和创新追求。公司创始人们看到了电力电子技术在各个行业领域的广阔应用前景,并决心打造一个专业、高效的电源解决方案提供商。然而,在创立初期,公司面临着资金短缺、技术难题以及市场竞争的严峻挑战。但创始人们凭借坚定的信念和不懈的努力,逐步攻克了技术难关,推出了首款电源转换产品,初步在市场上站稳了脚跟。

APX Technologies公司的发展小趣事

面对日益激烈的市场竞争,APX Technologies积极寻求与其他企业的合作。公司与一家知名的电子设备制造商达成战略合作协议,共同开发一款具有创新功能的新型智能手机。这款手机的成功上市不仅提升了APX Technologies的品牌知名度,也为其带来了可观的利润。

EMS GmbH公司的发展小趣事

随着公司技术的不断成熟和产品的不断优化,EMS GmbH公司开始积极拓展市场。公司不仅在欧洲市场取得了显著的成绩,还逐渐将业务拓展至全球范围。通过参加国际展会、与合作伙伴建立战略合作关系等方式,EMS GmbH公司不断提升品牌知名度和影响力。同时,公司还注重产品质量和服务质量的提升,以确保在激烈的市场竞争中保持竞争优势。

EDAC公司的发展小趣事

ECS-B公司是一家以生产高端电子产品为主的企业。在竞争激烈的电子行业中,ECS-B公司深知品质是企业生存和发展的关键。因此,公司非常重视品质管理,从原材料采购、生产过程到成品检验,都实行严格的质量控制。ECS-B公司还建立了完善的品质管理体系,通过持续改进和优化生产流程,提升产品的品质水平。正是凭借卓越的品质和可靠的性能,ECS-B公司的产品在市场上赢得了良好的口碑和广泛的认可。

Antex公司的发展小趣事

近年来,Antex公司不断升级产品,推出了包括Antex滚珠轴承、Antex齿轮环等在内的多款高端产品。这些产品以其卓越的性能和稳定的品质,赢得了全球客户的青睐。凭借这些优秀产品,Antex在大型回转轴承市场中的份额逐渐提升,目前已占据全球约40%的市场份额。

问答坊 | AI 解惑

学习C 和编程的50个观点

下面的是学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的情况下,滤波电容器充、放电的时间都不相等,滤波电容器充电的时 ...…

查看全部问答>

Stellaris资料整理贴

//--------------------------------------2010.3.25---------------------------------------- 1. Stellaris大全(不断更新) 2. Stellaris系列原理图汇总 3. Stellaris系列实验例程——IAR5.11实验例程 4. Stellaris系列实验例程——Keil实验 ...…

查看全部问答>

各位开发过GPRS发送彩信的项目的大侠来看了

我现在在做一个用simenz MC55模块实现通过GPRS发送彩信的项目, 现在有几个问题,请各位帮忙: 1.彩信MMS的具体标准格式是什么? 2.有了彩信文件后怎么打包成PDU? 3.打包成PDU后,已经实现连接了,怎么把彩信发送到一个指定的手机后? 是不是 ...…

查看全部问答>

请教:有没有提供SPI接口,可提供Slave模式的IC?

我可以通过程序随时同步修改SPI通信的内容的? 谢谢帮忙。…

查看全部问答>

stm32lcd显示的问题

在用write_string(char*)函数的时候,只有while(1){write_string(char*);}才能在LCD屏上看到字符串输出;如果不加while(1),就看不到。但这样我的程序就不能往其他地方跑了,从而不能执行其他的功能。怎么来实现字符串输出,而我的程序又能在运 ...…

查看全部问答>

自加密源代码:

把下面的程序段加在main的最前,可以让你的代码自行加密,不会在烧录时产生漏网之鱼://Led_Config(); if(FLASH_GetReadOutProtectionStatus() == SET) {   //Led1_ON();Led2_OFF();Led3_OFF();Led4_OFF() ...…

查看全部问答>

51最小系统

我用万用板 焊了一个51的最小系统 下载简单的程序(跑马灯)没问题,但是我想控制舵机就不行。有没有高人指点一下啊 是有干扰吗?…

查看全部问答>

超低功率高性能新一代产品 MSP430F5xx

MSP430F5xx可以延长电池寿命有广泛的应用前景,提供突破性性能和超低功率、帮助客户开发高级便携应用的全新一代产品   $(\'swf_mf3\').innerHTML=AC_FL_RunContent(\'width\', \'550\', \'height\', \'400\', \'allowNetworking\', \'intern ...…

查看全部问答>