首页 » 通讯 » 卒业设计 - 基于单片机stm32智能快递箱设计(物联网、含代码)_优先级_时钟

卒业设计 - 基于单片机stm32智能快递箱设计(物联网、含代码)_优先级_时钟

落叶飘零 2024-10-22 15:13:59 0

扫一扫用手机浏览

文章目录 [+]

开拓技能:51单片机

二,项目简介

随在当今的社会,网上购物以及线下获取快递己经成为日常生活中很主要的一个组成部分,电子商务的发展也带来了快递业的繁荣。
这对快递业而言,是一个巨大的发展机遇,同时也是一个不可忽略的寻衅。
当前,快件运输的安全性越来越受到大家的重视,对快件的做事哀求也越来越高。
但就目前的快递行业来说,也面临着这样那样的问题,比较常常碰着送快递的到了,业务不在家,取快递韶光对不上等。

卒业设计 - 基于单片机stm32智能快递箱设计(物联网、含代码)_优先级_时钟 通讯

在此根本上,提出了一种以STM32为核心的智能化快递柜。
本快递柜的紧张功能有,指纹解锁功能,按键功能,警报功能,继电器柜门开锁功能,验证码功能,紧张设计加入了指纹解锁功能。
本系统以STM32F103为主控芯片,配置了指纹传感、44矩阵键盘、报警提示以及继电器模块等一系列模块,可以使快递员对快递进行安全的存储,这样不仅方便了快递员,也方便了用户,在实现了安全便利地存取快递的同时,也提高了快递行业的做事水平。

三,系统展示

在基于STM32实现的智能快递箱设计中,根据需求剖析紧张将其分成了以下几个电路:电源电路,LCD1602显示电路,功能按键电路,指示电路,报警电路以及指纹模块电路。

在进行制造之前,要先对每一种电路的事情事理和浸染进行理解,然后才能确定电路中可以采取的元件。
比如,开关电源回路的电容用具有滤波回路的浸染,同时我们也可以根据线路上电流的高低来选择得当的电容器,经由 LED指示回路的电流具有的是限流的浸染,一样平常情形下,可选择的电流范围为100Ω—1 kΩ,只有这样,我们才能很好地把握元件的选用。

在本系列的设计过程中,也碰着了许多的问题,个中就有电路板的排版问题,由于走线的设计不当,终极导致了显示器与键盘的单片机无法折衷同等,只能重新设计,摧残浪费蹂躏了大量的韶光。
这些都是可以通过自己的努力来降落的。
产出焊见。

在将实系统编制造出来之后,要先用万用表对那些被堕落得太厉害并且被焊锡连接起来的部分进行丈量,以确保它们之间的连通,然后对电解电容器、二极管、三极管、蜂鸣器等有正负极的部分进行焊接,看它们有没有接反。
在确定了精确之后,为了检测一下线路是否可以正常事情,由于感应器的价钱比较贵,以是就没有接上,末了试验了一下线路的情形,创造线路没有问题,屏幕也是亮的。
将传感器按每个针脚的次序连在一起,打开后见图

显示器显示为待机状态,按下A键,可进入指纹识别与口令识别的选项,如图

按下B键,进入指纹模式,录入指纹,按D键确认继电器完成开锁显示,如图

按下C键进入密码模式,显示密码,按D键确认继电器完成开锁显示,如图

四,核心代码展示

