新手求助 是关于单片机控制步进电机的
时间:10-02
整理:3721RD
点击:
下面是原来的代码 想让电机先以一定速度正转两圈再过几秒钟再以另外一个速度逆转三圈 各个大神帮忙写下代码 小弟感激不尽!
#include<reg52.h>
#include "lcd1602.h"
#include "eeprom.h"
unsigned char T0_NUM;
unsigned char END_FLAG = 0;
sbit SW1=P3^0; //四个独立按键定义
sbit SW2=P3^1;
sbit SW3=P3^2;
sbit SW4=P3^3;
sbit MotorEn = P2^1; // 使能
sbit FX = P2^0; // 方向
sbit CLK = P2^2; // 脉冲
unsigned char g_MotorSt = 0; // 启停
unsigned char g_MotorDir = 0; // 正反
unsigned int CLK_OUT_NUM = 0; // 脉冲计数
signed int MotorSpedNum = 0; // 速度档
unsigned int CUR_MotorSpedQuan = 0; // 当前圈数
unsigned int SET_MotorSpedQuan = 0; // 设定圈数
unsigned char cMode = 0;
unsigned char s1_num;
unsigned int iSetData;
signed char RL = 0; // 方向
signed char iSet[3];
unsigned int SYS_NUM = 0;
unsigned char MotorTab[10] = {63, 42, 27, 18, 12, 8, 5, 3, 2};
unsigned int MotorSpedTab[6] = {400, 800, 1600, 3200, 6400, 12800};
signed char g_MotorNum = 0;
//--------------
void delayms(xms);
void mDelay(unsigned int DelayTime); //延时函数
void EEPROM_Init();
void T0_Init();
void LCD_Init();
void KeyScan(void);
void KeyProcess();
void SecondPro();
//void Display(void);
// 主程序 main()
void main(void)
{
EEPROM_Init(); // 读取数据
T0_Init(); // 定时器0 初始化
LCD_Init(); // 显示初始化
MotorEn = 0; // L297 使能(只有智能,才能正常工作,否则停止)
while(1)
{
if (!g_MotorSt) // 只有在空闲状态按键操作才有效;否则不能打断电机工作
{
KeyScan(); // 按键
KeyProcess();
if (SYS_NUM >= 100) // 10ms
{
SYS_NUM = 0;
write_com(0x80+0x40+8);
write_sfm(2,7,CUR_MotorSpedQuan);
}
}
if (SYS_NUM >= 100) // 10ms
{
SYS_NUM = 0;
write_com(0x80+0x40+8);
write_sfm(2,7,CUR_MotorSpedQuan);
}
}
}
/************存储初始化*****************/
void EEPROM_Init()
{
iSet[0]=byte_read(0x2000);//程序开始时读取EEPROM中数据
iSet[1]=byte_read(0x2200);
iSet[2]=byte_read(0x2400);
if((iSet[0] > 9) || (iSet[0] < 0)) //防止首次上电时读取出错
iSet[0] = 0;
if((iSet[1] > 9) || (iSet[1] < 0))
iSet[1] = 0;
if((iSet[2] > 9) || (iSet[2] < 0))
iSet[2] = 0;
iSetData = iSet[0]*100 + iSet[1]*10 + iSet[2];
MotorSpedNum=byte_read(0x2600);
if((MotorSpedNum > 9) || (MotorSpedNum < 0))
MotorSpedNum = 0;
RL = byte_read(0x2800);
if((RL > 2) || (RL < 0))
RL = 0;
}
/********定时器初始化***********************************************************/
void T0_Init()
{
TMOD = 0x01;
TH0 = (65535-100)/256; // 1ms
TL0 = (65535-100)%256;
EA = 1;
ET0 = 1;
// TR0 = 1;
}
// 液晶显示初始化
void LCD_Init()
{
init_1602(); //lcd1602初始化
write_string(1, 2, "set:");
write_sfm(1,7,iSetData);
write_string(2, 2, "cur:");
write_sfm(2,7,0);
// mDelay(1);
write_string(1, 13, "S:");
write_one_data(1, 15, MotorSpedNum);
if(RL == 0)
{
FX = 0;
write_string(2, 13, "R");
}
else
{
FX = 1;
write_string(2, 13, "L");
}
}
/********定时器中断*****************/
void T0_time() interrupt 1
{
// TR0 = 0;
TH0 = (65535-100)/256;
TL0 = (65535-100)%256;
T0_NUM++;
SYS_NUM++;
if(T0_NUM >= MotorTab[MotorSpedNum]) // 增加按键g_MotorNum++ 减小按键g_MotorNum--
{
T0_NUM = 0;
CLK=CLK^0x01; // 输出脉冲
CLK_OUT_NUM++;
if(CLK_OUT_NUM >= MotorSpedTab[1]) // 一圈
{
CLK_OUT_NUM = 0;
CUR_MotorSpedQuan++;
if(CUR_MotorSpedQuan >= iSetData) // 达到设定圈数
{
TR0 = 0;
cMode = 0;
g_MotorSt = 0;
MotorEn = 1;
write_com(0x80+0x40+8);
write_sfm(2,7,CUR_MotorSpedQuan);
END_FLAG = 1;
// SecondPro();
}
}
}
// TR0 = 1;
}
/********按键扫描函数***********************************************************/
void KeyScan()
{
if(SW1 == 0)
{
delayms(10);
if(SW1 == 0) // 功能键
{
while(!SW1); // 等待松开
cMode = 1; // 功能模式
}
}
if(SW2 == 0)
{
delayms(10);
if(SW2 == 0) // 增加
{
while(!SW2); // 等待松开
cMode = 2;
}
}
if(SW3 == 0)
{
delayms(10);
if(SW3 == 0) // 减小
{
while(!SW3); // 等待松开
cMode = 3;
}
}
if(SW4 == 0)
{
delayms(10);
if(SW4 == 0) // 启停
{
while(!SW4); // 等待松开
cMode = 4;
g_MotorSt = 1;
MotorEn = 1;
CUR_MotorSpedQuan = 0;
TR0 = 1;
}
}
}
/********按键处理函数***********************************************************/
void KeyProcess()
{
switch(cMode)
{
case 0: // 无模式
break;
case 1: // 功能模式
{
s1_num++;
cMode = 0; // 功能模式
if(s1_num ==1) // 第1次被按下
{
write_com(0x80+7); // 角度 百位
write_com(0x0f); // 光标闪烁
}
if(s1_num ==2)
{
write_com(0x80+8);
}
if(s1_num == 3)
{
write_com(0x80+9);
}
if(s1_num == 4)
{
write_com(0x80+15);
}
if(s1_num == 5)
{
write_com(0x80+0x40+13);
}
if(s1_num == 6)
{
s1_num = 0; // 记录按键清零
cMode = 0; // 退出模式
write_com(0x0c); // 取消光标闪烁
// 保存数据
SectorErase(0x2000);//擦除扇区
byte_write(0x2000,iSet[0]);//重新写入数
SectorErase(0x2200);//擦除扇区
byte_write(0x2200,iSet[1]);//重新写入数
SectorErase(0x2400);//擦除扇区
byte_write(0x2400,iSet[2]);//重新写入数
SectorErase(0x2600);//擦除扇区
byte_write(0x2600,MotorSpedNum);//重新写入数
SectorErase(0x2800);//擦除扇区
byte_write(0x2800,RL);//重新写入数
}
}
break;
case 2: // 增加
{
// s2_num++;
cMode = 0;
if(s1_num == 1) // 百
{
iSet[0]++;
if(iSet[0] >= 10)
iSet[0] = 0;
iSetData = iSet[0]*100 + iSet[1]*10 + iSet[2];
write_sfm(1, 7, iSetData);
write_com(0x80+7);
}
if(s1_num == 2)
{
iSet[1]++;
if(iSet[1] >= 10)
iSet[1] = 0;
iSetData = iSet[0]*100 + iSet[1]*10 + iSet[2];
write_sfm(1, 7, iSetData);
write_com(0x80+8);
}
if(s1_num == 3)
{
iSet[2]++;
if(iSet[2] >= 10)
iSet[2] = 0;
iSetData = iSet[0]*100 + iSet[1]*10 + iSet[2];
write_sfm(1, 7, iSetData);
write_com(0x80+9);
}
if(s1_num == 4) // 速度档
{
MotorSpedNum++;
if(MotorSpedNum >= 10)
{
MotorSpedNum = 9;
}
write_one_data(1, 15, MotorSpedNum);
write_com(0x80+15);
}
if(s1_num == 5) // 方向
{
RL++;
if(RL > 1)
RL = 0;
if(RL == 0)
{
FX = 0;
write_string(2, 13, "R");
}
else
{
FX = 1;
write_string(2, 13, "L");
}
write_com(0x80+0x40+13);
}
}
break;
case 3: // 减小
{
// s3_num++;
cMode = 0;
if(s1_num == 1)
{
iSet[0]--;
if(iSet[0] < 0)
iSet[0] = 9;
iSetData = iSet[0]*100 + iSet[1]*10 + iSet[2];
write_sfm(1, 7, iSetData);
write_com(0x80+7);
}
if(s1_num == 2)
{
iSet[1]--;
if(iSet[1] < 0)
iSet[1] = 9;
iSetData = iSet[0]*100 + iSet[1]*10 + iSet[2];
write_sfm(1, 7, iSetData);
write_com(0x80+8);
}
if(s1_num == 3)
{
iSet[2]--;
if(iSet[2] < 0)
iSet[2] = 9;
iSetData = iSet[0]*100 + iSet[1]*10 + iSet[2];
write_sfm(1, 7, iSetData);
write_com(0x80+9);
}
if(s1_num == 4) // 速度档
{
MotorSpedNum--;
if(MotorSpedNum < 0)
{
MotorSpedNum = 0;
}
write_one_data(1, 15, MotorSpedNum);
write_com(0x80+15);
}
if(s1_num == 5) // 方向
{
RL--;
if(RL < 0)
RL = 1;
if(RL == 0)
{
FX = 0;
write_string(2, 13, "R");
}
else
{
FX = 1;
write_string(2, 13, "L");
}
write_com(0x80+0x40+13);
}
}
break;
case 4: //
{
// 运行程序
g_MotorSt = 1;
cMode = 0;
/* if (SYS_NUM >= 100) // 10ms
{
SYS_NUM = 0;
write_com(0x80+0x40+8);
// write_string(1, 2, "set:");
write_sfm(2,7,CUR_MotorSpedQuan);
}*/
}
break;
default:
break;
}
}
void SecondPro()
{
if (END_FLAG) // 到达目的
{
END_FLAG = 0;
if(RL == 0)
{
RL = 1;
FX = 1;
write_string(2, 13, "L");
}
else
{
FX = 0;
write_string(2, 13, "R");
}
g_MotorSt = 1;
MotorEn = 1;
CUR_MotorSpedQuan = 0;
TR0 = 1;
}
}
/********延时函数***********************************************************/
void delayms(xms)
{
unsigned int x,y;
for(x=xms;x>0;x--)
for(y=110;y>0;y--)
;
}
#include<reg52.h>
#include "lcd1602.h"
#include "eeprom.h"
unsigned char T0_NUM;
unsigned char END_FLAG = 0;
sbit SW1=P3^0; //四个独立按键定义
sbit SW2=P3^1;
sbit SW3=P3^2;
sbit SW4=P3^3;
sbit MotorEn = P2^1; // 使能
sbit FX = P2^0; // 方向
sbit CLK = P2^2; // 脉冲
unsigned char g_MotorSt = 0; // 启停
unsigned char g_MotorDir = 0; // 正反
unsigned int CLK_OUT_NUM = 0; // 脉冲计数
signed int MotorSpedNum = 0; // 速度档
unsigned int CUR_MotorSpedQuan = 0; // 当前圈数
unsigned int SET_MotorSpedQuan = 0; // 设定圈数
unsigned char cMode = 0;
unsigned char s1_num;
unsigned int iSetData;
signed char RL = 0; // 方向
signed char iSet[3];
unsigned int SYS_NUM = 0;
unsigned char MotorTab[10] = {63, 42, 27, 18, 12, 8, 5, 3, 2};
unsigned int MotorSpedTab[6] = {400, 800, 1600, 3200, 6400, 12800};
signed char g_MotorNum = 0;
//--------------
void delayms(xms);
void mDelay(unsigned int DelayTime); //延时函数
void EEPROM_Init();
void T0_Init();
void LCD_Init();
void KeyScan(void);
void KeyProcess();
void SecondPro();
//void Display(void);
// 主程序 main()
void main(void)
{
EEPROM_Init(); // 读取数据
T0_Init(); // 定时器0 初始化
LCD_Init(); // 显示初始化
MotorEn = 0; // L297 使能(只有智能,才能正常工作,否则停止)
while(1)
{
if (!g_MotorSt) // 只有在空闲状态按键操作才有效;否则不能打断电机工作
{
KeyScan(); // 按键
KeyProcess();
if (SYS_NUM >= 100) // 10ms
{
SYS_NUM = 0;
write_com(0x80+0x40+8);
write_sfm(2,7,CUR_MotorSpedQuan);
}
}
if (SYS_NUM >= 100) // 10ms
{
SYS_NUM = 0;
write_com(0x80+0x40+8);
write_sfm(2,7,CUR_MotorSpedQuan);
}
}
}
/************存储初始化*****************/
void EEPROM_Init()
{
iSet[0]=byte_read(0x2000);//程序开始时读取EEPROM中数据
iSet[1]=byte_read(0x2200);
iSet[2]=byte_read(0x2400);
if((iSet[0] > 9) || (iSet[0] < 0)) //防止首次上电时读取出错
iSet[0] = 0;
if((iSet[1] > 9) || (iSet[1] < 0))
iSet[1] = 0;
if((iSet[2] > 9) || (iSet[2] < 0))
iSet[2] = 0;
iSetData = iSet[0]*100 + iSet[1]*10 + iSet[2];
MotorSpedNum=byte_read(0x2600);
if((MotorSpedNum > 9) || (MotorSpedNum < 0))
MotorSpedNum = 0;
RL = byte_read(0x2800);
if((RL > 2) || (RL < 0))
RL = 0;
}
/********定时器初始化***********************************************************/
void T0_Init()
{
TMOD = 0x01;
TH0 = (65535-100)/256; // 1ms
TL0 = (65535-100)%256;
EA = 1;
ET0 = 1;
// TR0 = 1;
}
// 液晶显示初始化
void LCD_Init()
{
init_1602(); //lcd1602初始化
write_string(1, 2, "set:");
write_sfm(1,7,iSetData);
write_string(2, 2, "cur:");
write_sfm(2,7,0);
// mDelay(1);
write_string(1, 13, "S:");
write_one_data(1, 15, MotorSpedNum);
if(RL == 0)
{
FX = 0;
write_string(2, 13, "R");
}
else
{
FX = 1;
write_string(2, 13, "L");
}
}
/********定时器中断*****************/
void T0_time() interrupt 1
{
// TR0 = 0;
TH0 = (65535-100)/256;
TL0 = (65535-100)%256;
T0_NUM++;
SYS_NUM++;
if(T0_NUM >= MotorTab[MotorSpedNum]) // 增加按键g_MotorNum++ 减小按键g_MotorNum--
{
T0_NUM = 0;
CLK=CLK^0x01; // 输出脉冲
CLK_OUT_NUM++;
if(CLK_OUT_NUM >= MotorSpedTab[1]) // 一圈
{
CLK_OUT_NUM = 0;
CUR_MotorSpedQuan++;
if(CUR_MotorSpedQuan >= iSetData) // 达到设定圈数
{
TR0 = 0;
cMode = 0;
g_MotorSt = 0;
MotorEn = 1;
write_com(0x80+0x40+8);
write_sfm(2,7,CUR_MotorSpedQuan);
END_FLAG = 1;
// SecondPro();
}
}
}
// TR0 = 1;
}
/********按键扫描函数***********************************************************/
void KeyScan()
{
if(SW1 == 0)
{
delayms(10);
if(SW1 == 0) // 功能键
{
while(!SW1); // 等待松开
cMode = 1; // 功能模式
}
}
if(SW2 == 0)
{
delayms(10);
if(SW2 == 0) // 增加
{
while(!SW2); // 等待松开
cMode = 2;
}
}
if(SW3 == 0)
{
delayms(10);
if(SW3 == 0) // 减小
{
while(!SW3); // 等待松开
cMode = 3;
}
}
if(SW4 == 0)
{
delayms(10);
if(SW4 == 0) // 启停
{
while(!SW4); // 等待松开
cMode = 4;
g_MotorSt = 1;
MotorEn = 1;
CUR_MotorSpedQuan = 0;
TR0 = 1;
}
}
}
/********按键处理函数***********************************************************/
void KeyProcess()
{
switch(cMode)
{
case 0: // 无模式
break;
case 1: // 功能模式
{
s1_num++;
cMode = 0; // 功能模式
if(s1_num ==1) // 第1次被按下
{
write_com(0x80+7); // 角度 百位
write_com(0x0f); // 光标闪烁
}
if(s1_num ==2)
{
write_com(0x80+8);
}
if(s1_num == 3)
{
write_com(0x80+9);
}
if(s1_num == 4)
{
write_com(0x80+15);
}
if(s1_num == 5)
{
write_com(0x80+0x40+13);
}
if(s1_num == 6)
{
s1_num = 0; // 记录按键清零
cMode = 0; // 退出模式
write_com(0x0c); // 取消光标闪烁
// 保存数据
SectorErase(0x2000);//擦除扇区
byte_write(0x2000,iSet[0]);//重新写入数
SectorErase(0x2200);//擦除扇区
byte_write(0x2200,iSet[1]);//重新写入数
SectorErase(0x2400);//擦除扇区
byte_write(0x2400,iSet[2]);//重新写入数
SectorErase(0x2600);//擦除扇区
byte_write(0x2600,MotorSpedNum);//重新写入数
SectorErase(0x2800);//擦除扇区
byte_write(0x2800,RL);//重新写入数
}
}
break;
case 2: // 增加
{
// s2_num++;
cMode = 0;
if(s1_num == 1) // 百
{
iSet[0]++;
if(iSet[0] >= 10)
iSet[0] = 0;
iSetData = iSet[0]*100 + iSet[1]*10 + iSet[2];
write_sfm(1, 7, iSetData);
write_com(0x80+7);
}
if(s1_num == 2)
{
iSet[1]++;
if(iSet[1] >= 10)
iSet[1] = 0;
iSetData = iSet[0]*100 + iSet[1]*10 + iSet[2];
write_sfm(1, 7, iSetData);
write_com(0x80+8);
}
if(s1_num == 3)
{
iSet[2]++;
if(iSet[2] >= 10)
iSet[2] = 0;
iSetData = iSet[0]*100 + iSet[1]*10 + iSet[2];
write_sfm(1, 7, iSetData);
write_com(0x80+9);
}
if(s1_num == 4) // 速度档
{
MotorSpedNum++;
if(MotorSpedNum >= 10)
{
MotorSpedNum = 9;
}
write_one_data(1, 15, MotorSpedNum);
write_com(0x80+15);
}
if(s1_num == 5) // 方向
{
RL++;
if(RL > 1)
RL = 0;
if(RL == 0)
{
FX = 0;
write_string(2, 13, "R");
}
else
{
FX = 1;
write_string(2, 13, "L");
}
write_com(0x80+0x40+13);
}
}
break;
case 3: // 减小
{
// s3_num++;
cMode = 0;
if(s1_num == 1)
{
iSet[0]--;
if(iSet[0] < 0)
iSet[0] = 9;
iSetData = iSet[0]*100 + iSet[1]*10 + iSet[2];
write_sfm(1, 7, iSetData);
write_com(0x80+7);
}
if(s1_num == 2)
{
iSet[1]--;
if(iSet[1] < 0)
iSet[1] = 9;
iSetData = iSet[0]*100 + iSet[1]*10 + iSet[2];
write_sfm(1, 7, iSetData);
write_com(0x80+8);
}
if(s1_num == 3)
{
iSet[2]--;
if(iSet[2] < 0)
iSet[2] = 9;
iSetData = iSet[0]*100 + iSet[1]*10 + iSet[2];
write_sfm(1, 7, iSetData);
write_com(0x80+9);
}
if(s1_num == 4) // 速度档
{
MotorSpedNum--;
if(MotorSpedNum < 0)
{
MotorSpedNum = 0;
}
write_one_data(1, 15, MotorSpedNum);
write_com(0x80+15);
}
if(s1_num == 5) // 方向
{
RL--;
if(RL < 0)
RL = 1;
if(RL == 0)
{
FX = 0;
write_string(2, 13, "R");
}
else
{
FX = 1;
write_string(2, 13, "L");
}
write_com(0x80+0x40+13);
}
}
break;
case 4: //
{
// 运行程序
g_MotorSt = 1;
cMode = 0;
/* if (SYS_NUM >= 100) // 10ms
{
SYS_NUM = 0;
write_com(0x80+0x40+8);
// write_string(1, 2, "set:");
write_sfm(2,7,CUR_MotorSpedQuan);
}*/
}
break;
default:
break;
}
}
void SecondPro()
{
if (END_FLAG) // 到达目的
{
END_FLAG = 0;
if(RL == 0)
{
RL = 1;
FX = 1;
write_string(2, 13, "L");
}
else
{
FX = 0;
write_string(2, 13, "R");
}
g_MotorSt = 1;
MotorEn = 1;
CUR_MotorSpedQuan = 0;
TR0 = 1;
}
}
/********延时函数***********************************************************/
void delayms(xms)
{
unsigned int x,y;
for(x=xms;x>0;x--)
for(y=110;y>0;y--)
;
}
你这代码不是写好了吗?哪里有问题呢?还是哪里不明白。