0、毕业设计选题原则说明(重点)
- 选题之前,同学们要弄明白一件事情,做毕业设计是干什么用的!
- 这里我告诉大家,毕业设计对于你来说,不是让你去搞研究,掌握运用所学知识的,也不是让你去比谁做的毕业设计多么牛逼,多么厉害。
- 说白点,它的作用就是一个,让你顺利毕业,能够拿到学位证,毕业证而已!!!
- 当你明白这一点后,作毕业设计的要求就是在满足老师的要求后,越简单越好,这样不但容易去做,而且你自己也容易去理解,掌握,同样也能花最少的钱!!!
- 满足老师的要求,这个没办法,毕竟他是决定你是否能通过答辩的人。
- 每年都有很多同学找到我的时候,后悔当初为什么要把功能写的那么复杂,后悔没有提前找我咨询一下!所以在这里提醒同学们,提交开题报告之前一定要多想想,不要自己随便写一堆提交上去!!!
1、项目简介
- 系统构成:车库管理系统设计以STM32F103C8T6单片机为控制核心,使用LED发光管对车库提供光源;使用SGP30采集CO2数据,使用DS18B20传感器采集环境温度;使用RFID技术实现刷卡进入,这里选用RC522射频模块;使用步进电机实现车库的自动打开与关闭;使用单片机对通风系统进行控制;使用OLED液晶显示屏显示车库的温度、CO2等信息。
1.1 系统功能
- 功能介绍:
- (1)使用 DS18B20 温度传感器采集温度信息,STM32单片机通过单总线协议与DS18B20通信,从而获取温度数据。
- (2)STM32单片机使用IIC协议与OLED液晶显示屏通信,通过该协议实现控制显示屏显示数据的功能。
- (3)STM32单片机通过IO口输出高低电平,即可对LED光照电路与通风系统进行控制。
- (4)通过RC522识别IC卡,STM32单片机将识别到的卡号与系统内部的卡号相比较,如果一致并且当前车库无车停放,则通过控制步进电机,自动打开车库入口,否则关闭车库入口。
1.2 演示视频
2、部分电路设计
2.1 STM32单片机核心板电路设计
- 基于 ARM Cortex-M3内核的STM32F1系列单片机属于主流STM32单片机,其中增强型STM32F103子系列单片机的CPU 主频高达72MHz,片内Flash容量高达1MB,芯片引脚数量多达144个,有 QFN、LQFP、CSP、BGA 等多种芯片封装形式,并具有多种片内外设、USB接口和CAN 接口。根据STM32F103单片机片内Flash容量的不同,ST 公司将其分为小容量(16-32KB)、中等容量(64-128KB)、大容量(256KB-1MB)3种。
- 电源电路:为单片机提供稳定的工作电压,通常采用3.3V电源供电。电源电路的设计要保证单片机在不同工作条件下都能获得稳定的电压输出,以确保单片机的正常工作。
- 晶振电路:提供单片机工作所需的时钟信号。晶振电路通过晶振和电容组成,为单片机提供稳定的工作脉冲,确保单片机的定时和同步需求。
- 复位电路:实现单片机的复位功能,类似于电脑的重启。复位电路通过电容和电阻的配合,实现单片机在上电启动时的自动复位,以及通过手动按键实现复位功能,保证单片机在程序跑飞或异常情况下能够重新开始执行程序。
STM32单片机是一种功能强大、易于使用、灵活且可靠的32位微控制器,基于ARM Cortex™-M内核。其主要功能特点包括:
- 高性能和低功耗:STM32系列单片机提供多种内核选择,如Cortex-M0、Cortex-M3、Cortex-M4等,满足不同应用场景对性能的需求,同时保持低功耗特性。
- 多种通信和外设接口:STM32单片机具备广泛的通信和外设接口,如I2C、SPI、USART、USB等,便于开发者实现各种复杂功能。
- 易于开发和调试:STM32单片机提供了丰富的软件和硬件工具,如HAL库、CubeMX等,帮助开发者快速创建和调试嵌入式系统。
- 高集成度和设计灵活性:STM32系列单片机全系列产品共用大部分引脚、软件和外设,优异的兼容性为开发人员带来最大的设计灵活性
单片机最小系统原理图如下图所示:
实物图:
2.2 SGP30传感器采集CO2检测电路设计
- SGP30是一种室内空气质量传感器,能够检测二氧化碳(CO2)和挥发性有机化合物(VOC)的浓度。这个模块采用了先进的传感器技术,可以提供高精度的空气质量数据。
- SGP30模块通常包括一个集成的传感器芯片和相应的电路,使其能够方便地与微控制器连接。它通常通过I2C总线与微控制器通信,因此可以轻松地集成到各种不同的嵌入式系统中。
具体电路原理图如下图所示:
2.3 RC522 RFID射频采集电路设计
- 本系统选择MFRC-522射频模块进行刷卡操作。MF RC522是应用于13.56MHz非接触式通信中高集成度的读写卡芯片,是NXP公司针对“三表”应用推出的一款低电压、低成本、体积小的非接触式读写卡芯片,是智能仪表和便携式手持设备研发的较好选择。MF RC522利用了先进的调制和解调概念,完全集成了在13.56MHz下所有类型的被动非接触式通信方式和协议。
- MFRC522支持MIFARE系列更高速的非接触式通信,双向数据传输速率高达424kbit/s。作为13.56MHz高集成度读写卡系列芯片家族的新成员,MF RC522与MF RC500和MF RC530有不少相似之处,同时也具备许多特点和差异。它与主机间通信采用SPI模式,有利于减少连线,缩小PCB板体积,降低成本。MF522-AN模块采用Philips MFRC522原装芯片设计读卡电路,使用方便,成本低廉,适用于设备开发、读卡器开发等高级应用的用户、需要进行射频卡终端设计/生产的用户。本模块可直接装入各种读卡器模具。模块采用电压为3.3V,通过SPI接口简单的几条线就可以直接与用户任何CPU主板相连接通信,可以保证模块稳定可靠的工作、读卡距离远;
其具体电路原理图如下图所示:
实物图如下:
2.4、uln2003 28BYJ-48步进电机控制电路
- ULN2003 是高耐压、大电流达林顿陈列,由七个硅NPN 达林顿管组成。
该电路的特点如下:
- ULN2003 的每一对达林顿都串联一个2.7K 的基极电阻,在5V 的工作电压下它能与TTL 和CMOS 电路直接相连,可以直接处理原先需要标准逻辑缓冲器来处理的数据。
- ULN2003 工作电压高,工作电流大,灌电流可达500mA,并且能够在关态时承受50V 的电压,输出还可以在高负载电流并行运行。
- ULN2003 采用DIP—16 或SOP—16 塑料封装。
其具体电路原理图如下图所示:
实物图:
3、单片机代码展示
3.1 系统初始化
void HardWare_Init(void)
{
uart_init(9600); //串口初始化
DIDoorInit();
FengShanInit();
LedInit();
Stepper_GPIOInit();
SGP30Init(&dev_data.sgp30);
OLED_Init();
OLED_ColorTurn(0);//0正常显示,1 反色显示
OLED_DisplayTurn(0);//0正常显示 1 屏幕翻转显示
RC522Init();
DO_LED_ON
Stepper_RotateByLoop(StepperDev2, Forward, 1, 5);
FENGSHAN_ON
Delay_Ms(1000);
FENGSHAN_OFF
Stepper_RotateByLoop(StepperDev2, Reversal, 1, 5);
DO_LED_OFF
}
3.2 DS18B20温度采集电路
//从ds18b20得到温度值
//精度:0.1C
//返回值:温度值 (-550~1250)
short DS18B20_Get_Temp(void)
{
u8 temp;
u8 TL,TH;
short tem;
DS18B20_Start (); // ds1820 start convert
DS18B20_Rst();
DS18B20_Check();
DS18B20_Write_Byte(0xcc);// skip rom
DS18B20_Write_Byte(0xbe);// convert
TL=DS18B20_Read_Byte(); // LSB
TH=DS18B20_Read_Byte(); // MSB
if(TH>7)
{
TH=~TH;
TL=~TL;
temp=0;//温度为负
}
else
{
temp=1;//温度为正
}
tem=TH; //获得高八位
tem<<=8;
tem+=TL;//获得底八位
tem=(float)tem*0.625;//转换
if(temp)
{
return tem; //返回温度值
}
else
{
return -tem;
}
}
3.3 OLED显示程序
//在指定位置显示一个字符,包括部分字符
//x:0~127
//y:0~63
//size1:选择字体 6x8/6x12/8x16/12x24
//mode:0,反色显示;1,正常显示
void OLED_ShowChar(u8 x,u8 y,u8 chr,u8 size1,u8 mode)
{
u8 i,m,temp,size2,chr1;
u8 x0=x,y0=y;
if(size1==8)size2=6;
else size2=(size1/8+((size1%8)?1:0))*(size1/2); //得到字体一个字符对应点阵集所占的字节数
chr1=chr-' '; //计算偏移后的值
for(i=0;i<size2;i++)
{
// if(size1==8)
// {temp=asc2_0806[chr1][i];} //调用0806字体
// else if(size1==12)
// {temp=asc2_1206[chr1][i];} //调用1206字体
// else if(size1==16)
// {temp=asc2_1608[chr1][i];} //调用1608字体
// else if(size1==24)
// {temp=asc2_2412[chr1][i];} //调用2412字体
// else return;
temp=asc2_1206[chr1][i];
for(m=0;m<8;m++)
{
if(temp&0x01)OLED_DrawPoint(x,y,mode);
else OLED_DrawPoint(x,y,!mode);
temp>>=1;
y++;
}
x++;
if((size1!=8)&&((x-x0)==size1/2))
{x=x0;y0=y0+8;}
y=y0;
}
}
//显示字符串
//x,y:起点坐标
//size1:字体大小
//*chr:字符串起始地址
//mode:0,反色显示;1,正常显示
void OLED_ShowString(u8 x,u8 y,u8 *chr,u8 size1,u8 mode)
{
while((*chr>=' ')&&(*chr<='~'))//判断是不是非法字符!
{
OLED_ShowChar(x,y,*chr,size1,mode);
if(size1==8)x+=6;
else x+=size1/2;
chr++;
}
}
3.4、SGP30 CO2传感器初始化
void SGP30Init(SGP30Data *sgp30_data)
{
u32 sgp30_dat;
SGP30_Init();
Delay_Ms(100);
SGP30_Write(0x20,0x08);
sgp30_dat = SGP30_Read();//读取SGP30的值
sgp30_data->co2_ = (sgp30_dat & 0xffff0000) >> 16;
sgp30_data->tvoc_ = sgp30_dat & 0x0000ffff;
//SGP30模块开机需要一定时间初始化,在初始化阶段读取的CO2浓度为400ppm,TVOC为0ppd且恒定不变,因此上电后每隔一段时间读取一次
//SGP30模块的值,如果CO2浓度为400ppm,TVOC为0ppd,发送“正在检测中...”,直到SGP30模块初始化完成。
//初始化完成后刚开始读出数据会波动比较大,属于正常现象,一段时间后会逐渐趋于稳定。
//气体类传感器比较容易受环境影响,测量数据出现波动是正常的,可自行添加滤波函数。
while(sgp30_data->co2_ == 400 && sgp30_data->tvoc_ == 0)
{
SGP30_Write(0x20,0x08);
sgp30_dat = SGP30_Read();//读取SGP30的值
sgp30_data->co2_ = (sgp30_dat & 0xffff0000) >> 16;//取出CO2浓度值
sgp30_data->tvoc_ = sgp30_dat & 0x0000ffff; //取出TVOC值
u1_printf("正在检测中...\r\n");
Delay_Ms(500);
}
}
3.5、SGP30 获取CO2数据
void SGP30Read(SGP30Data *sgp30_data)
{
u32 sgp30_dat = 0;
SGP30_Write(0x20,0x08);
sgp30_dat = SGP30_Read();//读取SGP30的值
sgp30_data->co2_ = (sgp30_dat & 0xffff0000) >> 16;//取出CO2浓度值
sgp30_data->tvoc_ = sgp30_dat & 0x0000ffff; //取出TVOC值
}