人口老龄化是当今世界人口发展的趋势,这种人口年龄结构的变化正在广泛而深刻地影响着人类社会生活的各个方面。相关调查显示目前老年人产品逐渐增多,但还不能满足中国社会的需求,随着年龄的增长,老年人体能下降且容易生病,时常需要持续吃药,所以老年人智能药盒也受到广泛的关注。在现实生活中,老年人常常会出现记忆丧失或者遗忘的时候,难免会出现漏服的现象,而当今社会老年人的子女往往会因为工作等原因无法及时提醒老年人按时服药。为解决老年人按时服药困难的问题,设计一款提醒使用者按时服药的辅助用药类产品,能够有效地解决部分老年人的用药问题,同时方便使用者存储药物。

设计的基本条件:

本设计以单片机为主控芯片,采用红外传感器、按键模块、蜂鸣器模块、显示模块、GSM模块等构成较为完善的硬件模块,达成设计的基本条件。

设计依据:

(1)基于单片机的智能药盒设计是个实际项目,通过查阅相关的资料并认真研究与分析,制定科学的设计内容和技术路线,为设计确定了科学依据。
(2)对设计中使用的红外传感器、蜂鸣器模块、显示模块、GSM模块等等模块和单片机芯片有一定的了解,能够熟练地使用设计中用到的元器件,并对所用知识进行系统的学习,有深入的了解,为设计的完成提供了技术支撑。

主要内容如下:

(1)通过按键设置时钟的时间以及每个药物位置的服药次数;
(2)到达指定的服药时间,蜂鸣器发出警报;
(3)测量体温,并通过红外检测药物是否被拿起;
(4)通过GSM模块发送信息提醒监护人;
(5)通过显示屏显示当天该吃药物的位置、次数以及时间。

本设计欲达到的目的:

设计出一款智能药盒,使之能够通过按键设置时间以及每个药物位置的服药次数,在到达指定时间时会发出警报提醒服药,通过传感器检测体温,并通过红外检测药物是否被拿起,若十分钟内药物未被拿起则通过GSM模块发送信息提醒监护人,相关参数通过显示屏显示。

演示视频

单片机智能药盒

部分核心代码

