|
這是一個用51單片機(jī)控制異步電機(jī)正反轉(zhuǎn)的,包括proteus仿真圖和keil代碼,只需要proteus就可以打開,里面包含了.hex文件
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
QQ圖片20180410213736.png (32.04 KB, 下載次數(shù): 61)
下載附件
2018-4-10 21:44 上傳
0.png (48.25 KB, 下載次數(shù): 74)
下載附件
2018-4-11 00:26 上傳
單片機(jī)控制異步電機(jī)源碼:
- #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; //順轉(zhuǎn)
- sbit K2 = P2^5; //反轉(zhuǎn)
- sbit K4 = P2^7; //停止 //步進(jìn)電機(jī)八拍編碼向量;
- 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; //根據(jù)規(guī)定,RS為低電平,RW為高電平時,可以 讀狀態(tài)
- RW=1;
- E=1; //E=1,才允許讀寫
- _nop_(); //空操作
- _nop_();
- _nop_();
- _nop_(); //空操作四個機(jī)器周期,給硬件反應(yīng)時間
- result=BF; //將忙碌標(biāo)志電平賦給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ā)生正跳變,所以應(yīng)先置"0"
- _nop_();
- _nop_(); //空操作兩個機(jī)器周期,給硬件反應(yīng)時間
- P0=dictate; //將數(shù)據(jù)送入P0口,即寫入指令或地址
- _nop_();
- _nop_();
- _nop_();
- _nop_(); //空操作四個機(jī)器周期,給硬件反應(yīng)時間
- E=1; //E置高電平
- _nop_();
- _nop_();
- _nop_();
- _nop_(); //空操作四個機(jī)器周期,給硬件反應(yīng)時間
- E=0; //當(dāng)E由高電平跳變成低電平時,液晶模 塊開始執(zhí)行命令
- }
- void WriteAddress(unsigned char x)
- {
- Write_com(x|0x80);
- }
- void WriteData(unsigned char y)
- {
- while(BusyTest()==1);
- RS=1; //RS為高電平,RW為低電平時,可以寫入數(shù)據(jù)
- RW=0;
- E=0; //E置低電平(寫指令時,就是讓E從0到1發(fā)生正跳變,所以應(yīng)先置"0"
- P0=y; //將數(shù)據(jù)送入P0口,即將數(shù)據(jù)寫入液晶模塊
- _nop_();
- _nop_();
- _nop_();
- _nop_(); //空操作四個機(jī)器周期,給硬件反應(yīng)時間
- E=1; //E置高電平
- _nop_();
- _nop_();
- _nop_();
- _nop_(); //空操作四個機(jī)器周期,給硬件反應(yīng)時間
- E=0; //當(dāng)E由高電平跳變成低電平時,液晶模塊開始 執(zhí)行命令
- }
- void LcdInt(void)
- {
- delay(15); //延時15ms,首次寫指令時應(yīng)給LCD一 段較長的反應(yīng)時間
- Write_com(0x38); //顯示模式設(shè)置:16×2顯示,5×7點陣,8位 數(shù)據(jù)接口
- delay(5); //延時5ms
- Write_com(0x38);
- delay(5);
- Write_com(0x38); //3次寫 設(shè)置模式
- delay(5);
- Write_com(0x0F); //顯示模式設(shè)置:顯示開,有光標(biāo),光標(biāo)閃爍
- delay(5);
- Write_com(0x06); //顯示模式設(shè)置:光標(biāo)右移,字符不移
- delay(5);
- Write_com(0x01); //清屏幕指令,將以前的顯示內(nèi)容清除
- 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; //電機(jī)正轉(zhuǎn)
- 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; //電機(jī)反轉(zhuǎn)
- 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黑下載附件…………
復(fù)制代碼
全部資料51hei下載地址:
電機(jī)正反轉(zhuǎn).rar
(67.25 KB, 下載次數(shù): 96)
2018-4-10 21:44 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|
評分
-
查看全部評分
|