|
步進電機控制旋轉(zhuǎn)度數(shù),能控制開關(guān),以及液晶顯示,通過按鍵設(shè)定正反轉(zhuǎn)度數(shù)。能夠設(shè)置正反轉(zhuǎn)。
仿真運行如下圖所示!
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
單片機源程序如下:
- #include <reg52.h>
- unsigned long beats=0;
- int set=0;
- sbit k2=P3^1;
- sbit k3=P3^2;
- sbit K1=P3^0;
- sbit k4=P3^3;
- #define DATA P0 //1602驅(qū)動端口
- int flag=0,flag2=0,flag3=0;
- int i;
- unsigned char S1,S2,S3;
- sbit RS= P2^0;
- sbit RW= P2^1;
- sbit E= P2^2;
- unsigned char tmp;
- static unsigned char index=0;
- unsigned char phasefz[8] ={0x08,0x0c,0x04,0x06,0x02,0x03,0x01,0x09};//正轉(zhuǎn) 電機導(dǎo)通相序 D-C-B-A
- unsigned char phasezz[8]={0x01,0x03,0x02,0x06,0x04,0x0c,0x08,0x09};//反轉(zhuǎn) 電機導(dǎo)通相序 A-B-C-D
- //判斷忙指令
- void Busy()
- {
- DATA = 0xff;
- RS = 0;
- RW = 1;
- while(DATA & 0x80)
- {
- E = 0;
- E = 1;
- }
- E = 0;
- }
- //寫指令程序
- void WriteCommand(unsigned char btCommand)
- {
- Busy();
- RS = 0;
- RW = 0;
- E = 1;
- DATA = btCommand;
- E = 0;
- }
- //寫數(shù)據(jù)程序
- void WriteData(unsigned char btData)
- {
- Busy();
- RS = 1;
- RW = 0;
- E = 1;
- DATA = btData;
- E = 0;
- }
- //清屏顯示
- void Clear()
- {
- WriteCommand(1);
- }
- //初始化
- void Init()
- {
- WriteCommand(0x0c); //開顯示,無光標(biāo)顯示
- WriteCommand(0x06); //文字不動,光標(biāo)自動右移
- WriteCommand(0x38); //設(shè)置顯示模式:8位2行5x7點陣
- }
- //顯示單個字符
- void DisplayOne(bit bRow, unsigned char btColumn, unsigned char btData, bit bIsNumber)
- {
- if (bRow) WriteCommand(0xc0 + btColumn);
- else WriteCommand(0x80 + btColumn);
- if (bIsNumber) WriteData(btData + 0x30);
- else WriteData(btData);
- }
- //顯示字符串函數(shù)
- void DisplayString(bit bRow, unsigned char btColumn, unsigned char *pData)
- {
- while (*pData != '\0')
- {
- if (bRow) WriteCommand(0xc0 + btColumn); //顯示在第1行
- else WriteCommand(0x80 + btColumn); //顯示在第0行
- WriteData(*(pData++)); //要顯示的數(shù)據(jù)
- btColumn++; //列數(shù)加一
- }
- }
- void startmotor(unsigned long angle);
- void key()
- {
- if(K1==0)
- {
- flag2++;
- while(K1==0);
- }
-
-
- if(k2==0)
- {
- set++;
- if(set>180) set=180;
- while(k2==0);
- }
-
-
- if(k3==0)
- {
- set--;
- if(set<=0) set=0;
- while(k3==0);
- }
-
-
- if(k4==0)
- {
- flag++;
- while(k4==0);
- }
- }
- void display()
- {
- S1 = (unsigned char)set / 100;
- S2 = (unsigned char)set % 100 / 10;
- S3 = (unsigned char)set % 10;
- DisplayOne(1,6,S1,1);
- DisplayOne(1,7,S2,1);
- DisplayOne(1,8,S3,1);
- if(flag%2==0) {DisplayString(1,5,"+");}
- if(flag%2==1) {DisplayString(1,5,"-");}
- }
- void main()
- {
- EA=1;
- TMOD=0X01;
- TH0=0XF8;//2ms
- TL0=0XCD;
- ET0=1;
- TR0=1;
- Init();
- flag3=1;
- DisplayString(0,2,"MOTOR: OOF");
- while(1)
- {
- key();
- display();
- if(flag2%2==1)
- {
- DisplayString(0,2,"MOTOR: ON");
- for(i=0;i<1;i++)
- {
- startmotor(set);
- }
-
- flag2++;
- }
-
-
- }
-
- }
- void startmotor(unsigned long angle)
- {
- EA=0;
- beats=(angle*4076)/360; //防止因為中斷導(dǎo)致計算錯誤,因為以后的中斷中需要使用到beats
- EA=1;
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復(fù)制代碼
所有資料51hei提供下載:
步進.zip
(95.88 KB, 下載次數(shù): 100)
2020-11-16 20:24 上傳
點擊文件名下載附件
步進電機
|
評分
-
查看全部評分
|