基于STM32F407的HMI USART串口屏智能药箱设计

目录

前言

一、屏幕设计

二、stm32部分代码

1.main.c

2.usart.c

 3.其余代码

总结:程序工程+屏幕文件链接



前言

前段时间花3天时间做的大创项目智能药箱,做完总结一下。

一、屏幕设计

主界面:

基于STM32F407的HMI USART串口屏智能药箱设计

 

时钟设置:

基于STM32F407的HMI USART串口屏智能药箱设计 

基于STM32F407的HMI USART串口屏智能药箱设计 

基于STM32F407的HMI USART串口屏智能药箱设计

服药设置:

基于STM32F407的HMI USART串口屏智能药箱设计 

基于STM32F407的HMI USART串口屏智能药箱设计

基于STM32F407的HMI USART串口屏智能药箱设计 

基于STM32F407的HMI USART串口屏智能药箱设计 

出药测试:

基于STM32F407的HMI USART串口屏智能药箱设计 

短信测试:

基于STM32F407的HMI USART串口屏智能药箱设计 

 

 

 

二、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

上一篇:Windows 与 linux文件相互传输的方法


下一篇:合泰单片机2-点亮LED