微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 哪位大侠有空帮忙下 关于步进电机

哪位大侠有空帮忙下 关于步进电机

时间:10-02 整理:3721RD 点击:
#include "AT89X51.h"
int delay();
void inti_lcd();
void show_lcd(int);
void cmd_wr();
void ShowState();
void clock(unsigned int Delay) ;
void DoSpeed();       //计算速度
//正转值
#define RIGHT_RUN 1
//反转值
#define LEFT_RUN 0
sbit RS=0xA0;
sbit RW=0xA1;
sbit E=0xA2;
char SpeedChar[]="SPEED(n/min):";
char StateChar[]="RUN STATE:";
char STATE_CW[]="CW";
char STATE_CCW[]="CCW";
char SPEED[3]="050";
unsigned int RunSpeed=50;                //速度
unsigned char RunState=RIGHT_RUN;  //运行状态
main()
{
        /*定时器设置*/
        TMOD=0x66;            //定时器0,1都为计数方式;方式2;
        EA=1;                        //开中断
        TH0=0xff;                //定时器0初值FFH;
        TL0=0xff;
        ET0=1;
        TR0=1;       
        TH1=0xff;                //定时器1初值FFH;
        TL1=0xff;
        ET1=1;
        TR1=1;
        IT0=1;                        //脉冲方式
        EX0=1;                        //开外部中断0:加速
        IT1=1;                        //脉冲方式
        EX1=1;                        //开外部中断1:减速
     inti_lcd();
    DoSpeed();      
    ShowState();
    while(1)
    {
      clock(RunSpeed);
      P0_1=P0_1^0x01;  }
    }
//定时器0中断程序:正转
void t_0(void) interrupt 1
{RunState=RIGHT_RUN;       
    P0_0=1;
    P1=0x01;
    cmd_wr();
    ShowState();}
//定时器1中断:反转
void t_1(void) interrupt 3
{        RunState=LEFT_RUN;
    P0_0=0;
    P1=0x01;
    cmd_wr();
    ShowState();
  } //中断0:加速程序
void SpeedUp() interrupt 0
{     if(RunSpeed>=12)
          RunSpeed=RunSpeed-2;
       DoSpeed();
       P1=0x01;
       cmd_wr();
       ShowState();
         }//中断1:减速程序
void SpeedDowm() interrupt 2
{     if(RunSpeed<=100)
        RunSpeed=RunSpeed+2;
    DoSpeed();
    P1=0x01;
    cmd_wr();
    ShowState();
        }
int delay()         //判断LCD是否忙
{   
    int a;
start:
      RS=0;
    RW=1;
    E=0;
    for(a=0;a<2;a++);
    E=1;
    P1=0xff;
    if(P1_7==0)
       return 0;
    else        
       goto start;}
void inti_lcd()  //设置LCD方式
{
  P1=0x38;//设置16x2显示
   cmd_wr();
   delay();
  P1=0x01;     //清除
   cmd_wr();
   delay();
   P1=0x0f;
   cmd_wr();
   delay();
  P1=0x06;//光标移动设置
   cmd_wr();
   delay();
   P1=0x0c;//显示开及光标设置
   cmd_wr();
   delay();}
void cmd_wr()           //写控制字
{
   RS=0;
   RW=0;
   E=0;
   E=1;}
void show_lcd(int i)   //LCD显示子程序
{  
   P1=i;
   RS=1;
   RW=0;
   E=0;
   E=1;}
void ShowState()    //显示状态与速度
{   int i=0;
    while(SpeedChar[i]!='\0')//////char SpeedChar[]="SPEED(n/min):";
    {
       delay();
       show_lcd(SpeedChar[i]);
       i++;  }  
    delay();
    P1=0x80 | 0x0d;///数据首地址为80H,所以数据地址为80H+地址码(0-27H,40-67H)
   cmd_wr();
   i=0;
    while(SPEED[i]!='\0')
    {
       delay();
       show_lcd(SPEED[i]);///SPEED[3]="050";
       i++; }
  delay();
    P1=0xC0;
    cmd_wr();
    i=0;
    while(StateChar[i]!='\0')
    {
       delay();
       show_lcd(StateChar[i]);//char StateChar[]="RUN STATE:";
       i++;  }
  delay();
    P1=0xC0 | 0x0A;/////0x0c显示开及光标设置
    cmd_wr();
    i=0;
    if(RunState==RIGHT_RUN)
        while(STATE_CW[i]!='\0')
        {
          delay();
          show_lcd(STATE_CW[i]);///char STATE_CW[]="CW";
   i++; }
    else
       while(STATE_CCW[i]!='\0')
        {
          delay();
          show_lcd(STATE_CCW[i]);///char STATE_CCW[]="CCW";
          i++;  }}
void clock(unsigned int Delay)   //1ms延时程序
{  unsigned int i;
   for(;Delay>0;Delay--)
    for(i=0;i<124;i++);
     }
void DoSpeed()
{
    SPEED[0]=(1000*6/RunSpeed/100)+48;
    SPEED[1]=1000*6/RunSpeed%100/10+48;
    SPEED[2]=1000*6/RunSpeed%10+48;}
这个程序能不能改成  加速键按下就一直加速 上限1000  减速也是 下限60 加的时候最好是1为单位 谢谢大哥了

做个标记  哈哈

额也是   新手过来露个脸的  {
www.dsqdsl.com ly1 www.xindongtai88.com ly1

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top