/*******************************************************************************
--------------------------------------------------------------------------------
* 毕设名称       : 基于STC15F2K60S2的智能药箱
* 作品说明       : 药物定时,吃药提醒,当日药物提示,未吃药短信提醒,LCD1602液晶显示
* 作    者         : F9986858
*******************************************************************************///#include<STC15F2K60S2.h>
#include"lcd.h"
#include"ds1302.h"
#include"DS18B20.h"#define yh 0x80//液晶 第一行的初始位置
#define er 0x80+0x40//     第二行的初始位置uchar code tab0[]={"Medicine  Select"};  //字符串数组,用于液晶显示
uchar code tab1[]={"Choose :        "};
uchar code tab2[]={" Times   Select "};
uchar code tab3[]={"       times/day"};
uchar code tab4[]={"Clock Setting / "};
uchar code tab5[]={"    End  Day    "};
uchar code tab6[]={"      :  :00    "};
uchar code tab7[]={"       -        "};
uchar code tab8[]={"Alarm Clock Work"};
uchar code tab9[]={"Today's medicine"};
uchar code tab10[]={"      None      "};
uchar code tab11[]={"Medicine      / "};
uchar idata clock[6][4][4];              //三维数组,用于保存闹钟盒子数,时分,截止日期
uchar idata clock_flag[6];               //闹钟使能
uchar idata beep_flag[6][4];         //蜂鸣器报警使能
uchar nian,yue,ri,week,shi,fen,miao;   //年月日时分秒
uchar temp,temp1,CLOCK_FUN,MEDICINE_FUN,FLAG_CLOCK,FLAG_MEDICINE,FLAG_auxiliary;       //temp,temp1临时变量保存,时钟功能,药盒功能,时钟设置标志,闹钟设置标志,辅助功能标志
uchar box_flag;     //盒子保存变量
uchar times_flag;  //次数保存变量
uchar yao=1;                      //默认从第一个药盒开始
uchar times[6]={1,1,1,1,1,1};      //默认次数为1
uchar idata chiyao_flag[6][4];      //相应药物吃药标志,默认未吃
//按键引脚定义
sbit KEY1=P2^5;        //时钟功能++
sbit KEY2=P2^4;        //时钟功能--
sbit KEY3=P2^3;        //数++
sbit KEY4=P2^2;        //数--
sbit KEY5=P2^1;        //闹钟功能--
sbit KEY6=P2^0;        //闹钟功能++
sbit KEY7=P3^6;        //吃药次数,时间点查询
sbit KEY8=P3^7;        //今天的药物查询
//红外引脚定义
sbit OUT1=P1^5;
sbit OUT2=P1^6;
sbit OUT3=P1^7;
sbit OUT4=P3^4;
sbit OUT5=P3^3;
sbit OUT6=P3^2;sbit BEEP=P3^5;
bit Display_Flag = 0;bit Display_Flag1 = 0;
/*******************************************************************************
* 函数名         : write_sfm
* 函数功能       : LCD显示时分秒函数
* 输入           : add,dat
* 输出             : 无
*******************************************************************************/
void write_sfm(uchar add,uchar dat)//写时分秒
{uchar gw,sw;gw=dat%10;sw=dat/10;LcdWriteCom(er+add);LcdWriteData(0x30+sw);LcdWriteData(0x30+gw);
}
/*******************************************************************************
* 函数名         : write_nyr
* 函数功能       : LCD显示年月日函数
* 输入           : add,dat
* 输出             : 无
*******************************************************************************/
void write_nyr(uchar add,uchar dat)//写年月日
{uchar gw,sw;gw=dat%10;sw=dat/10;LcdWriteCom(yh+add);LcdWriteData(0x30+sw);LcdWriteData(0x30+gw);
}void Uart1Init(void)        //9600bps@12.000MHz
{SCON = 0x50;       //8位数据,可变波特率AUXR |= 0x40;       //定时器1时钟为Fosc,即1TAUXR &= 0xFE;      //串口1选择定时器1为波特率发生器TMOD &= 0x0F;     //设定定时器1为16位自动重装方式TL1 = 0xC7;       //设定定时初值TH1 = 0xFE;     //设定定时初值ET1 = 0;        //禁止定时器1中断TR1 = 1;      //启动定时器1
}void Uart1Send(unsigned char dat)
{SBUF=dat;while(!TI);     //等待发送完成信号TI=0;
}/*******************************************************************************
* 函数名         : Timer0Init
* 函数功能       : 定时器0设置函数
* 输入           : 无
* 输出             : 无
*******************************************************************************/
void Timer0Init(void)       //50毫秒@12.000MHz
{AUXR &= 0x7F;      //定时器时钟12T模式TMOD &= 0xF0;       //设置定时器模式TMOD |= 0x01;      //设置定时器模式TL0 = 0xB0;            //设置定时初值        50msTH0 = 0x3C;         //设置定时初值TF0 = 0;            //清除TF0标志ET0 = 1;TR0 = 1;      //定时器0开始计时EA = 1;
}
/*******************************************************************************
* 函数名         : BCD_Decimal
* 函数功能       : BCD码转换函数
* 输入           : bcd
* 输出             : 无
*******************************************************************************/
uchar BCD_Decimal(uchar bcd)          //BCD码转换
{uchar Decimal;Decimal=bcd>>4;return(Decimal=Decimal*10+(bcd&=0x0F));
}
/*******************************************************************************
* 函数名         : clock_set
* 函数功能       : 时钟设置函数
* 输入           : 无
* 输出             : 无
*******************************************************************************/
void clock_set(void)
{if((KEY1==0)&&(FLAG_MEDICINE==0)&&(FLAG_auxiliary==0))         //时钟设置功能++{Delaynms(20);                                       //延时消抖if((KEY1==0)&&(FLAG_MEDICINE==0)&&(FLAG_auxiliary==0))                    //再次判断{                                   FLAG_CLOCK=1;                                  //时钟正在设置,药盒不能设定,辅助功能不能使用,只能设置时钟CLOCK_FUN++;                                  //时钟功能+1,功能分别为:秒,分,时,日,月,年switch(CLOCK_FUN)                                //判断是什么功能{case 1: TR0=0;                             //定时器0关闭,不提取ds1302的时间,即液晶不会自动跳数字LcdWriteCom(er+0x07);               //指针移动到秒的个位LcdWriteCom(0x0f);                 //光标闪烁temp=(miao)/10*16+(miao)%10;      //转换Ds1302Write(0x8e,0x00);              //关闭DS1302写保护,可写入Ds1302Write(0x80,0x80|temp);        //写入秒Ds1302Write(0x8e,0x80);              //打开写保护,不可写入break;case 2:   LcdWriteCom(er+0x04);                //光标移动到分个位break;case 3:    LcdWriteCom(er+0x01);                //光标移动到时个位break;case 4:    LcdWriteCom(yh+0x09);                //光标移动到日个位break;case 5:    LcdWriteCom(yh+0x06);                //光标移动到月个位break;case 6:    LcdWriteCom(yh+0x03);                //光标移动到年个位break;case 7:    LcdWriteCom(0x0c);                   //关闭光标闪烁CLOCK_FUN=0;                        //时钟功能清零FLAG_CLOCK=0;                       //时钟设置标志清零,药盒可设置temp=(miao)/10*16+(miao)%10;     //再次写入秒Ds1302Write(0x8e,0x00);Ds1302Write(0x80,0x00|temp);Ds1302Write(0x8e,0x80);TR0=1;                            //打开定时器0,定时获取DS1302内部时间,显示到LDCbreak;                          }while(KEY1==0);                                   //等待按键松手}}if((KEY2==0)&&(FLAG_MEDICINE==0)&&(FLAG_auxiliary==0))          //时钟设置功能--{Delaynms(20);if((KEY2==0)&&(FLAG_MEDICINE==0)&&(FLAG_auxiliary==0)){if(FLAG_CLOCK==1)                                //若进入时钟设置,功能--才能使用{CLOCK_FUN--;if(CLOCK_FUN==0)                          //功能范围控制,不能小于0{CLOCK_FUN=1;}}switch(CLOCK_FUN)                             //同上{case 1:  TR0=0;LcdWriteCom(er+0x07);LcdWriteCom(0x0f);temp=(miao)/10*16+(miao)%10;Ds1302Write(0x8e,0x00);Ds1302Write(0x80,0x80|temp);//miaoDs1302Write(0x8e,0x80);break;case 2: LcdWriteCom(er+0x04);break;case 3: LcdWriteCom(er+0x01);break;case 4: LcdWriteCom(yh+0x09);break;case 5: LcdWriteCom(yh+0x06);break;case 6: LcdWriteCom(yh+0x03);break;                            }while(KEY2==0);}}
}
/*******************************************************************************
* 函数名         : medicine_set
* 函数功能       : 药物设定函数
* 输入           : 无
* 输出             : 无
*******************************************************************************/
void medicine_set()
{if((KEY6==0)&&(FLAG_CLOCK==0)&&(FLAG_auxiliary==0))            //药盒功能++{Delaynms(20);if((KEY6==0)&&(FLAG_CLOCK==0)&&(FLAG_auxiliary==0))                   //再次判断按键按下,以及时钟没有在设置中{uchar num;                                    //临时变量定义FLAG_MEDICINE=1;                            //建立药盒正在设置标志MEDICINE_FUN++;                               //药盒功能++switch(MEDICINE_FUN)                        //功能判断{case 1:  TR0=0;                           //功能若为1,关闭定时器LcdWriteCom(yh);                //LCD指针第一行for(num=0;num<16;num++)              //刷一下固定显示字符串LcdWriteData(tab0[num]);LcdWriteCom(er);                 //LCD指针第二行for(num=0;num<16;num++)              //刷一下固定显示字符串LcdWriteData(tab1[num]);LcdWriteCom(er+0x0c);              //LCD第二行第十三LcdWriteData(yao+'0');             //显示药盒变量LcdWriteCom(er+0x0c);             //指针复位(与光标复位一个意思)LcdWriteCom(0x0f);                 //光标闪烁break;                           //执行完跳出switch语句case 2: LcdWriteCom(yh);                 //功能2,药次数记录for(num=0;num<16;num++)LcdWriteData(tab2[num]);LcdWriteCom(er);for(num=0;num<16;num++)LcdWriteData(tab3[num]);LcdWriteCom(er+0x03);              LcdWriteData(times[yao-1]+'0');      //在LCD显示吃药次数LcdWriteCom(er+0x03);LcdWriteCom(0x0f);break;case 3: LcdWriteCom(yh);               //第一次吃药的分for(num=0;num<16;num++)LcdWriteData(tab4[num]);LcdWriteCom(er);for(num=0;num<16;num++)LcdWriteData(tab6[num]);LcdWriteCom(yh+13);                 LcdWriteData(1+'0');           //显示第一次LcdWriteCom(yh+15);LcdWriteData(times[yao-1]+'0');      //显示次数总数 ,如1/3write_sfm(4,clock[yao-1][0][1]);  //在LCD显示第一次定时的分write_sfm(7,clock[yao-1][0][0]);  //在LCD显示第一次定时的时LcdWriteCom(er+0x08);break;case 4: LcdWriteCom(yh);               //第一次吃药的时for(num=0;num<16;num++)LcdWriteData(tab4[num]);LcdWriteCom(er);for(num=0;num<16;num++)LcdWriteData(tab6[num]);LcdWriteCom(yh+13);LcdWriteData(1+'0');LcdWriteCom(yh+15);LcdWriteData(times[yao-1]+'0');write_sfm(4,clock[yao-1][0][1]);write_sfm(7,clock[yao-1][0][0]);LcdWriteCom(er+0x05);break;                                    case 5: if(times[yao-1]>=2)               //若次数大于2,设置第二次吃药的分{LcdWriteCom(yh);                for(num=0;num<16;num++)LcdWriteData(tab4[num]);LcdWriteCom(er);for(num=0;num<16;num++)LcdWriteData(tab6[num]);LcdWriteCom(yh+13);LcdWriteData(2+'0');LcdWriteCom(yh+15);LcdWriteData(times[yao-1]+'0');write_sfm(4,clock[yao-1][1][1]);write_sfm(7,clock[yao-1][1][0]);LcdWriteCom(er+0x08);                       }else MEDICINE_FUN=10;        //否者直接跳到设置截止日期break;case 6: LcdWriteCom(yh);              //第2次吃药的时for(num=0;num<16;num++)LcdWriteData(tab4[num]);LcdWriteCom(er);for(num=0;num<16;num++)LcdWriteData(tab6[num]);LcdWriteCom(yh+13);LcdWriteData(2+'0');LcdWriteCom(yh+15);LcdWriteData(times[yao-1]+'0');write_sfm(4,clock[yao-1][1][1]);write_sfm(7,clock[yao-1][1][0]);LcdWriteCom(er+0x05);break;case 7: if(times[yao-1]>=3)              //若次数大于3,设置第三次吃药的分{LcdWriteCom(yh);                for(num=0;num<16;num++)LcdWriteData(tab4[num]);LcdWriteCom(er);for(num=0;num<16;num++)LcdWriteData(tab6[num]);LcdWriteCom(yh+13);LcdWriteData(3+'0');LcdWriteCom(yh+15);LcdWriteData(times[yao-1]+'0');write_sfm(4,clock[yao-1][2][1]);write_sfm(7,clock[yao-1][2][0]);LcdWriteCom(er+0x08);                       }else MEDICINE_FUN=10;        //否者直接跳到设置截止日期break;case 8: LcdWriteCom(yh);              //第3次吃药的时for(num=0;num<16;num++)LcdWriteData(tab4[num]);LcdWriteCom(er);for(num=0;num<16;num++)LcdWriteData(tab6[num]);LcdWriteCom(yh+13);LcdWriteData(3+'0');LcdWriteCom(yh+15);LcdWriteData(times[yao-1]+'0');write_sfm(4,clock[yao-1][2][1]);write_sfm(7,clock[yao-1][2][0]);LcdWriteCom(er+0x05);break;case 9: if(times[yao-1]>=4)              //若次数大于4,设置第四次吃药的分{LcdWriteCom(yh);                for(num=0;num<16;num++)LcdWriteData(tab4[num]);LcdWriteCom(er);for(num=0;num<16;num++)LcdWriteData(tab6[num]);LcdWriteCom(yh+13);LcdWriteData(4+'0');LcdWriteCom(yh+15);LcdWriteData(times[yao-1]+'0');write_sfm(4,clock[yao-1][3][1]);write_sfm(7,clock[yao-1][3][0]);LcdWriteCom(er+0x08);                       }else MEDICINE_FUN=10;       //否者直接跳到设置截止日期break;case 10: LcdWriteCom(yh);             //第4次吃药的时for(num=0;num<16;num++)LcdWriteData(tab4[num]);LcdWriteCom(er);for(num=0;num<16;num++)LcdWriteData(tab6[num]);LcdWriteCom(yh+13);LcdWriteData(4+'0');LcdWriteCom(yh+15);LcdWriteData(times[yao-1]+'0');write_sfm(4,clock[yao-1][3][1]);write_sfm(7,clock[yao-1][3][0]);LcdWriteCom(er+0x05);break;case 11: LcdWriteCom(yh);                //截止日for(num=0;num<16;num++)LcdWriteData(tab5[num]);LcdWriteCom(er);for(num=0;num<16;num++)LcdWriteData(tab7[num]);write_sfm(5,clock[yao-1][0][3]);write_sfm(8,clock[yao-1][0][2]);LcdWriteCom(er+0x09);break;case 12: LcdWriteCom(yh);                 //截止月for(num=0;num<16;num++)LcdWriteData(tab5[num]);LcdWriteCom(er);for(num=0;num<16;num++)LcdWriteData(tab7[num]);write_sfm(5,clock[yao-1][0][3]);write_sfm(8,clock[yao-1][0][2]);LcdWriteCom(er+0x06);break;case 13: LcdWriteCom(yh);                //时钟开关for(num=0;num<16;num++)LcdWriteData(tab8[num]);LcdWriteCom(er);              //清屏for(num=0;num<16;num++)LcdWriteData(' ');if(clock_flag[yao-1]==1)        //显示开{LcdWriteCom(er+0x06);LcdWriteData('O');LcdWriteData('N');LcdWriteData(' ');}else                          //显示关,默认关闭{LcdWriteCom(er+0x06);LcdWriteData('O');LcdWriteData('F');LcdWriteData('F');    }LcdWriteCom(0x0C);break;case 14:LcdWriteCom(yh);          //清屏for(num=0;num<16;num++)LcdWriteData(' ');LcdWriteCom(er);         //清屏for(num=0;num<16;num++)LcdWriteData(' ');TR0=1;                      //开定时器0FLAG_MEDICINE=0;         //药盒设置标志清零,表示药盒设定完毕MEDICINE_FUN=0;               //药盒功能清零break;                 }            }while(KEY6==0);   }if((KEY5==0)&&(FLAG_CLOCK==0)&&(FLAG_auxiliary==0))            //药盒功能--{Delaynms(20);if((KEY5==0)&&(FLAG_CLOCK==0)&&(FLAG_auxiliary==0)){ uchar num;   if(FLAG_MEDICINE==1){if(MEDICINE_FUN==1)                     //跳回时钟页面{LcdWriteCom(yh);                //清屏for(num=0;num<16;num++)LcdWriteData(' ');LcdWriteCom(er);                  //清屏for(num=0;num<16;num++)LcdWriteData(' ');LcdWriteCom(0x0c);TR0=1;FLAG_MEDICINE=0;MEDICINE_FUN=0;}else                               //跳回药盒设置页面{MEDICINE_FUN=1;                   //药盒选择TR0=0;LcdWriteCom(yh);             for(num=0;num<16;num++)LcdWriteData(tab0[num]);LcdWriteCom(er);for(num=0;num<16;num++)LcdWriteData(tab1[num]);LcdWriteCom(er+0x0c);LcdWriteData(yao+'0');LcdWriteCom(er+0x0c);LcdWriteCom(0x0f);}                                 }            }while(KEY5==0);   }
}
/*******************************************************************************
* 函数名         : main
* 函数功能       : 主函数
* 输入           : 无
* 输出             : 无
*******************************************************************************/
void main(void)
{BEEP=0;                                    //禁止蜂鸣器IO_init();           //IO口初始化Uart1Init();        //串口1初始化LcdInit();          //LCD初始化Ds1302Init();       //DS1302初始化Delaynms(10);      //等待DS1302初始化完成Ds1302ReadTime();    //读取ds1302的时间LcdDisplay();      //显示Timer0Init();       //定时器0初始化clock[0][0][2]=clock[0][0][3]=1;       //截止日期默认1月1号clock[1][0][2]=clock[1][0][3]=1;clock[2][0][2]=clock[2][0][3]=1;clock[3][0][2]=clock[3][0][3]=1;clock[4][0][2]=clock[4][0][3]=1;clock[5][0][2]=clock[5][0][3]=1; while(1){clock_set();                     //时钟设置扫描medicine_set();                     //药盒设置扫描digital_change();               //时钟/药盒数字有无改变扫描auxiliary();                     //辅助功能扫描clock_scan();                   //药盒闹钟扫描temp11=Ds18b20ReadTemp();     GetTemp();if((KEY8==0)&&(Key8Press==0)){Delaynms(20);if((KEY8==0)&&(Key8Press==0)){Display_Flag=~Display_Flag;}while(KEY8==0);}}
}
#include<STC15F2K60S2.h>
#include<intrins.h>//包括nop()函数unsigned char temp;             //保存药物号sbit Pow = P3^6;/*******************************************************************************
* 函数名         : Delay100ms
* 函数功能       : 延时100ms
* 输入           : 无
* 输出             : 无
*******************************************************************************/
void Delay100ms()      //@12.000MHz
{unsigned char i, j, k;_nop_();_nop_();i = 5;j = 144;k = 71;do{do{while (--k);} while (--j);} while (--i);
}/*******************************************************************************
* 函数名         : Delay
* 函数功能       : 延时 n*100ms
* 输入           : a
* 输出             : 无
*******************************************************************************/
void Delay(unsigned int a)
{unsigned int b; for(b=a;b>0;b--)Delay100ms();
}/*******************************************************************************
* 函数名         : IO_init
* 函数功能       : 配置I/O口
* 输入           : 无
* 输出             : 无
*******************************************************************************/
void IO_init(void)
{
//所有I/O口全设为准双向,弱上拉模式P0M0=0x00;               P0M1=0x00;P1M0=0x00;P1M1=0x00;P2M0=0x00;      P2M1=0x00;P3M0=0x00;P3M1=0x00;P4M0=0x00;P4M1=0x00;P5M0=0x00;P5M1=0x00;P6M0=0x00;P6M1=0x00;P7M0=0x00;P7M1=0x00;
}/*******************************************************************************
* 函数名         : Uart1Init
* 函数功能       : 串口1设置
* 输入           : 无
* 输出             : 无
*******************************************************************************/
void Uart1Init(void)        //9600bps@12.000MHz
{SCON = 0x50;       //8位数据,可变波特率AUXR |= 0x01;       //串口1选择定时器2为波特率发生器AUXR |= 0x04;     //定时器2时钟为Fosc,即1TT2L = 0xC7;            //设定定时初值T2H = 0xFE;         //设定定时初值AUXR |= 0x10;       //启动定时器2ES=1;           //开串口1中断EA=1;           //开总中断
}/*******************************************************************************
* 函数名         : Uart1Send
* 函数功能       : 字节发送
* 输入           : dat
* 输出             : 无
*******************************************************************************/
void Uart1Send(unsigned char dat)
{SBUF=dat;while(!TI);     //等待发送完成信号TI=0;
}/*******************************************************************************
* 函数名         : Uart1Sends
* 函数功能       : 发送字符串
* 输入           : *str
* 输出             : 无
*******************************************************************************/
void Uart1Sends(unsigned char *str)
{while(*str!='\0')    //检测字符串结束符{SBUF=*str;while(!TI);//等待发送完成信号TI=0;str++;      //指针+1}
}/*******************************************************************************
* 函数名         : Messages
* 函数功能       : 接收未按时吃药标志,发送相应短信
* 输入           : th
* 输出             : 无
*******************************************************************************/
void Messages(unsigned char th)
{if(th>0&&th<7){P_SW1 |= 0x40;                                       //串口引脚转移1->2ES=0;                                            //关闭串口1中断Uart1Sends("AT+CSCS=\"GSM\"\r\n");Delay(1);                                           //延时3SUart1Sends("AT+CMGF=1\r\n");                    //选择短信消息格式->文本模式Delay(1);Uart1Sends("AT+CSCA?\r\n");                        Delay(1);Uart1Sends("AT+CSMP=17,167,0,0\r\n");            //无发送报告,保留时间24小时,通常为0,发送英文Delay(1);Uart1Sends("AT+CMGS=\"18888888888\"\r\n");         //监护人号码Delay(1);Uart1Sends("The patient did not take medicine");   //短信内容前半部分switch(th){case 0X01: Uart1Sends(" 1 on time!");break;    //短信内容后半部分,发送对应的药号case 0X02: Uart1Sends(" 2 on time!");break;case 0X03: Uart1Sends(" 3 on time!");break;case 0X04: Uart1Sends(" 4 on time!");break;case 0X05: Uart1Sends(" 5 on time!");break;case 0X06: Uart1Sends(" 6 on time!");break;}Uart1Send(0x1a);                                 //结束发送P_SW1 &= 0xbf;                                    //串口引脚转移2->1temp=0;                                              //变量使用后清零ES=1;                                              //开串口1中断,允许接收}
}/*******************************************************************************
* 函数名         : main
* 函数功能       : 主函数
* 输入           : 无
* 输出             : 无
*******************************************************************************/
void main(void)
{IO_init();                                           //I/O口初始化Uart1Init();                                       //串口1初始化//Delay(100);                                            //等待GSM联网,10stemp=0;                                                 //变量清零Pow=1;Delay(1);Pow=0;Delay(45);Pow=1;while(1){Messages(temp);}
}/*******************************************************************************
* 函数名         : Uart1
* 函数功能       : 串口1中断服务函数,接收数据
* 输入           : 无
* 输出             : 无
*******************************************************************************/
void Uart1 (void) interrupt 4
{if(RI==1)                  //清收标志有效{RI=0;               //接收标志清零temp=SBUF;        //接收变量接收缓冲器数据}
}

基于单片机的智能药盒设计相关推荐

  1. 智能窗帘研究制作_基于单片机的智能窗帘设计

    基于单片机的智能窗帘设计 摘 要 本设计通过分析电动窗帘的现状和人们对自动窗帘控制系统的功能的需求,从而对自动窗帘控制器进行总体的设计.系统的总体设计采用以步进电机作为单片机控制元件,执行窗帘开闭的主 ...

  2. 【毕业设计】基于单片机的智能感应垃圾桶设计与实现 - 物联网 stm32 嵌入式

    文章目录 1 简介 2 绪论 2.1 课题背景与目的 3 系统设计 3.1 系统架构 3.2 硬件部分 3.2.1 传感器模块 3.2.2 语音模块 3.2.3 电机及其驱动模块 3.2.4 稳压模块 ...

  3. 【毕设狗】【单片机毕业设计】基于单片机的智能衣柜设计–仿真设计

    实物链接: 基于单片机的智能衣柜设计–实物设计 软件安装: Keil:点击下载 Proteus:点击下载 AD:点击下载 Visio:点击下载 设计简介: 本设计是基于单片机的智能衣柜设计,主要实现以 ...

  4. 【毕设狗】【单片机毕业设计】基于单片机的智能垃圾桶设计-仿真设计

    软件安装: Keil:点击下载 Proteus:点击下载 AD:点击下载 Visio:点击下载 程序烧录:点击下载 实物设计 基于单片机的智能垃圾桶设计-实物设计 设计简介: 本设计是基于单片机的智能 ...

  5. 基于单片机的智能空气加湿器设计

    本文从生活智能化的方向出发,设计了一套基于单片机的智能空气加湿器.系统将单片机技术与传感器技术相结合,以STC89C52单片机为控制器,通过DHT11温湿度传感器和水位传感器检测室内的温湿度和加湿器的 ...

  6. 台灯c语言,基于msp430单片机的智能台灯设计(C语言).doc

    基于msp430单片机的智能台灯设计(C语言) 桂林理工大学信息学院 实 习 报 告 实习名称: 电子系统设计创新与实践 名: 学 号: 组 员: 指导老师: 实习时间: 目 录1概述3 1.1 题目 ...

  7. 台灯c语言,基于msp单片机的智能台灯设计(C语言).doc

    基于msp单片机的智能台灯设计(C语言).doc 基于msp430单片机的智能台灯设计(C语言) 桂林理工大学信息学院 实 习 报 告 实习名称: 电子系统设计创新与实践 设计题目: 基于单片机的智能 ...

  8. 基于单片机的智能窗户(蓝牙)

    设计简介: 本设计基于单片机的智能窗户设计,主要有以下功能: 1.通过检测风速大于设置的风俗会自动关窗: 2.通过检测雨量大于设置的雨量会自动关窗: 3.通过检测温度小于最小温度会自动关窗: 4.可以 ...

  9. 嵌入式单片机智能药盒设计(含代码)

    目录 前言 设计的内容 (1)显示 (2)定时时间与用药量的设定 (3)实时时间调节 (4)报警功能 时钟模块 蓝牙模块 系统软件设计 系统主程序 按键函数 中断服务函数 作品展示 测试药定时提醒功能 ...

  10. 基于单片机的智能教室控制系统的设计

     word完整版可点击如下下载>>>>>>>> 基于单片机的智能教室控制系统的设计_c++课程设计题目汇总-硬件开发文档类资源-CSDN下载内容包括详细 ...

最新文章

  1. 两年三次刷PascalVOC最佳纪录,阿里图灵实验室怎样解决目标检测
  2. AOP实现Android集中式登录架构
  3. 光辉之章事件有哪些常规操作?天谕手游事后的补偿真的很安慰?
  4. S/4HANA Product edit button - draft node
  5. mysql 大小写 if_【已解决】Windows下 MySQL大小写敏感 解决方案及分析
  6. u-boot移植随笔:终于解决Nor Flash的问题了
  7. git 升级_git版本升级
  8. [置顶] Embedded Server:像写main函数一样写Web Server
  9. java内存模型(netty权威指南)
  10. putty+Xming使用方法
  11. 开心消消乐游戏网页设计作品 学生dreamweaver作业静态HTML网页设计模板 游戏主题网页作业制作
  12. Cad二次开发版本集合2000-2022
  13. 关联性——组内相关系数
  14. 最简单的三步yum配置阿里源
  15. ios 添加浮动效果_自定义悬浮窗详解(模拟IOS小球拖动,轮盘滑动)
  16. 玩转AgileCDN(二)——运维小哥做报表,不再为时区换算而烦恼
  17. 手把手教你在Unity2020中使用Timeline
  18. 拼接播放地址_无极婚礼布置地址,好的婚礼服务多少钱_大伟庆典
  19. Coreldraw绘画看了这个才算是真正明白了什么叫绘图
  20. 什么是云计算?什么是边缘计算?为什么需要云边协同?

热门文章

  1. 网易网盘关停!云端2T的“资源包、小电影”谁来守护?
  2. Redis技能—底层IO多路复用
  3. 免费全景摄影制作教程 - 摄影基础知识
  4. 左耳朵谈个人成长:做正确的事,等着被开除
  5. 二分算法——二分法求方程的根
  6. 今晚8:00 | 杜克大学计算进化智能中心(CEI Lab)—— 联邦学习专题!
  7. 宝塔面板网站解决跨域问题
  8. Java操作Excel表读取的数字变成科学计数法
  9. 油猴子 Tampermonkey
  10. mysql dump gtid_GTID环境下mysqldump set-gtid-purged取值