基于单片机的智能药物盒设计与实现
点击链接下载设计资料:https://download.csdn.net/download/m0_51061483/92081546
1. 系统功能概述
随着人口老龄化的加剧和慢性病患者数量的不断增加,智能化健康辅助设备在医疗护理中的应用愈发广泛。传统药盒仅具备药物分类与存放功能,缺乏主动提醒、记录与管理的能力,容易导致患者漏服或误服药物。为此,设计一款基于单片机控制的智能药物盒具有重要的实际意义。本系统采用STC89C52单片机作为主控核心,配合LCD显示模块、蜂鸣器、时钟芯片、按键电路以及掉电保护存储模块,实现药物定时提醒、药量记录与掉电保存等功能。
系统的主要功能如下:
- 定时提醒功能:用户可根据医生处方或个人需求设定服药时间,当时间到达预设值时,系统自动发出声光提醒;
- 药物管理功能:支持多种药物的独立管理,可设置药物编号、数量、类型等信息;
- 掉电保护功能:利用外部EEPROM存储芯片保存药物信息及时间参数,断电后不丢失数据;
- 智能显示与提示功能:LCD液晶实时显示当前时间、药物状态、提醒信息及剩余数量,用户可通过按键完成设置与操作;
- 人性化交互设计:系统通过简洁界面与直观按键控制,实现便捷操作,适合老年人或长期服药人群使用。
该设计在功能上兼顾实用性与可扩展性,为家庭健康管理提供了可行的智能化解决方案。
2. 系统电路设计
本系统主要由单片机最小系统、电源模块、时钟模块(DS1302)、存储模块(AT24C02)、LCD1602显示模块、蜂鸣器提示模块、按键模块等部分组成。各个模块之间通过标准I/O接口实现数据通信与控制信号传输。
2.1 单片机最小系统设计
系统的核心是STC89C52单片机,它基于MCS-51内核,内部集成了8KB Flash程序存储器、256字节RAM、三个16位定时器、四个I/O口及串口模块。单片机负责完成系统的逻辑判断、数据处理、时间比较与外设控制等任务。
其主要功能包括:
- 接收按键输入,设置与修改用药时间;
- 控制LCD显示当前药物信息与系统状态;
- 与DS1302进行时钟数据通信,实现时间读取与校准;
- 与AT24C02通信,实现掉电数据保存;
- 控制蜂鸣器与LED进行提醒提示。
时钟采用12MHz晶振电路,保证系统运行稳定。复位电路采用电容与上拉电阻组成的自动复位电路,确保上电时系统初始化。
2.2 电源模块设计
系统采用5V直流电源供电,通过AMS1117-5.0稳压芯片实现电压稳定输出。为保证模拟电路与数字电路的稳定性,电源线路中增加了去耦电容与滤波电容。若系统接入锂电池或外部供电,可通过二极管防反接设计确保安全。
在便携应用中,可加入18650电池及充电模块,实现移动供电,增强系统灵活性。
2.3 实时时钟模块设计(DS1302)
为了实现定时提醒功能,系统采用DS1302实时时钟芯片。该芯片具备独立的涓流充电电池输入接口,可在主电源断开时继续计时,确保时间精度。
DS1302通过三线串行通信方式与单片机连接(SCLK、I/O、CE),可实现秒、分、时、日期、月份、年份的读取与写入操作。系统开机后,单片机自动读取时钟数据,与预设提醒时间进行比较,当时间相等时触发提醒。
DS1302模块具有低功耗、高精度的特点,非常适合需要长时间运行的嵌入式系统。
2.4 存储模块设计(AT24C02)
为了在断电情况下仍能保存用户设置的药物信息与提醒时间,系统采用AT24C02串行EEPROM作为掉电保护模块。AT24C02容量为2Kb,采用I²C通信方式,与单片机的SCL与SDA口连接。
系统可将以下信息存入EEPROM:
- 预设的服药时间;
- 药物编号与名称;
- 药物剩余数量;
- 上次服药记录。
单片机在上电初始化时,自动读取EEPROM内容,恢复之前的系统状态,从而实现掉电数据保持功能。
2.5 LCD1602显示模块设计
LCD1602液晶显示屏是系统的人机交互界面,负责显示当前时间、药物名称、剩余数量、提醒信息等内容。LCD1602具有两行16字符显示能力,采用HD44780控制芯片,支持4位或8位数据接口。
显示内容设计示例:
时间: 08:00
药物1 剩余:12
当时间到达预设值时,LCD自动显示“请服药!”提示信息,同时蜂鸣器鸣叫提醒用户操作。
2.6 蜂鸣器与LED提示模块
蜂鸣器用于声音提醒,LED用于视觉提示,两者结合可增强提示效果。蜂鸣器由NPN三极管驱动,单片机输出高电平时三极管导通,蜂鸣器响起。当用户确认服药后,通过按键停止报警。
系统还可扩展多色LED用于区分不同药物,例如红色表示药物1、绿色表示药物2,以便多药物场景下快速识别。
2.7 按键输入模块设计
系统设有四个独立按键:模式键、加键、减键、确认键。按键用于时间调整、药物数量设置和提醒确认。按键输入采用上拉电阻设计,低电平触发。程序中加入消抖逻辑,确保按键响应准确可靠。
按键主要功能如下:
- 模式键:切换时间设置、药量设置、查看记录等模式;
- 加/减键:调整时间或数量;
- 确认键:保存设置或停止提醒。
3. 程序设计
系统程序采用模块化设计思想,包括主程序、时钟模块、存储模块、显示模块、按键处理模块和提示控制模块。各模块通过函数调用与全局变量交互,实现系统的协同运行。
3.1 主程序设计
主程序负责系统初始化、模块调用及逻辑控制。主要流程如下:
- 初始化各模块;
- 从EEPROM读取参数;
- 读取DS1302时间;
- 比较当前时间与服药时间;
- 若时间匹配则触发蜂鸣器提醒;
- 响应按键输入,执行相应操作;
- 循环运行,实时更新LCD显示。
主程序示例:
#include <reg52.h>
#include "lcd1602.h"
#include "ds1302.h"
#include "eeprom.h"
#include "key.h"
#include "beep.h"
void main() {
unsigned char hour, min;
unsigned char set_hour, set_min;
lcd_init();
ds1302_init();
eeprom_init();
beep_init();
eeprom_read_time(&set_hour, &set_min); // 读取设定时间
lcd_show_string(0,0,"智能药物盒系统");
delay(1000);
while(1) {
ds1302_read_time(&hour, &min);
lcd_show_time(hour, min);
lcd_show_medicine_info();
if(hour == set_hour && min == set_min) {
beep_on();
lcd_show_string(1,0,"请按时服药!");
}
key_scan(); // 处理按键输入
delay(100);
}
}
该主程序通过循环监测当前时间,并在匹配到设定时间时发出提示,实现定时提醒功能。
3.2 DS1302时钟模块程序设计
时钟模块负责时间的读取与写入操作,通过三线串行接口通信。代码如下:
void ds1302_write_byte(unsigned char dat) {
unsigned char i;
for(i=0;i<8;i++) {
DS_IO = dat & 0x01;
DS_CLK = 1;
DS_CLK = 0;
dat >>= 1;
}
}
unsigned char ds1302_read_byte() {
unsigned char i, dat=0;
for(i=0;i<8;i++) {
dat >>= 1;
if(DS_IO) dat |= 0x80;
DS_CLK = 1;
DS_CLK = 0;
}
return dat;
}
通过上述代码,系统能够与DS1302实现稳定通信,并精确读取时间数据。
3.3 EEPROM掉电保护模块程序设计
掉电保护模块用于保存用户设定的时间参数与药物信息。系统在参数修改后自动写入EEPROM中:
void eeprom_write_byte(unsigned char addr, unsigned char dat) {
IIC_Start();
IIC_Send_Byte(0xA0);
IIC_Send_Byte(addr);
IIC_Send_Byte(dat);
IIC_Stop();
delay(10);
}
unsigned char eeprom_read_byte(unsigned char addr) {
unsigned char dat;
IIC_Start();
IIC_Send_Byte(0xA0);
IIC_Send_Byte(addr);
IIC_Start();
IIC_Send_Byte(0xA1);
dat = IIC_Receive_Byte();
IIC_Stop();
return dat;
}
3.4 按键输入模块程序设计
按键扫描函数用于检测用户操作,并根据不同按键执行相应动作:
unsigned char key_scan() {
if(KEY1 == 0) { delay(10); if(KEY1 == 0) return 1; }
if(KEY2 == 0) { delay(10); if(KEY2 == 0) return 2; }
if(KEY3 == 0) { delay(10); if(KEY3 == 0) return 3; }
if(KEY4 == 0) { delay(10); if(KEY4 == 0) return 4; }
return 0;
}
系统根据按键编号实现不同的功能,如设置时间、调整药量或关闭蜂鸣器。
3.5 提示与显示模块程序设计
LCD显示模块用于动态展示系统信息。以下函数实现LCD内容的更新:
void lcd_show_time(unsigned char h, unsigned char m) {
lcd_set_cursor(0,0);
lcd_write_string("时间:");
lcd_write_num(h);
lcd_write_char(':');
lcd_write_num(m);
}
void lcd_show_medicine_info() {
lcd_set_cursor(1,0);
lcd_write_string("药物1 剩余:12");
}
蜂鸣器控制函数用于实现提醒功能:
void beep_on() {
BEEP = 1;
}
void beep_off() {
BEEP = 0;
}
当用户确认后,系统停止提醒,显示“已服药”信息。
4. 系统运行与测试
系统通电后,LCD显示当前时间与药物状态,用户可通过按键设置服药时间与药量。DS1302提供实时时钟信息,单片机实时判断当前时间是否达到设定值。当时间匹配时,蜂鸣器与LED同时工作,发出声光提醒。用户按下确认键后,提示自动停止。
测试结果表明,系统在长时间运行过程中稳定可靠,掉电后重新上电,系统能够自动恢复设置信息,说明EEPROM掉电保护功能正常。LCD显示清晰,按键响应迅速,整体设计符合智能药盒的设计预期。
5. 总结
本设计实现了一款基于STC89C52单片机的智能药物盒,具备定时提醒、药量管理、掉电保护与智能显示功能。系统结构合理、控制灵活、操作简便,能够有效帮助患者按时服药,减少漏服与误服的风险。通过软硬件结合设计,实现了家庭医疗设备的智能化与人性化,为后续健康监护设备的研发提供了有益参考。
75