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;
		}
			

	}
}

六、资料分享

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

相关推荐
堕落年代4 小时前
STM32的DH11温湿度模块和LED灯的综合实训
stm32·单片机·嵌入式硬件
普中科技4 小时前
【普中Hi3861开发攻略--基于鸿蒙OS】-- 第 31 章 WIFI 实验-华为 IoTDA 设备接入
单片机·嵌入式硬件·华为云·鸿蒙·liteos·hi3861·普中科技
酷飞飞7 小时前
GD32F407VE天空星开发板的188数码管
stm32·单片机·嵌入式硬件·mcu·arm
GilgameshJSS7 小时前
STM32H743-ARM例程35-DHCP
c语言·arm开发·stm32·单片机·嵌入式硬件
GilgameshJSS7 小时前
STM32H743-ARM例程34-BootROM
c语言·arm开发·stm32·单片机·嵌入式硬件
robin8611097 小时前
Keil(MDK-ARM)和 STM32CubeIDE对比
arm开发·stm32·嵌入式硬件
烟雨彷徨~~Xun7 小时前
esp8266+dht11传感器实时上报温湿度
单片机·mcu·物联网
La Pulga7 小时前
【STM32】FLASH闪存
android·c语言·javascript·stm32·单片机·嵌入式硬件·mcu
sheepwjl8 小时前
《嵌入式硬件(十九):基于IMX6ULL的SPI操作》
单片机·嵌入式硬件·spi·adxl345