#include "sys.h" //设置向量表偏移地址//NVIC_VectTab:基址//Offset:偏移量 void MY_NVIC_SetVectorTable(u32 NVIC_VectTab, u32 Offset) { SCB->VTOR = NVIC_VectTab|(Offset & (u32)0x1FFFFF80);//设置NVIC的向量表偏移寄存器//用于标识向量表是在CODE区还是在RAM区}//设置NVIC分组//NVIC_Group:NVIC分组 0~4 统共5组 void MY_NVIC_PriorityGroupConfig(u8 NVIC_Group) { u32 temp,temp1; temp1=(~NVIC_Group)&0x07;//取后三位temp1<<=8;temp=SCB->AIRCR; //读取先前的设置temp&=0X0000F8FF; //清空先前分组temp|=0X05FA0000; //写入钥匙temp|=temp1; SCB->AIRCR=temp; //设置分组 }//设置NVIC //NVIC_PreemptionPriority:抢占优先级//NVIC_SubPriority :相应优先级//NVIC_Channel :中断编号//NVIC_Group :中断分组 0~4//把稳优先级不能超过设定的组的范围!否则会故意想不到的缺点//组划分://组0:0位抢占优先级,4位相应优先级//组1:1位抢占优先级,3位相应优先级//组2:2位抢占优先级,2位相应优先级//组3:3位抢占优先级,1位相应优先级//组4:4位抢占优先级,0位相应优先级//NVIC_SubPriority和NVIC_PreemptionPriority的原则是,数值越小,越优先 void MY_NVIC_Init(u8 NVIC_PreemptionPriority,u8 NVIC_SubPriority,u8 NVIC_Channel,u8 NVIC_Group) { u32 temp;MY_NVIC_PriorityGroupConfig(NVIC_Group);//设置分组temp=NVIC_PreemptionPriority<<(4-NVIC_Group); temp|=NVIC_SubPriority&(0x0f>>NVIC_Group);temp&=0xf;//取低四位 NVIC->ISER[NVIC_Channel/32]|=(1<<NVIC_Channel%32);//使能中断位(要打消的话,相反操作就OK) NVIC->IP[NVIC_Channel]|=temp<<4;//设置相应优先级和抢断优先级 } //外部中断配置函数//只针对GPIOA~G;不包括PVD,RTC和USB唤醒这三个//参数://GPIOx:0~6,代表GPIOA~G//BITx:须要使能的位;//TRIM:触发模式,1,下升沿;2,上降沿;3,任意电平触发//该函数一次只能配置1个IO口,多个IO口,需多次调用//该函数会自动开启对应中断,以及屏蔽线 void Ex_NVIC_Config(u8 GPIOx,u8 BITx,u8 TRIM) {u8 EXTADDR;u8 EXTOFFSET;EXTADDR=BITx/4;//得到中断寄存器组的编号EXTOFFSET=(BITx%4)4; RCC->APB2ENR|=0x01;//使能io复用时钟 AFIO->EXTICR[EXTADDR]&=~(0x000F<<EXTOFFSET);//打消原来设置!


