这是一个用51单片机控制异步电机正反转的,包括proteus仿真图和keil代码,只需要proteus就可以打开,里面包含了.hex文件
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
单片机控制异步电机源码:
- #include<reg51.h>
- #include<intrins.h>
- sbit RS = P2^0;
- sbit RW = P2^1;
- sbit E = P2^2;
- sbit BF = P0^7;
- sbit K1 = P2^4; //顺转
- sbit K2 = P2^5; //反转
- sbit K4 = P2^7; //停止 //步进电机八拍编码向量;
- sbit K5 = P3^6;
- sbit K6 = P3^7;
- unsigned char code bianma[4]={0x01,0x02,0x04,0x08}; //0~9字符编码向量;
- unsigned char code word[]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39}; //延时1毫秒
- void delay(unsigned int t)
- {
- unsigned int k;
- while(t--)
- {
- for(k=0; k<125; k++)
- {}
- }
- }
- bit BusyTest(void)
- {
- bit result;
- RS=0; //根据规定,RS为低电平,RW为高电平时,可以 读状态
- RW=1;
- E=1; //E=1,才允许读写
- _nop_(); //空操作
- _nop_();
- _nop_();
- _nop_(); //空操作四个机器周期,给硬件反应时间
- result=BF; //将忙碌标志电平赋给result
- E=0;
- return result;
- }
- void Write_com (unsigned char dictate)
- {
- while(BusyTest()==1); //如果忙就等待
- RS=0;
- RW=0;
- E=0; //E置低电平(写指令时,就是让E从0到1发生正跳变,所以应先置"0"
- _nop_();
- _nop_(); //空操作两个机器周期,给硬件反应时间
- P0=dictate; //将数据送入P0口,即写入指令或地址
- _nop_();
- _nop_();
- _nop_();
- _nop_(); //空操作四个机器周期,给硬件反应时间
- E=1; //E置高电平
- _nop_();
- _nop_();
- _nop_();
- _nop_(); //空操作四个机器周期,给硬件反应时间
- E=0; //当E由高电平跳变成低电平时,液晶模 块开始执行命令
- }
- void WriteAddress(unsigned char x)
- {
- Write_com(x|0x80);
- }
- void WriteData(unsigned char y)
- {
- while(BusyTest()==1);
- RS=1; //RS为高电平,RW为低电平时,可以写入数据
- RW=0;
- E=0; //E置低电平(写指令时,就是让E从0到1发生正跳变,所以应先置"0"
- P0=y; //将数据送入P0口,即将数据写入液晶模块
- _nop_();
- _nop_();
- _nop_();
- _nop_(); //空操作四个机器周期,给硬件反应时间
- E=1; //E置高电平
- _nop_();
- _nop_();
- _nop_();
- _nop_(); //空操作四个机器周期,给硬件反应时间
- E=0; //当E由高电平跳变成低电平时,液晶模块开始 执行命令
- }
- void LcdInt(void)
- {
- delay(15); //延时15ms,首次写指令时应给LCD一 段较长的反应时间
- Write_com(0x38); //显示模式设置:16×2显示,5×7点阵,8位 数据接口
- delay(5); //延时5ms
- Write_com(0x38);
- delay(5);
- Write_com(0x38); //3次写 设置模式
- delay(5);
- Write_com(0x0F); //显示模式设置:显示开,有光标,光标闪烁
- delay(5);
- Write_com(0x06); //显示模式设置:光标右移,字符不移
- delay(5);
- Write_com(0x01); //清屏幕指令,将以前的显示内容清除
- delay(5);
- }
- main()
- {
- unsigned int p=0;
- long int r=0;
- int D1,D2,D3,flag;
- int delay_time;
- LcdInt(); //LCD1602初始化
- P1 = 0xf9;
- delay(15);
- while(1)
- {
- delay_time=300;
- if(K1==0)
- {
- for(;1;)
- {
- p=(p+1)%4; //电机正转
- P1=bianma[p];
- r=r+3;
- if(r>0)
- flag=0;
- else
- flag=1;
- D3=(r%360-flag*360)/100;
- D2=((r%360-flag*360)/10)%10;
- D1=(r%360-flag*360)%10;
- WriteAddress(0x00);
- WriteData(0x2b+flag*2);
- WriteData(word[D3]);
- WriteData(word[D2]);
- WriteData(word[D1]);
- if(K2==0||K4==0)
- {break;} //退出此循环程序
- delay(delay_time);
- if(K5==0)
- {
- if(delay_time<500)
- delay_time+=50;
- else
- delay_time=500;
- }
- if(K6==0)
- {
- if(delay_time>100)
- delay_time-=50;
- else
- delay_time=100;
- }
- }
- }
- else if(K2==0)
- {
- for(;1;)
- {
- p=(p+7)%4; //电机反转
- P1=bianma[p];
- r=r-3;
- if(r>0)
- flag=0;
- else
- flag=1;
- D3=(r%360-flag*360)/100;
- D2=((r%360-flag*360)/10)%10;
- D1=(r%360-flag*360)%10;
- WriteAddress(0x00);
- WriteData(0x2b+flag*2);
- WriteData(word[D3]);
- WriteData(word[D2]);
- WriteData(word[D1]);
- delay(1);
- if(K1==0||K4==0)
- {break;} //退出此循环程序
- delay(delay_time);
- if(K5==0)
- {
- if(delay_time<500)
- …………
- …………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
全部资料51hei下载地址:
电机正反转.rar
(67.25 KB, 下载次数: 96)
|