基于STM32单片机WIFI无线APP控灯亮度灭设计

基于STM32单片机控灯设计

(程序+原理图+设计报告)

功能介绍

具体功能:

本设计由STM32F103C8T6单片机核心电路+两位白色高亮LED灯电路+WIFI模块ESP8266电路+电源电路组成。

1、stm32实时监测wifi数据,解析数据后通过pwm控制led的亮灭及亮度程度。

2、手机发送指令:

OPEN1,第一个灯亮;OPEN2,第二个灯亮;

CLOSE1,第一个灯灭;CLOSE2,第二个灯灭;

LED1-1,第一个等处于1档,LED1-2,第1个等处于2档,LED1-3,第一个等处于3档。

LED2-1,第2个等处于1档,LED2-2,第2个等处于2档,LED2-3,第2个等处于3档,

OPENALL:全亮

CLOSEALL:全灭!

添加图片注释,不超过 140 字(可选)

程序

#include "led.h"
#include "delay.h"
#include "sys.h"
#include "timer.h"
#include "key.h"
#include "usart.h"	
#include <string.h>unsigned char led1Count=0;	//led 对比pwm值计数
unsigned char led2Count=0;
unsigned char PWML_LED1=10;//led PWM 范围0-10
unsigned char PWML_LED2=10;unsigned char BufTab[10]; //wifi数据暂存
unsigned char Count;	   //串口数据计数
unsigned char UartBusy=0;  //判断忙碌
unsigned char ReadFlag=0;//读取标志
unsigned char sendDataFlag=0;	//发送数据标志
u8 rebackFalg= 0; //数据返回标志
u8 MesCount=0;	//发送内容计数
unsigned char i ;
int main(void){	delay_init();	    	 //延时函数初始化NVIC_Configuration();//设置NVIC中断分组2:2位抢占优先级,2位响应优先级LED_Init();		  	//初始化与LED连接的硬件接?
//	KEY_Init();uart_init(9600);TIM3_Int_Init(499,7199);//10Khz的计数频率,计数到500为50ms i=50;while(i--) delay_ms(100);printf("AT+CIPMUX=1\r\n");		   //允许链接i=10;while(i--) delay_ms(100);printf("AT+CIPSERVER=1,8080\r\n");	   //创建端口号8080while(1){  if(ReadFlag== 1)		//读取串口数据标志{Count=0;					//传授接收变量清零UartBusy=0;ReadFlag=0;				//读取标识清零if((strstr((const char *)BufTab,"PEN1")!=NULL)||(strstr((const char * )BufTab,"ED1-3")!=NULL))	 //接收到LPEN1 LED1-3{PWML_LED1=10;rebackFalg=1;//设置pwm 发送标志置位}else if(strstr((const char * )BufTab,(const char * )"LOSE1")!=NULL)	  //接收到CLOSE1{PWML_LED1=0;rebackFalg=1;//设置pwm 发送标志置位}else if(strstr((const char *)BufTab,"ED1-1")!=NULL)	   //接收到LED1-1{PWML_LED1=3;rebackFalg=1;//设置pwm 发送标志置位}else if(strstr((const char *)BufTab,"ED1-2")!=NULL)	  //接收到LED1-2{PWML_LED1=6;rebackFalg=1;//设置pwm 发送标志置位}else if((strstr((const char *)BufTab,"PEN2")!=NULL)||(strstr((const char *)BufTab,"ED2-3")!=NULL))	 //接收到	OPEN2{PWML_LED2=10;rebackFalg=1;//设置pwm 发送标志置位}else if(strstr((const char *)BufTab,"LOSE2")!=NULL)	  //接收到LLOSE2{PWML_LED2=0;rebackFalg=1;//设置pwm 发送标志置位}else if(strstr((const char *)BufTab,"ED2-1")!=NULL)	   //接收到LED2-1{PWML_LED2=3;rebackFalg=1;//设置pwm 发送标志置位}else if(strstr((const char *)BufTab,"ED2-2")!=NULL)	 //接收到LED2-2{PWML_LED2=6;rebackFalg=1;//设置pwm 发送标志置位}}else if(strstr((const char *)BufTab,"PENALL")!=NULL)	 //接收OENALL{PWML_LED1=10;PWML_LED2=10;rebackFalg=1;		//设置pwm 发送标志置位}else if(strstr((const char *)BufTab,"LOSEALL")!=NULL)	  //接收到CLOSEALL{PWML_LED1=0;PWML_LED2=0; rebackFalg=1;}for(i=0;i<10;i++)	   //清空wifi数据数组{BufTab[i]='0';}if((sendDataFlag == 1)&&(rebackFalg != 0))//接收到数后返回ok			{if(MesCount == 0)			//发送信息计数{MesCount =1;printf("AT+CIPSEND=0,2\r\n");		//发送固定字节数据的at命令}else{				if(rebackFalg ==1)		//返回标志置位{printf("OK");}					//发送okMesCount = 0;				   //发送信息计数rebackFalg = 0;}sendDataFlag =	0;		//定时发送数据清空}			led1Count++;		//led 对比pwm值计数led2Count++;		//led 对比pwm值计数if(led1Count<PWML_LED1)	   //led1 PWM对比{LED1=0;			  //开灯}else if((led1Count>=PWML_LED1)&&(led1Count<=10))	 //led1 PWM对比{LED1=1;			//关灯}else{led1Count=0;  //一个周期结束}if(led2Count<PWML_LED2)	   //led2 PWM对比{LED2=0;			   //开灯}else if((led2Count>=PWML_LED2)&&(led2Count<=10))	 //led2 PWM对比{LED2=1;			//关灯}else{led2Count=0;  //一个周期结束}				}
}#include "delay.h"
#include "sys.h"
// 	 
//如果使用ucos,则包括下面的头文件即可.
#if SYSTEM_SUPPORT_UCOS
#include "includes.h"					//ucos 使用	  
#endifstatic u8  fac_us=0;//us延时倍乘数
static u16 fac_ms=0;//ms延时倍乘数
#ifdef OS_CRITICAL_METHOD 	//如果OS_CRITICAL_METHOD定义了,说明使用ucosII了.
//systick中断服务函数,使用ucos时用到
void SysTick_Handler(void)
{				   OSIntEnter();		//进入中断OSTimeTick();       //调用ucos的时钟服务程序               OSIntExit();        //触发任务切换软中断
}
#endif
********//完整资料***//***公众号:木子单片机********/	
//初始化延迟函数
//当使用ucos的时候,此函数会初始化ucos的时钟节拍
//SYSTICK的时钟固定为HCLK时钟的1/8
//SYSCLK:系统时钟
void delay_init()	 
{#ifdef OS_CRITICAL_METHOD 	//如果OS_CRITICAL_METHOD定义了,说明使用ucosII了.u32 reload;
#endifSysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);	//选择外部时钟  HCLK/8fac_us=SystemCoreClock/8000000;	//为系统时钟的1/8  #ifdef OS_CRITICAL_METHOD 	//如果OS_CRITICAL_METHOD定义了,说明使用ucosII了.reload=SystemCoreClock/8000000;		//每秒钟的计数次数 单位为K	   reload*=1000000/OS_TICKS_PER_SEC;//根据OS_TICKS_PER_SEC设定溢出时间//reload为24位寄存器,最大值:16777216,在72M下,约合1.86s左右	fac_ms=1000/OS_TICKS_PER_SEC;//代表ucos可以延时的最少单位	   SysTick->CTRL|=SysTick_CTRL_TICKINT_Msk;   	//开启SYSTICK中断SysTick->LOAD=reload; 	//每1/OS_TICKS_PER_SEC秒中断一次	SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk;   	//开启SYSTICK    
#elsefac_ms=(u16)fac_us*1000;//非ucos下,代表每个ms需要的systick时钟数   
#endif
}								    #ifdef OS_CRITICAL_METHOD	//使用了ucos
//延时nus
//nus为要延时的us数.		    								   
void delay_us(u32 nus)
{		u32 ticks;u32 told,tnow,tcnt=0;u32 reload=SysTick->LOAD;	//LOAD的值	    	 ticks=nus*fac_us; 			//需要的节拍数	  		 tcnt=0;told=SysTick->VAL;        	//刚进入时的计数器值while(1){tnow=SysTick->VAL;	if(tnow!=told){	    if(tnow<told)tcnt+=told-tnow;//这里注意一下SYSTICK是一个递减的计数器就可以了.else tcnt+=reload-tnow+told;	    told=tnow;if(tcnt>=ticks)break;//时间超过/等于要延迟的时间,则退出.}  }; 									    
}
//延时nms
//nms:要延时的ms数
void delay_ms(u16 nms)
{	if(OSRunning==TRUE)//如果os已经在跑了	    {		  if(nms>=fac_ms)//延时的时间大于ucos的最少时间周期 {OSTimeDly(nms/fac_ms);//ucos延时}nms%=fac_ms;				//ucos已经无法提供这么小的延时了,采用普通方式延时    }delay_us((u32)(nms*1000));	//普通方式延时,此时ucos无法启动调度.
}
#else//不用ucos时
//延时nus
//nus为要延时的us数.		    								   
void delay_us(u32 nus)
{		u32 temp;	    	 SysTick->LOAD=nus*fac_us; //时间加载	  		 SysTick->VAL=0x00;        //清空计数器SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk ;          //开始倒数	 do{temp=SysTick->CTRL;}while(temp&0x01&&!(temp&(1<<16)));//等待时间到达   SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk;       //关闭计数器SysTick->VAL =0X00;       //清空计数器	 
}
//延时nms
//注意nms的范围
//SysTick->LOAD为24位寄存器,所以,最大延时为:
//nms<=0xffffff*8*1000/SYSCLK
//SYSCLK单位为Hz,nms单位为ms
//对72M条件下,nms<=1864 
void delay_ms(u16 nms)
{	 		  	  u32 temp;		   SysTick->LOAD=(u32)nms*fac_ms;//时间加载(SysTick->LOAD为24bit)SysTick->VAL =0x00;           //清空计数器SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk ;          //开始倒数  do{temp=SysTick->CTRL;}while(temp&0x01&&!(temp&(1<<16)));//等待时间到达   SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk;       //关闭计数器SysTick->VAL =0X00;       //清空计数器	  	    
} 
#endif#include "sys.h"
#include "usart.h"	
#include "led.h"//
//加入以下代码,支持printf函数,而不需要选择use MicroLIB	  
#if 1
#pragma import(__use_no_semihosting)             
//标准库需要的支持函数                 
struct __FILE 
{ int handle; }; FILE __stdout;       
//定义_sys_exit()以避免使用半主机模式    
_sys_exit(int x) 
{ x = x; 
} 
//重定义fputc函数 
int fputc(int ch, FILE *f)
{      while((USART1->SR&0X40)==0);//循环发送,直到发送完毕   USART1->DR = (u8) ch;      return ch;
}
#endif /*使用microLib的方法*//* 
int fputc(int ch, FILE *f)
{USART_SendData(USART1, (uint8_t) ch);while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET) {}	return ch;
}
int GetKey (void)  { while (!(USART1->SR & USART_FLAG_RXNE));return ((int)(USART1->DR & 0x1FF));
}
*/u8 uartFlag = 0;//初始化IO 串口1 
//bound:波特率
void uart_init(u32 bound){//GPIO端口设置GPIO_InitTypeDef GPIO_InitStructure;USART_InitTypeDef USART_InitStructure;NVIC_InitTypeDef NVIC_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA, ENABLE);	//使能USART1,GPIOA时钟USART_DeInit(USART1);  //复位串口1//USART1_TX   PA.9GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PA.9GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;	//复用推挽输出GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化PA9//USART1_RX	  PA.10GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入GPIO_Init(GPIOA, &GPIO_InitStructure);  //初始化PA10//Usart1 NVIC 配置NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;//抢占优先级3NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;		//子优先级3NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;			//IRQ通道使能NVIC_Init(&NVIC_InitStructure);	//根据指定的参数初始化VIC寄存器//USART 初始化设置USART_InitStructure.USART_BaudRate = bound;//一般设置为9600;USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式USART_InitStructure.USART_StopBits = USART_StopBits_1;//一个停止位USART_InitStructure.USART_Parity = USART_Parity_No;//无奇偶校验位USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;	//收发模式USART_Init(USART1, &USART_InitStructure); //初始化串口USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//开启中断USART_Cmd(USART1, ENABLE);                    //使能串口 }void USART1_IRQHandler(void)                	//串口1中断服务程序{u8 Res;
#ifdef OS_TICKS_PER_SEC	 	//如果时钟节拍数定义了,说明要使用ucosII了.OSIntEnter();    
#endifif(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)  //{Res =USART_ReceiveData(USART1);//(USART1->DR);	//读取接收到数据Count++;if(Count>20){Count=0;}BufTab[Count]=Res;	//存储串口数据UartBusy=0;} 
#ifdef OS_TICKS_PER_SEC	 	//如果时钟节拍数定义了,说明要使用ucosII了.OSIntExit();  											 
#endif
} 

