"我们不做一锤子买卖,只做技术成长的长期伙伴!"
目录
一、视频展示
二、项目简介
题目:基于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;
}
}
}
六、资料分享
点击即可查看当前资料分享。