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

📄 转弯.c

📁 单片机控制小车(两个步进电机)前进后退及转弯程序
💻 C
字号:
/**************************************************************
头文件预处理:
**************************************************************/
#include<reg52.h>
#include <absacc.h>
#include <intrins.h>
#include<stdio.h>
/**************************************************************
数据类型宏定义:
**************************************************************/
#define uchar unsigned char
#define uint  unsigned int
/**************************************************************
I/O端口说明:
**************************************************************/
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)
sbit    SDA=P3^4;            //I2C数据线
sbit    SCL=P3^5;            //I2C时钟线
sbit 	A0=P1^0;
/**************************************************************
全局变量声明:
**************************************************************/
uchar NP1,NP2,temp2,Count;
uint temp,temp1,Sec;
const uchar motor1[8]={0x30,0x60,0xc0,0x90};
const uchar motor2[8]={0x03,0x06,0x0c,0x09};//{0x11,0x99,0x88,0xaa,0x22,0x66,0x44,0x55};  //八拍为一步
/**************************************************************
函数说明:
**************************************************************/
void RS232_SendData(uchar d)
{
	SBUF=d;while(TI==0);TI=0;
}
/**************************************************************
**函数名称:Delay
**功能描述:延时
***************************************************************
**调用函数:NONE
**参    数:NONE
**返 回 值:NONE
**************************************************************/
void delay(uchar t)// 每步延时的子程序  
{ 
	uchar i,j,k; 
	for (k=0;k<50;k++)      
			for (j=0;j<t;j++)
				_nop_(); 
} 
/**************************************************************
**函数名称:Delay1
**功能描述:延时1ms*t子程序
***************************************************************
**调用函数:NONE
**参    数:NONE
**返 回 值:NONE
**************************************************************/
void delay1(uchar t)// 
{ 
	uchar j,k; 
		for (k=0;k<t;k++)       
			for (j=0;j<60;j++)
				_nop_(); 
} 

/**********************Delay  函数结束************************/



/**************************************************************
**函数名称:round_step
**功能描述:转弯
***************************************************************
**调用函数:delay
**参    数:d,t
**返 回 值:NONE
**************************************************************/
void car_round_step(uchar d,uchar t)     //步进电机走一步d=0 右转d=1 左转。t 越大转得越慢  
{     
	uchar e;                        
     if (d&0x01)                   
     { 
       if (NP1==0) 
          NP1=3; 
       else NP1--; //NP1记录步数,全局变量
     } 
     else  
     { 
       if (NP1==3) 
       		NP1=0; 
       else 
	   		NP1++; 
     } 
     temp=motor1[NP1]; 

	 e=!d;
	 if (e&0x01)                   
     { 
       if (NP2==0) 
          NP2=3; 
       else NP2--; //NP2记录步数,全局变量
     } 
     else  
     { 
       if (NP2==3) 
       		NP2=0; 
       else 
	   		NP2++; 
     } 
	 temp1=motor2[NP2];
	 P2=temp|temp1;//输出到单片机的P2口
	 RS232_SendData(P2);//motortb[NP]);
     delay(t); 
} 
/**************************************************************
**函数名称:mov_step
**功能描述:转弯
***************************************************************
**调用函数:delay
**参    数:d,t
**返 回 值:NONE
**************************************************************/
void car_movstep(uchar d,uchar t)     //步进电机走一步d=0 前进d=1 后退。t 越大转得越慢  
{                            
     if (d&0x01)                   
     { 
       if (NP1==0) 
          NP1=3; 
       else NP1--; //NP1记录步数,全局变量
     } 
     else  
     { 
       if (NP1==3) 
       		NP1=0; 
       else 
	   		NP1++; 
     } 
     temp=motor1[NP1]; 

	 if (d&0x01)                   
     { 
       if (NP2==0) 
          NP2=3; 
       else NP2--; //NP2记录步数,全局变量
     } 
     else  
     { 
       if (NP2==3) 
       		NP2=0; 
       else 
	   		NP2++; 
     } 
	 temp1=motor2[NP2];
	 P2=temp|temp1;//输出到单片机的P2口
	 RS232_SendData(P2);//motortb[NP]);
     delay(t); 
} 


/**************************************************************
**函数名称:timer0
**功能描述:定时器中断服务程序
***************************************************************
**调用函数:NONE
**参    数:NONE
**返 回 值:NONE
**************************************************************/

void ISR_Tmr0() interrupt 1 using 2
{
	uchar i;
	TH0=0x9e;            //T0定时25ms
    TL0=0x58;             //0xD8F0
	if(!A0)
	{
	}
	else if(!A1)
	{
	}
//	temp2++;
//	RS232_SendData(temp2);
}

/**************************************************************
**函数名称:timer0
**功能描述:定时器中断服务程序
***************************************************************
**调用函数:NONE
**参    数:NONE
**返 回 值:NONE
**************************************************************/

void ISR_Tmr1() interrupt 1 using 3
{
	uchar i;
	TH0=0x9e;            //T0定时25ms
    TL0=0x58;             //0xD8F0
	if(Count==20)
	{
		Count=0;
		Sec++;
		//
	}
	else
		Count++;
//	temp2++;
//	RS232_SendData(temp2);
}

/**************************************************************
**函数名称:zd_int0()
**功能描述:int0中断服务子程序
***************************************************************
**调用函数:NONE
**参    数:NONE
**返 回 值:NONE
**************************************************************/

void zd_int0() interrupt 0 using 2
{
	uchar i;
	for(i=0;i<10;i++)
	car_round_step(0,100);
	RS232_SendData(P2);	

}



/**************************************************************
**函数名称:main()
**************************************************************/
void main()
{		uchar i,j,k,l;
		temp2=0;
		Sec=Count=0;
init:   TMOD=0x11;           //设置定时器0,工作方式1,
		TH0=0x9e;            //T0定时25ms
        TL0=0x58;            //0xD8F0
//        TH1=0xFE;            //T1定时500us
//        TL1=0x0C;            //理论值为FE0CH
        ET0=1;               //允许定时器0中断
//        ET1=1;               //允许定时器1中断
        TR0=1;               //关定时器0
//        TR1=1;               //关定时器1
//		EA=1;                //允许CPU总中断

//		IE=0x1b;						//ET0=ET1=EX0=ES=1;EX1=0;T0,T1,INT0,COM中断允许INT1不允许
    	SCON = 0x50;					//串口方式1,允许接收
    	RCAP2H=0xff;RCAP2L=0x64;T2CON=0x34;//波特率2400 bps

		EA=1;
//		NP=3;
		while(1)                     
        {
			for(i=0;i<150;i++)
				for(k=0;k<10;k++)
				{
					car_movstep(0,10);
//					RS232_SendData(temp2);
				}
			for(j=0;j<150;j++)
				car_round_step(0,10);
        
        }
}

⌨️ 快捷键说明

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