📄 stepmotor.c
字号:
/**********************************************************
爬楼梯机器人
谭安助
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 + -