基于51的避障循迹重力感应遥控的智能小车设计(c语言)_毕业设计论文(编辑修改稿)内容摘要:
脚 (Sync pin)支援视频电子影相稳定技术与 GPS 可程式控制的中断 (interrupt)支援姿势识别、摇摄、画面放大缩小、滚动、快速下降中断、highG 中断、零动作感应、触击感应、摇动感应功能。 VDD 供电电压为 177。 5%、 177。 5%、 177。 5%; VDDIO 为 177。 5% 陀螺仪运作电流: 5mA,陀螺仪待命电流: 5μA;加速器运作电流: 350μA,加速器省电模式电流: 20μA@10Hz 高达 400kHz 快速模式的 I2C,或最高至 20MHz 的 SPI 串 行主机接口 (serial host interface) 内建频率产生器在所有温度范围 (full temperature range)仅有 177。 1%频率变化。 使用者亲自测试 10,000 g 碰撞容忍度 为可携式产品量身订作的最小最薄包装 ( QFN) 符合 RoHS 及环境标准 6 效果图 6 软件设计 编译语言的选取 目前, STC89C52 单片机的开发多为支持两种语言,一种是汇编语言,另一种是 C 语言,而这两种语言各有 其优缺点。 汇编语言:效率高,对硬件的可操控性更强,体积小,但不易维护,可移植性很差。 C 语言 :效率比较低,硬件可操控性比较差,目标代码体积大,但容易维护,可移植性很好。 而在本设计里面,程序需要接近底层,但程序要解决的问题繁多,逻辑关系也比较复杂,代码量也比较大,又考虑到产品以后需要升级,各方面综合考虑,主要以 C51 语言来编写本设计的程序是最佳选择。 软件调试平台 Keil for C51 是美国 Keil Software 公司出品的 C 语言软件开发系统,与汇编相比, C 语言在功能上、结构性、可读性、可维护 性上有明显的优势,因而易学易用。 Keil C51 软件提供丰富的库函数和功能强大的集成开发调试工具,全 Windows 界面。 另外重要的一点,只要看一下编译后生成的汇编代码,就能体会到 Keil for C51 生成的目标代码效率非常之高,多数语句生成的汇编代码很紧凑,容易理解。 在开发大型软件时更能体现高级语言的优势。 下面详细介绍 Keil for C51 开发系统各部分功能和使用。 C51 开发中除必要的硬件外,同样离不开软件,我们写的源程序要变为C51 可以执行的机器码有两种方法,一种是手工汇编,另一种是机器汇编,目前已 极少使用手工汇编的方法了。 随着 C51 开发技术的不断发展,从普遍使用汇编语言到逐渐使用高级语言开发,单片机的开发软件也在不断发展, Keil软件 除了致力于单片机的编程开发平台外,还针对 目前最流行 C51开发 项目出品了 Keil for 51 软件 平台以及支持在线调试的串口烧写。 从近年来各仿真机厂商纷纷宣布全面支持 Keil 即可看出。 Keil 提供了包括 C 编译器、宏汇编、连接器、库管理和一个功能强大的仿真调试器等在内的完整开发方案,通过一个集成开发环境( uVision2)将这些部份组合在一起。 小车端程序 文件一 include include include ..\header\ include ..\header\ void R_S_Byte(uchar R_Byte) { SBUF = R_Byte。 while( TI == 0 )。 //查询法 TI = 0。 } /**********定时器初始化程序 ***************/ void T0T1_init() { EA=1。 ET1=1。 ET0=1。 TMOD=0x11。 //定时器 0 负责 小车速度控制 定时器 1 负责 超声波测距和舵机控制 TH0=(65536500)/256。 TL0=(65536500)%256。 TH1=(65536500)/256。 TL1=(65536500)%256。 TL1=0。 TH1=0。 TR0=1。 TR1=1。 } void StartModule(void)//超声波测距子函数 { TX=1。 //启动一次模块 _nop_()。 _nop_()。 _nop_()。 _nop_()。 _nop_()。 _nop_()。 _nop_()。 _nop_()。 _nop_()。 _nop_()。 _nop_()。 _nop_()。 _nop_()。 _nop_()。 _nop_()。 _nop_()。 _nop_()。 _nop_()。 _nop_()。 _nop_()。 _nop_()。 TX=0。 } void Conut(void)//通过超声波测量的数据计算距离 { if(csflag==0) { time=TH1*256+TL1。 TH1=0。 TL1=0。 S=(time*)/10。 //算出来是 mm // if(S499)。 } else { csflag=0。 S=600。 //如果定时器溢出则距离 S=600 } if(jd==3) {middleS=S。 }// 测量正前方 else if(jd==2) {leftS=S。 }//测量左前方 else if(jd==4) {rightS=S。 }//测量右前方 } /**********************接收遥控器的状态标志 **********************/ void RX_STATE(void) { uchar RxBuf[4]。 uchar SIGN=0。 if(nRF24L01_RxPacket(RxBuf))//如果收到遥控器的数据则进入 { led2=~led2。 R_S_Byte(RxBuf[0])。 SIGN=RxBuf[2]。 //判断倾斜的方向 X_SIAN=0:前方 X_SIAN=1:下方 STATE=RxBuf[3]。 LED_FLAG=(SIGNamp。 0x04)2。 //判断小车灯光控制位 CONTROL_MODE_FLAG=(STATEamp。 0xf0)4。 //读取当前状态标志 if(LED_FLAG) LED1=1。 else if(LED_FLAG==0) LED1=0。 } } void delay_RX(uint z)//避障模式下当出现 while 循环时用的延时函数 , { uint x,y。 for(x=110。 x0。 x) { for(y=z。 y0。 y)。 RX_STATE()。 //扫描无线模块接收到的新指令 } } void measured(unsigned char fs)//测距函数 jd=3 测量正前方 jd=2 测量左前方 jd=4 测量右前方 { TH1 = (65536500)/256。 TL1 = (65536500)%256。 //12MZ 晶振, mode=0。 jd=fs。 count2=0。 TR1=1。 delay_RX(500)。 TR1=0。 mode=1。 TH1=0。 TL1=0。 StartModule()。 while(!RX)。 //当 RX 为零时等待 TR1=1。 //开启计数 while(RX)。 //当 RX 为 1 计数并等待 TR1=0。 //关闭计数 Conut()。 } /********************避障模式子函数 ***********************/ void csbmode(void) { unsigned char temp。 TR1=0。 mode=1。 TH1=0。 TL1=0。 StartModule()。 while(!RX)。 //当 RX 为零时等待 TR1=1。 //开启计数 while(RX)。 //当 RX 为 1 计数并等待 TR1=0。 //关闭计数 Conut()。 //测量前方距离 delay_RX(80)。 speed1=16。 speed2=16。 while(middleS500 amp。 amp。 CONTROL_MODE_FLAG==3) //当前方空间大于 300mm时保持 { IN1_1=0。 IN1_2=1。 IN2_1=0。 IN2_2=1。 //小车前进 TR1=0。 mode=1。 TH1=0。 TL1=0。 StartModule()。 while(!RX)。 //当 RX 为零时等待 TR1=1。 //开启计数 while(RX)。 //当 RX 为 1 计数并等待 TR1=0。 //关闭计数 Conut()。 delay_RX(2)。 } IN1_1=0。 IN1_2=0。 IN2_1=0。 IN2_2=0。 //小车停止 speed1=0。 speed2=0。 measured(2)。 measured(4)。 TH1 = (65536500)/256。 //舵 机 复位 TL1 = (65536500)%256。 //12MZ 晶振, mode=0。 jd=3。 count2=0。 TR1=1。 delay_RX(500)。 TR1=0。 if(leftS250||rightS250) { temp=middleS。 speed1=20。 speed2=20。 IN1_1=1。 IN1_2=0。 IN2_1=1。 IN2_2=0。 //小车后退 while((middleStemp)200amp。 amp。 CONTROL_MODE_FLAG==3) { speed1=20。 speed2=20。 delay_RX(2)。 TR1=0。 mode=1。 TH1=0。 TL1=0。 StartModule()。 while(!RX)。 //当 RX 为零时等待 TR1=1。 //开启计数 while(RX)。 //当 RX 为 1 计数并等待 TR1=0。 //关闭计数 Conut()。 } speed1=20。 speed2=20。 if(leftSrightS) { IN1_1=1。 IN1_2=0。 IN2_1=0。 IN2_2=1。 } else { IN1_1=0。 IN1_2=1。 IN2_1=1。 IN2_2=0。 } delay_RX(500)。 speed1=0。 speed2=0。 IN1_1=0。 IN1_2=0。 IN2_1=0。 IN2_2=0。 //小车停止 measured(2)。 measured(4)。 TH1 = (65536500)/256。 //舵 机 复位 TL1 = (65536500)%256。 //12MZ 晶振, mode=0。 jd=3。 count2=0。 TR1=1。 delay_RX(500)。 TR1=0。 } if(leftSrightS) { speed1=0。 speed2=0。 IN1_1=1。 IN1_2=0。 IN2_1=0。 IN2_2=1。 while(middleS600amp。 amp。 CONTROL_MODE_FLAG==3) { speed1=17。 speed2=17。 delay_RX(5)。 TR1=0。 mode=1。 TH1=0。 TL1=0。 StartModul。基于51的避障循迹重力感应遥控的智能小车设计(c语言)_毕业设计论文(编辑修改稿)
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。
用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。