硬件设计

使用元器件:

单片机:STM32F103;

极性电容:10uF;

LED灯:高亮;电阻:10K;

ESP8266/WIFI模块:WIFI_ESP8266;

STM32核心板:STM32_CORE;

2.54单排座:3pin;

2.54单排座:4pin;

2.54单排座:20pin;

覆铜板或万用板;

普通USB线_大头;

添加图片注释,不超过 140 字(可选)

流程图:

添加图片注释,不超过 140 字(可选)

设计资料

01原理图

本系统原理图采用Altium Designer19设计,具体如图!

添加图片注释,不超过 140 字(可选)

02程序

本设计使用软件keil4和Keil5 MDK两个版本编程设计!具体如图!

添加图片注释,不超过 140 字(可选)

03设计报告

九千字设计报告,具体如下!

添加图片注释,不超过 140 字(可选)

04设计资料

全部资料包括程序(含注释)、AD原理图、任务书、开题报告、结构框图、设计报告、流程图、元件清单、实物图等。具体内容如下,全网最全! !

添加图片注释,不超过 140 字(可选)

点赞分享一起学习成长。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/88349.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/88349.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

学会C++中的vector的基本操作

vector 是 C 标准库中的一个动态数组类&#xff0c;它可以在运行时自动调整大小&#xff0c;非常适合用于处理大小不确定的集合。下面是 vector 的常见用法示例&#xff0c;帮助你更好地理解如何使用它。 注意&#xff1a;所有用数组完成的任务都可以用vector完成。 1. 引入头…

