⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 motor-key.c

📁 自动报警、lcd1602、键控、pc控制步进电机c51源码89s52最终完善版
💻 C
📖 第 1 页 / 共 2 页
字号:
     
#include <reg51.h>       //51芯片管脚定义头文件
#include <intrins.h>	 //内部包含延时函数 _nop_();
#include <stdio.h>

#define uchar unsigned char
#define uint  unsigned int
#define delayNOP(); {_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();};
#define dd 5	  // 设置圈数权值
#define rr 15 	  // 设置速率最大值


sbit  P1_0 = P1^0;     //脉冲输出
sbit  K1   = P1^7;       //实时停止运行控制
sbit  K2   = P2^3;       //减速
sbit  K3   = P2^4;       //加速
sbit  K4   = P2^5;       //运行
sbit  K5   = P2^6;       //停止
sbit  K6   = P2^7;       //PC控制
sbit  BEEP = P3^7;       //蜂鸣器
sbit  LCD_RS = P2^0;             
sbit  LCD_RW = P2^1;
sbit  LCD_EN = P2^2;

bit  off_on=0;			   //实时控制  标志
bit  on_off=0;            //运行与停止标志
bit  direction=1;         //方向标志
bit  rate_dr=1;           //速率标志

uchar code  cdis1[ ] = {" STEPPING MOTOR "};
uchar code  cdis2[ ] = {"CONTROL  PROCESS"};
uchar code  cdis3[ ] = {"    STOP        "};
uchar code  cdis4[ ] = {"NUM:    RATE:   "};
uchar code  cdis5[ ] = {"  RUNNING       "};

uchar   m,o=1;	  //   申明m-指定LCD code cdis数组 ,o-是否屏蔽pc控制

uchar r=0,k=0,j=1;	 //申明	r-T1低位定时值 ,k-T1高位定时值 ,j- 重复键	 

uchar rate = rr/2;	         //预设定速率
uint snum = (16-rr) * dd;	//预设定圈数
               
       
uchar   data_temp,data_temp1,data_temp2;   

/********************************************************/
/*                                                  
/* 延时t毫秒 
/* 11.0592MHz时钟,延时约1ms                                     
/*                                                      
/********************************************************/
void delay(uint t)
{                           
   uchar k;
   while(t--)
   {
     for(k=0; k<125; k++)
     { }
   }
}

/********************************************************/
//void delayB(uchar x)    //x*0.14MS
// {
//   uchar i;
//   while(x--)
//   {
//     for (i=0; i<60; i++)
//     { }
//   }
// }

/********************************************************/
//void beep()
// {
//   uchar j;
//   for (j=0;j<40;j++)
//    { 
//     delayB(5);
//     BEEP=!BEEP;                 //BEEP取反
//   } 
//     BEEP=1;                    //关闭蜂鸣器
// }

/********************************************************/
/*                                                                
/*检查LCD忙状态                                                   
/*lcd_busy为1时,忙,等待。为0时,闲,可写指令与数据。     
/*                                                               
/********************************************************/ 

bit lcd_busy()
 {                          
    bit result;
    LCD_RS = 0;
    LCD_RW = 1;
    LCD_EN = 1;
    delayNOP();
    result = (bit)(P0&0x80);
    LCD_EN = 0;
    return(result); 
 }

/********************************************************/
/*                                                                 
/*写指令数据到LCD                                                 
/*RS=L,RW=L,E=高脉冲,D0-D7=指令码。                             
/*                                                               
/********************************************************/

void lcd_wcmd(uchar cmd)

{                          
   while(lcd_busy());
    LCD_RS = 0;
    LCD_RW = 0;
    LCD_EN = 0;
    _nop_();
    _nop_(); 
    _nop_();
    _nop_(); 
    _nop_();
    _nop_(); 
    P0 = cmd;
    delayNOP();
    LCD_EN = 1;
    delayNOP();
    LCD_EN = 0;  
}

/********************************************************/
/*                                                                
/*写显示数据到LCD                                                  
/*RS=H,RW=L,E=高脉冲,D0-D7=数据。                              
/*                                                               
/********************************************************/

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; 
}

/********************************************************/
/*                                                                
/*  LCD初始化设定                                                
/*                                                                
/********************************************************/

void lcd_init()
{ 
    delay(10);                   
    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+地址变量
}

/********************************************************/
/*                                                       
/* LCD1602初始显示子程序                                             
/*                                                      
/********************************************************/
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_temp1=data_temp/10;       //高位
	 if(data_temp1==0)
	 {data_temp1=0x20;}             //高位为0不显示
     else 
	 {data_temp1=data_temp1+0x30;}

 	 data_temp2=data_temp%10;       //低位
     data_temp2=data_temp2+0x30;
 }

/********************************************************/
/*
/*数据显示子程序
/*
/********************************************************/
void  data_dis()
{
	   data_temp = snum;        //显示圈数
	   data_conv();
       lcd_pos(0x44); 
       lcd_wdat(data_temp1);
       lcd_pos(0x45); 
       lcd_wdat(data_temp2);
	   
	   data_temp = rate;         //显示速率
	   data_conv();
       lcd_pos(0x4d); 
       lcd_wdat(data_temp1);
       lcd_pos(0x4e); 
       lcd_wdat(data_temp2);
}
/********************************************************
/*
/* 显示运行方向符号
/*
/********************************************************/
void  motor_DR()
  {
       if(direction==1)           //正转方向标志
        { for(m=0;m<2;m++)
          { 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -