版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
目录TOC\o"1-3"\h\u16004仓储安全监测小车的程序设计案例概述 0221811.1系统程序设计 0119161.1.1系统总体框图 020851.1.2循迹模块程序设计 1206991.1.3电机驱动模块程序设计 5189191.1.4安全监测模块程序设计 8107981.1.5报警模块程序设计 1362171.1.6显示模块程序设计 1434771.2系统调试与验证 15系统程序设计系统总体框图小车主控程序的主要任务是处理红外传感器,超声波、温度、湿度、气体浓度等模块传入给单片机的数据来完成其相应的监测任务,当系统接收到外部输入指令时,执行相应的指令子程序,当超声波传感器检测到移动机器前方有障碍物时,小车将停止电机等待障碍物通过;如果超声波传感器检测到前方没有障碍物,小车将继续按照设定轨迹循迹行驶。本文中移动小车主程序流程图如图4-1所示。图4-1主程序流程图循迹模块程序设计小车循迹模块程序设计流程图如图4-2所示,整体流程是:通过5个TCRT5000红外传感器返回单片机的值来判断小车所处位置,TCRT5000传感器的红外发射二极管不断发射红外线,当发射出的红外线没有被反射回来或被反射回来但强度不够大时,光敏管一直处于关断状态,红外线也可以被黑色吸收,此时模块的输出端为低电平,指示二极管一直处于熄灭状态;当红外线被反射回来且强度足够大,光敏管饱和,此时模块的输出端为高电平,指示二极管被点亮。利用红外传感器的这个特性,在小车前方安装5个TCRT5000红外传感器,当红外传感器感应到黑线时,输入给单片机的信号为0,其他传感器未感应到黑线,输入给单片机信号为1,由此来判断黑线位置,进而控制小车转向,循线行驶。图4-2循迹流程图本设计所选用的是五路循迹的方式控制小车的移动,根据小车前方5个红外传感器输入值0或1判断小车运行情况(如表4-1所示),循迹行驶,当中间红外传感器感应到黑线时,此时小车直线行驶,当左侧传感器感应到黑线时,说明此时小车往黑线右前方行驶,需要左转调整角度继续沿黑线行驶,同理当右侧传感器感应到黑线时小车需要右转调整车身角度继续循迹行驶。表4-1各传感器值与对应小车状态表L1L2M3R4R5状态11011直行10111小幅度左转01111大幅度左转11101小幅度右转11110大幅度右转根据各传感器的读取值,可以将5个传感器的数据整合为一个五位二进制数,最左侧对管对应最高位第五位,最右侧对应最低位,当黑线处于正中央时,此时数据为:11011,以此类推,总共有5种二进制数:11011,10111,01111,11101,11110,根据输入给单片机的二进制数,进行相应的转向操作。初始化程序:voidInfrared_Init(void){GPIO_InitTypeDefGPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); //使能PA端口时钟 GPIO_InitStructure.GPIO_Pin=GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5; //PA0~PA4,5个红外传感器端口配置GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING; //下拉输入GPIO_Init(GPIOA,&GPIO_InitStructure); //根据设定参数初始化GPIOA的5个IO口}超声波测距模块程序流程图如图4-3所示,整体流程为:首先单片机通过IO口TRIG触发测距,给至少10us的高电平信号;然后模块自动发送8个40khz的方波,自动检测是否有信号返回;若有信号返回,通过IO口ECHO输出一个高电平给单片机,高电平持续的时间就是超声波从发射到返回的时间。测试距离=(高电平时间*声速(340M/S))/2;图4-3超声波测距流程图超声波程序代码:floatSenor_Using(void){floatlength=0,sum=0;u16tim;uinti=0;/*测5次数据计算一次平均值*/while(i!=5){PBout(1)=1;//拉高信号,作为触发信号delay_us(20);//高电平信号超过10usPBout(1)=0;/*等待回响信号*/while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_2)==RESET);TIM_Cmd(TIM2,ENABLE);//回响信号到来,开启定时器计数i+=1;//每收到一次回响信号+1,收到5次就计算均值while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_2)==SET);//回响信号消失TIM_Cmd(TIM2,DISABLE);//关闭定时器tim=TIM_GetCounter(TIM2);//获取计TIM2数寄存器中的计数值,一边计算回响信号时间length=(tim+overcount*1000)/58.0;//通过回响信号计算距离sum=length+sum;TIM2->CNT=0;//将TIM2计数寄存器的计数值清零overcount=0;//中断溢出次数清零delay_ms(200);}length=sum/5;returnlength;//距离作为函数返回值 }电机驱动模块程序设计电机驱动模块的程序设计主要是针对L298N模块的程序设计,在本设计中,采用的是三轮小车,其中两个驱动轮,一个从动轮,一个L298N模块可同时控制两个直流电机工作,因此只需一个L298N电机驱动模块即可完成对两个驱动轮的程序设计,电机驱动模块程序流程图如图4-4所示。图4-4电机驱动程序流程图小车电机驱动程序:voidturn_circle(intangle){ //正负代表方向,正为右转负为左转 if(angle<0) {TIM_SetCompare1(TIM4,0); TIM_SetCompare2(TIM4,50); TIM_SetCompare3(TIM4,50); TIM_SetCompare4(TIM4,0); delay_ms(-angle); } else if(angle>0) {TIM_SetCompare1(TIM4,50); TIM_SetCompare2(TIM4,0); TIM_SetCompare3(TIM4,0); TIM_SetCompare4(TIM4,50); delay_ms(angle); }}voidgo_forward(intdistance){ //正负代表方向,正为前进,负为后退 if(distance>0) { TIM_SetCompare1(TIM4,40); TIM_SetCompare2(TIM4,0); TIM_SetCompare3(TIM4,40); TIM_SetCompare4(TIM4,0); delay_ms(distance); } elseif(distance<0) { TIM_SetCompare1(TIM4,0); TIM_SetCompare2(TIM4,40); TIM_SetCompare3(TIM4,0); TIM_SetCompare4(TIM4,40); delay_ms(-distance); } 安全监测模块程序设计温度模块程序设计DHT11数字湿温度传感器采用单总线数据格式。即,单个数据引脚端口完成输入输出双向传输。其数据包由5Byte(40Bit)组成。数据分小数部分和整数部分,一次完整的数据传输为40bit,高位先出。数据格式:8bit湿度整数数据+8bit湿度小数数据+8bit温度整数数据+8bit温度小数数据+8bit校验和校验和数据为前四个字节相加。传感器数据输出的是未编码的二进制数据。数据(湿度、温度、整数、小数)之间应该分开处理。计算方法:HUMI(湿度)=byte4.byte3(%RH)TEMP(温度)=byte2.byte1(℃)JIAOYAN(校验)=byte4+byte3+byte2+byte1=73(=HMNI+TEMP)(校验正确)主机发送开始信号后,延时等待20us-40us后读取DHT11的回应信号,读取总线为低电平,说明DHT11发送响应信号,DHT11发送响应信号后,再把总线拉高,准备发送数据,每一个bit数据都以低电平开始,DHT11模块程序设计流程图如图4-5所示。步骤一:DHT11上电后(DHT11上电后要等待1S以越过不稳定状态在此期间不能发送任何指令),测试环境温湿度数据,幵记录数据,同时DHT11的DATA数据线由上拉电阻拉高一直保持高电平;此时DHT11的DATA引脚处于输入状态,时刻检测外部信号。步骤二:微处理器的I/O设置为输出同时输出低电平,且低电平保持时间不能小于18ms,然后微处理器的I/O设置为输入状态,由于上拉电阻,微处理器的I/O即DHT11的DATA数据线也随之变高,等待DHT11作出回答信号,步骤三:DHT11的DATA引脚检测到外部信号有低电平时,等待外部信号低电平结束,延迟后DHT11的DATA引脚处于输出状态,输出80微秒的低电平作为应答信号,紧接着输出80微秒的高电平通知外设准备接收数据,微处理器的I/O此时处于输入状态,检测到I/O有低电平(DHT11回应信号)后,等待80微秒的高电平后的数据接收。图4-5测量温湿度程序流程图温湿度测量程序:intDHT11_ReadData(void){ unsignedintcout=1; unsignedintT_H,T_L,H_H,H_L,Check; //设置为IO口输出模式 DHT_Set_Output(); //开始起始信号 DHT_ResetBit(); delay_ms(25); //拉低至少18ms DHT_SetBit(); delay_us(20); //拉高20~40us //设置为IO口输入模式 DHT_Set_Input(); //读取响应 if(DHT_ReadBit()==Bit_RESET) { //等待80us的低电平 cout=1; while(!DHT_ReadBit()&&cout++); //等待80us的高电平 cout=1; while(DHT_ReadBit()&&cout++); //读取8bit的湿度整数数据 H_H=DH21_ReadByte(); //读取8bit的湿度小数数据 H_L=DH21_ReadByte(); //读取8bit的温度整数数据 T_H=DH21_ReadByte(); //读取8bit的温度小数数据 T_L=DH21_ReadByte(); //读取8bit的校验和 Check=DH21_ReadByte(); if(Check==(H_H+H_L+T_H+T_L)) { DHT11.Hum_H=H_H; DHT11.Hum_L=H_L; DHT11.Tem_H=T_H; DHT11.Tem_L=T_L; return1; } else { return0; } } return0;}intDHT11_GetTem(void){//整和成温度值 return(DHT11.Tem_H<<8|DHT11.Tem_L);}intDHT11_GetHum(void){//整和成湿度值 return(DHT11.Hum_H<<8|DHT11.Hum_L);}烟雾浓度测量程序设计烟雾监测程序流程图如图4-6所示。MQ-2型烟雾传感器在开始监测之前需要预热一段时间才能正常采集烟雾浓度信息。程序在初始化结束后,将进入工作状态,将从MQ-2获取的信号放大并转换成电压值,电压值越高烟雾浓度越高,根据相应公式可以将电压值转换为对应的烟雾浓度值。图4-6测量烟雾浓度程序流程图烟雾浓度测量程序:u16Get_Adc(u8ch){ ADC_RegularChannelConfig(ADC1,ch,0,ADC_SampleTime_239Cycles5); //ADC1,ADC通道,采样时间为239.5周期 ADC_SoftwareStartConvCmd(ADC1,ENABLE); //使能指定的ADC1的软件转换启动功能 while(!ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC));//等待转换结束 returnADC_GetConversionValue(ADC1); //返回最近一次ADC1规则组的转换结果}u16Get_Adc_Average(u8ch,u8times){ u32temp_val=0; u8t; for(t=0;t<times;t++) { temp_val+=Get_Adc(ch); delay_ms(5); } returntemp_val/times;//得到烟雾浓度值} 报警模块程序设计图4-7报警模块程序流程图本程序中的报警模块采用的是低电平触发蜂鸣器,在报警模块启动后,给蜂鸣器引脚一个低电平,即可使蜂鸣器发出警报声音,提醒工作人员处理异常情况,程序流程图如图4-7所示,主要程序如下。报警模块主要程序:voidBEEP_Init(void){GPIO_InitTypeDefGPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD,ENABLE); //使能GPIOD端口时钟GPIO_InitStructure.GPIO_Pin=GPIO_Pin_2; //BEEP-->PD2端口配置GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP; //推挽输出GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; //速度为50MHzGPIO_Init(GPIOD,&GPIO_InitStructure); //根据参数初始化GPIOD2GPIO_SetBits(GPIOD,GPIO_Pin_2);//输出1,关闭蜂鸣器输出}显示模块程序设计本设计中采用的OLED屏幕可以将实时获取的温湿度、烟雾浓度信息实时显示到屏幕上,OLED屏幕耐低温,可以在-40℃环境下正常显示内容,发光效率更高、能耗低、生态环保,当小车发出警报后可以通过屏幕显示获取哪一环境值异常,从而迅速进行处理。显示程序流程图如图4-8所示。图4-8OLED显示模块流程图voidTEST_Chinese(void){ Sys_Init(); while(1) { DHT11_ReadData(); temperature=DHT11_GetTem()/256;//获取温度值 humidity=DHT11_GetHum()/256; //获取湿度值adcx=Get_Adc_Average(ADC_Channel_1,10); temp=adcx/(40.96);//获取烟雾浓度值 length=Senor_Using(); GUI_ShowCHinese(0,0,16,"温度",1);//在OLED对应位置显示”温度” GUI_ShowCHinese(0,20,16,"湿度",1);//在OLED对应位置显示”湿度” GUI_ShowCHinese(60,20,16,"浓度",1);//在OLED对应位置显示”浓度” GUI_ShowNum(30,0,(temperature),3,16,1);//将获取的温度值显示在对应位置 GUI_ShowNum(30,20,(humidity),3,16,1);//将获取的湿度值显示在对应位置 GUI_ShowNum(93,20,(temp),3,16,1);//将获取的烟雾浓度值显示在对应位置 }系统调试与验证本文设计的环境监测移动小车模型
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 医护一体化护理模式下的患者教育与自我管理
- 全膝关节置换术并发症的早期识别与处理
- 2026年有趣智力图形测试题及答案
- 2026年地铁安全培训测试题及答案
- 大豆玉米复合种植协议书
- 骨科护理科研进展
- 2026年国航行测测试题及答案
- 2026年序列功能测试题及答案
- 2026年铸造工(中级)铸造工艺参数调整试题及答案
- 体育馆市政路灯施工方案
- 2026-2030中国电热合金行业发展分析及发展战略研究报告
- 中远集团财务信息系统SAP操作手册
- 查缉战术课件大纲
- 3.辽宁2017定额宣贯《房屋建筑与装饰工程定额 》
- 交通事故民事起诉书模板(合集8篇)
- 安全施工监理实施细则
- 民航概论全套课件
- GB/T 4622.2-2008缠绕式垫片管法兰用垫片尺寸
- GB/T 32622-2016社会保险征缴稽核业务规范
- GB/T 18926-2008包装容器木构件
- 助产技术操作技能考核评分标准Microsoft-Word-文档
评论
0/150
提交评论