课程设计(论文)-基于STM32的智能路灯控制系统.doc_第1页
课程设计(论文)-基于STM32的智能路灯控制系统.doc_第2页
课程设计(论文)-基于STM32的智能路灯控制系统.doc_第3页
课程设计(论文)-基于STM32的智能路灯控制系统.doc_第4页
课程设计(论文)-基于STM32的智能路灯控制系统.doc_第5页
已阅读5页,还剩15页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

xxxx电气工程学院第三届电子设计大赛D题 智能路灯系统组 长:xxx学 号:xxxx队员1:xxxxx 学号:xxxxxxx队员2:xxxxx 学号: xxxxx学 院:xx大学电气工程学院 xxx大学通信工程学院 二O一五年五月摘 要本设计根据题目要求制作一套智能路灯控制系统,并且本着低成本高性能、结构简单、控制方便、直观显示等的设计思想。我们通过对硬件系统和软件程序的设计,以此实现通过光线强弱状态来控制路灯的亮灭功能。其中硬件电路部分主要包括:单片机最小系统、路灯控制电路部分、红外检测和执行电路部分、数码管显示电路部分;软件部分主要包括:相应软件和路灯控制、光电检测和执行、时间显示等程序模块。为了能够精确控制智能灯的开关状态,本参赛队队员决定采用集成度高、处理能力强、可靠性高的单片机STM32F103RCT6设计相应程序,通过红外检测模块来检测是否有物体通过。当物体通过时,下降沿触发产生中断,随后单片机执行中断函数里的命令。通过CH340g串口通信用电脑将采集到的有用数据发送给单片机,以此通过引脚高低电平和驱动电路控制路灯亮灭。再经处理后将物体通过的时间和对应速度显示在数码管上。 关键词:STM32F103RCT6,红外检测模块,LED驱动电路,CH340g串口通信 1系统方案论证与比较1.1整体设计思路流程1.2单片机模块部分方案一:选择STC89C52作为主控芯片,STC89C52周期比较慢,系统反应比较慢。方案二:选择STM32F103RB作为主控芯片,这款单片机的虽然周期是比STC89C52快,但是CPU兼容性不强,存储空间不够大。方案三:选择STM32F103RCT6作为主控芯片,这块芯片CPU兼容性更强,同时存储空间很强大,一个16位普通IC/OC/PWM),2个16位基本(IC/OC/PWM),1个STI,2个USART,同时具有低功率、记忆、定时器等功能完全可以满足系统智能控制的要求。综合以上三种方案,选择方案三。2电路与程序设计2.1电路的设计2.1.1红外感应检测模块部分采用红外感应技术而不采用其他人体感应技术,是因为目前基于红外线的人体感应技术已经发展成熟,各种类型的红外感应器也已经十分多见,而且价格便宜,目前成为最流行的人体感应技术。红外感应部分由红外线自动检测电路、逻辑运算、延迟电路、驱动电路等组成。利用红外传感器,可以检测到人体的接近、移动等运动状态。即当有人体进入到感应区域内时,红外发射电路发出的红外线被人体反射回一部分,红外接收电路接收后通过逻辑运算电路控制路灯的亮灭,从而实现自动控制。红外自动检测系统如图1-3所示。光学系统传导系统信号处理传感器红外源图1-3红外线自动检测系统框图2.1.2 LED驱动电路部分本部分通过LED驱动电路根据环境亮度的敏感程度做出反应。当环境亮度较低时(夜晚时分),电路将自动启动,给红外感应器模块供电,这时可以根据有没有人经过而自动控制路灯的亮灭。当环境亮度较高时(白天或者周围有更高亮度的路灯点亮时),电路将自动切断并进入省电模式,这是无论有没有人经过,路灯都不会点亮。如下1-4为LED驱动电路的仿真图。图1-4LED驱动电路设计图其中每只LED灯控制逻辑关系如图1-5所示,即在规定的时间条件成立的条件下,当明暗条件成立的情况下开灯。时间条件1LED灯明暗条件 输出为1 灯亮输出为0 灯灭图1-5 LED灯控制逻辑图2.1.3 串口通信部分该部分采用的是通过CH340g进行串口通信,即进行软件设置以后,将编程器与目标板连接,然后对单片机烧录程序。2.1.4 系统总体框图 智能路灯控制系统主要采用单片机进行控制,根据环境的明暗程度以及时间条件来决定路灯的开与关,其控制流程如下开始初始化显示系统信息 循环处理接受处理是否控制 是 关灯控制开灯控制时间调整 循环处理开灯时间成立?明暗条件成立?立否 否LED1和LED2熄灭LED1和LED2熄灭 是 是 2.2程序的设计1、程序功能根据题目要求软件部分主要实现运算与显示。2、程序设计利用单片机STM32F103RCT6的外部中断以及计时器功能,通过红外检测模块来检测是否有物体通过。当物体通过时,下降沿触发产生中断,随后单片机执行中断函数里的命令。以此通过引脚高低电平和驱动电路控制路灯亮灭,再经处理后将物体通过的时间和对应速度显示在数码管上。3.测试方案与测试结果3.1测试方案1、硬件测试首先分模块搭建硬件电路并分别测试成功,然后将分立的模块搭建在一起测试整体功能。经测试,我们的电源模块、功耗模块、单片机控制模块以及信号检测放大模块均工作正常。2、软件仿真测试利用Proteus软件画出电路仿真图,进行电路的各项性能测试,结果正常。3、硬件软件联调软件仿真结果与实测值进行比较,分析差异原因,找出改进方案。3.2 测试结果及分析 经过测试,系统各部分均工作正常,智能路灯照明系统可以控制LED灯的开关状态。同时可以根据数码管显示相应物体运动速度等,测试结果也比较准确,因此本设计可以满足相应功能。附主要程序:主函数#include stm32f10x.h#includeLCD1602.h#includetime_i.h#includeclock.h#include delay.h#include sys.h#include usart.h#includestrcmp.h#includeFixed_time.h#includeled.h#includeDigital_LED.h#includeAlarm.h#includeSpeed_Cal.h#includeIR_EXTI.h#includeEXTI_PC10.h#includeEXTI_PC11.h#includeexti_PC13.h#includeEXTI_PC14.h#includeEXTI_PC15.h#includeJudge_LED.hint main(void) u8 t;u8 len;u8 Time_Set=Set;u8 Time_Set_Flag=0;u8 Fix_Flag=0;u8 *P_Fix_Flag;P_Fix_Flag=&Fix_Flag;order=Pass_order=0; /LED1_Flag=LED2_Flag=0;/LED_1=LED_2=L=M=R=1;Time_Record_Flag=0;Action_Record=0;/*/*配置GPIO*/LCD_Data_GPIO_Config();LCD_Com_GPIO_Config();/*配置数码管的GPIO*/Digital_LED_GPIO_Init();/*LED GPIO配置*/LED_GPIO_Config();/*LCD初始化*/ LCD1602_Init();/*延时函数初始化*/delay_init(); /*设置中断优先级分组*/NVIC_Configuration_sys();/*警报初始化*/Alarm_Config();/*外部中断初始化*/EXTI_PC_Config(); EXTI_PC10_Config();EXTI_PC11_Config();EXTI_PC13_Config(); EXTI_PC14_Config();EXTI_PC15_Config();/*串口初始化为9600*/uart_init(9600); /*配置TIM3 默认开启时钟*/Timer_Init();/*给时钟赋初始时间*/Clock_Init();/*/ LED1(OFF); LED2(OFF);while(1)Judge();if(USART_RX_STA&0x8000) len=USART_RX_STA&0x3fff;/得到此次接收到的数据长度printf(%s_%s_%s_%srnThe message you have sent:rnn,Fixed_Buf1,Fixed_Buf3,Fixed_Buf2,Fixed_Buf4);for(t=0;tDR=USART_RX_BUFt;while(USART1-SR&0X40)=0);/等待发送结束printf(rnrn);/插入换行USART_RX_STA=0;Time_Set_Flag=1;Fix_Flag=1;Control_Flag1=1;Control_Flag2=1;if(Strcmp(USART_RX_BUF,Time_Set) 0&(USART_RX_BUF0 = S)if(Time_Set_Flag)hour=(USART_RX_BUF3-48)*10+(USART_RX_BUF4-48);min=(USART_RX_BUF6-48)*10+(USART_RX_BUF7-48);sec=(USART_RX_BUF9-48)*10+(USART_RX_BUF10-48)-1;Time_Set_Flag=0; Control();Fix(P_Fix_Flag);Dis_time(); Fixed_Show(); LCD显示LCD1602.c#includeLCD1602.h/ 单片机系统时钟在72MHZ下的延时/*延时函数* */ void delay_nus(u32 n)/微秒级延时 u8 i; while(n-) i=7; while(i-); void delay_nms(u32 n) /毫秒级延时,通常情况此函数可以不用更改 while(n-) delay_nus(1100); /LCD1602液晶读忙状态/ void LCD_FBUF(void)/ / LCD1602_RS0; /RS信号拉低/ LCD1602_RW1; /RW信号拉高/ LCD1602_EN1;/EN信号拉高/ DATA_OUT = 0xFF; /数据端口 11111111全高电平/ while(DATA_OUT & 0x80) = 0x80); /判断数据端口PB7 是否一直高/ LCD1602_RW1;/RW信号拉高/ LCD1602_EN0; /EN信号拉低 / /LCD1602写指令子函数void Write_LCD1602_Instruction_Com(uint8_t Com) /LCD_FBUF(); /读忙状态LCD1602_EN0; /EN信号拉低LCD1602_RS0; /RS信号拉低写指令LCD1602_RW0; /RW信号拉低DATA_OUT = Com; /数据端口指令输入delay_nms(1); /延时1msdelay_nms(1);LCD1602_EN1; /EN信号一个高脉冲delay_nms(1); /延时1msdelay_nms(1);LCD1602_EN0;/LCD1602写数据子函数void Write_LCD1602_Instruction_Data(uint8_t Date)/LCD_FBUF(); /读忙状态 LCD1602_EN0; /EN信号拉低LCD1602_RS1; /RS信号拉低写指令LCD1602_RW0; /RW信号拉低DATA_OUT = Date; /数据端口数据输入delay_nms(1); /延时1msdelay_nms(1);LCD1602_EN1; /EN信号一个高脉冲delay_nms(1); /延时1msdelay_nms(1);LCD1602_EN0;/LCD1602写指令和写数据子函数/ void Write_LCD1602_Instruction_Com_Data(uint8_t CountLiey, uint8_t Date)/ / if(CountLiey = 0) /CountLiey = 0 写指令/ / Write_LCD1602_Instruction_Com(Date); / 写指令/ / else /CountLiey !=0 写数据 / / Write_LCD1602_Instruction_Data(Date); /不等于0写数据 / / /LCD1602初始化子函数void LCD1602_Init(void) delay_nms(15);Write_LCD1602_Instruction_Com(0x38); /设置162显示,57点阵,8位数据接口delay_nms(5);Write_LCD1602_Instruction_Com(0x0C); /设置打开显示delay_nms(5);Write_LCD1602_Instruction_Com(0x06); /读或写一个字符后地址指针加1 delay_nms(5);Write_LCD1602_Instruction_Com(0x01); /显示清屏delay_nms(5);Write_LCD1602_Instruction_Com(0x80); /设置数据指针起点delay_nms(5); void LCD_Data_GPIO_Config(void) GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA, ENABLE);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 |GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3| GPIO_Pin_4| GPIO_Pin_5| GPIO_Pin_6| GPIO_Pin_7;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure); void LCD_Com_GPIO_Config(void) GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB, ENABLE);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 |GPIO_Pin_7 | GPIO_Pin_5 ;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOB, &GPIO_InitStructure); LCD1602.h#ifndef _LCD1602_H_#define _LCD1602_H_/*/#include stm32f10x.h/=端口位清除寄存器#define LCD1602_RS0 GPIO_ResetBits(GPIOB, GPIO_Pin_5)/低电平 PB5#define LCD1602_RW0 GPIO_ResetBits(GPIOB, GPIO_Pin_7) /低电平 PB7#define LCD1602_EN0 GPIO_ResetBits(GPIOB, GPIO_Pin_6)/低电平 PB6/=端口位设置/清除寄存器#define LCD1602_RS1 GPIO_SetBits(GPIOB, GPIO_Pin_5) /高电平 PB5#define LCD1602_RW1 GPIO_SetBits(GPIOB, GPIO_Pin_7) /高电平 PB7#define LCD1602_EN1 GPIO_SetBits(GPIOB, GPIO_Pin_6) /高电平 PB6#define DATA_OUT GPIOA-ODR/数据端口 PA0-PA7void Delay_us(uint32_t CountLing);void LCD_FBUF(void);void Write_LCD1602_Instruction_Com(uint8_t Com);void Write_LCD1602_Instruction_Data(uint8_t Date);void Write_LCD1602_Instruction_Com_Data(uint8_t CountLiey, uint8_t Date);void LCD1602_Init(void);void LCD_Data_GPIO_Config(void);void LCD_Com_GPIO_Config(void);/*/#endif数码管显示Digital_LED.c#include stm32f10x.h#includeDigital_LED.h#includeSpeed_Cal.h#include delay.h#includeled.hu32 Digital_LED_Table=0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90;/共阳极数码管显示编码u32 Dig_LED_time;void Digital_LED_GPIO_Init(void) GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB |RCC_APB2Periph_GPIOC, ENABLE);/*配置数据输出GPIO*/GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5| GPIO_Pin_6| GPIO_Pin_7;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOC, &GPIO_InitStructure);GPIO_ResetBits(GPIOC, GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5| GPIO_Pin_6| GPIO_Pin_7);/*配置位选GPIO*/GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12 ;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_14 | GPIO_Pin_15 ;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOB, &GPIO_InitStructure);/*/GPIO_ResetBits(GPIOA, GPIO_Pin_12 );GPIO_ResetBits(GPIOB, GPIO_Pin_8 | GPIO_Pin_14 | GPIO_Pin_15 ); void Digital_LED_Write(u32 Speed) /Speed 以mm为单位 if(Speed ODR/数据端口 PC0-PC7/*定义位选*/#define Dig_1_OnGPIO_SetBits(GPIOB, GPIO_Pin_14 );#define Dig_2_OnGPIO_SetBits(GPIOB, GPIO_Pin_15 );#define Dig_3_OnGPIO_SetBits(GPIOB, GPIO_Pin_8);#define Dig_4_OnGPIO_SetBits(GPIOA, GPIO_Pin_12 );#define Dig_1_OffGPIO_ResetBits(GPIOB, GPIO_Pin_14 );#define Dig_2_OffGPIO_ResetBits(GPIOB, GPIO_Pin_15 );#define Dig_3_OffGPIO_ResetBits(GPIOB, GPIO_Pin_8);#define Dig_4_OffGPIO_ResetBits(GPIOA, GPIO_Pin_12 );/*定义位选*/extern u32 Digital_LED_Table;extern u32 Dig_LED_time;void Digital_LED_GPIO_Init(void);void Digital_LED_Write(u32 Speed);void Delay(u32 nCount);void Run_Digital_LED(void);/*/#endif定时器3用于显示时间time_i.c#includetime_i.hvoid Timer_Init(void) TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;/*给TIM模块使能, TIM3挂载在APB1上*/RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);NVIC_Configuration();/*配置TIM3*/TIM_DeInit(TIM3);TIM_TimeBaseStructure.TIM_Period=1999;/自动重装载寄存器的值TIM_TimeBaseStructure.TIM_Prescaler=35999;/时钟预分频数TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;/采样分频TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;/计数方式TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);TIM_ClearFlag(TIM3,TIM_FLAG_Update);/清除溢出中断标志TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE);TIM_Cmd(TIM3,ENABLE);/开启时钟 /*配置NVIC*/static void NVIC_Configuration(void) NVIC_InitTypeDef NVIC_InitStructure;/*配置中断源*/NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; /抢占优先级1NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; /响应优先级1NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure); time_i.h#ifndef _TIME_I_#define _TIME_I_/*/#include stm32f10x.hvoid Timer_Init(void);static void NVIC_Configuration(void);/*/#endifTIM3中断函数void TIM3_IRQHandler(void) if (TIM_GetITStatus(TIM3,TIM_IT_Update)=SET) TIM_ClearITPendingBit(TIM3,TIM_FLAG_Update); sec+; Clock(); /Dis_time(); 串口控制LEDFixed_time.c#include stm32f10x_it.h#includeFixed_time.h#includeclock.h#include usart.h#includeLCD1602.h#includestrcmp.h#includeled.hu8 Fixed_1_On = N1;u8 Fixed_1_Off = F1;u8 Fixed_2_On = N2;u8 Fixed_2_Off = F2;/ u8 N_Now_1 = nowN1;/ u8 F_Now_1 = nowF1;/ u8 N_Now_2 = nowN2;/ u8 F_Now_2 = nowF2;u8 Led1=L1;u8 Led2=L2;u8 Fixed_Buf1= : : ;u8 Fixed_Buf2= : : ;u8 Fixed_Buf3= : : ;u8 Fixed_Buf4= : : ;u8 State_Flag1=0;u8 State_Flag2=0;u8 Control_Flag1=0;u8 Control_Flag2=0;void Fix(u8 *Fix_Flag) /*定时开启1号灯*/if(Strcmp(USART_RX_BUF,Fixed_1_On) 0)if(*Fix_Flag)& (USART_RX_BUF0=N)& (USART_RX_BUF1=1) State_Flag1=1;*Fix_Flag=0;Fixed_Buf10=USART_RX_BUF2;Fixed_Buf11=USART_RX_BUF3;Fixed_Buf13=USART_RX_BUF5;Fixed_Buf14=USART_RX_BUF6;Fixed_Buf16=USART_RX_BUF8;Fixed_Buf17=USART_RX_BUF9;/ if(GPIO_ReadOutputDataBit(GPIOB,GPIO_Pin_10)=0)/ / Write_LCD1602_Instruction_Com(0x80);/ Write_LCD1602_Instruction_Data(N);/ Write_LCD1602_Instruction_Com(0xC0);/ for(m=0;m 0)if(*Fix_Flag)& (USART_RX_BUF0=F)

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论