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

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 2639|回復(fù): 3
打印 上一主題 下一主題
收起左側(cè)

老年人用藥助記神器 單片機(jī)源程序

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

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

單片機(jī)源程序如下:
  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語言庫函數(shù)memcpy可以整體復(fù)制。memcpy聲明與string.h中,形式為:
  7.                                                 void * memcpy(void *dst, void *src, int length);
  8.                                                 其功能為將src地址上長度為length字節(jié)的數(shù)據(jù),復(fù)制到dst上。                 */

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

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

  16. sbit LED1=P2^5;                                 //按鍵1存儲(chǔ)指示燈
  17. bit KeyPressFlag;                         //定義按鍵標(biāo)志位
  18. //---存儲(chǔ)順序是  秒  分  時(shí)    日    月    周    年,  存儲(chǔ)格式是用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;                  //用于記錄次數(shù)
  22.                                                          
  23. void main()
  24. {
  25.         IRcvStr(0xae,0,&num,1);        //&符號(hào)的作用是取一個(gè)變量的地址。                 
  26.         LcdInit();
  27.         Ds1302Init();

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

  31.         while(1)
  32.         {       
  33.                 if(KeyPressFlag==1)
  34.                 {
  35.                           KeyPressFlag=0;  //按鍵標(biāo)志清零,以便下次檢測
  36.                         Scan_KEY();
  37.                 }       
  38.                 else
  39.                 {
  40.                         Ds1302ReadTime();                                                        //讀取時(shí)間參數(shù)
  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);                                                //移動(dòng)光標(biāo)指令,0x80是固定指令值,后面是移動(dòng)的絕對(duì)值
  54.                         LcdWriteData(num/10%10+0x30);
  55.                         LcdWriteData(num%10+0x30);                                        //+0x30就是把個(gè)位數(shù)值轉(zhuǎn)換成 字符0~9的ASCII碼
  56.                 }                           
  57.         }
  58.        
  59. }


  60. /*******************************************************************************
  61. * 函數(shù)名         : LcdDisplay()
  62. * 函數(shù)功能                   : 顯示函數(shù)
  63. * 輸入           : 無
  64. * 輸出                  : 無
  65. *******************************************************************************/
  66. void LcdDisplay(unsigned char addr)
  67. {
  68. //        LcdWriteCom(0x80);                                                    //第一行地址
  69. /*        LcdWriteData('1');                                                        //確定日期的年代轉(zhuǎn)換
  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);                                                //移動(dòng)光標(biāo)指令,前面是固定的,后面是移動(dòng)的數(shù)值
  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);                                //時(shí) ds1302輸出的是壓縮BCD碼,除16就得到十位數(shù)的10進(jìn)制數(shù)
  91.         LcdWriteData('0'+(TIME[2]&0x0f));                        //8位壓縮BCD碼,即高四位是一個(gè)0-9的BCD碼,低四位亦同樣是一個(gè)BCD碼         
  92.         LcdWriteData('-');
  93.         LcdWriteData('0'+TIME[1]/16);                                //分
  94.         LcdWriteData('0'+(TIME[1]&0x0f));                        //相與后保留低四位,即個(gè)位
  95.         LcdWriteData('-');
  96.         LcdWriteData('0'+TIME[0]/16);                                //秒  
  97.         LcdWriteData('0'+(TIME[0]&0x0f));                        //數(shù)值同0x0f相與后就是個(gè)位數(shù)了,這只對(duì)BCD碼有效。                                  
  98. }


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

  111.                    if(num<100)                                    //加操作 次數(shù)控制在99以內(nèi)
  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);                                     //延時(shí),去抖
  123.                 if(KEY2==0)    //                           //確認(rèn)按鍵按下
  124.                 {
  125.                  for(i=0;i<100;i++)             //此處消抖程序非常經(jīng)典,怎么按都絕對(duì)不會(huì)產(chǎn)生抖動(dòng)。而且直到松手后再執(zhí)行后面程序
  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);                                     //延時(shí),去抖
  141.                 if(KEY3==0)    //                           //確認(rèn)按鍵按下
  142.                 {
  143.                  for(i=0;i<100;i++)             //此處消抖程序非常經(jīng)典,怎么按都絕對(duì)不會(huì)產(chǎn)生抖動(dòng)。
  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);                                     //延時(shí),去抖
  154.                 if(KEY4==0)    //                           //確認(rèn)按鍵按下
  155.                 {
  156.                  for(i=0;i<100;i++)             //此處消抖程序非常經(jīng)典,怎么按都絕對(duì)不會(huì)產(chǎn)生抖動(dòng)。
  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);                                                //移動(dòng)光標(biāo)指令,0x80是固定指令值,后面是移動(dòng)的絕對(duì)值
  172.         LcdWriteData(num/10%10+0x30);
  173.         LcdWriteData(num%10+0x30);                                        //+0x30就是把個(gè)位數(shù)值轉(zhuǎn)換成字符了
  174. }
  175. /*INT0中斷函數(shù) */
  176. void  counter0(void) interrupt 0                     //INT0 是四個(gè)按鍵接入74LS21四與門輸入,然后輸出口接入P3.2口
  177. {
  178.         EX0=0;                                                          //關(guān)閉中斷
  179.         KeyPressFlag=1;                                           //表明按鍵有動(dòng)作,可以進(jìn)行按鍵掃描
  180.           EX0=1;                                                                //再次打開中斷
  181. }

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

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

評(píng)分

參與人數(shù) 1黑幣 +30 收起 理由
admin + 30 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

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

使用道具 舉報(bào)

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

使用道具 舉報(bào)

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

使用道具 舉報(bào)

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

好的。謝謝。
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 99综合网| 在线精品一区二区三区 | 黄色精品| 国产精品视频一区二区三区 | 中文字幕欧美在线观看 | 日本亚洲欧美 | 久久久久国产精品一区三寸 | 欧美亚洲高清 | 成人福利网站 | 91成人在线视频 | av一区二区三区在线观看 | 国产欧美日韩一区二区三区在线 | 国产精品1区2区3区 欧美 中文字幕 | 国产亚洲一区二区在线观看 | 天天激情综合 | 中文天堂网| 日韩中文字幕免费在线 | 亚洲精色 | 国产精品99视频 | www.国产精 | www.久久精品视频 | 日韩国产在线观看 | 国产精品久久精品 | 九九精品在线 | 在线免费黄色小视频 | 欧美视频在线免费 | www.国产91 | 黄色片在线网站 | 神马久久春色视频 | 国产精品一区二区久久精品爱微奶 | 免费的av | 草草草久久久 | 精品一区二区久久久久久久网站 | 欧美一区二区另类 | 亚洲欧洲成人 | 天天操 夜夜操 | 天天看天天操 | 日韩欧美一区二区三区免费观看 | 日本久久网| 国产成人影院 | 中文字幕一区二区三区在线乱码 |