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

📄 dianji001.c

📁 用L298作为驱动器
💻 C
字号:
/**************************************************************
**项目名称:两相混合式步进电机驱动程序	   
**功能描述:
**说    明:
/**************************************************************
头文件预处理:
**************************************************************/
#include <reg52.h>
#include <math.h>
#include <stdio.h>
/**************************************************************
数据类型宏定义:
**************************************************************/
#define uchar unsigned char
#define uint  unsigned int
/*============================================================
I/O Ports' Definition:
============================================================*/
sbit		IN1=P2^0;            
sbit		IN2=P2^1;   
sbit		IN3=P2^2;            
sbit		IN4=P2^3;         
sbit   		Led_Clk=P1^5;	//clock port of 74HC164
sbit   		Led_Dat=P1^6;	//data port of 74HC164
sbit    	Led_Cs=P1^7; 	//Led display controlling(using BJT's base)
/**************************************************************
全局变量声明:
**************************************************************/
uint	t=15;
uchar	fx;
uchar	power;
uchar	step0=0;
uchar	step1=0;
uchar	Cnt0=0;
uchar	Cnt1=0;
uchar	key_value,key_value_temp;
/**************************************************************
函数说明:
**************************************************************/
void   Led_Display();
void   Led_Write(uchar leddat);
void   Key_Func();
//void	zheng();
//void	fan();
void   delay(uint t);
void   delay1();
/**************************************************************
code tab:
**************************************************************/
uchar code tab[]={
        0x03,0x9F,0x25,0x0D,0x99,0x49,0x41,0x1F,0x01,0x09,//0-9
        0xFF//dark all
};


void main()
{	
	TMOD=0x11;	   //甚至定时器0/1的工作方式
	ET0=1;			//允许定时器0中断
	ET1=1;			//允许定时器1中断
	EA=1;				//允许总中断
	
	while(1)
	{	
		Key_Func();
		Led_Display();
		
	}

}


/**************************************************************
**函数名称:Key_Func
**功能描述:键盘处理
***************************************************************
**调用函数:None
**参    数:None
**返 回 值:None              
**************************************************************/	
void Key_Func()
{
       P1=0xff;
	 
       key_value=P1;
       key_value=(key_value&0x1f);
       do
       {
          key_value_temp=P1;
          key_value_temp=(key_value_temp&0x1f);
          delay1();
       }while(key_value_temp!=0x1f);

       switch(key_value)
       {

        case 0x1e:		if(t<995) t+=5;
						break;	
		           
        case 0x1d:		if(t>5)	t-=5;
		           		break;

        case 0x1b: 		fx=0;		//正向向运转	 
						power=1;
						TH0=0xBC;		
						TL0=0xb0;						
						TR1=0;			 //关闭定时器1
						TR0=1;			//启动定时器0
						IN1=0;
						IN2=1;
						IN3=0;
						IN4=1;
		           		break;              

        case 0x17: 		fx=1;		  	//反向运转  
						power=1;
						TH1=0xBC;		
						TL1=0xb0;
						TR0=0;			 //关闭定时器0
						TR1=1;			//启动定时器1					
						IN1=0;
						IN2=1;
						IN3=0;
						IN4=1;	

						break;           

        case 0x0f: 		power=0;	//停止运转  
						TR0=0;			 //关闭定时器0
						TR1=0;			//关闭定时器1


		default:   break;
       }
}

/*==================Key_Func 函数结束=======================*/



/**************************************************************
**函数名称:Led_Display
**功能描述:LED数码管显示	 
***************************************************************
**调用函数:Led_Write
**参    数:None
**返 回 值:None
************************************************************/

void Led_Display()
{
	uint p=t ;
 	uchar s ,i;
	Led_Cs=1;
	for	(i=0;i<3;i++)
	{
		s=p%10;
		p=p/10; 
		Led_Write(s);
	}
	                          	   //输出转速   
	Led_Write(10);				//全黑,作为分割点	  
	Led_Write(fx);				//运转方向标识符  1为正向,0为反向 
	Led_Write(power);
	Led_Cs=0;
	delay1();			 //输出运转标识符   1为运转,0为停转 
}	
/********************Led_Display 函数结束*********************/

/**************************************************************
**函数名称:Led_Write
**功能描述:移位寄存器送出一个字节的数据
***************************************************************
**调用函数:None
**参    数:None
**返 回 值:None
**************************************************************/
void   Led_Write(uchar leddat)
{
    uchar i;
	uchar dat=tab[leddat];
    for(i=0;i<8;i++)
   {
      if((dat&0x80)==0)  Led_Dat=0;
       	else Led_Dat=1;

           Led_Clk=0;           //时钟端产生脉冲    
           Led_Clk=1;           //送出一位数据	  
           dat<<=1;								  
   }
}

/*********************Led_Write 函数结束**********************/
/**************************************************************
**函数名称:delay
**功能描述:延时
***************************************************************
**调用函数:None
**参    数:None
**返 回 值:None
**************************************************************/

void delay1()
{
   uchar i,k;
   for(i=0;i<=50;i++)
   for(k=0;k<15;k++)
   {
       ;
   }
}


/********************* delay 函数结束**********************/
 void Tmr0_ISR() interrupt 1 using 1		 //定时器0中断	  正转 
{
	Cnt0++;
    if(Cnt0==t) 
	{
		Cnt0=0 ;
		switch(step0)
		{
			case 0:	IN1=1;
					IN2=0;
					break;
			case 1:	IN3=1;
					IN4=0;
					break;
			case 2:	IN2=1;
					IN1=0;
					break;
			case 3:	IN4=1;
					IN3=0;
					break;				  //正转输出顺序 
		}
		if(step0==3) step0=0;
		else step0++;
			
	} 
	TH0=0x3c;		
	TH0=0xb0;
}
/**************************************************************/
void Tmr1_ISR() interrupt 3 using 2   //定时器1				  反转 
{
	Cnt1++;
	if(Cnt1==t) 
	{
		Cnt1=0 ;
		switch(step1)
		{
			case 0:	IN4=1;
					IN3=0;
					break;
			case 1:	IN2=1;
					IN1=0;
					break;
			case 2:	IN3=1;
					IN4=0;
					break;
			case 3:	IN1=1;
					IN2=0;
					break;				//反转输出顺序 
		}
		if(step1==3) step1=0;
		else step1++;
	}
	TH1=0x3c;		
	TH1=0xb0;
}

⌨️ 快捷键说明

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