嵌入式单片机智能药盒设计(含代码)
目錄
前言
?設計的內容
(1)顯示
(2)定時時間與用藥量的設定
(3)實時時間調節
(4)報警功能
?時鐘模塊
?藍牙模塊
?
系統軟件設計
?系統主程序
?按鍵函數
?中斷服務函數
作品展示?
?測試藥定時提醒功能
?完整代碼
前言
近年來,疫情反復,這讓一些家庭使得自己的家里的老人造成了沒有人照看的狀態,那這就會出現一個問題,那就是我國現在的醫療物資非常的緊張,因為收到了疫情的影響,相關的專業的人員都已經開始向智慧云藥能方面開始發展了,同時現在也是大數據的社會在這樣的時代的背景下,那些對自身健康問題越來越重視的人,就能夠從網絡上獲取到很多有關于醫療的信息,所以為了迎合拿下記憶力下降而遇到事情就容易忘記的健忘人員,對于他們的需求,就由此提出了一種可以給基于嵌入式單片機的智能藥盒的設計方案。
?設計的內容
首先介紹一下本設計的使用的LCD160液晶顯示屏幕的顯示的原理,以及實時時鐘模塊運行的原理和聲控光控報警系統模塊的原理。
系統的硬件部分由以下幾個模塊組成:STC90C51單片機、4×2鍵盤模塊、LCD1602液晶顯示屏幕模塊、聲光報警模塊、HC-05藍牙模塊。其中LCD1602液晶顯示屏幕模塊可以實現實時日期、時間顯示功能,鍵盤模塊可以實現對時間、藥物用量的設置,聲光報警模塊可以實現定時時間的提醒,HC-05模塊建立單片機與手機之間的鏈接。
其中系統實現的基本功能具體如下:
(1)顯示
采用LCD1602液晶屏幕顯示實時日期時間、用藥種類及用量等。
(2)定時時間與用藥量的設定
系統將在LCD屏幕上顯示并實現三種藥物用量以及時間的定時設置,分別通過鍵盤模塊中的七個按鍵完成。
其中七個按鍵的功能具體為:一個設置鍵,記為k1,負責進入設置狀態;一個功能鍵記為k2,負責進入三種藥品的用藥量設置狀態;兩個調節鍵,分別記為k7、k8。其中k7的作用為藥量增加1,k8的作用為藥量減少1。三次定時對應的三個定時按鍵k4、k5、k6,按下即可停止蜂鳴器鳴警報。
(3)實時時間調節
實時時間通過三個按鍵進行調節,一個為設置鍵,記為k1,負責進入時間設置狀態;另外兩個個為調節鍵,記為k2、k3。其中k2的作用為增加時間,k3為減少時間。
(4)報警功能
系統內部程序存儲器中,自動將系統時鐘模塊運行的實時時間與定時時間進行對比判斷,在兩者一致的情況下,蜂鳴器警報響起,且根據需要的服用藥物種類,同時對應的LED發光二極管將持續閃爍。
本設計以STC90C516RD+單片機作為核心主控芯片,在本文中主要介紹系統復位電路以及內部振蕩電路的原理。其中LCD1602屏幕顯示模塊則負責時間、日期、藥物種類、用藥量等設置[4],將簡單介紹其原理組成、指令時序。由LED發光二極管與蜂鳴器電路組成的聲光報警系統中,以蜂鳴器警報為主,LED則起到輔助報警功能。系統的基本原理為:各模塊驅動程序運行后,系統主程序調用單片機和按鍵掃描子程序,將掃描結果發送給系統數據更新程序,反饋給LCD1602液晶屏幕顯示模塊,從而實現按鍵的輸入信息顯示功能。在聲光報警電路中,程序將調用單片機細分讀取數據并輸入報警時間。
原理圖?
時間設置用三個按鍵完成,一個功能按鍵k1,兩個調節按鍵k2、k3,在屏幕時間顯示界面,按下功能按鍵后即可進入時間設置狀態,兩個調節按鍵k2、k3分別為時間增加1、減少1,最后按下功能按鍵直至退出設置狀態,時鐘開始工作。
藥品用量設置用四個按鍵完成,兩個功能按鍵,兩個調節按鍵。其中一個功能鍵作用為屏幕由時間顯示轉換到藥量顯示,另一個即進入、退出設置狀態。兩個調節按鍵分別為藥量增加1、減少1。
聲光報警系統中,停止蜂鳴器警報與LED發光二極管的閃爍需要使用到三個按鍵,分別對應三種藥物,按下即可停止;如果沒有按下相應按鍵,則將在一分鐘后,程序判定實時時鐘超過固定時鐘,即實時時間超過定時時間,判斷結果為時間不相等,系統自動退出報警程序。
系統結構?
藥盒系統的最小系統圖?
LCD連接方式?
LCD顯示屏指令表?
LCD屏操作時序?
除了復位電路模塊,在此次的單片機的應用系統中,按鍵鍵盤模塊部分也是不可或缺的。鍵盤是計算機全部操作中使用的輸入設備之一,通過用手指按壓鍵盤按鈕——通常按鈕上附有對應文字標簽,向計算機發送文字信號等。
鍵盤的開關主要有膜合開關、機械開關、電容無接點方式,其中,膜合開關和機械開關是完全數字的開關,只有觸點關閉或觸點打開兩種狀態。
本系統鍵盤電路共由8個按鍵按鈕組成,并根據4×2的格式進行布局焊接。
按下鍵帽時,內置的電路成為閉路,電流流動,作為電信號被編碼器讀取并作為數字信號輸入到單片機系統中。
本次系統所采用的是電磁式蜂鳴器,是利用電磁線圈對蜂鳴片的作用而發聲,相對于壓電式蜂鳴器,其運作時所需要的電壓較低。
?
發光二極管是二極管的一種,與熒光燈、白熾燈泡等許多其他光源不同,LED會產生偏向特定波長的光。因此,有時由于不包含亮度所需要的波長的光,所以不能得到充分的效果。但LED結構簡單,可以大量生產,從而價格相對白熾燈、熒光燈較為低廉,在當今市場上被廣泛應用[5]。雖然LED對高溫缺乏耐受性,其半導體的材質有可能因電路產生問題而發生故障,但其由于不使用燈絲,重量輕且耐沖擊性強,由此可知壽命比白熾燈長。并且與需要穩定器的熒光燈相比,LED的電路比較簡單。
發光二極管與其他一般二極管一樣具有極性,在陽極上加正電壓用于陰極,即電源正極與發光二極管的正極相連,陰極同理,此時將該電路中的電壓稱為“正向下降電壓”。與一般將硅用作主原料的二極管相比,發光二極管的正向下降電壓高。
發光二極管連接圖?
?時鐘模塊
單片機中,具有處理時間和一定周期等形式的時間相關功能的是定時/計時器。本次設計采用的是DS1302時鐘芯片作為系統的定時/計時器,通過傳送多個字節的時鐘信號或RAM數據,對年月日期及時分秒進行計時。
時鐘信號是指在電子基板和半導體芯片等內部,為了使多個電子電路發送接收信號的定時一致,有規則地被刻上的電信號。通過這樣的信號使各電路的動作同步的方式稱為時鐘同步設計。信號的形式有幾種,但最簡單的時鐘信號每隔一定的時間切換高電壓和低電壓,將電壓從上升到下一個上升的時間(或從下降到下一個下降的時間)稱為“時鐘周期”,每單位時間的周期數 “時鐘頻率”。時鐘頻率越高,越能高速處理和收發數據。
時鐘信號是由內置水晶和陶瓷振子的時鐘振蕩電路發出的,通過專用的信號線提供給各電路。雖然基板上的芯片或電路根據單個時鐘進行操作,但是也可以僅在諸如CPU之類的特定芯片內以來自外部的信號的數倍的時鐘信號高速工作。
時鐘芯片原理圖?藍牙模塊
無線通信主要是利用電波進行的電子通信,而使用電纜等作為傳輸線的通信稱為有線通信。藍牙是無線通信技術之一。使用超短波2.4GHz帶寬,無線連接近距離的數字設備[7]。
藍牙是一種只有小基礎和電池的小型輕量裝置,與Wi-Fi等無線LAN相比,價格與功耗較低,并且對于開發者來說具有較為容易理解的數據模型,在此基礎上可以自由擴展功能,應用于各種服務。
?
系統軟件設計
系統主要模塊軟件設計結構?系統主程序
當本系統主程序運行在不同階段時,在系統逐步完成各個功能模塊的初始化之后,將進入程序的循環狀態,即此時系統正在運行掃描程序。之后根據所需,按下鍵盤模塊上的按鈕,向系統輸入信息,于是系統內置的程序存儲庫中將信息命令判斷并執行,這些操作完成之后LCD1602液晶顯示屏將實時顯示輸入信息,同理可實現定時提醒、設定三種藥物的劑量。
主程序流程?按鍵函數
系統中的八個按鍵分別具有不同的職能,以下主要介紹設置鍵k1、功能鍵兼調節鍵k2、k3、調節鍵k7、k8:
(1)設置鍵,當屏幕顯示實時時間時,按下即進入設置狀態,同理可退出設置狀態。
(2)在屏幕時間設置狀態下,k2作為調節鍵,起到時間增加1的作用;相反,未進入時間設置狀態時,k2作為功能鍵,按下即進入藥量顯示狀態,此時可對三種藥物的用量進行設置。同理,k3作為調節鍵時起到時間減少1的作用,作為功能鍵時可切換時間的顯示。
(3)調節鍵k7為藥量增加1,則k8為藥量減少1。
?中斷服務函數
在正常程序運行中,中斷處理作為CPU的硬件功能實現,強制中斷正常程序的執行。例如,從LED發光二極管閃爍這樣簡單的處理到在多任務操作系統中,有時必須停止程序的長時間運行。而在本系統時鐘模塊中,這種情況出現時將利用定時器中的中斷子函數進行處理。
?
作品展示?
電路焊接完成得到單片機成品之后,經過對軟件程序的設置并燒入,硬件成品上的鍵盤模塊便可實現按鍵輸入功能,對LCD1602屏幕上的時間進行設置與時間的定時,以及對屏幕時間顯示內容進行切換顯示為三種藥品的用量界面,進行用量設置。完成以上步驟之后退出設置狀態,系統便會按照設定的數值進行工作,然后在運行時判斷是否啟動報警程序。
LCD1602液晶屏幕時間顯示界面如圖25所示,在當前顯示界面圖中,第一行為日期,其中THU為英文Thursday的縮寫,表示2022年4月13日為星期四;第二行為實時時間顯示,采用24小時制,其顯示分別為小時、分鐘、秒.
時間顯示 藥量顯示?
?
藍牙連接后的效果圖?測試藥定時提醒功能
單片機實物上的鍵盤模塊按鈕按從左至右,先第一行后第二行的順序命名為k1、k2、k3、k4、k5、k6、k7、k8。
如圖28所示,按下k1或手機屏幕顯示上的“按鍵①”,進入設置狀態,,在此將單片機實時顯示時間設定為16:59:54(24小時制)
LCD屏實時時間顯示?????????再次按下如上相同位置的按鍵,直至進入定時時間設置狀態,“SET TIME1”即第一次定時時間,在此將其設定為17:00。
?最后按下如上相同位置按鍵,直至退出時間設置狀態,此時按下k2或“按鍵②”后LCD1602屏幕顯示DRU1、DRU2、DRU3即三種藥物的用量。而后用同上的按鍵進入設置狀態。手機軟件顯示界面中, “藥量加”即k7、“藥量減”即k8。默認狀態下三種藥物用量均為零,需手動設置。到達定時時間時,用量不為一的情況下,聲光報警系統發出提醒警報。如圖30所示,將藥物一用量設定為3,藥物二用量為2,藥物三用量為1。最后退出設置狀態。
?定時時間到,根據設定,如圖31所示單片機上三盞LED燈閃爍同時伴隨蜂鳴器警報響起。同理,若設定需服用藥物種類用量僅為兩種或一種,則LED閃爍對應兩盞燈或一盞燈。
?按下k2切換LCD屏幕顯示藥物種類及用量;或如圖33所示,按下手機顯示屏幕上名為“按鍵②”的按鈕也能達到此目的。
手機“藍牙串口”軟件切換顯示藥量?
?完整代碼
#include "common.h" #include "DS1302.h" #include "lcd1602.h" #include "uart.h" #define UART_RX_BUF RX1_Buffer sbit LED1 = P3^2; sbit LED2 = P3^3; sbit LED3 = P3^4; sbit BEEP = P2^0; uchar sec, min, hour, day, month, week, year;sbit p_r=0; bit displayMode=0; uchar setn=0; unsigned char bobao = 0; unsigned char Dosage1=0; unsigned char Dosage2=0; unsigned char Dosage3=0; uchar tx1_shi = 8,tx1_fen = 0; uchar tx2_shi = 12,tx2_fen = 0; uchar tx3_shi = 19,tx3_fen = 0; uchar REMINDFLAG = 0x00; void Timer0Init(void) {TMOD |= 0x01;TL0 = 0x00; TH0 = 0x4C;ET0 = 1;TR0 = 1;EA = 1; };void write_week(uchar week) {lcd_write_com(0x80+12);switch(week) { case 1:lcd_write_data('M');lcd_write_data('O');lcd_write_data('N');break; case 2:lcd_write_data('T');lcd_write_data('U');lcd_write_data('E');break; case 3:lcd_write_data('W');lcd_write_data('E');lcd_write_data('D');break; case 4:lcd_write_data('T');lcd_write_data('H');lcd_write_data('U');break; case 5:lcd_write_data('F');lcd_write_data('R');lcd_write_data('I');break; case 6:lcd_write_data('S'); lcd_write_data('T');lcd_write_data('A');break; case 7:lcd_write_data('S');lcd_write_data('U');lcd_write_data('N');break;} lcd_write_data(' '); }void displayTime() { lcd_write_com(0x80); lcd_write_data(' '); lcd_write_data('2'); lcd_write_data('0'); lcd_write_data(year/10+0x30); lcd_write_data(year%10+0x30); lcd_write_data('-'); lcd_write_data(month/10+0x30); lcd_write_data(month%10+0x30); lcd_write_data('-'); lcd_write_data(day/10+0x30); lcd_write_data(day%10+0x30); lcd_write_data(' ');write_week(week); lcd_write_com(0x80+0x40+4); lcd_write_data(hour/10+0x30); lcd_write_data(hour%10+0x30); lcd_write_data(':'); lcd_write_data(min/10+0x30); lcd_write_data(min%10+0x30); lcd_write_data(':'); lcd_write_data(sec/10+0x30); lcd_write_data(sec%10+0x30); }void Run_DS1302(void) {v_W1302(0x8f, 0);sec = bcdtodec(uc_R1302(0x81)); v_W1302(0x8f, 0);min = bcdtodec(uc_R1302(0x83)); v_W1302(0x8f, 0);hour = bcdtodec(uc_R1302(0x85)); v_W1302(0x8f, 0);day = bcdtodec(uc_R1302(0x87)); v_W1302(0x8f, 0);month = bcdtodec(uc_R1302(0x89));v_W1302(0x8f, 0);week = bcdtodec(uc_R1302(0x8b));v_W1302(0x8f, 0);year = bcdtodec(uc_R1302(0x8d));if(!displayMode)displayTime(); }void displayDosage() {if(Dosage1==0){lcd_write_char(1,1,'-');lcd_write_char(2,1,'-');}else{lcd_write_char(1,1,Dosage1/10+'0');lcd_write_char(2,1,Dosage1%10+'0');} if(Dosage2==0) {lcd_write_char(7,1,'-');lcd_write_char(8,1,'-');} else{ lcd_write_char(7,1,Dosage2/10+'0'); lcd_write_char(8,1,Dosage2%10+'0');} if(Dosage3==0) {lcd_write_char(13,1,'-');lcd_write_char(14,1,'-'); } else {lcd_write_char(13,1,Dosage3/10+'0');lcd_write_char(14,1,Dosage3%10+'0'); } }//燈狀態 void LedState() {if(REMINDFLAG&0x01)LED1=0;else LED1=1; if(REMINDFLAG&0x02) LED2=0; else LED2=1; if(REMINDFLAG&0x04) LED3=0; else LED3=1; }//按鍵掃描 void keyscan() { uint nian_temp; if(P1==0xFE || strstr(UART_RX_BUF,"k1")!=NULL) { delay_ms(30); if(P1==0xFE || strstr(UART_RX_BUF,"k1")!=NULL) { memset(UART_RX_BUF, 0, COM_RX1_Lenth); RX1_RxCounter = 0; bobao = 0; setn++; if(!displayMode { if(setn > 13){setn = 0; lcd_write_com(0x0c); lcd_clear();} if(setn == 1) {bobao = 0;displayTime();lcd_write_com(0x80+4);lcd_write_com(0x0f);}if(setn == 2){lcd_write_com(0x80+7);lcd_write_com(0x0f); } if(setn == 3) {lcd_write_com(0x80+10);lcd_write_com(0x0f); } if(setn == 4) {lcd_write_com(0x80+14);lcd_write_com(0x0f); } if(setn == 5) {lcd_write_com(0x80+0x40+5);lcd_write_com(0x0f); } if(setn == 6) { lcd_write_com(0x80+0x40+8); lcd_write_com(0x0f); } if(setn == 7) {lcd_write_com(0x80+0x40+11);lcd_write_com(0x0f); } if(setn == 8) {lcd_write_str(0,0," SET TIME 1 ");lcd_write_str(0,1," 00:00 ");lcd_write_com(0x80+0x40+6);lcd_write_data(tx1_shi/10 + 0x30);lcd_write_data(tx1_shi%10 + 0x30);lcd_write_data(':');lcd_write_data(tx1_fen/10 + 0x30);lcd_write_data(tx1_fen%10 + 0x30);lcd_write_com(0x80+0x40+7);lcd_write_com(0x0F); } if(setn == 9) {lcd_write_com(0x80+0x40+10);lcd_write_com(0x0F); } if(setn == 10) {lcd_write_str(0,0," SET TIME 2 ");lcd_write_str(0,1," 00:00 ");lcd_write_com(0x80+0x40+6);lcd_write_data(tx2_shi/10 + 0x30);lcd_write_data(tx2_shi%10 + 0x30);lcd_write_data(':');lcd_write_data(tx2_fen/10 + 0x30);lcd_write_data(tx2_fen%10 + 0x30);lcd_write_com(0x80+0x40+7);lcd_write_com(0x0F); } if(setn == 11) {lcd_write_com(0x80+0x40+10);lcd_write_com(0x0F); } if(setn == 12) { lcd_write_str(0,0," SET TIME 3 ");lcd_write_str(0,1," 00:00 ");lcd_write_com(0x80+0x40+6);lcd_write_data(tx3_shi/10 + 0x30);lcd_write_data(tx3_shi%10 + 0x30);lcd_write_data(':');lcd_write_data(tx3_fen/10 + 0x30);lcd_write_data(tx3_fen%10 + 0x30);lcd_write_com(0x80+0x40+7);lcd_write_com(0x0F); } if(setn == 13) { lcd_write_com(0x80+0x40+10);lcd_write_com(0x0F);} } else{if(setn > 3){setn = 0;lcd_write_com(0x0c);} if(setn == 1) {lcd_write_com(0x80+0x40+2); lcd_write_com(0x0f); } if(setn == 2) {lcd_write_com(0x80+0x40+8); lcd_write_com(0x0f);} if(setn == 3) {lcd_write_com(0x80+0x40+14);lcd_write_com(0x0f);}}while(P1==0xFE);} }if(P1==0xFD || strstr(UART_RX_BUF,"k2")!=NULL){delay_ms(20); if(P1==0xFD || strstr(UART_RX_BUF,"k2")!=NULL){ memset(UART_RX_BUF, 0, COM_RX1_Lenth); RX1_RxCounter = 0; if(setn == 0) {displayMode=1;lcd_clear();if(displayMode) { lcd_write_str(0,0,"DRU1| DRU2 |DRU3"); lcd_write_str(0,1," | | "); displayDosage();} } if(!displayMode){ if(setn == 1){year++;if(year == 100)year = 0; Write_DS1302Init(year,month,day,week,hour,min,sec); nian_temp=2000+year; if((nian_temp%400==0)||((nian_temp%100!=0)&&(nian_temp%4==0)))p_r=1; elsep_r=0; displayTime(); lcd_write_com(0x80+4); lcd_write_com(0x0f); } else if(setn == 2) { month++; if(month==13) month=1; if((month==4)||(month==6)||(month==9)||(month==11)) { if(day>30)day=1; } else{if(month==2) {if(p_r==1) {if(day>29) day=1; }else{if(day>28) day=1; }}} Write_DS1302Init(year,month,day,week,hour,min,sec); displayTime(); lcd_write_com(0x80+7); lcd_write_com(0x0f);} else if(setn == 3) { day++;if((month==1)||(month==3)||(month==5)||(month==7)||(month==8)||(month==10)||(month==12)) {if(day==32) day=1;} else{if(month==2){if(p_r==1){if(day==30) day=1;}else{if(day==29)day=1;}} else{if(day==31)day=1; }}Write_DS1302Init(year,month,day,week,hour,min,sec);displayTime();lcd_write_com(0x80+10);總結
以上是生活随笔為你收集整理的嵌入式单片机智能药盒设计(含代码)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 网工压轴题个人总结背诵版 专题二 配
- 下一篇: 王江民故事:38岁开始学计算机 与病毒作