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

📄 stepmotor.c

📁 全国机器人机械创新大赛的程序
💻 C
📖 第 1 页 / 共 2 页
字号:
/**********************************************************
  爬楼梯机器人
   谭安助
  2007,4,28   
***********************************************************/
/*-----------------------------------------
REF I/0:
P0.0 - P0.6 行程开关输入
P1.0  p2.6- 上升电机控制
P1.1  p1.6 - 前后电机控制
-----------------------------------------*/
#include <Reg932.h> 			//Keil header file name
#include <stdio.h>
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
#define ccu_inter_count 2
#define	TH0_DATA	0x0d4			// 0xd4cc<-->2mS (0xa999<-->4mS)
#define	TL0_DATA	0x0cc
#define CSM  6		 //参数设定范围,有6个参数
#define CMID 0x80 

sbit sw1=P0^1 ;
sbit sw2=P0^0 ;
sbit sw3=P0^2 ;
sbit sw4=P0^3 ;
sbit sw5=P0^4 ;
sbit sw6=P0^5 ;
sbit sw7=P0^6 ;
sbit wait=P0^7;
sbit P22=P2^2;
sbit P23=P2^3;
sbit P24=P2^4;
sbit P25=P2^5;
sbit wait_down=P1^7;
sbit direct_A=P1^0;
sbit direct_B=P1^1;
sbit power_A=P2^6;
sbit RCLK=P2^4;
sbit IN=P2^2;          //数据发送口
sbit SCLK=P2^5;        //同步时钟信号
sbit KEY=P2^3;         //读键口      
sbit st=P1^5 ;		   //复位
bit SF=0;              //闪烁标志位
uchar TK=0x09;         //按键按下位寄存器1
uchar DATA0[8],DATA1[8];//发送数据库
uchar EDATA[2];			//E^2PROM读写暂存器
uint CS[CSM];            //修改参数寄存器组(CS[0],CS[1]为,CS[2]为RA,CS[3]为KPB,CS[4]为KIB,CS[5]为RB,CS[6]为外环调整基量)
uchar x=0,y=0,k=0,j=0,p=0,l=0; //指针型变量,k对DATA0&DATA1&selectable;x&y对digitable;j对EDATA;p/l对FA&FB;
uchar w=0;             //取数计数器	,定时器T0中断计数
uchar M=0,R=4;//M用于参数选择,M等于0时没有键按下,不等到0时有键按下;R为右移选择.
uchar floor=1;
uchar row=1;
sbit A_up=P2^0;
sbit A_down=P2^7;
sbit B_up=P1^2;
sbit B_down=P1^3;
//sbit power_B=P1^6;
//uint i=0;

uchar flag_over=1;
uchar idata digitable[11]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00};
uchar idata selectable[8]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};
//extern void _nop_(void);
void Delays(uint i);
 void init(void)
{

	sw1=1;
	sw2=1;
	sw3=1;
	sw4=1;
	sw5=1;
	sw6=1;
	sw7=1;

	direct_A=1;
	direct_B=1;
	power_A=0;

	P1=0xff;               
	P2=0xff;
}

 void Delays(uint i)
{
	//j=1000;
	//j1=1000;
	//j1=i;
     uint s;
	for(i;i>0;i--)
		for(s=3000;s>0;j--);
		//	for(j1=1000;j1>0;j1--);
}

//**********************************************************************************************
// 初始化CCU单元:	void	InitCCU(void);
void	InitCCU(void)
{	
	TOR2H=0xFF;
	TOR2L=0xFF;
	TH2=0xFF;
	TL2=0xFF;		//SET THE T2 REPEAT VALUE
	TPCR2H=0x00;
	TPCR2L=0x00;	//SET CCUCLK=PLLCLK/((TPCR2H,TPCR2L)+1);

//	CCCRA=0x19;
	OCB=1;
	CCCRB=0x19;	//SET CCCRX REGISTER,OCM1 AND OCM2 
//	CCCRC=0x01;
//	CCCRD=0x01;

	TCR21=0x86;	//SET TCOU2=1 AND ENTER THE VALUE,PLLCLK=((Fosc/2)/(TCR21&0x0F+1))*32;
	TCR20=0x00;

	OCRBH=0x00;
	OCRBL=0x00;
	TCR20=0x86;
}

void start_B(void)
{
	OCRBH=0xa0;                               //原文件中是0x66
	OCRBL=0x00;                               //原文件中是0x66
	TCR21=0x86;
}

