打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
51单片机控制步进电机正反转的程序
这是一款51单片机控制步进电机正反转的程序,同时还能实现调速。#include ”reg51.h“
#include “intrins.h”
#define uchar unsigned char
#define uint  unsigned int
#define delayNOP(); {_nop_();_nop_();_nop_();_nop_();};
unsigned char code FFW[8]={0xfe,0xfc,0xfd,0xf9,0xfb,0xf3,0xf7,0xf6}; //??
unsigned char code REV[8]={0xf6,0xf7,0xf3,0xfb,0xf9,0xfd,0xfc,0xfe}; //??
//unsigned char code FFW[8]={0x01,0x03,0x02,0x06,0x04,0x0c,0x08,0x09}; //??
//unsigned char code REV[8]={0x09,0x08,0x0c,0x04,0x06,0x02,0x03,0x01}; //??
sbit  K1   = P3^2;       //?????
sbit  K2   = P3^3;       //????
sbit  K3   = P3^4;       //????
sbit  K4   = P3^5;       //????
sbit  LCD_RS = P2^0;
sbit  LCD_RW = P2^1;
sbit  LCD_EN = P2^2;
bit  on_off=0;            //???????
bit  direction=1;         //????
bit  rate_dr=1;           //????
bit  snum_dr=1;           //????
uchar code  cdis1[ ] = {"NO.0738230126 "};
uchar code  cdis2[ ] = {"     2012/5/24"};
uchar code  cdis3[ ] = {"    STOP        "};
uchar code  cdis4[ ] = {"NUM:    RATE:   "};
uchar code  cdis5[ ] = {"  RUNNING       "};
uchar   m,v=0,q=0;
uchar   number=0,number1=0;
uchar   snum=20,snum1=20;       //?????
uchar   rate=3;               //?????
uchar   data_temp,data_temP0,data_temp2;
void delay(uint t)
{
uchar k;
while(t--)
{
for(k=0; k<124; k++)
{ }
}
}
void delayB(uchar x)    //x*0.14MS
{
uchar i;
while(x--)
{
for (i=0; i<13; i++)
{ }
}
}
bit lcd_busy()
{
bit result;
LCD_RS = 0;
LCD_RW = 1;
LCD_EN = 1;
delayNOP();
result = (bit)(P0&0x80);
LCD_EN = 0;
return(result);
}
void lcd_wcmd(uchar cmd)
{
while(lcd_busy());
LCD_RS = 0;
LCD_RW = 0;
LCD_EN = 0;
_nop_();
_nop_();
P0 = cmd;
delayNOP();
LCD_EN = 1;
delayNOP();
LCD_EN = 0;
}
void lcd_wdat(uchar dat)
{
while(lcd_busy());
LCD_RS = 1;
LCD_RW = 0;
LCD_EN = 0;
P0 = dat;
delayNOP();
LCD_EN = 1;
delayNOP();
LCD_EN = 0;
}
void lcd_init()
{
delay(30);
lcd_wcmd(0x38);      //16*2??,5*7??,8???
delay(5);
lcd_wcmd(0x38);
delay(5);
lcd_wcmd(0x38);
delay(5);
lcd_wcmd(0x0c);      //???,???
delay(5);
lcd_wcmd(0x06);      //????
delay(5);
lcd_wcmd(0x01);      //??LCD?????
delay(5);
}
void lcd_pos(uchar pos)
{
lcd_wcmd(pos | 0x80);  //????=80+????
}
void  LCD_init_DIS()
{
delay(10);                 //??
lcd_init();                //???LCD
lcd_pos(0);                //????????????1???
m = 0;
while(cdis1[m] != '\0')
{                         //????
lcd_wdat(cdis1[m]);
m++;
}
lcd_pos(0x40);             //???????????1???
m = 0;
while(cdis2[m] != '\0')
{
lcd_wdat(cdis2[m]);      //????
m++;
}
delay(3000);               //??
lcd_pos(0);                //????????????1???
m = 0;
while(cdis3[m] != '\0')
{                        //????
lcd_wdat(cdis3[m]);
m++;
}
lcd_pos(0x40);             //???????????1???
m = 0;
while(cdis4[m] != '\0')
{
lcd_wdat(cdis4[m]);    //????
m++;
}
for(m=0;m<2;m++)
{
lcd_pos(0x0c+m);    //??????
lcd_wdat(0x3e);
}
}
void  data_conv()
{
data_temP0=data_temp/10;       //??
if(data_temP0==0)
{data_temP0=0x20;}             //???0???
else
{data_temP0=data_temP0+0x30;}
data_temp2=data_temp;       //??
data_temp2=data_temp2+0x30;
}
void  data_dis()
{
data_temp = snum;        //????
data_conv();
lcd_pos(0x44);
lcd_wdat(data_temP0);
lcd_pos(0x45);
lcd_wdat(data_temp2);
data_temp = rate;         //????
data_conv();
lcd_pos(0x4d);
lcd_wdat(data_temP0);
lcd_pos(0x4e);
lcd_wdat(data_temp2);
}
void  motor_DR()
{
if(direction==1)           //??????
{ for(m=0;m<2;m++)
{
lcd_pos(0x0c+m);      //??????
lcd_wdat(0x3e);
}
}
else
{ for(m=0;m<2;m++)       //??????
{
lcd_pos(0x0c+m);     //??????
lcd_wdat(0x3c);
}
}
}
void  motor_RUN()
{
if(on_off==1)
{ TR0=1;
lcd_pos(0);     //????????????1???
m = 0;
while(cdis5[m] != '\0')
{ lcd_wdat(cdis5[m]);      //RUNNING
m++;   }
motor_DR();              //
}
else
{ TR0=0; P0 =0x0f;
lcd_pos(0);     //????????????1???
m = 0;
while(cdis3[m] != '\0')
{ lcd_wdat(cdis3[m]);      //STOP
m++;   }
motor_DR();              //
snum=snum1;             //
number1=0;              //??????
}
}
main()
{
LCD_init_DIS();
TMOD = 0x01;       //T0????1
TL0  = 0x33;
TH0  = 0xf5;
EA   = 1;
ET0  = 1;
P1=0;
while(1)
{
if(K1==0)
{
//beep();
while(K1==0);       //?????
on_off=~on_off;
motor_RUN();
}   //K1 end
if(K2==0)
{
if(snum_dr==1)
{ snum++;
snum1=snum;
if(snum==0x14)
{ snum_dr=~snum_dr;}
}
else
{snum--;
snum1=snum;
if(snum==0x01)
{ snum_dr=~snum_dr; }
}
} //K2  end
if(K3==0)
{
direction=~direction;
motor_DR();
}//K3 end
if(K4==0)
{
if(rate_dr==1)
{ rate++;
if(rate==0x10)
{ rate_dr=~rate_dr;}
}
else
{
rate--;
if(rate==0x01)
{ rate_dr=~rate_dr; }
}
} //K4 end
if(number1==snum1)   //?????????
{ number1=0;
on_off=0;
TR0=0;
snum=snum1;
P1=0x0f;
motor_RUN();
}
data_dis();
}  // while(1) end
}  //main end
void  motor_onoff()  interrupt  1
{
TL0  = 0x33;
TH0  = 0xf5;
q++;
if(q < rate)
{ return; }
else
{  q=0;
number++;                  //????
if(number==64)              //64????????
{ snum--;
number=0;
number1++; }          //??????
if(direction==1)            //????
{ if(v<8)
{P1 = FFW[v];v++;}       //???,??
if(v==8)
{ v=0; }
}
else
{ if(v<8)
{P1 = REV[v];v++;}       //???,??
if(v==8)
{ v=0; }
}
}
}
分享: 
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
DS18B20-64位序列码读取程序
51单片机之LCD1602液晶显示与4×4矩阵键盘
51单片机的LCD12864显示
如何用12864液晶显示图片和绘制任意函数图象(打点)
自行车测速、测距仪原来是这么玩的
第八课 温度检测DS18B20《中学生C51单片机易学实战入门教程》
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服