标题:
单片机仿真步进电机设定旋转度数 附源程序
[打印本页]
作者:
吴海晨o
时间:
2020-11-16 20:26
标题:
单片机仿真步进电机设定旋转度数 附源程序
步进电机控制旋转度数,能控制开关,以及液晶显示,通过按键设定正反转度数。能够设置正反转。
仿真运行如下图所示!
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
51hei图片20201116202608.png
(99.8 KB, 下载次数: 43)
下载附件
2020-11-16 20:26 上传
单片机源程序如下:
#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)
2020-11-16 20:24 上传
点击文件名下载附件
步进电机
下载积分: 黑币 -5
作者:
∮醉心∮·
时间:
2020-11-17 09:46
大神,我做的 步进电机仿真里转,实物连线就没有反应,可以 帮我看看程序吗?
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1