AI时代工具:AIGC导航——AI工具集合

大家好!AIGC导航是一个汇集多种AIGC工具的平台&#xff0c;提供了丰富的工具和资源。 工具功能​: 该平台整合了多样的AIGC工具&#xff0c;涵盖了绘画创作、写作辅助以及视频制作等多个领域。绘画工具能够生成高质量的图像作品&#xff1b;写作工具支持从构思到润色的全流程写…

java-SpringBoot框架开发计算器网页端编程练习项目【web版】

今天分享一个使用springboot 写一个 前后端不分离的项目&#xff0c;网页计算器&#xff0c;来熟悉springboot框架的使用。 java版本&#xff1a;8。 springboot&#xff1a;2.6.13 使用的技术是&#xff1a; Java Spring Boot Thymeleaf HTML/CSS/JS 构建的 Web 端简约按钮…

linux操作系统的软件架构分析

一、linux操作系统的层次结构 1.内核的主要功能 1&#xff09;进程管理 2&#xff09;内存管理 3&#xff09;文件系统 4&#xff09;进程间通信、I/O系统、网络通信协议等 2.系统程序 1&#xff09;系统接口函数库&#xff0c;比如libc 2)shell程序 3&#xff09;编译器、编辑…

浅谈Java对象在内存中的存储形式

