基于合泰单片机无线鼠标智能小车控制.doc
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 单片机 无线 鼠标 智能 小车 控制
- 资源描述:
-
#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 // 5 字节宽度的发射地址 #define RX_ADR_WIDTH 5 // 5 字节宽度的接收地址 #define TX_PLOAD_WIDTH 1 // 数据通道有效数据宽度 #define RX_PLOAD_WIDTH 1 // 数据通道有效数据宽度 uchar TX_ADDRESS[TX_ADR_WIDTH]= {0x34,0x43,0x10,0x10,0x01}; //发送地址 uchar RX_ADDRESS[RX_ADR_WIDTH]= {0x34,0x43,0x10,0x10,0x01}; //接收地址 uchar gs[10]={0x00,0x01,0x80,0x01,0x00,0x02,0x80,0x02,0x00,0x03}; //低字节高字节 占空比数组 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 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 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 TxBuf[2]={}; uchar RxBuf[1]; //************************************** uchar sta; uchar m=3; unsigned char IN1,IN2,IN3,IN4;//对应芯片如向前1000 void 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;i〈x;i++) { GCC_DELAY(200000); } } /**********小车控制函数***********************/ void car_qian() { _pcs2=0b00100000;//STM0 C5 pwm _pcc5=0; _pcpu5=1; _pcs3=0b00000000;//STM0 C6 0 _pcc6=0; _pc6=0; } void car_hou() { _pcs2=0b00000000;//STM0 C5 0 _pcc5=1; _pcpu5=0; _pcs3=0b00000001;//STM0 C6 pwm _pcc6=0; _pcpu6=1; } void car_zuo() { _pds0=0b00000001;//STM3 D0 pwm _pdc0=0; _pdpu=1; _pds1=0b00000000;//STM3 D3 0 _pdc3=0; _pd3=0; } void car_you() { _pds0=0b00000000;//STM3 D0 0 _pdc0=1; _pdpu0=0; _pds1=0b00010000;//STM D3 pwm _pdc3=0; _pdpu3=1; } void car_stop() { _pcs2=0x00; _pcs3=0x00; _pds0=0x00; _pds1=0x00; _pcc6=0; _pc6=0; _pcc5=1; _pcpu5=0; _pdc0=1; _pdpu0=0; _pdc3=0; _pd3=0; } void car_clear() //清楚上次位移端口影响 { _pcs2=0x00; _pcs3=0x00; _pds0=0x00; _pds1=0x00; GCC_DELAY(20); } //******pwm占空比******** void pwm_gs() { if(m>5){m=5;} if(m〈1){m=1;} switch(m) { case 1: {_tm0al = 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 = 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; } //写一个字节到nrf24l01,同时从nrf24l01读出一个字节 //************************************************************************************* uchar SPI_RW(uchar data) { uchar i,temp=0; for(i=0;i〈8;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 _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 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 nRF24L01 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_ctr<uchars;uuchar_ctr++) { pBuf[uuchar_ctr] = SPI_RW(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_ctr〈uchars; uuchar_ctr++) { SPI_RW(*pBuf++); } _pa6=1; //关闭SPI return(status1); } void SetRX_Mode(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); // read 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_PLOAD, 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_REG + 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); //设置接收数据长度,本次设置为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高三位 本来应该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=0b10010110; //7.784M 停止不分频关闭100 512P高三位 本来应该8m实验测得7。784M _tm3c1=0b10101000; //工作模式输出模式高有效同相向上计数(p匹配双pwm输出模式) // _tm3al = 0x80;//a // _tm3ah = 0x02;//a _tm3c0 &=~(1 〈〈 7); //运行定时器 _tm3c0 |= (1 〈〈 3); //计数器On /* 计数值的上限是3FFH,这里取计数初值为356H,即每隔 (3FFH—356H)=169x1/(fsys/4)的时间触发一次中断*/ _mf0e = 1; //允许多功能中断0,多功能中断包括TM中断(INTC1寄存器bit1位) _emi = 1;//开总中断 } void main() { uchar num,zuo,you,qian,hou; num=0;zuo=0;you=0;qian=0;hou=0; Mcu_init(); init_NRF24L01(); SetRX_Mode(); //设置看门狗除能(使能应为:0b01010011) _wdtc = 0b10101011; _tm0al = 0x00;//a _tm0ah = 0x02;//a _tm3al = 0x00;//a _tm3ah = 0x02;//a time_init(); //定时器初始化 _emi = 1; //开总中断 while(1) { SetRX_Mode(); nRF24L01_RxPacket(RxBuf); GCC_DELAY(10000); if(nRF24L01_RxPacket(RxBuf)) { num++; if(RxBuf[0]==0x0a) {zuo++;} else if(RxBuf[0]==0x0b) {you++;} else if(RxBuf[0]==0x0c) {qian++;} else if(RxBuf[0]==0x0d) {hou++;} else if(RxBuf[0]==0x0e) {m++;pwm_gs();} else if(RxBuf[0]==0x0f) {m—-;pwm_gs();} if(num>=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; } } }展开阅读全文
咨信网温馨提示:1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,个别因单元格分列造成显示页码不一将协商解决,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前可先查看【教您几个在下载文档中可以更好的避免被坑】。
5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
6、文档遇到问题,请及时联系平台进行协调解决,联系【微信客服】、【QQ客服】,若有其他问题请点击或扫码反馈【服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【版权申诉】”,意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:0574-28810668;投诉电话:18658249818。




基于合泰单片机无线鼠标智能小车控制.doc



实名认证













自信AI助手
















微信客服
客服QQ
发送邮件
意见反馈



链接地址:https://www.zixin.com.cn/doc/3906410.html