久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2674|回復: 3
打印 上一主題 下一主題
收起左側

老年人用藥助記神器 單片機源程序

[復制鏈接]
跳轉到指定樓層
樓主
ID:568756 發表于 2019-9-6 19:40 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
為了幫助老年人在用藥時比較容易忘記的難題,本人特結合用藥特點,設計了本程序。本程序特點:
程序有四個按鍵,其功能分別為:
1、用藥一次,即可按此鍵,以便總用藥次數加1;
2、用藥次數有誤時,可按此鍵,讓用藥次數減1;
3、用藥次數置零;
3、用藥次數及時間清零,并啟用時間計時器,計時器自00-00-00,時-分-秒格式計時計數

本程序功能有:
1、程序硬件有AT24C02存儲器,以便對每次用藥的參數進行存儲,關閉電源后,相關數據不會丟失;
2、程序硬件有時間芯片DS1302,可通過按鍵,啟用時間計時,方便記錄類似于熱敷、浸泡類事項的時間;
3、相關信息,通過液晶1602顯示出來。
4、本程序是單片機愛好者的練習之作,亦可為家里老人盡一份孝心的小物件。

單片機源程序如下:
  1. #include<reg51.h>
  2. #include"lcd.h"
  3. #include"ds1302.h"
  4. #include "i2c.h"
  5. #include "delay.h"
  6. #include "string.h"                 /*利用C語言庫函數memcpy可以整體復制。memcpy聲明與string.h中,形式為:
  7.                                                 void * memcpy(void *dst, void *src, int length);
  8.                                                 其功能為將src地址上長度為length字節的數據,復制到dst上。                 */

  9. void LcdDisplay(unsigned char addr);
  10. void Scan_KEY();
  11. void num_display(void);

  12. sbit KEY1=P1^3;                                 //加1 四個按鍵共了,其再與74LS21與門并聯,相與后聯接P3.2口,實現INT0中斷
  13. sbit KEY2=P1^4;                                 //減1
  14. sbit KEY3=P1^5;                                 //次數置0
  15. sbit KEY4=P1^6;                                 //次數與時間均置0

  16. sbit LED1=P2^5;                                 //按鍵1存儲指示燈
  17. bit KeyPressFlag;                         //定義按鍵標志位
  18. //---存儲順序是  秒  分  時    日    月    周    年,  存儲格式是用BCD碼---//
  19. //uchar TIME2[7] = {10, 20, 0x00, 0x07, 0x07, 0x07, 0x68};
  20. //uchar *jxhj[]= {"Mon","Tues","Wed","Thur","Fri","Sat","Sun"};

  21. unsigned char num=0;                  //用于記錄次數
  22.                                                          
  23. void main()
  24. {
  25.         IRcvStr(0xae,0,&num,1);        //&符號的作用是取一個變量的地址。                 
  26.         LcdInit();
  27.         Ds1302Init();

  28.         EA=1;                 //中斷總開關
  29.            EX0=1;                 //外部中斷INT0使能
  30.         IT0=1;       //下降沿觸發  IT0=0為低電平觸發

  31.         while(1)
  32.         {       
  33.                 if(KeyPressFlag==1)
  34.                 {
  35.                           KeyPressFlag=0;  //按鍵標志清零,以便下次檢測
  36.                         Scan_KEY();
  37.                 }       
  38.                 else
  39.                 {
  40.                         Ds1302ReadTime();                                                        //讀取時間參數
  41.                         LcdDisplay(0x00);                                                        //第一行地址是0x00,第二行是0x40;       
  42.                         LcdWriteCom(0xC0);               
  43.                         LcdWriteData('F');
  44.                         LcdWriteData('R');
  45.                         LcdWriteData('E');
  46.                         LcdWriteData('Q');
  47.                         LcdWriteData('U');
  48.                         LcdWriteData('E');
  49.                         LcdWriteData('N');
  50.                         LcdWriteData('C');
  51.                         LcdWriteData('Y');
  52.                         LcdWriteData(':');
  53.                            LcdWriteCom(0xC0+13);                                                //移動光標指令,0x80是固定指令值,后面是移動的絕對值
  54.                         LcdWriteData(num/10%10+0x30);
  55.                         LcdWriteData(num%10+0x30);                                        //+0x30就是把個位數值轉換成 字符0~9的ASCII碼
  56.                 }                           
  57.         }
  58.        
  59. }


  60. /*******************************************************************************
  61. * 函數名         : LcdDisplay()
  62. * 函數功能                   : 顯示函數
  63. * 輸入           : 無
  64. * 輸出                  : 無
  65. *******************************************************************************/
  66. void LcdDisplay(unsigned char addr)
  67. {
  68. //        LcdWriteCom(0x80);                                                    //第一行地址
  69. /*        LcdWriteData('1');                                                        //確定日期的年代轉換
  70.         LcdWriteData('9');
  71.         LcdWriteData('0'+TIME[6]/16);                                //年
  72.         LcdWriteData('0'+(TIME[6]&0x0f));
  73.         LcdWriteData('-');
  74.         LcdWriteData('0'+TIME[4]/16);                                //月
  75.         LcdWriteData('0'+(TIME[4]&0x0f));
  76.         LcdWriteData('-');
  77.         LcdWriteData('0'+TIME[3]/16);                                //日
  78.         LcdWriteData('0'+(TIME[3]&0x0f));
  79.         LcdWriteCom(0x80+13);                                                //移動光標指令,前面是固定的,后面是移動的數值
  80.         LcdWriteData('0'+(TIME[5]&0x07));                           //星期                         
  81. */
  82.         LcdWriteCom(addr+0X80);                                                //書寫的位置
  83.         LcdWriteData('S');
  84.         LcdWriteData('T');
  85.         LcdWriteData('A');
  86.         LcdWriteData('R');
  87.         LcdWriteData('T');
  88.         LcdWriteData(':');
  89.         LcdWriteCom(0x80+7);
  90.         LcdWriteData('0'+TIME[2]/16);                                //時 ds1302輸出的是壓縮BCD碼,除16就得到十位數的10進制數
  91.         LcdWriteData('0'+(TIME[2]&0x0f));                        //8位壓縮BCD碼,即高四位是一個0-9的BCD碼,低四位亦同樣是一個BCD碼         
  92.         LcdWriteData('-');
  93.         LcdWriteData('0'+TIME[1]/16);                                //分
  94.         LcdWriteData('0'+(TIME[1]&0x0f));                        //相與后保留低四位,即個位
  95.         LcdWriteData('-');
  96.         LcdWriteData('0'+TIME[0]/16);                                //秒  
  97.         LcdWriteData('0'+(TIME[0]&0x0f));                        //數值同0x0f相與后就是個位數了,這只對BCD碼有效。                                  
  98. }


  99. void Scan_KEY()                                                     
  100. {
  101.         unsigned char i;
  102.         if(KEY1==0)                                                   //按鍵按下
  103.         {
  104.                 DelayMs(20);                                     //延時,去抖
  105.                 if(KEY1==0)                                       //確認按鍵按下
  106.                 {
  107.                  for(i=0;i<100;i++)             //此處消抖程序非常經典,怎么按都絕對不會產生抖動。
  108.             {
  109.                     if(KEY1==0) i=0;
  110.             }                                                        //自下面開始寫程序

  111.                    if(num<100)                                    //加操作 次數控制在99以內
  112.             {
  113.                   num++;
  114.               ISendStr(0xa0,0,&num,1);  //寫入24c02
  115.               DelayMs(10);
  116.                           num_display();
  117.             }
  118.          }
  119.      }

  120.         if(KEY2==0)                                                   //按鍵按下
  121.         {
  122.                 DelayMs(20);                                     //延時,去抖
  123.                 if(KEY2==0)    //                           //確認按鍵按下
  124.                 {
  125.                  for(i=0;i<100;i++)             //此處消抖程序非常經典,怎么按都絕對不會產生抖動。而且直到松手后再執行后面程序
  126.             {
  127.                     if(KEY2==0) i=0;
  128.             }
  129.                       if(num>0)  //減操作
  130.                  {
  131.                   num--;
  132.               ISendStr(0xa0,0,&num,1);  //寫入24c02
  133.               DelayMs(10);
  134.                           num_display();
  135.              }
  136.          }
  137.      }

  138.         if(KEY3==0)                                                   //按鍵按下
  139.         {
  140.                 DelayMs(20);                                     //延時,去抖
  141.                 if(KEY3==0)    //                           //確認按鍵按下
  142.                 {
  143.                  for(i=0;i<100;i++)             //此處消抖程序非常經典,怎么按都絕對不會產生抖動。
  144.             {
  145.                     if(KEY3==0)        i=0;
  146.              }
  147.                         Ds1302Init();                                          
  148.                         LcdDisplay(0x40);                                                        //第一行地址是0x00,第二行是0x40;       
  149.          }
  150.      }


  151.         if(KEY4==0)                                                   //按鍵按下
  152.         {
  153.                 DelayMs(20);                                     //延時,去抖
  154.                 if(KEY4==0)    //                           //確認按鍵按下
  155.                 {
  156.                  for(i=0;i<100;i++)             //此處消抖程序非常經典,怎么按都絕對不會產生抖動。
  157.             {
  158.                     if(KEY4==0)i=0;
  159.             }
  160.                         Ds1302Init();                                          
  161.                         LcdDisplay(0x40);                                                        //第一行地址是0x00,第二行是0x40;       
  162.                         num=0;
  163.             ISendStr(0xa0,0,&num,1);  //寫入24c02
  164.                         num_display();
  165.          }
  166.      }
  167. }

  168. void num_display(void)                                                          //專門用來顯示num值的
  169. {
  170.         LcdDisplay(0x40);                                                        //第一行地址是0x00,第二行是0x40;       
  171.            LcdWriteCom(0xC0+13);                                                //移動光標指令,0x80是固定指令值,后面是移動的絕對值
  172.         LcdWriteData(num/10%10+0x30);
  173.         LcdWriteData(num%10+0x30);                                        //+0x30就是把個位數值轉換成字符了
  174. }
  175. /*INT0中斷函數 */
  176. void  counter0(void) interrupt 0                     //INT0 是四個按鍵接入74LS21四與門輸入,然后輸出口接入P3.2口
  177. {
  178.         EX0=0;                                                          //關閉中斷
  179.         KeyPressFlag=1;                                           //表明按鍵有動作,可以進行按鍵掃描
  180.           EX0=1;                                                                //再次打開中斷
  181. }

  182. /*------------------------------------------------
  183.                  定時器中斷子程序
  184. ------------------------------------------------*/
  185. void Timer0_isr(void) interrupt 1                                 //定時對液晶屏數值進行更新
  186. {
  187.         TH0=(65536-12000)/256;                                                  //重新賦值 2ms
  188.         TL0=(65536-2000)%256;
  189.         LcdDisplay(0x00);                                                        //第一行地址是0x00,第二行是0x40;       
  190.         LcdWriteCom(0x80+11);                                                //移動光標指令,后面是移動的絕對值
  191.         LcdWriteData(num%10+0x30);                                        //+0x30就是把個位數值轉換成字符了
  192. }