我们知道计算机以二进制的方式存储数据&#xff0c;以 64 位虚拟机为例&#xff0c;Java 对象在内存中的存储形式为&#xff1a; 开头是 8 个字节的 markword&#xff0c;用于标记对象的状态。&#xff08;也就是一个 long 型数据的大小。不妨记作对象头里有一个长长的 markwo…

Android 开发问题:Wrong argument type for formatting argument ‘#2‘ in info_message

<string name"info_message">name: %1$s, age: %2$d</string>String str getString(R.string.info_message, "zs");在 Android 开发中&#xff0c;上述代码&#xff0c;出现如下警告信息 Wrong argument type for formatting argument #2 in…

Vue+spring boot前后端分离项目搭建---小白入门

首先&#xff0c;介绍一下软件准备工作 1.vscode 2.maven 3.vue搭建&#xff1a;node.jsyarnvite 一.后端搭建 打开vscode,建立一个springboot项目&#xff0c;参考链接&#xff1a;sping boot项目搭建 建立一个项目&#xff0c;目录结构如下&#xff1a; helloController.java…

“苏超”拉动周末消费,抖音生活服务:比赛城市迎来普遍消费上涨

“苏超”爆火&#xff0c;有力拉升了紧随赛程的周末消费。抖音生活服务数据显示&#xff0c;刚刚过去的周末&#xff08;6月21日至22日&#xff09;&#xff0c;江苏商圈休闲运动团购订单消费环比增长225%&#xff0c;到店消费金额环比增长181%。虽然几个比赛城市周末天气欠佳&…

使用python开发一个exe版本的计算器项目练习

最近在练习python开发软件&#xff0c;就开发了一个 客户端版的 计算器。先给大家看一下 做出来的样子 python版本&#xff1a;3.8 以上 主要是 使用 import tkinter as tk 这个库来实现图形界面开发 代码还是比较简单的&#xff1a; # 创建主窗口 root tk.Tk() root.title…