void stop_B(void)
{
	OCRBH=0x00;
	OCRBL=0x00;
	TCR21=0x86;
}
 /*********************************************************
	 二进制数转BCD码
  **********************************************************/	
	//二进制数转BCD码子程序0
	void CONVBIT0(uint num,uchar hor)
	{	
		DATA0[hor] = num/1000;
		DATA0[hor+1] = num%1000/100;
		DATA0[hor+2] = num%100/10;
		DATA0[hor+3] = num%10/1;

	}
	
	//二进制数转BCD码子程序1
	void CONVBIT1(uint num,uchar hor)
	{
		DATA1[hor] = num/1000;
		DATA1[hor+1] = num%1000/100;
		DATA1[hor+2] = num%100/10;
		DATA1[hor+3] = num%10/1;
    }

  /*********************************************************
	 数据发送子程序
  **********************************************************/	

	void SEND()
	{
		SPSTAT=0x80;
		SPDAT=digitable[x];
		while(SPSTAT!=0xbf)
		 {
		 };
		SPSTAT=0x80;
		SPDAT=digitable[y];
		while(SPSTAT!=0xbf)
		 {
	 	 };
		SPSTAT=0x80;
		SPDAT=selectable[k];
		while(SPSTAT!=0xbf)
		 {
		 };
		RCLK=0;
		RCLK=0;
		RCLK=0;
		RCLK=1;
		RCLK=1;
		RCLK=1;
		RCLK=1;
		RCLK=0;
		RCLK=0;
		RCLK=0;

	}

  /*********************************************************
	  读取EEPROM子程序
  **********************************************************/	

	void rEEPROM()
	{
	  for(j=1;j<2*CSM;j++)
	  {
	     DEECON=0x00;                //初始化DEECON
	     DEEADR=(2*j-2);
		 while((DEECON&0x80)==0);
		 EDATA[0]=DEEDAT;
		 DEECON&=0x7F;
		 DEEADR=(2*j-1);
		 while((DEECON&0x80)==0);
		 EDATA[1]=DEEDAT;
		 CS[j-1]=(EDATA[0]*0x100+EDATA[1]);
		 DEECON&=0x7F;
	   }
	}
 /*********************************************************
	初始化定时器优先级
  **********************************************************/	

	 void IP_ini(void)
	 {
	   IP0H=IP0H&0xFD;
	   IP0=IP0&0xFD;   //将定时器0中断优先级降最低
	   IP1H=IP1H|0x10;
	   IP1=IP1|0x10;	//将CCU中断优先级升为最高
	 }
/*********************************************************
	 初始化SPI
  **********************************************************/	

	 void SPI_ini(void)
	 { 
	   IN=1;
	   SCLK=1;
	   RCLK=0;
	   SPCTL=0xD0;
	   SPDAT=0x00;
	   }
/*********************************************************
	  初始化定时器
  **********************************************************/	

	 void TIME_ini(void)
	 {
	   TMOD=0x01;
	   TAMOD=0x00;
  	   TH0=TH0_DATA;			// 0xd4cc<-->2mS (0xa999<-->4mS)
	   TL0=TL0_DATA;
	   EA=1;
	   ET0=1;
	   TR0=1;
	   }

void main(void)
{
	P0M1=0xFF;
	P0M2=0x00;	//P0口做寻迹传感器接口,仅为输入
	P1M1=0x0c;
	P1M2=0xf3;	//P1.0、P1.1(2个继电器吸合控制口,对应电机PWM输出口分别为OCA和OCD)设为推挽输出
    P2M1=0x89;
    P2M2=0x76;	//P2.3(READKEY)、P2.0(CAPTURE_b)和P2.7(CAPTURE_a)仅输入,其它推挽输出。
	IP0H=IP0H&0xFD;
	IP0=IP0&0xFD;   //将定时器0中断优先级降最低
	init();
	InitCCU();
    rEEPROM();
    SPI_ini();
	TIME_ini();
    IP_ini();
	TCR20=0x86;
	while(1)
	{   
		power_A=0;
		stop_B();
		//while((wait==1)&&(wait_down==1)&&(A_up==1)&&(A_down==1)&&(B_up==1)&&(B_down==1));
		//while((wait==1)&&(wait_down==1));//等待按键
		//while(wait_down==1);

/*		if(A_up==0)
		{
			direct_A=1;//正转主轴上升
			power_A=1;
			while(A_up==0);
			power_A=0;
		}
		else if(A_down==0)
		{
			direct_A=0;//正转主轴上升
			power_A=1;
			while(A_down==0);
			power_A=0;
		}
		else if(B_up==0)
		{
			direct_B=1;//前脚前移,电机正转
			start_B();	
			while(B_up==0);
			direct_B=0;
			Delays(15);
			stop_B();
		}
		else if(B_down==0)
		{
			direct_B=0;//后脚前移,电机反转
			start_B();
			while(B_down==0);
			direct_B=1;
			Delays(15);
			stop_B();
		}         */

		if(A_up==0)                                          
		{
			direct_A=1;//正转主轴上升
			power_A=1;
			while((A_up==0)&&(sw6==1));
			power_A=0;
			//Delays(400);                              
			while(A_up==0)
			{
				if(A_down==0)
					power_A=1;
				while((A_up==0)&&(A_down==0)&&(sw5==1));
				power_A=0;
				//Delays(400);                        
				break;
			}		
		}
		else if(A_down==0)
		{
			direct_A=0;//正转主轴上升
			power_A=1;
			while((A_down==0)&&(sw7==1));
			power_A=0;
			//Delays(400);                        
		}
		else if(B_up==0)
		{
			direct_B=1;//前脚前移,电机正转
			start_B();	
			while((B_up==0)&&(sw1==1)&&(sw4==1));
			stop_B();
			//Delays(20);
		    direct_B=0;
			//Delays(200);                       
		}
		else if(B_down==0)
		{
			direct_B=0;//后脚前移,电机反转
			start_B();
//			while((B_down==0)&&(sw2==1)&&(sw3==1));
			while((B_down==0)&&(sw3==1));
			stop_B();
		//	Delays(20);
			direct_B=1;
		//	Delays(200);                    
		}
		else if(wait==0)
		{
			/************************************************/
			//启动上楼 
		 	direct_A=1;//正转主轴上升
			power_A=1;
			Delays(3000);
			power_A=0;
			
			while(wait==1);//等待按键
	
			direct_B=1;//前脚前移,电机正转
			start_B();	
			while(sw1==1);
			stop_B();
			Delays(20);
			direct_B=0;
			//power_B=0;
	
			direct_A=0;//反转下降
			power_A=1;
			while(sw7==1);
			power_A=0;

⌨️ 快捷键说明

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