STM32项目分享:基于STM32单片机的恒温药箱的设计

"我们不做一锤子买卖,只做技术成长的长期伙伴!"

目录

一、视频展示

二、项目简介

三、原理图设计

四、PCB硬件设计

五、程序设计

六、资料分享


一、视频展示

基于STM32单片机的恒温药箱的设计 -视频分享

二、项目简介

题目:基于STM32单片机的恒温药箱的设计

主控:STM32F103C8T6

显示:1062屏幕

DS18B20温度传感器

加温继电器

降温继电器

语音:JQ8400

三按键

DC电源

红外光电

DS1302时钟模块

功能:

1、程序设置7点,12点,17点语音播报提醒提醒用户吃药(吃药时间到)

2、红外监测药品数量,红外每被遮住一次,药品数量减1

3、可按键设置温度阈值,当实际温度低于阈值时,进行继电器加热。

4、当温度超过阈值,进行继电器降温,进行声光报警。

5、红外传感器检测药盒是否被打开。

三、原理图设计

四、PCB硬件设计

五、程序设计

复制代码
#include "stm32f10x.h"                  // Device header
#include "delay.h"
#include "lcd1602.h"
#include "ds1302.h"
#include "IOput.h"
#include "usart.h"
#include "ds18b20.h"
#include "jq8400.h"   

u8 show_flag,count,show1_flag=1;
u8 max_sh=40,dec_sh=10,number=10,open_flage,max1=0,max2=0,max3=0;

void showtime(void)
{
	ds1032_read_realTime();         //??????
	LCD_WRITE_CharDATA(TimeData.day/10+'0',0,14);
	LCD_WRITE_CharDATA((TimeData.day%10)+'0',0,15);
	LCD_WRITE_CharDATA('-',0,13);
	LCD_WRITE_CharDATA(TimeData.month/10+'0',0,11);
	LCD_WRITE_CharDATA((TimeData.month%10)+'0',0,12);
	LCD_WRITE_CharDATA('-',0,10);
	TimeData.year = TimeData.year - 2000;
	LCD_WRITE_CharDATA(TimeData.year/10+'0',0,8);
	LCD_WRITE_CharDATA((TimeData.year%10)+'0',0,9);
	
	LCD_WRITE_CharDATA(TimeData.second/10+'0',1,14);
	LCD_WRITE_CharDATA((TimeData.second%10)+'0',1,15);
	LCD_WRITE_CharDATA(':',1,13);
	LCD_WRITE_CharDATA(TimeData.minute/10+'0',1,11);
	LCD_WRITE_CharDATA((TimeData.minute%10)+'0',1,12);
	LCD_WRITE_CharDATA(':',1,10);
	LCD_WRITE_CharDATA(TimeData.hour/10+'0',1,8);
	LCD_WRITE_CharDATA((TimeData.hour%10)+'0',1,9);
	
}

void show_change_time(void)
{	
	count++;
	if(count<=10)
	{
	LCD_WRITE_CharDATA(lssj.day/10+'0',0,14);
	LCD_WRITE_CharDATA((lssj.day%10)+'0',0,15);
	LCD_WRITE_CharDATA('-',0,13);
	LCD_WRITE_CharDATA(lssj.month/10+'0',0,11);
	LCD_WRITE_CharDATA((lssj.month%10)+'0',0,12);
	LCD_WRITE_CharDATA('-',0,10);
	LCD_WRITE_CharDATA(lssj.year/10+'0',0,8);
	LCD_WRITE_CharDATA((lssj.year%10)+'0',0,9);
	
	LCD_WRITE_CharDATA(lssj.second/10+'0',1,14);
	LCD_WRITE_CharDATA((lssj.second%10)+'0',1,15);
	LCD_WRITE_CharDATA(':',1,13);
	LCD_WRITE_CharDATA(lssj.minute/10+'0',1,11);
	LCD_WRITE_CharDATA((lssj.minute%10)+'0',1,12);
	LCD_WRITE_CharDATA(':',1,10);
	LCD_WRITE_CharDATA(lssj.hour/10+'0',1,8);
	LCD_WRITE_CharDATA((lssj.hour%10)+'0',1,9);

	Delay_50ms(4);
	}
}