uniapp开发小程序,导出文件打开并保存,实现过程downloadFile下载,openDocument打开

uniapp开发小程序&#xff0c;导出文件打开并保存 实现思路 1、调用请求获取到后端接口返回的下载文件的url路径 &#xff08;注意必须是https的路径&#xff0c;域名需要配置在微信小程序后台的合法域名里面&#xff09; 2、使用 uni.downloadFile 方法 &#xff08;下载文件…

vue2中前端实现图片裁剪上传到服务器

在 Vue 2 中实现图片裁剪并上传到服务器&#xff0c;你可以结合使用 Cropper.js 来进行图片裁剪&#xff0c;并通过 Axios 或者其他 HTTP 客户端库将裁剪后的图片上传至服务器。以下是一个基本的实现步骤和示例代码&#xff1a; 步骤 安装依赖&#xff1a;你需要安装 cropperj…

C# 网络编程-关于HttpWebRequest使用方式(二)

项目开发用到数据请求时候&#xff0c;会用的到HttpWebRequest的请求方式&#xff0c;主要涵盖GET、POST、PUT、DELETE等方法 一、HttpWebRequest简介 HttpWebRequest是.NET Framework中用于发送HTTP请求的核心类&#xff0c;适用于构建HTTP客户端。它支持GET、POST、PUT、DE…

git变更记录

目录 wvp-ui -new Dji 10.60.2.175:8000上的编译 个人拉分支 目前约定2025-06-25 wvp-ui -new branch new BASE_URL /new/ ci-cd : wvp-newui Config [Jenkins] 禁 用 10.30.2.8 ssh 10.30.2.8 /home/dualven/wvp-server/deployNewUi.sh Dji 主分支的构建&#xf…

前端如何禁止用户复制?

禁用右键菜单 document.addEventListener(contextmenu, function(e) {e.preventDefault(); });禁用快捷键&#xff08;CtrlC/X/A等&#xff09; document.addEventListener(keydown, function(e) {if (e.ctrlKey && [c, x, v, a].includes(e.key.toLowerCase())) {e.…

阿里云无影:开启云端办公娱乐新时代

阿里云无影云电脑&#xff1a;打破传统束缚&#xff0c;畅享云端自由 在数字化浪潮汹涌澎湃的当下&#xff0c;云计算技术持续革新&#xff0c;为我们的工作与生活带来前所未有的变革。阿里云作为云计算领域的佼佼者&#xff0c;推出的无影云电脑无疑是一颗璀璨的明星&#xf…

Windows 和 macOS 串口调试软件

在 Windows 和 macOS 上&#xff0c;你可以使用以下串口调试软件来查看开发板的打印信息。以下是常见且好用的工具推荐&#xff1a; Windows 推荐工具 PuTTY 免费、轻量级&#xff0c;支持串口&#xff08;COM&#xff09;和 SSH/Telnet下载地址&#xff1a;https://www.putty.…

Redis 的作用及详细分析

网上查询总结了一下Redis相关的信息 记录一下 &#xff0c;有问题的地方&#xff0c;望多加指正&#xff0c;我们共同学习。 什么是Redis Redis是一款内存高速缓存数据库。Redis全称为&#xff1a;Remote Dictionary Server &#xff08;远程数据服务&#xff09;&#xff0c;…

【边缘计算】引论基础

&#xff08;1&#xff09;在不远的未来&#xff0c;将有超过50%的数据需要在网络边缘侧分析、处理与储存。智能互联的网络边缘侧将会面临如下挑战&#xff1a; 联接设备的海量与异构 随着联接设备数量的剧增&#xff0c;网络运维管理、灵活扩展和可靠性保障都面临着巨大挑战。…

SpringBoot中4种登录验证码实现方案

文章目录 详解方案一&#xff1a;基于kaptcha的图形验证码实现步骤 方案二&#xff1a;基于短信验证码实现步骤 方案三&#xff1a;基于Spring Mail的邮箱验证码实现步骤 方案四&#xff1a;基于AJ-Captcha的滑动拼图验证码实现步骤 总结 详解 在Web应用中&#xff0c;验证码是…

基于版本控制+WORM的OSS数据保护:防勒索攻击与法规遵从实践

1. 数据保护的核心挑战与解决方案架构 &#xff08;1&#xff09;现代数据保护的三大矛盾 勒索软件进化 vs 传统备份脆弱性&#xff1a;攻击者已掌握备份系统删除技术&#xff08;如vssadmin delete shadows&#xff09;法规保留要求&#xff08;GDPR第17条&#xff09;vs 技…