復制代碼

所有代碼51hei提供下載:
老年人用藥助記神器.rar (66.16 KB, 下載次數: 22)

評分

參與人數 1黑幣 +30 收起 理由
admin + 30 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:1 發表于 2019-9-6 20:08 | 只看該作者
本帖需要重新編輯補全電路原理圖,源碼,詳細說明與圖片即可獲得100+黑幣(帖子下方有編輯按鈕)
回復

使用道具 舉報

板凳
ID:342822 發表于 2019-9-6 20:25 | 只看該作者
建議加提示音早中晚用藥數量~~~
回復

使用道具 舉報

地板
ID:568756 發表于 2019-9-6 21:09 | 只看該作者
taotie 發表于 2019-9-6 20:25
建議加提示音早中晚用藥數量~~~

好的。謝謝。
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日韩精品久久一区二区三区 | 亚洲欧美日韩系列 | 亚洲国产成人久久久 | 欧美一级二级视频 | 亚洲乱码一区二区 | 色成人免费网站 | 国产观看 | 91 久久 | 狼色网| 亚洲精品在线视频 | 亚洲黄色av网站 | 亚洲精品成人av久久 | 香蕉一区二区 | 免费人成激情视频在线观看冫 | 午夜免费精品视频 | 久久综合九色综合欧美狠狠 | 国产成人免费视频 | 日本在线一区二区三区 | 久久网一区二区 | 久久精品亚洲精品国产欧美 | 久久久久国产一区二区三区四区 | 九色网址 | 日韩一区二区免费视频 | 在线播放日韩 | www四虎影视 | 一区二区三区韩国 | 国产国语精品 | 亚洲影视在线 | 婷婷久久网| 日韩在线不卡 | 亚州精品天堂中文字幕 | 欧美不卡一区二区三区 | 动漫www.被爆羞羞av44 | 国产精品三级 | 免费av直接看 | 国产精品精品视频一区二区三区 | 日韩精品一区二区三区在线播放 | 日韩在线视频免费观看 | 久久成人免费 | 一级欧美黄色片 | 奇米久久|