AFIO->EXTICR[EXTADDR]|=GPIOx<<EXTOFFSET;//EXTI.BITx映射到GPIOx.BITx //自动设置EXTI->IMR|=1<<BITx;// 开启line BITx上的中断//EXTI->EMR|=1<<BITx;//不屏蔽line BITx上的事宜 (如果不屏蔽这句,在硬件上是可以的,但是在软件仿真的时候无法进入中断!) if(TRIM&0x01)EXTI->FTSR|=1<<BITx;//line BITx上事宜低落沿触发if(TRIM&0x02)EXTI->RTSR|=1<<BITx;//line BITx上事宜上升降沿触发} //不能在这里实行所有外设复位!否则至少引起串口不事情. //把所有时钟寄存器复位 void MYRCC_DeInit(void){ RCC->APB1RSTR = 0x00000000;//复位结束 RCC->APB2RSTR = 0x00000000; RCC->AHBENR = 0x00000014; //就寝模式闪存和SRAM时钟使能.其他关闭. RCC->APB2ENR = 0x00000000; //外设时钟关闭. RCC->APB1ENR = 0x00000000; RCC->CR |= 0x00000001; //使能内部高速时钟HSION RCC->CFGR &= 0xF8FF0000; //复位SW[1:0],HPRE[3:0],PPRE1[2:0],PPRE2[2:0],ADCPRE[1:0],MCO[2:0] RCC->CR &= 0xFEF6FFFF; //复位HSEON,CSSON,PLLONRCC->CR &= 0xFFFBFFFF; //复位HSEBYP RCC->CFGR &= 0xFF80FFFF; //复位PLLSRC, PLLXTPRE, PLLMUL[3:0] and USBPRE RCC->CIR = 0x00000000; //关闭所有中断 //配置向量表 #ifdef VECT_TAB_RAMMY_NVIC_SetVectorTable(0x20000000, 0x0);#else MY_NVIC_SetVectorTable(0x08000000,0x0);#endif}//THUMB指令不支持汇编内联//采取如下方法实现实行汇编指令WFI void WFI_SET(void){__ASM volatile("wfi"); }//关闭所有中断void INTX_DISABLE(void){ __ASM volatile("cpsid i");}//开启所有中断void INTX_ENABLE(void){__ASM volatile("cpsie i"); }//设置栈顶地址//addr:栈顶地址__asm void MSR_MSP(u32 addr) { MSR MSP, r0 //set Main Stack value BX r14} //进入待机模式 void Sys_Standby(void){SCB->SCR|=1<<2;//使能SLEEPDEEP位 (SYS->CTRL) RCC->APB1ENR|=1<<28; //使能电源时钟 PWR->CSR|=1<<8; //设置WKUP用于唤醒PWR->CR|=1<<2; //打消Wake-up 标志PWR->CR|=1<<1; //PDDS置位 WFI_SET(); //实行WFI指令 } //系统软复位 void Sys_Soft_Reset(void){ SCB->AIRCR =0X05FA0000|(u32)0x04; } //JTAG模式设置,用于设置JTAG的模式//mode:jtag,swd模式设置;00,全使能;01,使能SWD;10,全关闭; //#define JTAG_SWD_DISABLE 0X02//#define SWD_ENABLE 0X01//#define JTAG_SWD_ENABLE 0X00 void JTAG_Set(u8 mode){u32 temp;temp=mode;temp<<=25;RCC->APB2ENR|=1<<0; //开启赞助时钟 AFIO->MAPR&=0XF8FFFFFF; //打消MAPR的[26:24]AFIO->MAPR|=temp; //设置jtag模式} //系统时钟初始化函数//pll:选择的倍频数,从2开始,最大值为16 void Stm32_Clock_Init(u8 PLL){unsigned char temp=0; MYRCC_DeInit(); //复位并配置向量表 RCC->CR|=0x00010000; //外部高速时钟使能HSEONwhile(!(RCC->CR>>17));//等待外部时钟就绪RCC->CFGR=0X00000400; //APB1=DIV2;APB2=DIV1;AHB=DIV1;PLL-=2; //抵消2个单位(由于是从2开始的,设置0便是2)RCC->CFGR|=PLL<<18; //设置PLL值 2~16RCC->CFGR|=1<<16; //PLLSRC ON FLASH->ACR|=0x32; //FLASH 2个延时周期RCC->CR|=0x01000000; //PLLONwhile(!(RCC->CR>>25));//等待PLL锁定RCC->CFGR|=0x00000002;//PLL作为系统时钟 while(temp!=0x02) //等待PLL作为系统时钟设置成功{ temp=RCC->CFGR>>2;temp&=0x03;} } void GPIO_Config(GPIO_TypeDef GPIOx, GPIO_Pin_TypeDef GPIO_pin,uint8_t GPIO_mode){uint32_t reg_tmp = 0x00; //寄存器缓存 uint32_t reg_mode = 0x4; //寄存器模式配置 int8_t bitPos = -1;//引脚位置 //PB3,PB4,PA12 if((GPIO_pin==GPIO_Pin_12 && GPIOx==GPIOA)||((GPIO_pin &(GPIO_Pin_3|GPIO_Pin_4))!=0 && GPIOx==GPIOB)) { RCC->APB2ENR|= 0x00000001;//AFIOEN = 1;赞助功能IO时钟使能AFIO->MAPR |= 0x02000000;//配置AFIO_MAPR,的SWJ_CFG[2:0]位为010:关闭JTAG-DP,启用SW-DP}//先打开时钟 if(GPIOx == GPIOA)RCC->APB2ENR|=1<<2;else if(GPIOx == GPIOB)RCC->APB2ENR|=1<<3;else if(GPIOx == GPIOC)RCC->APB2ENR|=1<<4;else return; //取得引脚位置 while(GPIO_pin != ((uint16_t)0x0000)) { GPIO_pin >>= 1; bitPos++; } //取寄存器配置模式 reg_mode = GPIO_mode & ((uint32_t)0xF); if(GPIO_mode==GPIO_Mode_IPD)GPIOx->BRR = (((uint32_t)0x01) << bitPos); else if(GPIO_mode==GPIO_Mode_IPU)GPIOx->BSRR = (((uint32_t)0x01) << bitPos); //输出速率配置 if (((GPIO_mode) & ((uint8_t)0x10)) != 0x00) { if((GPIO_mode&((uint8_t)0x03))==0x00)reg_mode |= GPIO_Speed_50MHz;//缺省位50MHz速率 } //送到寄存器 if(bitPos < 8) //引脚GPIO_Pin_x为低8位 { reg_tmp = GPIOx->CRL;//拷贝寄存器 reg_tmp &= (~(((u32)0xF)<<(bitPos4)));//置零配置位 reg_tmp |= ((reg_mode)<<(bitPos4));//模式配置 GPIOx->CRL = reg_tmp; } else//高8位 { reg_tmp = GPIOx->CRH; reg_tmp &= (~(((u32)0xF)<<((bitPos-8)4))); reg_tmp |= ((reg_mode)<<((bitPos-8)4)); GPIOx->CRH = reg_tmp; }} uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef GPIOx, uint16_t GPIO_Pin){ uint8_t bitstatus = 0x00; if ((GPIOx->IDR & GPIO_Pin) != (uint32_t)Bit_RESET) { bitstatus = (uint8_t)Bit_SET; } else { bitstatus = (uint8_t)Bit_RESET; } return bitstatus;} void GPIO_SetBits(GPIO_TypeDef GPIOx, uint16_t GPIO_Pin){ GPIOx->BSRR = GPIO_Pin;}void GPIO_ResetBits(GPIO_TypeDef GPIOx, uint16_t GPIO_Pin){ GPIOx->BRR = GPIO_Pin;}
五,干系作品展示