int main (void)
{
	delay_init();
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
	
	OLED_Init();
	delay_ms(1);
	OLED_Clear();
	
	LCD_INIT();		//LCD1602  ʼ  
	ds1302_gpio_init();
	DS18B20_Init();
	input_init();
	output_init();
	Usart1_Init(9600);
	playsong(1);
	while(1)
	{

		temp_get();
		key_scan(1,1,1);
		if(key1_flag==1 && show_flag==0)
		{
			LCD_WRITE_CMD( 0x01 );
			key1_flag = 0;
			show1_flag++;
			key2_flag=0;
			key3_flag=0;
			if(show1_flag>=5)
				show1_flag = 0;
		}
		if(show1_flag==0)
		{
			if(key2_flag == 1)
			{
				key2_flag = 0;
				show_flag++;
				
			}
			if(show_flag == 7)
			{
				show_flag = 0;
				lssj.month=(lssj.month)/10*16+(lssj.month)%10;
				lssj.day=(lssj.day)/10*16+(lssj.day)%10;
				lssj.hour=(lssj.hour)/10*16+(lssj.hour)%10;
				lssj.minute=(lssj.minute)/10*16+(lssj.minute)%10;
				lssj.second=(lssj.second)/10*16+(lssj.second)%10;
				lssj.year=lssj.year;
				ds1032_init();
			}
			if(show_flag == 0)
			{
				showtime();
				lssj.year=TimeData.year;
				lssj.month=TimeData.month;
				lssj.day=TimeData.day;
				lssj.hour=TimeData.hour;
				lssj.minute=TimeData.minute;
				lssj.second=TimeData.second;
				lssj.week=TimeData.week;
			}
			if (show_flag == 1) 
			{
				show_change_time();
				if (key1_flag == 1) 
				{
					key1_flag = 0;
					lssj.year++;
				}
				if (key3_flag == 1) 
				{
					key3_flag = 0;
					lssj.year--;
				}
				if(lssj.year>100)
						lssj.year = 0;
				
				OLED_ShowChar(24,4,'_',16);
				
				if(count>=10)
				{
					LCD_WRITE_CharDATA('_',0,8);
					LCD_WRITE_CharDATA('_',0,9);
				}
				if(count>=20)
					count=0;
				Delay_50ms(2);
			}
			if (show_flag == 2) 
			{
				show_change_time();
				if (key1_flag == 1) 
				{
					key1_flag = 0;
					lssj.month++;
				}
				if (key3_flag == 1) 
				{
					key3_flag = 0;
					lssj.month--;
				}
				if(lssj.month>12)
						lssj.month = 1;
				if(lssj.month<1)
					lssj.month = 12;
				if(count>=10)
				{
					LCD_WRITE_CharDATA('_',0,11);
					LCD_WRITE_CharDATA('_',0,12);
				}
				if(count>=20)
					count=0;
				Delay_50ms(2);
			}
			if (show_flag == 3)
			{
				show_change_time();
				if (key1_flag == 1)
				{
						key1_flag = 0;
						lssj.day++;
				}
				if (key3_flag == 1)
				{
						key3_flag = 0;
						lssj.day--;
				}
				if(lssj.day>31)
					lssj.day = 1;
				if(lssj.day<1)
					lssj.day = 31;
				if(count>=10)
				{
					LCD_WRITE_CharDATA('_',0,14);
					LCD_WRITE_CharDATA('_',0,15);
				}
				if(count>=20)
					count=0;
				Delay_50ms(4);
			}
			if (show_flag == 4)
			{
				show_change_time();
				if (key1_flag == 1)
				{
						key1_flag = 0;
						lssj.hour++;
						if (lssj.hour > 23)
								lssj.hour = 0;
				}
				if (key3_flag == 1)
				{
						key3_flag = 0;
						lssj.hour--;
						if (lssj.hour >200)
								lssj.hour = 23;
				}
				if(count>=10)
				{
					LCD_WRITE_CharDATA('_',1,8);
					LCD_WRITE_CharDATA('_',1,9);
				}
				if(count>=20)
					count=0;
				Delay_50ms(2);
			}
			if (show_flag == 5)
			{
				show_change_time();
				if (key1_flag == 1)
				{
						key1_flag = 0;
						lssj.minute++;
						if (lssj.minute > 59)
								lssj.minute = 0;
				}
				if (key3_flag == 1)
				{
						key3_flag = 0;
						lssj.minute--;
						if (lssj.minute > 200)
								lssj.minute = 59;
				}
				if(count>=10)
				{
					LCD_WRITE_CharDATA('_',1,11);
					LCD_WRITE_CharDATA('_',1,12);
				}
				if(count>=20)
					count=0;
				Delay_50ms(2);
			}
			if (show_flag == 6)
			{
				show_change_time();
				if (key1_flag == 1)
				{
						key1_flag = 0;
						lssj.second++;
						if (lssj.second > 59)
								lssj.second = 0;
				}
				if (key3_flag == 1)
				{
						key3_flag = 0;
						lssj.second--;
						if (lssj.second > 200)
								lssj.second = 59;
				}
				if(count>=10)
				{
					LCD_WRITE_CharDATA('_',1,14);
					LCD_WRITE_CharDATA('_',1,15);
				}
				if(count>=20)
					count=0;
				Delay_50ms(2);
			}
		}
		if(show1_flag==1)
		{
			showtime();
			LCD_WRITE_CharDATA((u8)wd / 10+'0',0,5);
			LCD_WRITE_CharDATA((u8)wd % 10+'0',0,6);
			LCD_WRITE_StrDATA("TEMP:",0,0);
			LCD_WRITE_StrDATA("NUMB:",1,0);
			LCD_WRITE_CharDATA((u8)number / 10+'0',1,5);
			LCD_WRITE_CharDATA((u8)number % 10+'0',1,6);
			if(GD==0)
			{
				open_flage=1;
				
			}
			if(GD==1 && open_flage==1)
			{
				open_flage=0;
				if(number>=1)
					number--;
			}
//			LCD_WRITE_CharDATA((u8)water / 10+'0',1,0);
//			LCD_WRITE_CharDATA((u8)water % 10+'0',1,1);
		}
		if(show1_flag==2)
		{
			LCD_WRITE_StrDATA("MAX_TEMP:",0,4);
			LCD_WRITE_CharDATA((u8)max_sh / 10+'0',1,8);
			LCD_WRITE_CharDATA((u8)max_sh % 10+'0',1,9);
			if (key2_flag == 1) 
				{
					key2_flag = 0;
					max_sh++;
				}
				if (key3_flag == 1) 
				{
					key3_flag = 0;
					max_sh--;
				}
				if(max_sh>100 || max_sh<=0)
						max_sh = 0;
		}
		
		if(show1_flag==3)
		{
			LCD_WRITE_StrDATA("DEC_TEMP:",0,4);
			LCD_WRITE_CharDATA((u8)dec_sh / 10+'0',1,8);
			LCD_WRITE_CharDATA((u8)dec_sh % 10+'0',1,9);
			if (key2_flag == 1) 
				{
					key2_flag = 0;
					dec_sh++;
				}
				if (key3_flag == 1) 
				{
					key3_flag = 0;
					dec_sh--;
				}
				if(dec_sh>100 || dec_sh<=0)
						dec_sh = 0;
		}
		if(show1_flag==4)
		{
			LCD_WRITE_StrDATA("Medical:",0,4);
			LCD_WRITE_CharDATA((u8)number / 10+'0',1,8);
			LCD_WRITE_CharDATA((u8)number % 10+'0',1,9);
			if (key2_flag == 1) 
				{
					key2_flag = 0;
					number++;
				}
				if (key3_flag == 1) 
				{
					key3_flag = 0;
					number--;
				}
				if(number>11 || number<=0)
						number = 0;
		}
		
		if ((TimeData.hour == 7 || TimeData.hour == 12 || TimeData.hour == 17) && TimeData.minute == 30 && TimeData.second <= 30)
		{
			if(max1==1)
			{
				playsong(5);
				max1=0;
			}
				
		}
		else
			max1=1;
		
		if(wd>=max_sh)
		{
			if(max2==1)
			{
				playsong(3);
				max2=0;
			}
			
			BEEP=0;
			JDQ1=0;
		}
		else
		{
			max2=1;
			JDQ1=1;
			BEEP=1;
		}
		
		if(wd<=dec_sh)
		{
			JDQ2=0;
			if(max3==1)
			{
				max3=0;
				playsong(4);
			}
		}
		else
		{
			max3=1;
			JDQ2=1;
		}
			

	}
}

