STM32单片机光照检测智能调光系统Protest仿真+代码+报告+讲解视频

STM32单片机光照检测智能调光系统Protest仿真+代码+报告+讲解视频 STM32单片机光照检测智能调光系统本设计包含proteus仿真程序代码设计报告讲解视频一、开发环境仿真图proteus 8.17程序编译器keil 5编程语言C语言设计编号C0136二、主要功能采用STM32F103系列单片机作为控制核心实现光照检测与LED亮度调节仿真环境光照检测范围为0999lx显示分辨率不低于10lx;LED台灯亮度可在10%100%范围内调节至少具有5档亮度等级具有自动调光与手动调光两种工作模式通过按键切换自动模式下当环境光变化时系统响应时间不大于2s;采用OLED显示当前光照值、工作模式和亮度等级;使用Proteus仿真实现亮度自动调节功能。资料下载链接KEY_C0136 STM32智能台灯控制OLED显示设计链接: https://pan.baidu.com/s/14liAWxV4vjPOY_2gfqGDkw?pwdpc1q提取码: pc1q以下为本设计资料展示三、仿真设计打开仿真工程双击proteus中的单片机选择hex文件路径然后开始仿真。四、程序代码程序是用keil5 mdk版本打开的如果打开有问题核实下keil的版本。程序有注释可以结合讲解视频理解。// 函数声明voidHardware_Init(void);voidDisplay_Init(void);voidRefresh_Data(void);// 全局变量u8 humi,fan_adj;// 湿度、风扇调节未使用u8 set_sta0;// 设置状态标志0正常显示1设置模式u8 key_ctrl0;// 按键控制标志用于刷新显示floatmq2_vol,smog_th100.0;// MQ2烟雾传感器电压、烟雾阈值未使用u8 temp_th30;// 温度阈值未使用uint32_tlight_vol;// 光照强度值Luxuint8_twork_mode0;// 工作模式0-自动模式1-手动模式uint8_tlight_level1;// 亮度等级 1~5uint8_tFan_Status0;// 风扇状态未使用uint8_tBeep_Status;// 蜂鸣器状态未使用uint8_tFire_Status0;// 火焰检测状态未使用uint8_trelay_Status0;// 继电器状态未使用uint8_tStatus_Change;// 状态变化标志用于刷新显示floattemp;// 温度值未使用/* ************************************************************ * 函数名称 main * 函数功能 主函数程序入口 * 入口参数 无 * 返回参数 0 * 说明 循环检测光照、控制风扇亮度等级、刷新显示 ************************************************************ */intmain(void){unsignedshorttimeCount0;// 发送间隔变量用于定时任务约2.5秒Hardware_Init();// 初始化外围硬件Display_Init();// 初始化OLED显示界面Led_Set(LED_OFF);// 关闭LED指示灯SystemCoreClockUpdate();// 更新系统核心时钟变量// 通过串口1打印系统时钟频率UsartPrintf(USART_DEBUG,system_clock:%lu Hz (%.2f MHz)\r\n,SystemCoreClock,SystemCoreClock/1000000.0);while(1){// 定时任务每50次循环约500ms因为循环内DelayMs(10)执行一次if(timeCount50)// 发送间隔2.5s{timeCount0;// 读取光照强度Luxlight_vollight_intensity();UsartPrintf(USART_DEBUG,light----%d--\r\n,light_vol);// 如果是自动模式(work_mode0)根据光照强度自动计算亮度等级if(work_mode0)light_levellight_level_intensity();// 自动调节亮度等级UsartPrintf(USART_DEBUG, light_level %d\r\n,light_level);// 如果状态发生变化重新初始化显示界面if(Status_Change){Status_Change0;Display_Init();}}// 处理设置模式下的显示清除if(set_sta){if(key_ctrl){OLED_Clear();key_ctrl0;UsartPrintf(USART_DEBUG,OLED_Clear\r\n);}}else{// 非设置模式下按键触发重新初始化显示if(key_ctrl){Display_Init();key_ctrl0;UsartPrintf(USART_DEBUG,Display_Init\r\n);}}// 刷新显示数据光照值、工作模式、亮度等级等Refresh_Data();// 根据亮度等级设置PWM占空比控制灯光if(light_level1){Fan_Set(PWM_L1);}elseif(light_level2){Fan_Set(PWM_L2);}elseif(light_level3){Fan_Set(PWM_L3);}elseif(light_level4){Fan_Set(PWM_L4);}elseif(light_level5){Fan_Set(PWM_L5);}DelayMs(10);// 延时10ms主循环周期约10ms}}/* ************************************************************ * 函数名称 Hardware_Init * 函数功能 硬件初始化 * 入口参数 无 * 返回参数 无 * 说明 初始化单片机外设及外接模块中断分组、延时、串口、 * 、LED、ADC、OLED、按键 ************************************************************ */voidHardware_Init(void){NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);// 中断控制器分组设置2位抢占优先级2位子优先级Delay_Init();// SysTick 延时初始化Usart1_Init(115200);// 串口1初始化波特率115200用于打印调试信息Usart2_Init(115200);// 串口2初始化备用Led_Init();// LED指示灯初始化AD_Init();// ADC初始化用于光照、烟雾等模拟量采集OLED_Init();// OLED显示屏初始化Fan_Init();// PWM初始化 控制灯光UsartPrintf(USART_DEBUG, Hardware init OK\r\n);OLED_Clear();OLED_ShowString(0,0,Hardware init OK,16);DelayMs(1000);Key_Init();// 按键初始化}/* ************************************************************ * 函数名称 Display_Init * 函数功能 初始化OLED显示界面绘制静态文字 * 入口参数 无 * 返回参数 无 * 说明 清屏后显示中文标签 * 第0行光照 * 第3行工作模式 * 第6行亮度等级 ************************************************************ */voidDisplay_Init(void){OLED_Clear();// 第0行显示光照中文字符索引10,11,12,0OLED_ShowCHinese(0,0,10);// 光OLED_ShowCHinese(18,0,11);// 照OLED_ShowCHinese(18*2,0,12);// OLED_ShowCHinese(18*3,0,0);// 0是冒号// 第3行显示工作模式OLED_ShowCHinese(0,3,13);// 工OLED_ShowCHinese(18*1,3,14);// 作OLED_ShowCHinese(18*2,3,15);// 模OLED_ShowCHinese(18*3,3,16);// 式OLED_ShowCHinese(18*4,3,0);// // 第6行显示亮度等级OLED_ShowCHinese(0,6,17);// 亮OLED_ShowCHinese(18*1,6,18);// 度OLED_ShowCHinese(18*2,6,19);// 等OLED_ShowCHinese(18*3,6,20);// 级OLED_ShowCHinese(18*4,6,0);// }/* ************************************************************ * 函数名称 Refresh_Data * 函数功能 刷新OLED上的动态数据光照值、工作模式文字、亮度等级 * 入口参数 无 * 返回参数 无 * 说明 根据Status_Change标志决定是否清屏仅在非设置模式(set_sta0) * 且非状态变化时更新显示数值。工作模式显示自动/手动。 ************************************************************ */voidRefresh_Data(void){staticu8 last_status0;// 记录上一次的Status_Change状态用于检测上升沿charbuf[20];// 临时字符串缓冲区// 如果状态发生变化且上一次状态为0即刚变为1则清屏if(Status_Change){if(last_status0){OLED_Clear();}}else{// 非设置模式下才更新显示数值if(set_sta0){memset(buf,0,sizeof(buf));// 显示光照强度值单位Luxsprintf(buf,%dLux,light_vol);OLED_ShowString(18*4,0,(u8*)buf,16);// 从第4个中文字符位置开始显示// 显示工作模式自动模式显示自动手动模式显示手动if(work_mode0){// 0是自动模式OLED_ShowCHinese(18*5,3,21);// 自OLED_ShowCHinese(18*6,3,23);// 动}else{OLED_ShowCHinese(18*5,3,22);// 手OLED_ShowCHinese(18*6,3,23);// 动}// 显示亮度等级memset(buf,0,sizeof(buf));sprintf(buf,%d,light_level);OLED_ShowString(18*5,6,(u8*)buf,16);// 从第5个中文字符位置显示等级数字}}last_statusStatus_Change;// 更新状态记录用于下次判断边沿}程序流程图五、设计说明书8265字内容包括硬件设计、软件设计、结论等。六、资料清单下载链接资料下载链接链接: https://pan.baidu.com/s/14liAWxV4vjPOY_2gfqGDkw?pwdpc1q提取码: pc1q