完全代码可进群免费领取!


嵌入式物联网的学习之路非常漫长,不少人由于学习路线不对或者学习内容不足专业而错失落高薪offer。
不过别担心,我为大家整理了一份150多G的学习资源,基本上涵盖了嵌入式物联网学习的所有内容。
点击下方链接,0元领取学习资源,让你的学习之路更加顺畅!
记得点赞、关注、收藏、转发哦!

点击这里找小助理0元领取:扫码进群领资料

标签:

相关文章

汇率代码表,金融沟通的桥梁

汇率,作为货币之间的比价关系,是国际金融交流的重要媒介。而汇率代码表,则是金融领域沟通的桥梁,它简化了汇率信息的传递,为全球金融市...

通讯 2025-01-06 阅读0 评论0

江门,打造独具特色的数字经济发展高地

江门,这座美丽的海滨城市,自古以来就是我国南粤文化的发源地之一。近年来,江门紧跟国家发展战略,抢抓数字经济发展机遇,积极打造独具特...

通讯 2025-01-06 阅读0 评论0

汽车协议盒子,汽车智能化的关键纽带

随着科技的飞速发展,汽车行业也迎来了前所未有的变革。智能化、网联化、电动化已成为汽车行业发展的三大趋势。在这个过程中,汽车协议盒子...

通讯 2025-01-06 阅读0 评论0