📄 新建 文本文档 (4).txt
字号:
/****************
手动机器人程序
2006,5,4 王不更
*****************
-----------------------------------------
REF I/0:
P2.7 - ICA - RIGHT WHEEL
P2.0 - ICB - LEFT WHEEL
-----------------------------------------
P2.6 - OCA - P1.0(REVERSE) 右轮
P1.6 - OCB - P1.1 升降
P1.7 - OCC - P1.2 伸缩
P2.1 - OCD - P1.3 左轮
P1.4 挟持
P0.0 - AD01
P0.1 - AD10
P0.4:P0.7 - KBFUNC:LOAD,CAST,GATE,STOPALL
AD AXIS:
00
│
│
│ DEADZONE
│7A /
┌─┼─┐
7A│ │ │95
00────┼─┼─┼────→FF
│80│ │
└─┼─┘
│95
│
│
│
↓
FF
----------------- JACKIE'S COMMENTS -------------*/
#include <Reg935.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 gei_ding 70
// #define out_direction_enter 25
#define TH0_data 0xB8
#define TL0_data 0x00
#define CSM 5 //参数设定范围,有9个参数
#define CMID 0x80
#define WAITFORADDATA _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
sbit P02=P0^2;
sbit P03=P0^3;
sbit P04=P0^4;
sbit P05=P0^5;
sbit P06=P0^6;
sbit P07=P0^7;
sbit P10=P1^0;
sbit P11=P1^1;
sbit P12=P1^2;
sbit P13=P1^3;
sbit P14=P1^4;
sbit P15=P1^5;
sbit P16=P1^6;
sbit P17=P1^7;
sbit P20=P2^0;
sbit P21=P2^1;
sbit P22=P2^2;
sbit P23=P2^3;
sbit P24=P2^4;
sbit P25=P2^5;
sbit P26=P2^6;
sbit P27=P2^7;
sbit RCLK=P2^4;
sbit IN=P2^2; //数据发送口
sbit SCLK=P2^5; //同步时钟信号
sbit KEY=P2^3; //读键口
sbit st=P1^5 ; //复位
bit data kflag = 0; //手柄按键标志位
bit SF=0; //闪烁标志位
// bit Q=0; //外环调整标志位
bit run=0; //电机左右轮运行标志,1时运行,0时停
bit data flag = 0; //电机左右轮给定值标志位
bit data rwa = 0; //RIGHT WHEEL APPRO
bit data lwa = 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 S=0; //寻迹传感器状态寄存器
uchar d;
uchar deadzonel0 = 0x00; //死区范围设计
uchar deadzoner0 = 0x00;
uchar deadzonel1 = 0x00;
uchar deadzoner1 = 0x00;
// uchar mid0;
// uchar mid1;
uint circl_count_A;
uint circl_count_B;
uint cod = 0; //CMP OUTPUT D
uint coa = 0;
uint addata; //A/D转换结果值
uint CAP1=0x0000;
uint CAP2=0x0000;
uint CBP1=0x0000;
uint CBP2=0x0000; //定义捕获值寄存器组
uint RESHIP=0x0000; //CCU重装值寄存器
uchar AD_0;
uchar AD_1;
uint PLSA=0;
uint PLSB=0; //捕获脉冲总次数寄存器
bit HA=0,HB=0; //首次捕获标志位
uint FAA=0;
uint FAB=0; //捕获信号频率寄存器
uint I=0x0000; //CCU溢出次数计数器
void ICA_int();
void ICB_int();
void CCU_int();
signed int idata EKA1=0,EKA2=0,EKB1=0,EKB2=0,EKA3=0,EKB3=0;//,EK1,EK2; //误差寄存器
uint idata UKA,UKB; //输入值
uint idata FA[8];
uint idata FB[8]; //捕获信号频率寄存器组
ulong idata TFAA=0;
ulong idata TFAB=0; //滑动平均暂存器
ulong idata TPI=0; //CCU溢出次数暂存器
uchar idata TCAP2H;
uchar idata TCAP2L;
uchar idata TCBP2H;
uchar idata TCBP2L; //捕获值暂存器组
uint idata TPNA;
uint idata TPNB; //捕获次数暂存器
uint idata NA=0x00;
uint idata NB=0x00; //捕获次数累加器
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};
uint idata VA; //电机转速A
uint idata VD; //电机转速D
extern void _nop_(void);
// void delay(void)
/*********************************************************
A/D调用服务程序
**********************************************************/
void delay( uchar time)
{
uchar i;
uchar j;
uchar k;
for(i=0;i<=time;i++)
{
for(j=0;j<=100;j++)
for(k=0;k<=100;k++);
}
}
/*********************************************************
A/D调用服务程序
**********************************************************/
void AD(void)
{
// ADINS = 0x12;
AD_0 = AD1DAT0; //对应AD10与P01口
AD_1 = AD0DAT1; //对应AD01与P00口
ADCON0 |= 0x03;
ADCON1 |= 0x03;
}
/*********************************************************
手柄按键盘中断服务程序
**********************************************************/
void KBI(void) interrupt 7
{
kflag = 1;
EKBI = 0;
}
/*********************************************************
//手柄按键盘中断服务子程序
**********************************************************/
void SCANKEY(void)
{
if(kflag)
{
if(P02==0)
{
// delay(1);
if(P02==0)
{
P11 = 1;
// delay(1);
OCRBH = CS[1]*10>>8;
OCRBL = CS[1]*10&0xFF;
TCR21 |= 0x80;
OCB= 1;
}
// OCB = 0;
// P11 = 0;
}
else if(P03==0)
{
// delay(1);
if(P03==0)
{
P11 = 0;
// delay(1);
OCRBH = CS[2]*10>>8;
OCRBL = CS[2]*10&0xFF;
TCR21 |= 0x80;
OCB = 1;
}
// OCB = 0;
// P11 = 0;
}
else if(P04==0)
{
// delay(1);
if(P04==0)
{
P12 = 0;
// delay(1);
OCRCH = CS[3]*10>>8;
OCRCL = CS[3]*10&0xFF;
TCR21 |= 0x80;
OCC = 1;
}
// OCC = 0;
// P12 = 0;
}
else if(P05==0)
{
// delay(1);
if(P05==0)
{
P12 = 1;
// delay(1);
OCRCH = CS[4]*10>>8;
OCRCL = CS[4]*10&0xFF;
TCR21 |= 0x80;
OCC = 1;
}
// OCC = 0;
// P12 = 0;
}
else if(P06==0)
{
// delay(1);
if(P06==0)
{
P24 = 0;
// delay(1);
P14 = !P14;
}
}
else if(P07==0)
{
// delay(1);
if(P07==0)
{
P24 = 1;
// delay(10);
P14 = !P14;
}
// P14 = 0;
// P24 = 0;
}
KBCON &= 0xFE;
EKBI = 1;
kflag = 0;
}
else
{
OCB=0;
OCC=0;
// P14=0;
P24=0;
}
}
/*********************************************************
设计运行死区范围
**********************************************************/
void refreshMV()
{
WAITFORADDATA
WAITFORADDATA
deadzonel0=AD0DAT1-0x20; deadzoner0=AD0DAT1+0x20; //死区范围0x75至0x90,在该范围内电机不会运行
WAITFORADDATA
WAITFORADDATA
deadzonel1=AD1DAT0-0x20; deadzoner1=AD1DAT0+0x20;
// mid0=AD0DAT1;
// mid1=AD1DAT0;
}
/*********************************************************
前进后退方向控制
**********************************************************/
void CTRLUD(void) //P01口
{
//ACC OR BACK CONTROL USE AD10
if(AD1DAT0 >= deadzoner1)
{
addata = (AD1DAT0-CMID)*CS[0];//向前
coa = addata;
cod = addata;
rwa = 0;
lwa = 0;
flag = 1;
}
else if(AD1DAT0 <= deadzonel1)
{
addata = (CMID-AD1DAT0)*CS[0];//向后
coa = addata;
cod = addata;
rwa = 1;
lwa = 1;
flag = 1;
}
}
/*********************************************************
左右方向控制
**********************************************************/
void CTRLLR(void) //P00口
{
//LTURN OR RTURN CONTROL USE AD01
if(AD0DAT1 >= deadzoner0)
{
addata = (AD0DAT1-CMID)*CS[0]; //向左转
/* if(coa >= addata)
coa -= addata;
else
{
coa = addata - coa;
rwa = !rwa;
} */
coa = addata;
flag = 1;
}
else if(AD0DAT1 <= deadzonel0)
{
addata = (CMID-AD0DAT1)*CS[0]; //向右转
/* if(cod >= addata)cod -= addata;
else
{
cod = addata - cod;
lwa = !lwa;
} */
cod = addata;
flag = 1;
}
//END
}
/*********************************************************
方向驱动程序
**********************************************************/
void CTRLEXE(void)
{
if(flag)
{
UKA = coa;
UKB = cod;
P13 = lwa;
P10 = rwa;
delay(1);
if(VA==0)
{
P26=0;
P21 = 1;
}
else if(VD==0)
{
P21=0;
P26 = 1;
}
else
{
P26 = 1;
P21 = 1;
}
lwa = 0;
rwa = 0;
coa = 0;
cod = 0;
flag = 0;
run=1;
}
else
{
P21=0;
P26=0;
run=0;
flag = 0;
} //P2 &= 0xBD; P2=1011 1101,关掉左右电机,显示变黑
}
/*********************************************************
CCU中断服务程序
**********************************************************/
void CCU_ISR() interrupt 11
{
while(TISE2)
{
switch(TISE2)
{
case 0x07: CCU_int(); //执行CCU溢出中断服务子程序
break;
case 0x06: ICA_int(); //执行ICA捕获中断服务子程序
break;
case 0x05: ICB_int(); //执行ICB捕获中断服务子程序
break;
};
};
}
/*********************************************************
捕获中断服务子程序
**********************************************************/
//ICA捕获中断服务子程序
void ICA_int()
{
if(HA==0)
{
CAP1=(ICRAH*0x100+ICRAL); //A首次捕获值
HA=1;
NA++;
}
else
{
NA++;
}
TIFR2=TIFR2&0xFE; //将ICA中断标志位清零
PLSA++;
}
//ICB捕获中断服务子程序
void ICB_int()
{
if(HB==0)
{
CBP1=(ICRBH*0x100+ICRBL); //B首次捕获值
HB=1;
NB++;
}
else
NB++;
TIFR2=TIFR2&0xFD; //将ICB中断标志位清零
PLSB++;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -