




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、2014年全国大学生电子设计竞赛金属物体探测定位器 B题【本科组】2014年8月15日金属物体探测定位器(B题)【本科组】摘要:本设计采用单片机MSP430f5529作为金属探头的检测和控制核心,实现金属扫描式检测。精准的判断金属并且确定其中心位置等功能。该探测器采用TI公司LDC1000电感/数字转换器评估板(AY-LDC1000)作为金属物体探头,探头上应有定位指针,可以给出明显定位指示。探头可在水平放置的玻璃板上移动。电机控制核心采用MSP430f5529单片机,控制探头来实现基本的探测功能。关键词:智能控制 金属检测Abstract:Thisdesign usesasingle chi
2、pMSP430f5529coremetalprobedetection and control, to achieveametaldetectorscan.Accuratejudgmentofmetalanddetermineitscentral location, and other functions.Thedetectoruses TIsLDC1000inductance/DigitalConverter Evaluation Board(AY-LDC1000)as a metalobjectprobe,theprobeshouldbepositioningthe pointer, yo
3、u cangiveclearpositionindication.Probe can bemoved in ahorizontalglassplate.MotorcontrolMCUcore usingMSP430f5529controlprobeto achievebasicdetection function.Keywords: Intelligent Control Metal Detector1系统方案本系统主要由系统方案模块、控制模块、检测模块模块、电源模块组成,下面分别论证这几个模块的选择。1.1 系统方案模块论证与选择 方案一:使用智能电动车,这个方案,机械结构构成特别方便,只需
4、要制作硬件电路模块。但是在使用时,比赛时间紧急,控制算法比较难于实现, 方案二:使用滑轮导轨作为探测系统框架结构,该系统是实现方便,而且需要的材料也可以从生活找到,易于操作 所以选择方案二作为系统控制器1.2 控制器的论证与选择微处理器型号多样,微控制器的选择关系到系统的整体设计,常用的单片机有:方案一:S52单片机。AT89S52是一般设计中经常使用的一种处理器。AT89S52具有8K的可编程Flash存储器,对不是很复杂的程序设计已经完全够用了。AT89S52有256个字节的RAM,看门狗定时器、全双工串口,以及两个数据指针。AT89S52的中断为二级六向量,以及3个16位的定时器(/计数
5、器)。在其空闲的模式下,CPU停止工作的情况下,允许串口、中断、RAM、定时器/计数器继续工作4。AT89S52单片机价格低,使用简单易于操作,但该单片机没有AD模块,I/O口较少,作为8位处理器信息的处理能力相对较低,并非最佳选择4。方案二:M32单片机。STM32F103系列单片机的内核是基于Cortex-M3的,内置12位AD、三路USART通讯口和四个16位定时器等丰富的资源,作为32位处理器系统的时钟频率最高为72MHz。STM32F103RBT6处理器有128KB 的Flash,不同型号的STM有不同大小Flash,选择合适大小的就可以,该处理器可以内嵌20KB的SRAM。STM3
6、2F103RBT6型号的芯片有80个外部I/O端口,可以与外界快速进行信息交互,定时器和通讯接口也是相当丰富的。STM32单片机资源充足,处理能力强,但其丰富的资源也决定了其操作的复杂性,并非处理能力越强越好,合适的资源和处理能力才是设计所需要的。 方案三:MSP430F5529,德州仪器MSP430系列微控制器的体系结构,结合广泛的低功耗模式优化来达到延长电池寿命在便携式测量的应用。设备功能强大的16位RISC CPU、16位寄存器和最大的代码效率。数控振荡器(DCO)允许在3.5s(典型的)从低功耗模式唤醒到主动模式。单片机配置集成的USB层和物理层支持USB 2.0,四个16位定时器,一
7、个高性能的12位模拟数字转换器(ADC),两个通用串行通信接口(USCI),硬件乘法器、DMA、实时时钟模块与报警功能,和63 I / O口线。 因此选择MSP430F5529作为控制器1.3检测电路分析 LDC1000是世界首款电感到数字转换器。提供低功耗,小封装,低成本的解决方案,它的SPI接口可以很方便链接MCU。LDC1000只需要外接一个PCB线圈或者自制线圈就可以实现非接触式电感检测。LDC1000的电感检测并不是指向Q表那样测试线圈的电感量,而是可以测试外部金属物体和LDC相连的测试线圈的空间位置关系。利用LDC1000这个特性配以外部设计的金属物体即可很方便实现:水平或者垂直距
8、离检测;角度检测;唯一监测;运动检测;振动检测;金属成分检测。可以广泛应用在汽车、消费电子、计算机、工业、通信和医疗;领域。LDC-1000接口F5529LP接口MCU接口说明SDOP4,2/UCB1SOMIMISOSPI数据输出SDFP4.1/UCB1SIMOMISISPI数据输入SCLKP4.3/UCB1CLKSCLKSPI时钟信号CSBP4.0/UCB1STEGPIO从设备使能信号INTP1.2INT/GPO中断接口TBCLKP1.0/ACLKTIMER/Aux CLK频率计数时钟频率2结构框图 2.1系统框图声光报警电路电机模块电源电路MCU 2.2系统分析 设计并制作一个可自主移动的
9、金属物体探测定位器(以下简称探测器),可探测置于玻璃板下的金属物体并给出定位指示。该探测器需采用TI公司LDC1000电感/数字转换器评估板(AY-LDC1000)作为金属物体探头,探头上应有定位指针,以给出明显定位指示。探头可在水平放置的玻璃板上移动。用直径2(mm)的铁丝围成约50cm50cm的正方形闭合框作为探测区边界置于玻璃板下,示意图见图1。玻璃板下铁丝方框玻璃板下金属物体图1 金属物体探测环境示意图无色透明普通玻璃板或有机玻璃板探头进入区50cm50cm1. 要求(1) 在探测区域内某处(距探测边界5cm)玻璃下放置一枚直径约19mm的镀镍钢芯1角硬币(第五套人民币的1角硬币)。探
10、头能从“探头进入区”一侧任意指定位置和方向自行进入探测区(铁丝框包围区域)。通过探测,定位指针应指在硬币边沿之内,探测定位速度越快越好,且探测定位总时间应不超过2分钟。完成定位时给出声-光指示,此后探头不得再移动。(30分)(2) 将1角硬币更换成直径约25mm的镀镍钢芯1元硬币(第五套人民币1元硬币),重复要求(1)的探测过程。定位完成后,定位指针与硬币圆心之间的定位误差应控制在5mm以内;探测定位速度越快越好,探测定位总时间不应超过2分钟。完成定位时给出声-光指示,此后探头不得再移动。(30分)(3) 将硬币改为自制圆铁环(用2铁丝绕制),铁环外直径4cm。重复要求(1)的探测过程,应使定
11、位指针尽可能指向铁环圆心,定位误差应控制在5mm以内;完成定位时给出声-光指示,此后探头不得再移动,探测定位总时间应不超过3分钟。(30分) 2.3制作实物分析开始Y向电机想前走,然后X轴探测器,探测是否有金属,如果没有则X向电机停止,运作Y,然后再运作X方向电机,如果没有电机则继续运作Y方向电机,如果有电机则进行声光报警。3软件部分: 3.1软件介绍 软件部分软件部分包括主函数控制算法模块程序,步进电机控制程序模块,AY-JDC1000电感到数字转换器SPI同步通信模块程序及其基本的声光展示模块程序1.LDC1000SPID通信模块SPI通用协议,SPI扩展通信协议2.步进电机采用四相八拍控
12、制正反转3.主函数控制算法模块程序3.2软件流程图附录:程序代码;结论对系统的电源模块、金属检测部分、驱动电路等的测试,本设计基本达到设计制作要求。总结本系统以单片机MSP430f5529为核心部分,利用单片机控制电机驱动模块使得探针可以自动扫描金属,运用一套软件的算法实现了金属探测仪的移动与检测,和蜂鸣器的报警等功能,最终使金属探测器完成竞赛题目中的任务。在系统设计过程中,力求硬件线路简单,充分发挥软件编程方便灵活的特点,来满足系统设计要求。因为时间有限,所以该系统还有许多改进的地方:金属探头制作在移动过程中距离玻璃的距离并不是一直固定的,因此,可以在探头上制作轮子等减少摩擦。在本次设计的过
13、程中,遇到了许多突发事件和各种困难,设计制作曾一度中断,但通过仔细分析和自我状态调整后解决了问题。在这个过程中我们深刻得体会到共同协作和团队精神的重要性,深刻认识到了实际情况和理论的差距,提高了自己解决问题的能力。主程序:#include#includemsp430.h#includeHAL_PMM.h/电源管理库文件#includeHAL_UCS.h/Clock System Control,系统时钟配置#includeHAL_Board.h/实验板处理器外围输入输出端口基本配置#includeHAL_Buttons.h/按键中断配置#includeHAL_Dogs102x6.h/液晶模块配
14、置#includeHAL_Menu.h/菜单界面配置#includeHAL_Wheel.h/齿轮电位计配置#includeLPM.h/显示菜单函数声明,并返回利用滚动齿轮电位计选择的菜单项目数#includePMM.h/Power Management Module,电源配置#includelab1.h#includeLDC1000_cmd.h/LDC1000/定义时间计数个数uint16_ttimeoutCounter;int flag=0;/用于判断定时100msint k=0;/用于累加定时/ This image has been created by ImageDog using t
15、i_bug.jpgstaticconstuint8_ttiBug = 0x42, / Image width in pixels 0x08, / Image height in rows (1 row = 8 pixels) 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0
16、xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0
17、x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x0f, 0x0f, 0x0f, 0x08, 0x00, 0x00, 0x0f, 0xcf, 0xcf, 0xcf, 0xcf, 0xcf, 0xc8, 0x00, 0x00, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x00, 0x00, 0
18、x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xf0, 0xf0, 0xf0, 0xf0, 0xc0, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xc0, 0x00, 0x00, 0
19、xf0, 0xf0, 0xf0, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0x70, 0x7c, 0x7e, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xcf, 0x0f, 0
20、x0f, 0x0f, 0x00, 0x00, 0x01, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x01, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xc0, 0xe0, 0xf0, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0
21、xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x80, 0x00, 0x0e, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfc, 0x80, 0x00, 0x0e, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0
22、x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xe0, 0xf0, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf0, 0xe0, 0xc0, 0x80, 0x80, 0x80, 0xc0, 0xc0, 0xf0, 0xf8, 0xfe, 0xff, 0xff, 0xff, 0xff, 0x03, 0x03, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x0f, 0xff, 0xff, 0
23、xff, 0xfe, 0xfe, 0xfc, 0xf8, 0xf0, 0xf0, 0xe0, 0xe0, 0xc0, 0xc0, 0xc0, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xe0, 0xf8, 0xfe, 0xff, 0xff, 0
24、xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xe0, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0
25、x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xc0, 0xf0, 0xf0, 0xf8, 0xfc, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00;/-步进电机1用的延时函数及其他函数声明
26、#define CPU_F (double)#definedelay_us(x) _delay_cycles(long)(CPU_F*(double)x/.0)#definedelay_ms(x) _delay_cycles(long)(CPU_F*(double)x/1000.0)staticintstep_index1; /staticintstep_index2; /voiddelay(unsignedintendcount); /延时函数,延时endcount个0.5msvoiddelay_nms1(unsignedint n);voiddelay_5ms1(void);voiddel
27、ay_nms(unsignedint n);voiddelay_5ms(void);/P2口延时函数voiddelay_nms2(unsignedint n);voiddelay_5ms2(void);staticinta1; /a1=0用于在探测到金属时停止步进电机/两个步进电机控制程序/voidmotor2(unsignedint a2);/P4口用于垂直往前走voidmotor4(unsignedint a4);/P4口用于垂直往后推voidmotor21(unsignedint a21);/P2口用于水平左走/a3用于步进电机右转时间角度voidmotor22(unsignedint
28、a22); /P2口用于水平右走/a4用于步进电机后退时间角度/LDC1000变量定义配置及函数声明/_*staticuint8_ttxlen;staticuint8_trxlen;staticuint8_t *txbuf;staticuint8_t *rxbuf;staticuint8_ttxaddr;staticuint8_twordbuf2;uint8_tproximtyData2;uint8_tfrequencyData3;unsignedintproximtyDataMIN;unsignedintproxin;/存储最小RP数据unsignedintfrequencyDataMIN;
29、unsignedintproximtyDataMAX;unsignedintfrequencyDataMAX;unsignedintproximtyDataTEMP;unsignedintfrequencyDataTEMP;#define RPMIN 0x3A#define RPMAX 0x13char ab1=1; /用于水平和垂直电机转动,为0时停止所有电机,代表此/试验一程序找到了一个金属物体,如需进一步测量,执行后面的程序int ab2=1; /用于选择水平电机左转或右转char ab3=1; /用于停止水平电机转动,为0是停止水平扫描电机,代表在水平扫描时找到了一个金属物体unsig
30、nedintproxin = 4600; /是否找到金属物体的大小判断数值界限,此数值需根据现场调试具体实际数值确定voidscan(void)inti;Dogs102x6_clearScreen(); /清屏spi_readBytes(LDC1000_CMD_PROXLSB,&proximtyData0,2);spi_readBytes(LDC1000_CMD_FREQCTRLSB,&frequencyData0,3);proximtyDataMAX = (unsignedchar) proximtyData18) + proximtyData 0;frequencyDataMAX = (u
31、nsignedchar)frequencyData18) + frequencyData0;proximtyDataMIN = proximtyDataMAX;frequencyDataMIN = frequencyDataMAX;for (i=0;i50;i+)spi_readBytes(LDC1000_CMD_PROXLSB,&proximtyData0,2);spi_readBytes(LDC1000_CMD_FREQCTRLSB,&frequencyData0,3);proximtyDataTEMP = (unsignedchar)proximtyData18) + proximtyD
32、ata 0;frequencyDataTEMP = (unsignedchar)frequencyData18) + frequencyData0;if (proximtyDataTEMPproximtyDataMIN)proximtyDataMIN = proximtyDataTEMP;if (frequencyDataTEMPproximtyDataMAX)proximtyDataMAX = proximtyDataTEMP;if (frequencyDataTEMPfrequencyDataMAX)frequencyDataMAX = frequencyDataTEMP;Trans_va
33、l(proximtyDataMIN,1);Trans_val(proximtyDataMAX,2);Trans_val(frequencyDataMIN,3);Trans_val(frequencyDataMAX,4);if(proximtyDataMIN 4600)P1DIR |= BIT0 + BIT1 + BIT2 + BIT3 + BIT4 + BIT5;P1OUT |= BIT0 + BIT1 + BIT2 + BIT3 + BIT4 + BIT5;P8DIR |= BIT1 + BIT2;P8OUT |= BIT1 + BIT2;ab3 = 0;ab1 = 0;P7DIR |=BI
34、T0;P7OUT |=BIT0;while (1)P7OUT =BIT0;_delay_cycles(8000);elseP1OUT &= (BIT0 + BIT1 + BIT2 + BIT3 + BIT4 + BIT5);P8OUT &= (BIT1 + BIT2);ab3 = 1;ab1 = 1;/_*voidmain(void)uint8_t contrast = *(unsignedchar *)contrastSetpointAddress); /读取FLASH中对比度值uint8_t brightness = *(unsignedchar *)brightnessSetpointA
35、ddress); /读取FLASH中背光值SetVCore(3); /设VCore为最大/ Basic GPIO initializationBoard_init(); /初始化GPIO/*LDC1000*/PORT INIT P1DIR |= BIT0; / LDC CLK for Freq counter (set to output selected clock) P1SEL |=BIT0;/INTB INIT/ /UCS SETTING UCSCTL3 |= SELREF_REFOCLK; _bis_SR_register(SCG0); / Disable the FLL contro
36、l loop UCSCTL0 = 0x0000; / Set lowest possible DCOx, MODx UCSCTL1 = DCORSEL_6; / Select DCO range 24MHz operationUCSCTL2 = FLLD_0 + 731; / Set DCO Multiplier for 24MHz/ (N + 1) * FLLRef = Fdco/ (731 + 1) * 32768 = 24MHz/ Set FLL Div = fDCOCLK/2 _bic_SR_register(SCG0); / Enable the FLL control loopUC
37、SCTL4 |= SELA_DCOCLK + SELS_XT1CLK +SELM_DCOCLK; /ACLK=24Mhz,SMCLK=4Mhz,MCLK=24MHz Source select UCSCTL5 |= DIVPA_2; /ACLK output divide UCSCTL6 |= XT1DRIVE_3 + XCAP_0; /XT1 cap/ initialize SPI P2DIR |= BIT0; / P2.0 IO Output TO LDC1000 STE P2SEL &= BIT0;/SPI SETUP P3SEL |=BIT0 + BIT1 + BIT2; /UCB0S
38、PI P3.0 P3.1 P3.2 UCB0CTL1 |=UCSWRST; UCB0CTL0 |= UCMST+UCMSB+UCSYNC+UCCKPL; / 3-pin, 8-bit SPI master,Clock polarity high, MSB/test/反馈选择位,为1,发送的数被自己接收,用于测试,正常使用时注释掉 UCB0CTL1 |= UCSSEL_1; / CLOCK ACLK UCB0BR0 = 0x01; UCB0BR1 = 0; UCB0CTL1 &= UCSWRST;/*TEST*TEST*TEST*/read all REG value using default
39、 settingcharorgVal20;/write to registerspi_writeByte(LDC1000_CMD_RPMAX, RPMAX);spi_writeByte(LDC1000_CMD_RPMIN, RPMIN);spi_writeByte(LDC1000_CMD_SENSORFREQ, 0x94);spi_writeByte(LDC1000_CMD_LDCCONFIG, 0x17);spi_writeByte(LDC1000_CMD_CLKCONFIG, 0x02);spi_writeByte(LDC1000_CMD_INTCONFIG, 0x02);spi_writ
40、eByte(LDC1000_CMD_THRESHILSB, 0x50);spi_writeByte(LDC1000_CMD_THRESHIMSB, 0x14);spi_writeByte(LDC1000_CMD_THRESLOLSB, 0xC0);spi_writeByte(LDC1000_CMD_THRESLOMSB, 0x12);spi_writeByte(LDC1000_CMD_PWRCONFIG, 0x01);/read all registersspi_readBytes(LDC1000_CMD_REVID, &orgVal0,12); _enable_interrupt(); /使
41、能全局中断/ Setup real time clockSetupRTC(); /设置实时时钟/ Set up LCD Dogs102x6_init(); /初始化LCD Dogs102x6_backlightInit(); /背光初始化contrast = 11;brightness = 11; Dogs102x6_setBacklight(brightness); /设置初始背光值 Dogs102x6_setContrast(contrast); /设置初始对比度值 Dogs102x6_clearScreen(); /清屏/ Set up wheelWheel_init(); /初始化齿轮
42、电位计Buttons_init(BUTTON_ALL); /初始化按键Buttons_interruptEnable(BUTTON_ALL); /使能所有按键中断buttonsPressed = 0; /键值清零/ Display TI logo Dogs102x6_imageDraw(tiBug, 0, 16); /显示TI图案/两个步进电机控制/a1用于步进电机正转时间,反转时间,停止转动时间;b1用于选择步进电机是正转,反转还是停止;c1用于选择电机的转动速度/推荐参数:a1-1000,b1-0-正转,1-反转,c1-为2时最佳/test/电机IO口设置P4DIR |=BIT4;P4DI
43、R |=BIT5;P4DIR |=BIT6;P4DIR |=BIT7;P4OUT&=BIT4;P4OUT&=BIT5;P4OUT&=BIT6;P4OUT&=BIT7;P7OUT &= (BIT0 + BIT1 + BIT2 + BIT3);P7DIR |= BIT0 + BIT1 + BIT2 + BIT3; Dogs102x6_clearScreen();/开定时器A中断,以检测并显示是否找到金属 TA2CCTL0 = CCIE; / CCR0 interrupt enabled TA2CCR0 = 50000; /每2ms执行一次中断,进入程序判断是否找到金属 TA2CTL = TASSE
44、L_2 + MC_2 + TACLR; / SMCLK, contmode, clear TAR _bis_SR_register(GIE); /enable interruptswhile(ab1) /扫描到金属后才跳出循环 /while1inti=0;ab2+;if(ab2 = 1000)ab2=2; /ab2=9999时向右走,则走完后ab2+后应向左走/ab2是偶数,则水平向左扫描if(ab2%2) = 0)/ab2 2/for testfor(i=200;i0;i-) /电机走动2000个计数周期/forif(ab3 = 1) /水平扫描时10个周期时没有找到金属,则继续水平扫描10
45、个周期,直到满2000个周期/ab3=1没检测到金属motor21(10);/P2口用于水平左走走一次2000用了14.5秒,从右手走起/if(ab3 = 1)if(flag = 1) /每隔1000ms则检测金属scan();flag =0;/for/ab2 2/ab2是奇数,则水平向右扫描if(ab2 % 2)=1) /ab2是奇数,则水平向右扫描/ab2 1for(i=200;i0;i-) /电机走动2000个计数周期/forif(flag = 1) /每隔500ms则检测金属scan();flag = 0;if(ab3 = 1) /水平扫描时10个周期时没有找到金属,则继续水平扫描10
46、个周期,直到满2000个周期/ab3=1没检测到金属motor22(10); /P2口用于水平右走走一次2000用了14.5秒,从左手走起/if(ab3 = 1)/for/ab2if(ab3 = 1)/左或右扫描都没有找到硬币,则向前走一步motor2(33); /P4口用于垂直往前走一次走4厘米,走10次 /while(ab1 = 1)/main主函数标号/定义求余显示函数:将16位二进制整型数据,转换为5位十进制数据并在液晶102x6上分别显示出来externvoidTrans_val(unsignedintHex_Val,intnum)unsignedinta,b,c,d,e;uint8
47、_t ptr05; /用于保存转换好的十进制结果a = Hex_Val; /万位数b = a%10000; /千位数c = b%1000; /百位数d = c%100; /十位数e = d%10; /个位数ptr00 = a/10000;ptr00 = ptr00 + 0x30;ptr01 = b/1000;ptr01 = ptr01 + 0x30;ptr02 = c/100;ptr02 = ptr02 + 0x30;ptr03 = d/10;ptr03 = ptr03 + 0x30;ptr04 = e;ptr04 = ptr04 + 0x30;switch (num) case 1:Dogs102x6_stringDraw(0, 0, RPmin:, DOGS102x6_DRAW_NORMAL);Dogs102x6_clearRow(1);/Dogs102x6_stringDraw(1, 0, ptr0, DOGS102x6_DRAW_NORMAL);Dogs102x6_charDraw(1,0,ptr00,DOGS102x6_DRAW_NORMAL);/将一个字符写入确定行列的LCD液晶显示屏上Dogs102x6_charDraw(1,6,ptr01,DOGS
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 委托加工合同模板3篇
- 代理投票授权3篇
- 二手商业店买卖合同样本3篇
- 劳动合同解除决定通知协议决定3篇
- 户口迁移的严肃承诺3篇
- 保密性托管服务协议3篇
- 废品交易协议3篇
- 代为办理房产交易的委托书3篇
- 煤炭批发区域市场差异考核试卷
- 老年人辅助包装考核试卷
- 湖北省武汉市2025届高三下学期四月调研考试(二模)数学试题 含解析
- 高二下学期《家校携手凝共识齐心协力创辉煌》家长会
- 2025年人教版七年级下册英语全册教学设计
- 2024年大模型+RAG最佳实践报告
- 2024-2025学年人教版数学八年级下册期中检测卷(含答案)
- 教育的起源和古代东方文明古国的教育
- 有机化学6章对映异构-课件
- 抗菌药物使用强度(DDD)解析与控制
- T∕CACM 1064-2018 针刀医学临床 通用要求
- 招聘求职简历制作表格模板可编辑下载 精品简历模板 标准表格单页02
- 凑十法加法竖式运算(可打印)
评论
0/150
提交评论