1、基于合泰单片机无线鼠标智能小车控制#include HT66FU70A.h#define uchar unsigned char#define uint unsigned int#define led _pc2 /led/*NRF24L01端口宏定义*/#define MOSI _pa3 /MOSI/#define SCK _pa4 /SCK/#define CE _pa5 /CE/#define CSN _pa6 /CSN/#define MISO _pa1 /MISO输入/#define IRQ _pa7 /IRQ输入/*NRF24L01*#define TX_ADR_WIDTH 5 /
2、5 字节宽度的发射地址#define RX_ADR_WIDTH 5 / 5 字节宽度的接收地址#define TX_PLOAD_WIDTH 1 / 数据通道有效数据宽度#define RX_PLOAD_WIDTH 1 / 数据通道有效数据宽度uchar TX_ADDRESSTX_ADR_WIDTH= 0x34,0x43,0x10,0x10,0x01; /发送地址uchar RX_ADDRESSRX_ADR_WIDTH= 0x34,0x43,0x10,0x10,0x01; /接收地址uchar gs10=0x00,0x01,0x80,0x01,0x00,0x02,0x80,0x02,0x00,0
3、x03; /低字节高字节 占空比数组 1,83.3,66.7,50,33.3/*NRF24L01相关命令的宏定义*#define READ_REG 0x00 / 读寄存器命令#define WRITE_REG 0x20 / 写寄存器命令#define RD_RX_PLOAD 0x61 / 读取接收数据命令#define WR_TX_PLOAD 0xA0 / 写待发数据指令#define FLUSH_TX 0xE1 / 冲洗发送FIFO指令#define FLUSH_RX 0xE2 / 冲洗接收FIFO指令#define REUSE_TX_PL 0xE3 / 定义重复装载数据命令#define
4、NOP 0xFF / ?/*SPI(nRF24L01)相关地址的宏定义*#define CONFIG 0x00 #define EN_AA 0x01 #define EN_RXADDR 0x02 #define SETUP_AW 0x03 #define SETUP_RETR 0x04 #define RF_CH 0x05 #define RF_SETUP 0x06 #define STATUS 0x07 #define OBSERVE_TX 0x08 #define CD 0x09 #define RX_ADDR_P0 0x0A #define RX_ADDR_P1 0x0B #define
5、 RX_ADDR_P2 0x0C #define RX_ADDR_P3 0x0D #define RX_ADDR_P4 0x0E #define RX_ADDR_P5 0x0F #define TX_ADDR 0x10 #define RX_PW_P0 0x11 #define RX_PW_P1 0x12 #define RX_PW_P2 0x13 #define RX_PW_P3 0x14 #define RX_PW_P4 0x15 #define RX_PW_P5 0x16 #define FIFO_STATUS 0x17 /uuchar TxBuf2=;uchar RxBuf1;/*uc
6、har sta;uchar m=3; unsigned char IN1,IN2,IN3,IN4;/对应芯片如向前1000void pwn_1();void car_qian();void car_hou();void car_zuo();void car_you();void car_stop();void time_init();void CAR_Q();void CAR_H();/*延迟函数ms*/void delay200ms(unsigned int x) unsigned int i; for(i=0;i5)m=5; if(m1)m=1; switch(m) case 1: _tm
7、0al = 0x00; _tm0ah = 0x01; _tm3al = 0x00; _tm3ah = 0x01;break; case 2: _tm0al = 0x80; _tm0ah = 0x01; _tm3al = 0x80; _tm3ah = 0x01;break; case 3: _tm0al = 0x00; _tm0ah = 0x02; _tm3al = 0x00; _tm3ah = 0x02;break; case 4: _tm0al = 0x80; _tm0ah = 0x02; _tm3al = 0x80; _tm3ah = 0x02;break; case 5: _tm0al
8、= 0x00; _tm0ah = 0x03; _tm3al = 0x00; _tm3ah = 0x03;break; GCC_DELAY(10); time_init(); void Mcu_init() _pas1=0x00; _pac3=0; _pas2=0x00; _pac4=0; _pas2=0x00; _pac5=0; _pas3=0x00; _pac6=0; /pa3-6 配置为输出io口无线模块配置 _pas0=0x00; _pac1=1; _papu1=1; _pas3=0x00; _pac7=1; _papu7=1; _pcs1=0x00; _pcc2=0; /写一个字节到n
9、rf24l01,同时从nrf24l01读出一个字节/*uchar SPI_RW(uchar data) uchar i,temp=0; for(i=0;i8;i+) / output 8-bit if(data & 0x80)=0x80) _pa3=1; / output uuchar, MSB to MOSI else _pa3=0; data = (data 1); / shift next bit into MSB. temp=1; _pa4=1; / Set SCK high. if(_pa1=1)temp+; / capture current MISO bit xiugai pa1
10、 _pa4=0; / .then set SCK low again return(temp); / return read uuchar/从reg寄存器读一个字节/*uchar SPI_Read(uchar reg) uchar reg_val; _pa6=0; / CSN low, initialize SPI communication. SPI_RW(reg); / Select register to read from. reg_val = SPI_RW(0); / .then read registervalue _pa6=1; / CSN high, terminate SPI
11、 communication return(reg_val); / return register value/写数据到reg寄存器/*uchar SPI_RW_Reg(uchar reg, uchar value) uchar status1; _pa6=0; / CSN low, init SPI transaction status1 = SPI_RW(reg); / select register SPI_RW(value); / .and write value to it. _pa6=1; / CSN high again return(status1); / return nRF
12、24L01 status uuchar/用于读数据/*uchar SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars) uchar status2,uuchar_ctr; _pa6=0; / Set CSN low, init SPI tranaction status2 = SPI_RW(reg); / Select register to write to and read status uuchar for(uuchar_ctr=0;uuchar_ctruchars;uuchar_ctr+) pBufuuchar_ctr = SPI_RW(
13、0); _pa6=1; return(status2); / return nRF24L01 status uuchar/用于写数据 /*uchar SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars) uchar status1,uuchar_ctr; _pa6=0; /SPI使能 status1 = SPI_RW(reg); for(uuchar_ctr=0; uuchar_ctruchars; uuchar_ctr+) SPI_RW(*pBuf+); _pa6=1; /关闭SPI return(status1);void SetRX_Mo
14、de(void) _pa5=0; SPI_RW_Reg(WRITE_REG + CONFIG, 0x0f); / IRQ收发完成中断响应,16位CRC,主接收 _pa5=1; GCC_DELAY(2000); /注意不能太小uchar nRF24L01_RxPacket(uchar* rx_buf) uchar revale=0; sta=SPI_Read(STATUS); / 读取状态寄存其来判断数据接收状况 if(sta&0x40) / 判断是否接收到数据 _pa5=0; /SPI使能 SPI_Read_Buf(RD_RX_PLOAD,rx_buf,TX_PLOAD_WIDTH); / r
15、ead receive payload fromRX_FIFO buffer revale =1; /读取数据完成标志 SPI_RW_Reg(WRITE_REG+STATUS,sta); /接收到数据后RX_DR,TX_DS,MAX_PT都置高为1,通过写1来清楚中断标志 return revale;/发送tx-buf中数据/*void nRF24L01_TxPacket(uuchar *tx_buf) CE=0 ; SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH); SPI_Write_Buf(WR_TX_PLOA
16、D, tx_buf, TX_PLOAD_WIDTH); SPI_RW_Reg(WRITE_REG + CONFIG, 0x0e); CE=1; delay_us(100);*/void init_NRF24L01(void) GCC_DELAY(250); _pa5=0 ; / chip enable _pa6=1; / Spi disable _pa4=0; / Spi clock line init high SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH); / 写本地地址 SPI_Write_Buf(WRITE_R
17、EG + RX_ADDR_P0, RX_ADDRESS, RX_ADR_WIDTH); / 写接收端地址 SPI_RW_Reg(WRITE_REG + EN_AA, 0x01); / 频道0自动 ACK应答允许 SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01); / 允许接收地址只有频道0,如果需要多频道可以参考Page21 SPI_RW_Reg(WRITE_REG + RF_CH, 0); / 设置信道工作为2.4GHZ,收发必须一致 SPI_RW_Reg(WRITE_REG + RX_PW_P0, RX_PLOAD_WIDTH); /设置接收数据长度,本次设置
18、为32字节 SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07); /设置发射速率为1MHZ,发射功率为最大值0dB SPI_RW_Reg(WRITE_REG + CONFIG, 0x0E); / IRQ收发完成中断响应,16位CRC ,主接收void time_init(void) /保持对应的I/O口的原来功能 _phs0 = 0; _tm0c0 = 0x00; /增强型TM(查找TM1C0寄存器),4分频 / _tm0dl = 0x00;/ _tm0dh = 0x00; _tm0c0=0b10010110; /7.784M 停止不分频关闭100 512P高三位 本
19、来应该8m实验测得7.784M _tm0c1=0b10101000; /工作模式输出模式高有效同相向上计数(p匹配双pwm输出模式)/ _tm0c2=0b10101000; /工作模式输出模式高有效同相边沿对齐 / _tm0al = 0x80;/a/ _tm0ah = 0x02;/a _tm0c0 &=(1 7); /运行定时器 _tm0c0 |= (1 3); /计数器On /*_tm0c0 |= (1 3); /计数器On*/ _tm3c0 = 0x00; /增强型TM(查找TM3C0寄存器) / _tm3dl = 0x00;/ _tm3dh = 0x00; _tm3c0=0b100101
20、10; /7.784M 停止不分频关闭100 512P高三位 本来应该8m实验测得7.784M _tm3c1=0b10101000; /工作模式输出模式高有效同相向上计数(p匹配双pwm输出模式)/ _tm3al = 0x80;/a/ _tm3ah = 0x02;/a _tm3c0 &=(1 7); /运行定时器 _tm3c0 |= (1 =20) num=0; if(zuo=11) zuo=0; car_zuo(); delay200ms(10);car_clear();car_stop(); if(you=11) you=0; car_you(); delay200ms(10);car_clear();car_stop(); if(qian=11) qian=0; car_qian();delay200ms(10);car_clear();car_stop(); if(hou=11) hou=0; car_hou(); delay200ms(10);car_clear();car_stop(); else led=0;
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1