六、资料分享

点击即可查看当前资料分享。

相关推荐
云山工作室8 分钟前
基于物联网的智能楼宇门禁系统
单片机·物联网·毕业设计·课程设计·毕设
猪八戒1.01 小时前
onenet接口
开发语言·前端·javascript·嵌入式硬件
d111111111d1 小时前
SPI通信协议--在STM32中介绍(学习笔记)
笔记·stm32·单片机·嵌入式硬件·学习
电子科技圈2 小时前
IAR与Quintauris携手推进RISC-V汽车实时应用的功能安全软件开发
嵌入式硬件·安全·设计模式·编辑器·汽车·risc-v
up向上up3 小时前
基于STM32的电子钟万年历Proteus仿真设计_LCD1602显示
stm32·单片机·proteus
q***07144 小时前
SocketTool、串口调试助手、MQTT中间件基础
单片机·嵌入式硬件·中间件
新晨单片机设计4 小时前
【S001A】基于STM32单片机视力保护仪【Proteus仿真+Keil程序+报告+原理图】
stm32·单片机·proteus
爱吃程序猿的喵6 小时前
STM32嵌入式系统开发实战1:OLED显示、串口通信与GPIO控制
stm32·单片机·嵌入式硬件
up向上up8 小时前
【普中】基于普中51开发板单片机的8_8点阵滚动显示设计
单片机·51单片机·proteus
Bona Sun9 小时前
单片机手搓掌上游戏机(十二)—esp8266运行gameboy模拟器之编译上传
c语言·c++·单片机·游戏机