#include <reg24e1.h>
void Delay100us(volatile unsigned char n) ;
/* LED1-LED4 */
sbit LED1 = P0^2;
sbit leftkey = P0^4;
sbit rightkey = P0^7;
//sbit wheel1 = P0^3;
sbit wheel2 = P0^5;
bit flag=0;
bit leftold,rightold;
unsigned char i=0;
unsigned char adc_dat[3];
static unsigned char tmpforward;
unsigned char forward=0; //forward==0说明滚轮未动,forward==1说明前进,forward==2说明后退
unsigned char oldforward[3];
long leftduan,rightduan;
unsigned char leftchang,rightchang;
int x,y,z,offsety,offsetx;
unsigned char savetime=10;
unsigned char bi;
struct RFConfig
{
unsigned char n;
unsigned char buf[15];
};
typedef struct RFConfig RFConfig;
#define ADDR_INDEX 8 // Index to address bytes in RFConfig.buf
#define ADDR_COUNT 4 // Number of address bytes
#define size 20
volatile unsigned char idata Txdata[size]=
{
0x56, 0x32, 0xa6, 0xb9, 0xaa, 0x54, 0xc5, 0x98, 0x5d, 0xcd,
0x11, 0x0d, 0xf5, 0xeb, 0x66, 0xa1, 0xb9, 0xdf, 0x72, 0x4b
};
const RFConfig tconf =
{
15,
0x20, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0xaa, 0xbb, 0x12, 0x34, 0x83, 0x6f, 0x04
};
const RFConfig rconf =
{
15,
0x20, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0xaa, 0xbb, 0x12, 0x34, 0x83, 0x6f, 0x05
};
void Delay100us(volatile unsigned char n)
{
unsigned char i;
while(n--)
for(i=0;i<35;i++)
;
}
void Delayms(volatile unsigned char m)
{
unsigned char j;
while(m--)
for(j=0;j<255;j++);
}
unsigned char SpiReadWrite(unsigned char b)
{
EXIF &= ~0x20; // Clear SPI interrupt
SPI_DATA = b; // Move byte to send to SPI data register
while((EXIF & 0x20) == 0x00) // Wait until SPI hs finished transmitting
;
return SPI_DATA;
}
void TransmitPacket(unsigned char b0,unsigned char b1,unsigned char b2,unsigned char b3)
{
unsigned char i;
CE = 1;
Delay100us(0);
for(i=0;i<ADDR_COUNT;i++)
SpiReadWrite(tconf.buf[ADDR_INDEX+i]);
SpiReadWrite(b0);
SpiReadWrite(b1);
SpiReadWrite(b2);
SpiReadWrite(b3);
CE = 0;
}
void Init_Tran(void)
{
unsigned char j;
CS = 1;
Delay100us(0);
for(j=0;j<tconf.n;j++)
{
SpiReadWrite(tconf.buf[j]);
}
CS = 0;
}
void Init(void)
{
// Port1 ini
P0_ALT = 0x08; // Select alternate functions on pins P0.1 and P0.2, TXD RXD
P0_DIR = 0xF8; // P0.0, P0.3 is input(S1, S2), the rest output
// P0 = 0xF0; // P0.7-P0.4 = 1 for OFF LED1-LED4
LED1=0;
//SPI
PWR_UP = 1; // Turn on Radio
Delay100us(30); // Wait > 3ms
SPICLK = 0; // Max SPI clock (XTAL/8)
SPI_CTRL = 0x02; // Connect internal SPI controller to Radio
// serial communication ini
// TH1 = 243; // 19200@16MHz (when T1M=1 and SMOD=1)
// CKCON |= 0x10; // T1M=1 (/4 timer clock)
// PCON = 0x80; // SMOD=1 (double baud rate)
// SCON = 0x52; // Serial mode1, enable receiver
// TMOD = 0x20; // Timer1 8bit auto reload
// TCON = 0x40; // Start timer1
EX0=1; //外部中断0允许
PX0=1;//高优先级
IT0=1; //外部中断0为边沿触发方式
//定时器2中断
TR2=0;
CKCON|=0x20; //定时器2时钟CUP_CLK/4
RCAP2L=0x00; //1KHz时钟 0x63c0~100Hz; 0xf060~1kHz; 0xe0c0~500Hz
RCAP2H=0x63;
TF2=0; //清除定时器2溢出标志位
TR2=1; //定时器2开始计时
ET2=1; //定时器2中断使能
//AD初始化
ADCSTATIC&=0x1C; //DIFFM=0,SLEEP=0,CLK8=0
ADCSTATIC|=0x01; //8bit
ADCCON=0x30; //CHANNEL=0
}
void main(void)
{
EA=0;
Init();
Init_Tran();
Delayms(3); //延时,等待传感器准备好
EA=1;
while(1)
{
if(flag==1)
{
///////////////////////////////////////
if (leftkey==0)
{
leftduan++;
if (leftduan>100)
{
leftchang=1;
leftduan=0;
}
}
if (leftkey==1)
{
leftchang=0;
leftduan=0;
}
///////////////////////////////////////
if (rightkey==0)
{
rightduan++;
if (rightduan>100)
{
rightchang=1;
rightduan=0;
}
}
if (rightkey==1)
{
rightchang=0;
rightduan=0;
}
//////////////////////////////////////////
CS = 1;
Delay100us(0);
for(bi=0;bi<tconf.n;bi++)
{
SpiReadWrite(tconf.buf[bi]);
}
CS = 0;
x=130-adc_dat[2];
y=130-adc_dat[1];
if (leftkey==0&&leftold==1)
{
TransmitPacket(1,0,0,z); //如果按下左键,则左击
}
if (leftkey==1&&leftold==0)
{
TransmitPacket(0,0,0,z); //如果放开左键
}
if (rightkey==0&&rightold==1)
{
TransmitPacket(2,0,0,z); //如果按下右键,则右击
}
if (rightkey==1&&rightold==0)
{
TransmitPacket(0,0,0,z); //如果放开右键
}
if (leftchang==1)
{
TransmitPacket(1,y,x,z); //如果左键长按则拖拽
}
if (rightchang==1)
{
TransmitPacket(0,y,x,z); //如果右键长按则移动
}
if (z!=0)
{
TransmitPacket(0,0,0,z); //如果滚轮动作,则z为-2或+2
}
z=0;
leftold=leftkey;
rightold=rightkey;
flag=0;
}
/*
if(flag==1)
{
CS = 1;
Delay100us(0);
for(bi=0;bi<tconf.n;bi++)
{
SpiReadWrite(tconf.buf[bi]);
}
CS = 0;
x=133-adc_dat[2];
y=133-adc_dat[1];
TransmitPacket(1,1,1,0); //发送包头
flag=0;
}
*/
}
}
void encoder(void) interrupt 0 //外部中断0
{
PWR_UP = 1;
if (wheel2)
{
Delay100us(30);
if (INT0==0)
{
oldforward[i]=0;
i++;
if (i>2) {i=0;}
}
}
else
{
oldforward[i]=1;
i++;
if (i>2) {i=0;}
}
if ((oldforward[0]+oldforward[1]+oldforward[2])>1)
{
z=2;
LED1=1;
}
else
{
z=-2;
LED1=0;
}
IE0=0;
}
//定时中断2,采集AD转换数据,并发送出去
void Timer2ISR(void) interrupt 5 using 1
{
TF2=0;//清定时器2中断标志位
EA=0;
flag=1;
adc_dat[0]=0x34;
adc_dat[1]=0x67;
//采集AD转换数据
ADCCON&= ~0x80;
ADCCON&= 0xF8;
ADCCON|=0x82;//通道2,x轴
ADCCON&=~0x80;//开始新的AD转换
ADCCON|=0x80;
while((EXIF&0x10)==0)
;
EXIF&=0xEF;
adc_dat[0]=ADCDATAH;
ADCCON&= ~0x80;
ADCCON&= 0xF8;
ADCCON|=0x81;//通道1,Y轴
ADCCON&= ~0x80;//开始新的AD转换
ADCCON|=0x80;
while((EXIF&0x10)==0)
;
EXIF&=0xEF;
adc_dat[1]=ADCDATAH;
ADCCON&= ~0x80;
ADCCON&= 0xF8;
ADCCON|=0x80;//通道1,Z轴
ADCCON&= ~0x80;//开始新的AD转换
ADCCON|=0x80;
while((EXIF&0x10)==0)
;
EXIF&=0xEF;
adc_dat[2]=ADCDATAH;
EA=1;
}
trs.zip_nrf24e1
版权申诉
143 浏览量
2022-09-21
06:56:02
上传
评论
收藏 32KB ZIP 举报
朱moyimi
- 粉丝: 61
- 资源: 1万+
最新资源
- 论文(最终)_20240430235101.pdf
- 基于python编写的Keras深度学习框架开发,利用卷积神经网络CNN,快速识别图片并进行分类
- 最全空间计量实证方法(空间杜宾模型和检验以及结果解释文档).txt
- 5uonly.apk
- 蓝桥杯Python组的历年真题
- 2023-04-06-项目笔记 - 第一百十九阶段 - 4.4.2.117全局变量的作用域-117 -2024.04.30
- 2023-04-06-项目笔记 - 第一百十九阶段 - 4.4.2.117全局变量的作用域-117 -2024.04.30
- 前端开发技术实验报告:内含4四实验&实验报告
- Highlight Plus v20.0.1
- 林周瑜-论文.docx
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