這是一個用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; //根據規(guī)定,RS為低電平,RW為高電平時,可以 讀狀態(tài)
- 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發(fā)生正跳變,所以應先置"0"
- _nop_();
- _nop_(); //空操作兩個機器周期,給硬件反應時間
- P0=dictate; //將數據送入P0口,即寫入指令或地址
- _nop_();
- _nop_();
- _nop_();
- _nop_(); //空操作四個機器周期,給硬件反應時間
- E=1; //E置高電平
- _nop_();
- _nop_();
- _nop_();
- _nop_(); //空操作四個機器周期,給硬件反應時間
- E=0; //當E由高電平跳變成低電平時,液晶模 塊開始執(zhí)行命令
- }
- 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發(fā)生正跳變,所以應先置"0"
- P0=y; //將數據送入P0口,即將數據寫入液晶模塊
- _nop_();
- _nop_();
- _nop_();
- _nop_(); //空操作四個機器周期,給硬件反應時間
- E=1; //E置高電平
- _nop_();
- _nop_();
- _nop_();
- _nop_(); //空操作四個機器周期,給硬件反應時間
- E=0; //當E由高電平跳變成低電平時,液晶模塊開始 執(zhí)行命令
- }
- 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;} //退出此循環(huán)程序
- 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;} //退出此循環(huán)程序
- delay(delay_time);
- if(K5==0)
- {
- if(delay_time<500)
- …………
- …………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
全部資料51hei下載地址:
電機正反轉.rar
(67.25 KB, 下載次數: 96)
2018-4-10 21:44 上傳
點擊文件名下載附件
|