步进电机控制旋转度数,能控制开关,以及液晶显示,通过按键设定正反转度数。能够设置正反转。
仿真运行如下图所示!
仿真原理图如下(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驱动端口
- 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};//正转 电机导通相序 D-C-B-A
- unsigned char phasezz[8]={0x01,0x03,0x02,0x06,0x04,0x0c,0x08,0x09};//反转 电机导通相序 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;
- }
- //写数据程序
- void WriteData(unsigned char btData)
- {
- Busy();
- RS = 1;
- RW = 0;
- E = 1;
- DATA = btData;
- E = 0;
- }
- //清屏显示
- void Clear()
- {
- WriteCommand(1);
- }
- //初始化
- void Init()
- {
- WriteCommand(0x0c); //开显示,无光标显示
- WriteCommand(0x06); //文字不动,光标自动右移
- WriteCommand(0x38); //设置显示模式: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);
- }
- //显示字符串函数
- 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++)); //要显示的数据
- btColumn++; //列数加一
- }
- }
- 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; //防止因为中断导致计算错误,因为以后的中断中需要使用到beats
- EA=1;
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
步进.zip
(95.88 KB, 下载次数: 100)
|