目录
前言
前段时间花3天时间做的大创项目智能药箱,做完总结一下。
一、屏幕设计
主界面:
时钟设置:
、
服药设置:
出药测试:
短信测试:
二、stm32部分代码
1.main.c
#include "stm32f4xx.h"
#include "usart.h"
#include "delay.h"
#include "servo.h"
#include "motor.h"
#include "thumb.h"
#include "worm.h"
#include "stepmotor.h"
#include "infrared.h"
#include "ds18b20.h"
//#include "exti.h"
#include "key.h"
#include "LD3320.h"
#include "jetson.h"
#include "rubbish.h"
#include "voice.h"
#include "rtc.h"
#include "usmart.h"
//#include "lcd.h"
//#include "sram.h"
//#include "malloc.h"
//#include "w25qxx.h"
//#include "sdio_sdcard.h"
//#include "ff.h"
//#include "exfuns.h"
//#include "fontupd.h"
#include "text.h"
//#include "touch.h"
#include "usart3.h"
#include "sim800c.h"
/*********************************************************************************************************
* 全局变量
*********************************************************************************************************/
/*********************************************************************************************************
* 函数声明
*********************************************************************************************************/
void tablet(int medicine_count)//药片
{
int i;
for(i=0;i<medicine_count;i++)
{
set_Angle_2(0);//药片 TIM4 通道2 B7
delay_ms(1000);
set_Angle_2(100);//胶囊 TIM4 通道2 B7
delay_ms(2000);
}
}
void pill_1(int medicine_count)//药丸1
{
int i;
for(i=0;i<medicine_count;i++)
{
TIM_SetCompare1(TIM4,800);//药丸1 TIM4 通道1 B6
delay_ms(1000);
set_Angle_1(70);//药丸1 TIM4 通道1 B6
delay_ms(2000);
}
}
void pill_2(int medicine_count)//药丸2
{
int i;
for(i=0;i<medicine_count;i++)
{
TIM_SetCompare4(TIM4,700);//药丸2 TIM4 通道4 B9
delay_ms(1000);
set_Angle_4(80);//药丸2 TIM4 通道4 B9
delay_ms(2000);
}
}
void capsule(int medicine_count)//胶囊
{
int i;
for(i=0;i<medicine_count;i++)
{
set_Angle_3(0);//药片 TIM4 通道3 B8
delay_ms(1000);
set_Angle_3(100);//药片 TIM4 通道3 B8
delay_ms(2000);
}
}
void Medicien(int medicine_box,int medicine_count)
{
switch(medicine_box)
{
case(1):pill_1(medicine_count);break;
case(2):tablet(medicine_count);break;
case(3):capsule(medicine_count);break;
case(4):pill_2(medicine_count);break;
}
}
void Medicien_star(void)
{
int i;
if(page==16)
{
while(page==16);
}
if(page==17)
{
while(page==17)
{
if(medicine_flag==7)
{
for(i=0;i<8;i+=2)
{
Medicien(medicinebuf[i],medicinebuf[i+1]);
}
page=0;
break;
}
}
}
if(page==18)
{
pill_1(2);
tablet(2);
capsule(2);
pill_2(2);
page=0;
}
}
int main(void)
{
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
delay_init(168);
uart_init(9600); //串口初始化为9600
usart3_init(115200); //初始化串口3
KEY_Init();
TIM4_PWM_Init();
My_RTC_Init(); //初始化RTC
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2
RTC_Set_WakeUp(RTC_WakeUpClock_CK_SPRE_16bits,0); //配置WAKE UP中断,1秒钟中断一次
set_Angle_1(70);//药丸1 TIM4 通道1 B6
set_Angle_2(100);//胶囊 TIM4 通道2 B7
set_Angle_3(100);//药片 TIM4 通道3 B8
set_Angle_4(80);//药丸2 TIM4 通道4 B9
delay_ms(1000);
while(1)
{
switch(page)
{
case 0:break;
case 1:main_interface_show();break;
case 2:rtc_show_set();break;
case 7:voice_IO(1);break;
// case 8:play_back();break;
// case 9:play_back();break;
// case 10:play_back();break;
// case 11:play_back();break;
case 16:Medicien_star();break;
case 17:Medicien_star();break;
case 18:pill_1(2);
tablet(2);
capsule(2);
pill_2(2);page=1;break;
case 19:voice_IO(7);break;
case 20://usmart_dev.init(168);//初始化USMART
sim800c_test(1);break;
case 21:sim800c_test(2);break;
}
}
}
2.usart.c
void USART1_IRQHandler(void) //串口1中断服务程序
{
u8 Res;
#if SYSTEM_SUPPORT_OS //如果SYSTEM_SUPPORT_OS为真,则需要支持OS.
OSIntEnter();
#endif
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //接收中断(接收到的数据必须是0x0d 0x0a结尾)
{
Res =USART_ReceiveData(USART1);//(USART1->DR); //读取接收到的数据
if((USART_RX_STA&0x8000)==0)//接收未完成
{
if(USART_RX_STA&0x4000)//接收到了0x0d
{
if(Res!=0x0a)USART_RX_STA=0;//接收错误,重新开始
else USART_RX_STA|=0x8000; //接收完成了
}
else //还没收到0X0D
{
if(Res==0x0d)USART_RX_STA|=0x4000;
else
{
USART_RX_BUF[USART_RX_STA&0X3FFF]=Res ;
USART_RX_STA++;
if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0;//接收数据错误,重新开始接收
}
}
}
if((page==5||page==6)&&time_flag<=3)
{
timebuf[time_flag]=Res;
time_flag++;
}
else if((page==10)&&tea_flag<=4)
{
teabuf[tea_flag]=Res;
if(teabuf[0]<10)
{
page=teabuf[0];
}
tea_flag++;
}
else if((page==17)&&tea_flag<=7)
{
medicinebuf[medicine_flag]=Res;
medicine_flag++;
}
else if(page!=5&&page!=6&&page!=10&&page!=17)
{
switch(Res)
{
case 0x01:page=1;break;
case 0x02:page=2;break;
case 0x03:page=3;break;
case 0x04:page=4;break;
case 0x05:page=5;break;
case 0x06:page=6;break;
case 0x07:page=7;break;
case 0x08:page=8;break;
case 0x09:page=9;break;
case 0x0a:page=10;break;
case 0x0b:page=11;break;
case 0x0c:page=12;break;
case 0x0d:page=13;break;
case 0x0e:page=14;break;
case 0x10:page=16;break;
case 0x11:page=17;break;
case 0x12:page=18;break;
case 0x13:page=19;break;
case 0x14:page=20;break;
case 0x15:page=21;break;
case 0x16:page=22;break;
case 0x17:page=23;break;
case 0x18:page=24;break;
case 0x19:page=25;break;
}
}
}
#if SYSTEM_SUPPORT_OS //如果SYSTEM_SUPPORT_OS为真,则需要支持OS.
OSIntExit();
#endif
}
#endif
3.其余代码
这个工程是基于正点原子的SMI600短信模块测试程序,工程代码我已经打包好上传,有需要的小伙伴可以在评论区留言。
总结:程序工程+屏幕文件链接
程序代码工程链接:基于STM32F407的HMI USART串口屏智能药箱设计.zip