资源描述
步进电机驱动程序
采用热转印制作 PCB ,电路采用2相推挽全桥驱动,单片机采用 STC54C12C5404
学生的设计要求:具体的模式如下:五种模式选择
一:停止。
二:顺时针转2分钟,停6分钟,循环;
三:逆时针转2分钟,停6分钟,循环;
四:顺指针转2分钟停6分钟,逆时针转2分钟停6分钟,循环;
五:顺指针转5分钟,逆时针转5分钟持续3小时,停9小時,循环。
请将模式四和五放在首选。用数字码显示模式
步进电机39BYG250
品牌: 北斗 型号: 39BYG 技术参数
步距角: 1.8 电流: 0.4 A 电阻: 27 Ω
重量: 0.130 kg 驱动电压: 12 V
相电流: 0.4 A 相数: 2 环境温度: 130 ℃
1代表程式1,2代表程式2。。。。。
1位数码管,1个按钮
8圈/分,
每圈要分4步跳
//2010.8.26
/**************************************************
具体的模式如下:五种模式选择
0:停止。
1:顺时针转2分钟,停6分钟,循环;
2:逆时针转2分钟,停6分钟,循环;
3:顺指针转2分钟停6分钟,逆时针转2分钟停6分钟,循环;
4:顺指针转5分钟,逆时针转5分钟持续3小时,停9小時,循环。
模式四和五放在首选。用数字码显示模式
1代表程式1,2代表程式2。。。。。
1位数码管,1个按钮
8圈/分,68
每圈要分4步跳
;***************************************************************/
#include "STC12C5410AD.H"//头文件
#include "intrins.h"//头文件
#define uchar unsigned char//宏定义
#define uint unsigned int//宏定义
#define DPDR P2//并行数据接口定义
sbit key=P3^2;//按键
sbit AB=P3^5;
sbit CP=P3^3;
//sbit HHH=P1^6;
sbit CLL=P3^4;
bit Forward_Inversion_bit;//正转,//反转,标志
bit bit_bit;
//1:正转
//0:反转
bit Start_Stop_bit;//启动,停止,标志
//1:启动
//0:停止
//uchar count_2;
uint counter_3;
uchar counter_4;
uchar Forward_Tolerance_Counter;//正转容错记数器,保持步进电机不跳步
uchar Inversion_Tolerance_Counter;//反转容错记数器,保持步进电机不跳步
uchar Mode_Selection;//模式选择////数码管显示值
//0:停止。
//1:顺时针转2分钟,停6分钟,循环;
//2:逆时针转2分钟,停6分钟,循环;
//3:顺指针转2分钟停6分钟,逆时针转2分钟停6分钟,循环;
//4:顺指针转5分钟,逆时针转5分钟持续3小时,停9小時,循环。
uchar Time_Counter_5;//时间计数器:200*5=1秒
uchar Time_Counter_60;//时间计数器:1秒*60=1分钟
uchar Time_Counter_x;//时间计数器:1分钟*x=x分钟
uchar Time_3_by_3;//时间计数器:3小时*3=9小时
uchar Time_30_by_30;//时间计数器:3小时*3=9小时
#define ISP_IAP_BYTE_READ 0x01//读
#define ISP_IAP_BYTE_PROGRAM 0x02//编程
#define ISP_IAP_SECTOR_ERASE 0x03//扇区擦除
#define ENABLE_ISP 0x85//等待时间,和对ISP_CONTR设置初值
#define EEPROM_ADDRESS_1 0x2800//第一扇区地址 2800-29FF
#define EEPROM_ADDRESS_2 0x2A00//第二扇区地址 2A00-2BFF
#define EEPROM_ADDRESS_3 0x2A01//第二扇区地址 2A00-2BFF
//#define EEPROM_ADDRESS_3 0x2C00//第三扇区地址 2C00-2DFF
//#define EEPROM_ADDRESS_4 0x2E00//第四扇区地址 2E00-2FFF
uchar DATA_H_ADDRESS;//单片机内部 EEPROM 地址高字节
uchar DATA_L_ADDRESS;//单片机内部 EEPROM 地址低字节
uint sfr_16;//双字节缓存对单片机内部 EEPROM 地址字节的处理
uchar code DispTab_Digital[]={0xa0,0xf3,0x34,0x32,0x63,0x2a,0x28,0xb3,0x20,0x22,0xff};//数码管显示
//0;1;2;3;4;5; ;
uchar code DispTab_Inversion[]={0x60,0x09,0x12,0x84};//反转
//d=+,c=-;
//b=+,a=-;
//c=+,d=-;
//a=+,b=-;
/*
uchar code DispTab_Forward[]={0xa3,0x3a,0xac,0xca};//正转
//a=-,b=+;1010 0011=0xa3
//c=-,d=+;0011 1010=0x3a
//a=+,b=-;1010 1100=0xac
//c=+,d=-;1000 1010=0xca*/
uchar code DispTab_Forward[]={0x84,0x12,0x09,0x60};//正转
//a=-,b=+;1010 0011=0xa3
//c=-,d=+;0011 1010=0x3a
//a=+,b=-;1010 1100=0xac
//c=+,d=-;1000 1010=0xca
void delay(uint z)//延时为 1ms
{
uchar x,x1;
for(;z>0;z--)
{
for(x=0;x<114;x++)
{
for(x1=0;x1<1;x1++);
}
}
}
void init()
{
P1M1=0xff;// 设为强上拉0101 0101
P2M1=0xff;// 设为强上拉0101 0101
DPDR=0xaa;
TMOD=0x11;
TH1=0x16;//10ms
TL1=0xed;//10ms
TH0=0x16;//200ms
TL0=0xed;//200ms
EA=1;
ET1=1;
TR1=0;
CLL=1;
AB=1;
CP=1;
ET0=1;
TR0=1;
PT0=1;
WDT_CONTR=0x3d;//看门狗//0x3c=1.2S,,,0x3d=2.2S,,,0x3e=4.5S
counter_3=0;
counter_4=0;
bit_bit=0;
Forward_Tolerance_Counter=0;
Inversion_Tolerance_Counter=0;
Time_Counter_5=0;//时间计数器:200*5=1秒
Time_Counter_60=0;//时间计数器:1秒*60=1分钟
Time_Counter_x=0;//时间计数器:1分钟*x=x分钟
Time_3_by_3=0;//时间计数器:3小时*3=9小时
}
void Timer0(void) interrupt 1
{
//static uchar WDT_CONTR_Counter;
TH0=0x16;//200ms
TL0=0xed;//200ms
//WDT_CONTR_Counter++;
//if(WDT_CONTR_Counter==9)//4S 喂一次狗,
//{
//WDT_CONTR_Counter=0;
//WDT_CONTR=0x3d;//看门狗
//}
////////////////////////////////////////
//0:停止。
if(Mode_Selection==0)
{
Start_Stop_bit=0;//停止。
}
//1:顺时针转2分钟,停6分钟,循环.
else if(Mode_Selection==1)//Forward_Inversion_bit;//正转,//反转
{
if(Start_Stop_bit==1)
{
Time_Counter_5++;//时间计数器:200*5=1秒
if(Time_Counter_5==5)
{
Time_Counter_5=0;
Time_Counter_60++;//时间计数器:1秒*60=1分钟
if(Time_Counter_60==59)
{
Time_Counter_60=0;
Time_Counter_x++;//1分钟*x=x分钟
if(Time_Counter_x==2)
{
Time_Counter_x=0;
Start_Stop_bit=0;
Forward_Inversion_bit=1;
}
}
}
}
else
{
Time_Counter_5++;//时间计数器:200*5=1秒
if(Time_Counter_5==5)
{
Time_Counter_5=0;
Time_Counter_60++;//时间计数器:1秒*60=1分钟
if(Time_Counter_60==59)
{
Time_Counter_60=0;
Time_Counter_x++;//1分钟*x=x分钟
if(Time_Counter_x==6)
{
Time_Counter_x=0;
Start_Stop_bit=1;
Forward_Inversion_bit=1;
}
}
}
}
}
//2:逆时针转2分钟,停6分钟,循环;
else if(Mode_Selection==2)//Forward_Inversion_bit;//正转,//反转
{
if(Start_Stop_bit==1)
{
Time_Counter_5++;//时间计数器:200*5=1秒
if(Time_Counter_5==5)
{
Time_Counter_5=0;
Time_Counter_60++;//时间计数器:1秒*60=1分钟
if(Time_Counter_60==59) //60
{
Time_Counter_60=0;
Time_Counter_x++;//1分钟*x=x分钟
if(Time_Counter_x==2) //2
{
Time_Counter_x=0;
Start_Stop_bit=0;
Forward_Inversion_bit=0;
}
}
}
}
else
{
Time_Counter_5++;//时间计数器:200*5=1秒
if(Time_Counter_5==5)
{
Time_Counter_5=0;
Time_Counter_60++;//时间计数器:1秒*60=1分钟
if(Time_Counter_60==59)//60
{
Time_Counter_60=0;
Time_Counter_x++;//1分钟*x=x分钟
if(Time_Counter_x==6)//6
{
Time_Counter_x=0;
Start_Stop_bit=1;
Forward_Inversion_bit=0;
}
}
}
}
}
//3:顺指针转2分钟停6分钟,逆时针转2分钟停6分钟,循环;
else if(Mode_Selection==3)//Forward_Inversion_bit;//正转,//反转
{
if(Start_Stop_bit==1)
{
Time_Counter_5++;//时间计数器:200*5=1秒
if(Time_Counter_5==5)
{
Time_Counter_5=0;
Time_Counter_60++;//时间计数器:1秒*60=1分钟
if(Time_Counter_60==59)
{
Time_Counter_60=0;
Time_Counter_x++;//1分钟*x=x分钟
if(Time_Counter_x==2)
{
Time_Counter_x=0;
Start_Stop_bit=0;
Forward_Inversion_bit=~Forward_Inversion_bit;
}
}
}
}
else
{
Time_Counter_5++;//时间计数器:200*5=1秒
if(Time_Counter_5==5)
{
Time_Counter_5=0;
Time_Counter_60++;//时间计数器:1秒*60=1分钟
if(Time_Counter_60==59)
{
Time_Counter_60=0;
Time_Counter_x++;//1分钟*x=x分钟
if(Time_Counter_x==6)
{
Time_Counter_x=0;
Start_Stop_bit=1;
}
}
}
}
}
//4:顺指针转5分钟,逆时针转5分钟持续3小时,停9小時,循环。
else if(Mode_Selection==4)
{
if(Start_Stop_bit==1)
{
Time_Counter_5++;//时间计数器:200*5=1秒
if(Time_Counter_5==5)
{
Start_Stop_bit=1;
Time_Counter_5=0;
Time_Counter_60++;//时间计数器:1秒*60=1分钟
if(Time_Counter_60==59) //60
{
Time_Counter_60=0;
Time_Counter_x++;//1分钟*x=x分钟
if(Time_Counter_x==5) //5分钟
{
Time_Counter_x=0;
Forward_Inversion_bit=!Forward_Inversion_bit;
Time_3_by_3++;
if(Time_3_by_3==36) //36//3钟
{
Start_Stop_bit=0;
Time_3_by_3=0;
TH1=0x16;//200ms
TL1=0xed;//200ms
TR0=0;
TR1=1;
}
}
}
}
}
}
}
void Timer1(void) interrupt 3
{
//static uchar count;
TH1=0x16;//200ms
TL1=0xed;//200ms
if(Mode_Selection==4)
{
if(Start_Stop_bit==0)
{
Time_Counter_5++;//时间计数器:200*5=1秒
if(Time_Counter_5==5)
{
Start_Stop_bit=0;
Time_Counter_5=0;
Time_Counter_60++;//时间计数器:1秒*60=1分钟
if(Time_Counter_60==59) //60
{
Time_Counter_60=0;
Time_Counter_x++;//1分钟*x=x分钟
if(Time_Counter_x==59) //60分钟
{
Time_Counter_x=0;
Time_3_by_3++;
if(Time_3_by_3==9) //9钟
{
Start_Stop_bit=1;
Time_3_by_3=0;
Forward_Inversion_bit=1;
TH0=0x16;//200ms
TL0=0xed;//200ms
TR0=1;
TR1=0;
}
}
}
}
}
}
}
void IAP_Disable()//关闭 IAP
{
ISP_CONTR=0;
ISP_CMD=0;
ISP_TRIG=0;
}
void Byte_read()//读
{
uint sfr_sfr;
sfr_sfr=sfr_16;
DATA_L_ADDRESS=sfr_sfr;//低地址字节
sfr_sfr>>=8;
DATA_H_ADDRESS=sfr_sfr;//高地址字节
ISP_CONTR=ENABLE_ISP;
ISP_CMD=ISP_IAP_BYTE_READ;
ISP_ADDRH=DATA_H_ADDRESS;
ISP_ADDRL=DATA_L_ADDRESS;
//EA=0;
ISP_TRIG=0x46;
ISP_TRIG=0xb9;
_nop_();
//EA=1;
//ISP_DATA//读出的数据在 ISP_DATA
IAP_Disable();
}
void Byte_program(uchar Byte_data)////编程//Byte_data为要保存的数据
{
uint sfr_sfr;
sfr_sfr=sfr_16;
DATA_L_ADDRESS=sfr_sfr;//低地址字节
sfr_sfr>>=8;
DATA_H_ADDRESS=sfr_sfr;//高地址字节
ISP_CONTR=ENABLE_ISP;
ISP_CMD=ISP_IAP_BYTE_PROGRAM;
ISP_ADDRH=DATA_H_ADDRESS;
ISP_ADDRL=DATA_L_ADDRESS;
ISP_DATA=Byte_data;
//EA=0;
ISP_TRIG=0x46;
ISP_TRIG=0xb9;
_nop_();
//EA=1;
// IAP_Disable();
}
void Sector_Erase()//扇区擦除
{
uint sfr_sfr;
sfr_sfr=sfr_16;
DATA_L_ADDRESS=sfr_sfr;//低地址字节
sfr_sfr>>=8;
DATA_H_ADDRESS=sfr_sfr;//高地址字节
ISP_CONTR=ENABLE_ISP;
ISP_CMD=ISP_IAP_SECTOR_ERASE;
ISP_ADDRH=DATA_H_ADDRESS;
ISP_ADDRL=DATA_L_ADDRESS;
//EA=0;
ISP_TRIG=0x46;
ISP_TRIG=0xb9;
_nop_();
//EA=1;
//IAP_Disable();//关闭 IAP
}
void Digital_Tube()//数码管显示
{
//uchar ii,temp,a;
//P1=DispTab_Digital[2];
P1=DispTab_Digital[Mode_Selection];
//HHH=0;
}
void Key_Detection()//按键检测
{
if(Mode_Selection>4)
{
Mode_Selection=0;
}
if(key==0)
{
delay(20);
if(key==0)
{
Digital_Tube();//数码管显示
while(key==0);
delay(20);
if(Mode_Selection==0)
{
Mode_Selection=1;
Start_Stop_bit=1;
Forward_Inversion_bit=1;
}
else if(Mode_Selection==1)
{
Mode_Selection=2;
Start_Stop_bit=1;
Forward_Inversion_bit=0;
}
else if(Mode_Selection==2)
{
Mode_Selection=3;
Start_Stop_bit=1;
Forward_Inversion_bit=1;
}
else if(Mode_Selection==3)
{
Mode_Selection=4;
Start_Stop_bit=1;
Forward_Inversion_bit=1;
}
else if(Mode_Selection==4)
{
Mode_Selection=0;
Start_Stop_bit=0;
Forward_Inversion_bit=1;
}
else if(Mode_Selection==0)
{
Mode_Selection=1;
//Start_Stop_bit=0;
//Forward_Inversion_bit=1;
}
Time_Counter_5=0;//时间计数器:200*5=1秒
Time_Counter_60=0;//时间计数器:1秒*60=1分钟
Time_Counter_x=0;//时间计数器:1分钟*x=x分钟
Time_3_by_3=0;//时间计数器:3小时*3=9小时
counter_3=0;
counter_4=0;
bit_bit=0;
sfr_16=EEPROM_ADDRESS_1;
Sector_Erase();//扇区擦除
Byte_program(Mode_Selection);////编程
IAP_Disable();
Digital_Tube();//数码管显示
}
}
}
void Database_Refresh()//刷新数据库
{
sfr_16=EEPROM_ADDRESS_1;
Byte_read();//读
Mode_Selection=ISP_DATA;
if(Mode_Selection>4)
{
Mode_Selection=0;
}
sfr_16=EEPROM_ADDRESS_2;
Byte_read();//读
Forward_Tolerance_Counter=ISP_DATA;
sfr_16=EEPROM_ADDRESS_3;
Byte_read();//读
Inversion_Tolerance_Counter=ISP_DATA;
if(Mode_Selection==0)
{
Start_Stop_bit=0;
}
if(Mode_Selection==2)
{
Start_Stop_bit=1;
Forward_Inversion_bit=0;
}
if((Mode_Selection==1)||(Mode_Selection==1))
{
Start_Stop_bit=1;
Forward_Inversion_bit=1;
}
//if(Mode_Selection==3)
//{
// Start_Stop_bit=1;
// Forward_Inversion_bit=1;
//}
//else
//{
// Start_Stop_bit=1;
// Forward_Inversion_bit=1;
//}
}
void main()
{
//uchar i;
init();//单片机硬件资源初始化
Database_Refresh();//刷新数据库
Digital_Tube();//数码管显示
TR1=0;
while(1)
{
Key_Detection();//按键检测
WDT_CONTR=0x3d;//看门狗
delay(27);//27
if(Start_Stop_bit==1)//启动,停止,标志
{
if(Forward_Inversion_bit==1)//正转,//反转,标志
{
Forward_Tolerance_Counter++;
if(Forward_Tolerance_Counter>3)
{
Forward_Tolerance_Counter=0;
}
DPDR=DispTab_Forward[Forward_Tolerance_Counter];
if(Forward_Tolerance_Counter==0)
{
Inversion_Tolerance_Counter=1;
}
if(Forward_Tolerance_Counter==1)
{
Inversion_Tolerance_Counter=0;
}
if(Forward_Tolerance_Counter==2)
{
Inversion_Tolerance_Counter=3;
}
if(Forward_Tolerance_Counter==3)
{
Inversion_Tolerance_Counter=2;
}
}
else if(Forward_Inversion_bit==0)//反转
{
Inversion_Tolerance_Counter++;
if(Inversion_Tolerance_Counter>3)
{
Inversion_Tolerance_Counter=0;
}
DPDR=DispTab_Inversion[Inversion_Tolerance_Counter];
if(Inversion_Tolerance_Counter==0)
{
Forward_Tolerance_Counter=1;
}
if(Inversion_Tolerance_Counter==1)
{
Forward_Tolerance_Counter=0;
}
if(Inversion_Tolerance_Counter==2)
{
Forward_Tolerance_Counter=3;
}
if(Inversion_Tolerance_Counter==3)
{
Forward_Tolerance_Counter=2;
}
}
sfr_16=EEPROM_ADDRESS_2;
Sector_Erase();//扇区擦除
Byte_program(Forward_Tolerance_Counter);////编程
sfr_16=EEPROM_ADDRESS_3;
Byte_program(Inversion_Tolerance_Counter);////编程
IAP_Disable();
if(bit_bit==0)
{
counter_3++;
if(counter_3==50)
{
counter_3=0;
Start_Stop_bit=0;
bit_bit=1;
}
}
}
if(bit_bit==1)
{
counter_4++;
if(counter_4==20)
{
counter_4=0;
Start_Stop_bit=1;
bit_bit=0;
}
}
if(Start_Stop_bit==0)//启动,停止,标志
{
DPDR=0xaa;
}
}
}
展开阅读全文